Chargement de la progression locale…
PLC Gym
Accueil PLC GymNiveau 1, 0 XP · ta progression
TIA Portal V20

Siemens SCL

Testé sur simulateur

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.

Types de données API et FB

Regroupe les données d'un équipement et réutilise un bloc de commande testé

Testé sur simulateur
  • 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 de données API · document TYPE
TYPE
    PumpStatus : STRUCT
        Running : BOOL;
        Starts : DINT;
    END_STRUCT;
END_TYPE
FB PumpControl · interface
NomSectionType de données
StartEntréeBOOL
StopEntréeBOOL
PermitEntréeBOOL
FaultEntréeBOOL
RunningOutputBOOL
StatusInOutPumpStatus
LatchStaticBOOL
WasRunningStaticBOOL
Corps du FB (SCL)
#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;
Deux instances appelées depuis la routine principale
#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.

  1. Examine le UDT et la définition du bloc, puis les deux instances aux noms différents.
  2. 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.
  3. 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.
  4. 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.
  5. 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