Langage ladder et autres langages automate : la référence
Ce que chaque profil Siemens, Rockwell et Beckhoff prend en charge ici, les hypothèses qu’il fait et où il diffère des outils des fabricants.
Siemens SCL
S7-1500 standard · stockage FB optimisé · variables locales # en SCL.
- Structure
- Interface typée ; affectations, IF / ELSIF / ELSE, listes CASE signées INT/DINT et REGION / END_REGION. Les plages CASE sont hors de ce sous-ensemble.
- Expressions
- Logique BOOL, arithmétique numérique, comparaisons et parenthèses. INT, DINT, REAL et TIME. & veut aussi dire AND. ABS, LIMIT, MIN, MAX, ROUND et TRUNC travaillent sur des nombres. Un REAL passe dans un INT ou un DINT par ROUND ou TRUNC : TIA Portal ne le convertit pas tout seul. Les commentaires vont de // jusqu’à la fin de la ligne, ou s’écrivent (* ... *), ou (/* ... */) pour un commentaire qui peut être traduit.
- Instructions à mémoire
- Temporisations TON_TIME, TOF_TIME, TP_TIME et TONR_TIME ; compteurs IEC_COUNTER.CTU, CTD_INT et CTUD_INT avec PV/CV en INT ; R_TRIG et F_TRIG. La liste ci-dessous les détaille un par un.
- Boucles FOR et EXIT
- FOR counter := start TO end BY step DO … END_FOR; utilise un compteur INT/DINT, des bornes incluses et un BY facultatif (par défaut +1). Les pas négatifs fonctionnent. EXIT quitte la boucle la plus interne. Ne modifie ni le compteur, ni la borne de fin, ni les opérandes BY dans le corps de la boucle ; un BY égal à zéro est refusé.
- Tableaux
- Déclare ARRAY[0..9] OF REAL dans l’interface du bloc ; lis ou écris #Samples[#Index]. Éléments BOOL, INT, DINT et REAL, bornes inférieures négatives comprises.
- Types de données API et FB
- Types de données d’automate nommés (table ou document TYPE) et FB réutilisables avec Input, Output, InOut, Static et Temp. Déclare les instances de FB dans Static et appelle #Instance(Input := …, Output => …).
- Limites d’exécution
- Tableaux à une dimension : jusqu’à 256 éléments chacun et 1 024 valeurs de stockage déployées par programme. Chaque élément apparaît dans Variables surveillées et dans la relecture. Un indice hors limites arrête le cycle en affichant l’indice réel et les bornes autorisées. Les boucles partagent le budget de 20 000 opérations par cycle, même avec un corps vide. Ce sont des limites de l’académie.
- Hors de ce sous-ensemble
- WHILE / REPEAT, l’opérateur de puissance **, les autres fonctions mathématiques (SQRT, SIN, etc.), les tableaux multidimensionnels, les tableaux d’UDT ou d’instances, les structures imbriquées anonymes, les copies de tableaux entiers, tes propres fonctions avec valeur de retour, l’adressage par pointeur et les fichiers de projet natifs.
Temporisations, compteurs et mémorisations
- TON
TON_TIME - Temporisation à l'enclenchement. Q passe à 1 quand IN est à 1 depuis PT, et repasse à 0 avec IN.
#Delay(IN := #Start, PT := T#2s);Siemens: page - TOF
TOF_TIME - Temporisation au déclenchement. Q passe à 1 avec IN et reste à 1 pendant PT après que IN est repassé à 0.
#RunOn(IN := #Start, PT := T#2s);Siemens: page - TP
TP_TIME - Impulsion. Q est à 1 pendant PT à partir de chaque front montant de IN, quoi que fasse IN ensuite. Un nouveau front pendant l'impulsion est ignoré.
#Dose(IN := #Start, PT := T#2s);Siemens: page - TONR
TONR_TIME - Totalisateur de temps. ET additionne le temps pendant lequel IN est à 1 et le garde quand IN repasse à 0. Q passe à 1 à PT et y reste. R efface ET et Q.
#RunTime(IN := #Running, R := #Clear, PT := T#1h);Siemens: page - CTU
IEC_COUNTER - Compte. Chaque front montant de CU ajoute 1 à CV. Q est à 1 quand CV est égal à PV ou plus. R met CV à 0.
#Bottles.CTU(CU := #Sensor, R := #Clear, PV := 6);Siemens: page - CTD
CTD_INT - Décompte. LD charge PV dans CV. Chaque front montant de CD retire 1. Q est à 1 quand CV est égal à 0 ou moins.
#Left(CD := #Sensor, LD := #Refill, PV := 12);Siemens: page - CTUD
CTUD_INT - Compte et décompte. CU ajoute 1, CD retire 1, et les deux dans un même cycle laissent CV tranquille. R met CV à 0 et LD charge PV. QU est à 1 à PV ou plus, QD à 0 ou moins.
#Stock(CU := #In, CD := #Out, R := #Clear, LD := FALSE, PV := 10);Siemens: page
SR, RS et la bobine inversée sont des boîtes CONT et LOG. En SCL, écris un verrou avec IF et un bit inversé avec NOT.
Regroupe les données d'un équipement et réutilise un bloc de commande testé
- Un UDT décrit un groupe de valeurs liées. PumpStatus contient l'état de marche et le total de démarrages ; il n'exécute aucune logique.
- PumpControl contient la logique réutilisable. DutyControl et StandbyControl sont des instances distinctes : elles partagent la définition, mais chacune garde ses propres valeurs Latch et WasRunning.
- Les entrées sont fournies à l'appel. Running est copié vers la sortie après l'exécution. Status est un InOut structuré qui référence la variable d'état de cette pompe ; écrire dans Status.Starts met à jour les données de l'appelant.
- Chaque appel s'exécute dans l'ordre du programme. Sauter un appel conserve les valeurs de l'instance et de la sortie ; un IF autour d'un appel n'est pas une commande d'arrêt. Fournis l'entrée d'inhibition/Stop et exécute le bloc pour arrêter la pompe.
Déclare PumpStatus comme type de données d’automate et PumpControl comme FB. Déclare DutyControl/StandbyControl dans Static pour les appels multi-instance. SCL utilise des variables locales préfixées par #, Input/InOut avec := et Output avec =>. Les données Temp sont effacées à chaque appel dans ce modèle pédagogique optimisé.
TYPE
PumpStatus : STRUCT
Running : BOOL;
Starts : DINT;
END_STRUCT;
END_TYPE| Nom | Section | Type de données |
|---|---|---|
Start | Entrée | BOOL |
Stop | Entrée | BOOL |
Permit | Entrée | BOOL |
Fault | Entrée | BOOL |
Running | Output | BOOL |
Status | InOut | PumpStatus |
Latch | Static | BOOL |
WasRunning | Static | BOOL |
#Latch := (#Start OR #Latch) AND NOT #Stop AND #Permit AND NOT #Fault;
IF #Latch AND NOT #WasRunning THEN
#Status.Starts := #Status.Starts + 1;
END_IF;
#Status.Running := #Latch;
#Running := #Latch;
#WasRunning := #Latch;#DutyControl(Start := #Start, Stop := #Stop, Permit := #Permit, Fault := #Fault, Running => #PumpOn, Status := #DutyStatus);
#StandbyControl(Start := #StandbyStart, Stop := #Stop, Permit := #Permit, Fault := #StandbyFault, Running => #StandbyPump, Status := #StandbyStatus);Essaie-le dans l'établi
Ouvre n'importe quelle SCL mission et utilise les onglets Types de données API et les Blocs fonctionnels qui s'y trouvent. Puis déclare les instances dans Interface du bloc.
- Examine le UDT et la définition du bloc, puis les deux instances aux noms différents.
- En pause, force Start à TRUE dans l'onglet Entrées et avance de plusieurs cycles : PumpOn reste activé et DutyStatus.Starts n'augmente qu'une fois.
- Relâche Start. L'auto-maintien garde la pompe principale en marche. Démarre la pompe de secours ; son compteur de démarrages est indépendant.
- Passe Fault sur ON : la pompe principale s'arrête aussitôt alors que la pompe de secours continue de tourner. Appuie sur Stop pendant l'exécution, ou force Stop à TRUE dans l'onglet Entrées en pause : les deux s'arrêtent.
- Rembobine un cycle enregistré et compare les variables d'état de l'appelant avec l'état local du bloc et les lignes de bloc exécutées.
Le contrat de simulation
- Tâche virtuelle fixe de 20 ms. La vitesse de lecture et la fréquence d’images 3D ne changent pas les résultats.
- Chaque scénario de test part d’un automate et d’une installation remis à neuf.
- Les modifications arrêtent l’exécution. Les résultats et la relecture appartiennent à la révision du programme testée.
- REAL utilise une précision de 32 bits. Un dépassement d’entier non pris en charge produit un diagnostic.
- Les compteurs contiennent des valeurs INT. Les autres largeurs de compteur (SINT, DINT et les types non signés) et les temporisations LTIME ne sont pas implémentées ici.
- Les calculs NORM_X/SCALE_X valides sont pris en charge en LOG. Les plages invalides s’arrêtent avec un diagnostic ; les résultats natifs ENO/erreur ne sont pas reproduits.
- Les grafcets utilisent un seul chemin actif et des actions booléennes N/S/R. Les actions temporisées natives, les chemins parallèles et les options de dernier cycle/réinitialisation sont hors de ce modèle.
- La division entière supprime la partie décimale : 7 / 2 donne 3. Les comparaisons décimales utilisent la précision de l’opérande ; une valeur REAL de 0.1 est égale à 0.1. Utilise un opérande REAL pour une division avec décimales.
- SCL accepte les constantes REAL typées comme REAL#2.0. Les calculs en virgule flottante ambigus utilisent la double précision du S7-1500 avant l’affectation à une variable REAL.
- La rémanence à la coupure d’alimentation, les vraies E/S, le timing réseau et le firmware des fabricants sont hors du modèle.
Lire la documentation d’origine
Cette académie enseigne un sous-ensemble limité. Une vérification native demande de compiler et de tester dans le logiciel du fabricant indiqué.
La notation de l’entretien se fait dans ce navigateur. Le déroulé actuel en présentiel est un prototype local, pas un service sécurisé d’évaluation à distance. Les fichiers d’export sont en bêta et doivent être vérifiés à l’import et en fonctionnement dans TIA Portal V20 ou Studio 5000.
Le comportement de base a été comparé aux manuels officiels Logix, au manuel S7-1200 et au guide S7-1200/1500. Les documents Siemens sont antérieurs à la V20. Le comportement TwinCAT suit les pages de référence Tc2_Standard de Beckhoff et le manuel TwinCAT 3 PLC. Cette comparaison ne remplace pas un test sur l’automate cible, surtout pour le timing des grafcets et les blocs réutilisables.
Siemens TIA Portal V20Studio 5000 v38Manuel des blocs fonctionnels LogixManuel SFC LogixLangages TwinCAT 3 PLCTON de TwinCAT Tc2_StandardCTU de TwinCAT Tc2_Standard