Académique Documents
Professionnel Documents
Culture Documents
S7-SCL - Mise en Route PDF
S7-SCL - Mise en Route PDF
SIMATIC
S7-SCL V5.3 pour S7-300/400
Getting Started Edition 01/2005
Mise en route
Cet exemple accompagnant le produit n'est pas une description isolée mais fait partie du manuel.
Il peut être appelé via l'icône "Mise en route".
Consignes de sécurité
Ce manuel donne des consignes que vous devez respecter pour votre propre sécurité ainsi que pour
éviter des dommages matériels. Elles sont mises en évidence par un triangle d’avertissement et sont
présentées, selon le risque encouru, de la façon suivante :
! Danger
signifie que la non-application des mesures de sécurité appropriées entraîne la mort, des blessures
graves ou un dommage matériel important.
! Attention
signifie que la non-application des mesures de sécurité appropriées peut entraîner la mort, des
blessures graves ou un dommage matériel important.
! Prudence
signifie que la non-application des mesures de sécurité appropriées peut entraîner des blessures
légères.
Prudence
signifie que la non-application des mesures de sécurité appropriées peut entraîner un dommage
matériel.
Important
doit vous rendre tout particulièrement attentif à des informations importantes sur le produit, aux
manipulations à effectuer avec le produit ou à la partie de la documentation correspondante.
Personnel qualifié
La mise en service et l’utilisation d'un appareil ne doivent être effectuées que par des personnes
qualifiées. Il s’agit de personnes qui ont l’autorisation de mettre en service, de mettre à la terre et de
repérer des appareils, des systèmes et circuits électriques conformément aux règles de sécurité en
vigueur.
Utilisation conforme
Tenez compte des points suivants :
! Attention
L’appareil ne doit être utilisé que pour les applications spécifiées dans le catalogue ou dans la
description technique, et exclusivement avec des périphériques et composants recommandés par
Siemens.
Le transport, le stockage, le montage, la mise en service ainsi que l’utilisation et la maintenance
adéquats de l'appareil sont les conditions indispensables pour garantir son fonctionnement correct et
sûr.
Marques de fabrique
SIMATIC®, SIMATIC HMI® et SIMATIC NET® sont des marques déposées de Siemens AG.
Les autres désignations dans ce document peuvent être des marques dont l’utilisation par des tiers à
leurs propres fins peut enfreindre les droits des propriétaires desdites marques.
Siemens AG
Automation and Drives Siemens AG 2005
Postfach 4848, 90327 Nürnberg, Allemagne Sous réserve de modifications techniques
Objectifs
L'exemple proposé veut vous apprendre à utiliser au mieux les possibilités offertes par
S7-SCL. Les questions les plus fréquentes au début sont par exemple :
• Comment faire pour concevoir mon programme avec S7-SCL ?
• Quels sont les éléments de langage de S7-SCL adéquats pour résoudre ce problème ?
• Quelles sont les fonctions de test mises à ma disposition ?
Ce chapitre entend répondre à ces questions et à quelques autres.
Matériel requis
Vous pouvez exécuter le programme-exemple dans un automate SIMATIC S7-300 ou
SIMATIC S7-400 doté de la périphérie suivante :
• Un module d'entrée à 16 voies,
• Un module de sortie à 16 voies.
Enoncé du problème
Présentation
Il s'agit de saisir des valeurs de mesure au moyen d'un module d'entrée, pour les trier et
traiter ensuite à l'aide d'un programme S7-SCL. Les résultats seront indiqués par un module
de sortie.
Commutateur de
saisie Valeur de mesure Commutateur de tri
X 1 1 1 1 1 1 1 1 X
255
255 1 1 1
127 3 2 9
63 7 3 49
31 15 Calculs 4 225
15 31 6 961
7 63 8 3969
3 127 11 16129
Débordement
1 255 16 haut
1 1 1
3 2 9
Adressage
7 de la sortie 3 49
15 4 225
31 6 961
63 Inverseur 8 3969
Sélection
127 de la sortie 11 16129
Débordement
255 16 haut
Types de bloc
Un programme S7-SCL structuré permet de résoudre au mieux le problème posé. Un tel
programme est de construction modulaire, c'est-à-dire divisé en blocs chargés chacun d'une
tâche partielle bien déterminée. Comme dans les langages de programmation de STEP 7,
vous disposez dans S7-SCL des types de bloc suivants.
Les fonctions sont des blocs de code sans mémoire. De ce fait, il faut que les
Blocs FC valeurs calculées soient traitées aussitôt après l'appel de la fonction.
STEP 7
Les blocs de données sont des zones servant à mémoriser les données
DB utilisateur. On distingue les DB globaux auxquels tous les blocs de code
ont accès et les DB d'instance qui sont associés à un appel de FB
déterminé.
Les types de donné es utilisateur sont des types complexes que vous
UDT définissez vous-même au besoin et qui sont réutilisables. Ainsi, un type
de données utilisateur peut servir à générer plusieurs blocs de données de
même structure. Les UDT s'emploient comme des blocs.
Tâches partielles
Dans la figure ci-après, les tâches partielles sont représentées par des blocs. Les zones
rectangulaires grises représentent les blocs. La disposition des blocs de code de la gauche
vers la droite correspond à leur ordre d'appel.
Enregistre-
SAISIE_DONNEES Sens de dé- Sens de dé-
ment des
Bloc de données (DB) placement du Placement
données
programme des données
Présentation
L'interface d'un bloc est formée de paramètres auxquels il est possible d'accéder depuis
d'autres blocs.
Les paramètres déclarés dans le bloc sont des marques de réservation dont les valeurs ne
sont fixées qu'au moment de l'utilisation concrète (appel). On les nomme paramètres
formels, tandis que les valeurs qui leur sont affectées à l'appel du bloc sont désignées par
paramètres effectifs. Lorsqu'un bloc est appelé, des données d'entrée lui sont transmises en
tant que paramètres effectifs. Après le retour au bloc appelant, les données de sortie sont
mises à disposition pour être prises en charge. Une fonction (FC) peut transmettre son
résultat sous forme de valeur de la fonction.
On peut classer les paramètres de bloc dans les catégories suivantes :
OB CYCLE
L'OB CYCLE n'a pas de paramètres formels. Il appelle le FB SAISIE et lui transmet pour
ses paramètres formels la valeur de mesure et les données de commande.
FB SAISIE
FB CALCUL
Le FB SAISIE appelle le FB CALCUL. Les deux FB ont comme données communes le
tableau de valeurs de mesure à trier. Il faut donc déclarer ce tableau comme paramètre
d'entrée/sortie. Un tableau de structures est créé en tant que paramètre d'entrée pour les
résultats du calcul que sont la racine carrée et le carré. Voici les paramètres formels :
SQRT et CARRE
Ces fonctions sont appelées par CALCUL. Elles nécessitent une valeur d'entrée et
fournissent le résultat en tant que valeur de la fonction.
Octet 0 Octet 4
Système d'automatisation
Octet 1 Octet 5
Module
d'entrée Octet 0
E 0.3
0 Validation de la valeur de mesure
E 0.4 1 Déclenchement du tri et du calcul
2 Choix du résultat : racine carrée ou carré
3 Sélection sortie : valeur de mesure ou résultat
4 Codage, bit 0
5 Codage, bit 1
6 Codage, bit 2
7 Validation du codage
Octet 1
Module de
sortie Octet 4 0
0à7 Octet de poids fort du mot de sortie
1
(bits 8 à 15), requis seulement pour
2 l'élévation au carré, sinon 0.
3
4
5
6
7
0
1
2
0à7 Octet de poids faible du mot de sortie
3 (bits 0 à 7), valeur de mesure ou résultat :
4 racine carrée ou carré.
5
6
Octet 5 7
FC CARRE
appelle
FB CALCUL
appelle
FB SAISIE
appelle
OB CYCLE
Création du FB CALCUL
Organigramme de EXPLOITER
Début de l’instruction
REPEAT échanger := FALSE
I := LIMITE
I signifie index
Début de l’instruction
FOR non
I >= 1 ?
oui
oui
mémoire_tri [I-1] >
mémoire_tri [I]
? Echanger les valeurs
de la mémoire de tri [I-1]
non et de la mémoire de tri [I]
ECHANGER = TRUE
Fin de l’instruction
REPEAT échanger ?
TRUE
FALSE
I := 0
Début de l’instruction
FOR non
I <= LIMITE ?
oui
Entrer les résultats dans le ta-
SQRT bleau structuré des résultats.
Fin
CONST
LIMITE := 7;
END_CONST
VAR_IN_OUT
memoire_tri : ARRAY[0..LIMITE] OF INT;
END_VAR
VAR_OUTPUT
memoire_calcul : ARRAY[0..LIMITE] OF
STRUCT
racine_carree : INT;
carre : INT;
END_STRUCT;
END_VAR
VAR_TEMP
echanger : BOOL;
indice, aux : INT;
valeur_r, resultat_r: REAL;
END_VAR
Déroulement du programme
Le paramètre d'entrée/sortie "memoire_tri" est combiné avec la mémoire circulante
"valeurs_mesure", c'est-à-dire que le contenu original de la mémoire est écrasé par les
valeurs de mesure triées.
Le nouveau tableau "memoire_calcul" est créé comme paramètre de sortie pour les résultats
du calcul. Ses éléments sont structurés de telle façon qu'ils contiennent la racine carrée et le
carré de chaque valeur de mesure.
La figure ci-après montre le lien entre les tableaux décrits.
mémoire_tri
valeurs_mesure
mémoire_calcul
CALCUL
BEGIN
(******************************************************************
1ère partie : tri par échange de paires. Les valeurs sont échangées
par paires jusqu'à ce que la mémoire des valeurs de mesure soit
triée.
*******************************************************************)
REPEAT
echanger := FALSE;
FOR indice := LIMITE TO 1 BY -1 DO
IF memoire_tri[indice-1] > memoire_tri[indice]
THEN aux :=
memoire_tri[indice];
memoire_tri[indice] := memoire_tri[indice-1];
memoire_tri[indice-1] := aux;
echanger := TRUE;
END_IF;
END_FOR;
UNTIL NOT echanger
END_REPEAT;
(******************************************************************
2ème partie : calcul de la racine carrée avec la fonction standard
SQRT et élévation au carré avec la fonction CARRE.
*******************************************************************)
FOR indice := 0 TO LIMITE BY 1 DO
valeur_r := INT_TO_REAL(memoire_tri[indice]);
resultat_r := SQRT(valeur_r);
memoire_calcul[indice].racine_carree := REAL_TO_INT(resultat_r);
memoire_calcul[indice].carre :=
CARRE(memoire_tri[indice]);
END_FOR;
END_FUNCTION_BLOCK
Création du FB SAISIE
Organigramme de SAISIR
Début
Modifier oui
nouvelle
valeur ? La mémoire circulante est réalisée
Inscrire valeur de mesure
avec l’opération MOD : lorsque la limite
non dans mémoire circulante,
est atteinte, elle recommence au
recalculer l’index
début.
Modifier oui
nouveau
tri ?
Trier la mémoire circulante et effectuer
non CALCUL les calculs (créer à cet
effet le tableau des résultats).
Modifier oui
nouveau
code ? D’abord décaler les bits non
Evaluation du codage et
significatifs vers le bord droit,
non détermination de l’adresse
puis masquer les places inutiles
de sortie
à l’aide de AND
Choix TRUE
fonction ?
FALSE
Charger résultat du calcul Charger résultat du calcul
de la racine carrée du cadre
Charger :
Charger valeur de mesure inscrire les éléments de la liste
avec les adresses de sortie dans
les paramètres de sortie pour ensuite
afficher leurs valeurs.
Fin
CONST
LIMITE := 7;
NOMBRE := LIMITE + 1;
END_CONST
VAR_INPUT
entree_val_mesure : INT ; // Nouvelle valeur de mesure
nouv_val : BOOL; // Prendre en charge la valeur
// de mesure dans la mémoire
// circulante "valeurs_mesure"
nouv_tri : BOOL; // Trier les valeurs de mesure
choix_fonction : BOOL; // Choix de la fonction de calcul
Racine carrée ou Carré
nouv_selection : BOOL; // Valider l'adresse de sortie
selection : WORD; // Adresse de sortie
END_VAR
VAR_OUTPUT
sortie_resultat : INT; // Valeur calculée
sortie_val_mesure : INT; // Valeur de mesure correspondante
END_VAR
VAR
valeurs_mesure : ARRAY[0..LIMITE] OF INT := 8(0);
memoire_resultats : ARRAY[0..LIMITE] OF
STRUCT
racine_carree : INT;
carre : INT;
END_STRUCT;
pointeur : INT := 0;
anc_val : BOOL := TRUE;
anc_tri : BOOL := TRUE;
anc_selection : BOOL := TRUE;
adresse : INT := 0; //Adresse de sortie
convertie
instance_calcul : CALCUL, //Définition de l'instance
//locale
END_VAR
Variables statiques
Nous avons choisi le type de bloc FB parce qu'il y a des données à enregistrer d'un cycle de
programme au suivant. Il s'agit des variables statiques qui sont déclarées dans la section de
déclaration "VAR, END_VAR".
On appelle variables statiques les variables locales dont les valeurs sont conservées durant
toutes les exécutions du bloc concerné. Elles servent à stocker les valeurs d'un bloc
fonctionnel et sont conservées dans le bloc de données d'instance.
Initialisation de variables
Notez les valeurs initiales qui sont écrites dans les variables lors de l'initialisation du bloc
(après son chargement dans la CPU). L'instance locale du FB CALCUL est également
déclarée dans la section de déclaration "VAR, END_VAR". Ce nom sera utilisé plus tard
pour l'appel et l'accès aux paramètres de sortie. L'instance globale SAISIE_DONNEES sert
de mémoire de données.
Calcul de l'adresse
La figure ci-après montre le calcul de l'adresse. Le mot d'entrée EW0 contient dans ses bits
12 à 14 le codage qui est validé lorsqu'un front est détecté au commutateur de codage
(bit 15). La valeur "adresse" est déterminée par décalage vers la droite au moyen de la
fonction standard SHR et masquage des bits significatifs avec un masque AND.
C'est avec cette adresse que les éléments du tableau (résultat du calcul et valeur de mesure
correspondante) sont écrits dans les paramètres de sortie. Le paramètre "choix_fonction"
détermine si le résultat est la racine carrée ou le carré.
Un front du commutateur de codage est signalé par le changement de "nouv_selection" par
rapport à "anc_selection".
0 0 0 0
1 1 1 1 « adresse »
2 2 2 2
3 3 3 3
Commutateur
4 4 4 4
pour valeur 5 5 5 5
de codage 6 6 6 6
Commutateur 7 7 7 7
de codage Octet 0
0 8 8 8
1 9 9 9
2 10 10 10
3 11 11 11
4 12 12 12
5 13 13 13
6 14 14 14
7 15 15 15
Octet 1 EW0
BEGIN
(*****************************************************************
1ère partie : saisie des valeurs de mesure.
La modification de "nouv_val" provoque la saisie de la valeur de
mesure. L'opération MOD permet de réaliser une mémoire circulante
pour valeurs de mesure.
******************************************************************)
IF nouv_val <> anc_val THEN
pointeur := pointeur MOD NOMBRE;
valeurs_mesure[pointeur] := entree_val_mesure;
pointeur := pointeur + 1;
END_IF;
anc_val := nouv_val;
(******************************************************************
2ème partie : déclenchement du tri et du calcul
La modification de "nouv_tri" déclenche le tri de la mémoire
circulante et l'exécution de calculs avec les valeurs de mesure. Les
résultats sont enregistrés dans un nouveau tableau "memoire_calcul".
******************************************************************)
IF nouv_tri <> anc_tri THEN
pointeur := 0; //Remise à 0 du pointeur de la mémoire circulante
instance_calcul(memoire_tri := valeurs_mesure);//Appel du FB
CALCUL
END_IF;
anc_tri := nouv_tri;
memoire_resultats := instance_calcul.memoire_calcul; //Carré et
racine carrée
(******************************************************************
3ème partie : évaluation du codage et préparation de la sortie
Si modification de "nouv_selection", le codage pour adressage de
l'élément de tableau pour la sortie est déterminé de nouveau : les
bits significatifs de "selection" sont masqués et convertis en
entiers. Selon la position de l'inverseur de "choix_fonction", c'est
"racine_carree" ou "carre" qui est mis à disposition pour la sortie.
*******************************************************************)
IF nouv_selection <> anc_selection THEN
adresse := WORD_TO_INT(SHR(IN := selection, N := 12) AND
16#0007);
END_IF;
anc_selection := nouv_selection;
IF choix_fonction THEN
sortie_resultat:= memoire_resultats[adresse].carre;
ELSE
sortie_resultat:= memoire_resultats[adresse].racine_carree;
END_IF;
sortie_val_mesure := valeurs_mesure[adresse]; //Indication de la
valeur de mesure
END_FUNCTION_BLOCK
ORGANIZATION_BLOCK CYCLE
(*******************************************************************
CYCLE est identique à un OB1, à savoir qu'il est appelé cycliquement
par le système S7.
1ère partie : appel du bloc fonctionnel et transmission des valeurs
d'entrée
2ème partie : prise en charge des valeurs de sortie et sortie avec
sélection
*******************************************************************)
VAR_TEMP
donnees_systeme : ARRAY[0..20] OF BYTE; //Zone pour l'OB1
END_VAR
BEGIN
(* 1ère partie :
***************************************************)
SAISIE.SAISIE_DONNEES(
entree_val_mesure := WORD_TO_INT(entree),
nouv_val := "entree 0.0", //Commutateur de saisie
//sous forme de mnémonique
nouv_tri := commutateur_de_tri,
choix_fonction := commutateur_de_fonction,
nouv_selection := commutateur_de_codage,
selection := codage);
Données de test
Conditions requises
Vous avez besoin pour le test d'un module d'entrée avec l'adresse 0 et d'un module de sortie
avec l'adresse 4.
Avant le test, poussez vers la gauche ("0") les 8 commutateurs supérieurs du module
d'entrée et vers la droite ("1") les 8 commutateurs inférieurs.
Chargez à nouveau les blocs dans la CPU, puisque les valeurs initiales des variables sont
également testées.
Etapes du test
Effectuez maintenant le test en vous conformant aux étapes décrites dans le tableau ci-
après.
Test complémentaire
Les tableaux ci-après expliquent les commutateurs du module d'entrée et proposent des
modèles de test pour la racine carrée et le carré qui vous aideront à définir vos propres
étapes de test.
• L'entrée est effectuée au moyen des commutateurs : les 8 du haut permettent de
commander le programme, les 8 du bas de fournir une valeur de mesure.
• La sortie est effectuée au moyen d'indicateurs : le groupe du haut indique l'octet de sortie
de poids fort, celui du bas l'octet de poids faible.