Lokaler Fortschritt wird geladen…
PLC Gym
PLC Gym StartseiteLevel 1, 0 XP · dein Fortschritt
TIA Portal V20

Siemens SCL

Im Simulator getestet

Standard-S7-1500 · optimierte FB-Speicherung · lokale #-Variablen in SCL.

Struktur
Typisierte Schnittstelle; Zuweisungen, IF / ELSIF / ELSE, CASE-Listen mit vorzeichenbehafteten INT/DINT und REGION / END_REGION. CASE-Bereiche gehören nicht zu dieser Teilmenge.
Ausdrücke
BOOL-Logik, numerische Arithmetik, Vergleiche und Klammern. INT, DINT, REAL und TIME. & bedeutet auch AND. ABS, LIMIT, MIN, MAX, ROUND und TRUNC funktionieren mit Zahlen. Ein REAL kommt über ROUND oder TRUNC in einen INT oder DINT: TIA Portal wandelt es nicht von selbst um. Kommentare sind // bis zum Zeilenende, (* ... *) oder (/* ... */) für einen Kommentar, der übersetzt werden kann.
Zustandsbehaftete Anweisungen
Timer TON_TIME, TOF_TIME, TP_TIME und TONR_TIME; Zähler IEC_COUNTER.CTU, CTD_INT und CTUD_INT mit INT PV/CV; R_TRIG und F_TRIG. Die Liste unten führt jeden einzeln auf.
FOR-Schleifen und EXIT
FOR counter := start TO end BY step DO … END_FOR; nutzt einen INT/DINT-Zähler, schließt beide Grenzen ein und hat ein optionales BY (Standard +1). Negative Schrittweiten funktionieren. EXIT verlässt die innerste Schleife. Lass Zähler, Ende und BY-Operanden im Schleifenkörper unverändert; ein BY von null wird abgelehnt.
Arrays
Deklariere ARRAY[0..9] OF REAL in der Bausteinschnittstelle; lies oder schreibe #Samples[#Index]. Elemente vom Typ BOOL, INT, DINT und REAL, auch mit negativen unteren Grenzen.
SPS-Datentypen und Funktionsbausteine
Benannte PLC-Datentypen (Tabelle oder TYPE-Dokument) und wiederverwendbare FBs mit Input, Output, InOut, Static und Temp. Deklariere FB-Instanzen in Static und rufe #Instance(Input := …, Output => …) auf.
Ausführungsgrenzen
Eindimensionale Arrays: bis zu 256 Elemente je Array und 1.024 erweiterte Speicherwerte pro Programm. Jedes Element erscheint in den beobachteten Variablen und im Replay. Ein Index außerhalb des Bereichs stoppt den Zyklus und nennt den tatsächlichen Index und die erlaubten Grenzen. Schleifen teilen sich das Zyklusbudget von 20.000 Operationen, auch mit leerem Rumpf. Das sind Grenzen der Academy.
Außerhalb dieser Teilmenge
WHILE / REPEAT, der Potenzoperator **, die übrigen mathematischen Funktionen (SQRT, SIN und so weiter), mehrdimensionale Arrays, Arrays aus UDTs oder Instanzen, anonyme verschachtelte Strukturen, Kopien ganzer Arrays, eigene Funktionen mit Rückgabewerten, Zeigeradressierung und native Projektdateien.

Timer, Zähler und Selbsthaltungen

TON TON_TIME
Einschaltverzögerung. Q geht an, sobald IN für PT an war, und geht mit IN aus. #Delay(IN := #Start, PT := T#2s); Siemenss Seite
TOF TOF_TIME
Ausschaltverzögerung. Q geht mit IN an und bleibt für PT an, nachdem IN ausgeht. #RunOn(IN := #Start, PT := T#2s); Siemenss Seite
TP TP_TIME
Impuls. Q ist ab jeder steigenden Flanke von IN für PT an, egal was IN danach tut. Eine neue Flanke, während der Impuls läuft, wird ignoriert. #Dose(IN := #Start, PT := T#2s); Siemenss Seite
TONR TONR_TIME
Zeitakkumulator. ET summiert die Zeit, in der IN an ist, und behält sie, wenn IN ausgeht. Q geht bei PT an und bleibt an. R löscht ET und Q. #RunTime(IN := #Running, R := #Clear, PT := T#1h); Siemenss Seite
CTU IEC_COUNTER
Zählt vorwärts. Jede steigende Flanke von CU addiert 1 zu CV. Q ist an, wenn CV gleich PV oder größer ist. R setzt CV auf 0. #Bottles.CTU(CU := #Sensor, R := #Clear, PV := 6); Siemenss Seite
CTD CTD_INT
Zählt rückwärts. LD lädt PV in CV. Jede steigende Flanke von CD zieht 1 ab. Q ist an, wenn CV 0 oder kleiner ist. #Left(CD := #Sensor, LD := #Refill, PV := 12); Siemenss Seite
CTUD CTUD_INT
Zählt vor- und rückwärts. CU addiert 1, CD zieht 1 ab, und beide im selben Zyklus lassen CV unverändert. R setzt CV auf 0 und LD lädt PV. QU ist an bei PV oder mehr, QD bei 0 oder weniger. #Stock(CU := #In, CD := #Out, R := #Clear, LD := FALSE, PV := 10); Siemenss Seite

SR, RS und die negierte Spule sind Boxen in KOP und FUP. In SCL schreibst du eine Selbsthaltung mit IF und ein invertiertes Bit mit NOT.

SPS-Datentypen und Funktionsbausteine

Anlagendaten bündeln und einen getesteten Steuerbaustein wiederverwenden

Im Simulator getestet
  • Ein UDT beschreibt eine Gruppe zusammengehöriger Werte. PumpStatus enthält den Laufstatus und die Startanzahl; er führt keine Logik aus.
  • PumpControl enthält die wiederverwendbare Logik. DutyControl und StandbyControl sind getrennte Instanzen: Sie teilen sich die Definition, aber jede behält ihre eigenen Werte für Latch und WasRunning.
  • Eingänge werden beim Aufruf übergeben. Running wird nach der Ausführung auf den Ausgang kopiert. Status ist ein strukturierter InOut-Parameter, der auf die Status-Variable dieser Pumpe verweist; ein Schreiben auf Status.Starts ändert die Daten des Aufrufers.
  • Jeder Aufruf läuft in Programmreihenfolge. Wird ein Aufruf übersprungen, behält er seine Instanz- und Ausgangswerte; ein IF um einen Aufruf ist kein Stoppbefehl. Belege den Sperr- bzw. Stop-Eingang und führe den Baustein aus, um die Pumpe auszuschalten.

Deklariere PumpStatus als PLC-Datentyp und PumpControl als FB. Deklariere DutyControl/StandbyControl in Static für Multiinstanz-Aufrufe. SCL nutzt lokale Variablen mit #, Input/InOut mit := und Output mit =>. Temp-Daten werden in diesem optimierten Lehrmodell bei jedem Aufruf gelöscht.

SPS-Datentyp · TYPE-Dokument
TYPE
    PumpStatus : STRUCT
        Running : BOOL;
        Starts : DINT;
    END_STRUCT;
END_TYPE
FB PumpControl · Schnittstelle
NameBereichDatentyp
StartEingangBOOL
StopEingangBOOL
PermitEingangBOOL
FaultEingangBOOL
RunningOutputBOOL
StatusInOutPumpStatus
LatchStaticBOOL
WasRunningStaticBOOL
FB Rumpf (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;
Zwei Instanzen, aufgerufen aus der Hauptroutine
#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);

Probier es in der Werkbank

Öffne eine beliebige SCL Mission und nutze die PLC-Datentypen und Funktionsbausteine Tabs. Deklariere dann die Instanzen in Bausteinschnittstelle.

  1. Sieh dir den UDT und die Bausteindefinition an, dann die zwei unterschiedlich benannten Instanzen.
  2. Überschreibe im pausierten Zustand Start im Tab Eingänge auf TRUE und gehe mehrere Zyklen einzeln weiter: PumpOn bleibt an und DutyStatus.Starts steigt einmal.
  3. Lass Start los. Die Selbsthaltung hält die Hauptpumpe am Laufen. Starte die Reservepumpe; ihr Startzähler ist unabhängig.
  4. Schalte Fault auf ON: Die Hauptpumpe stoppt sofort, während die Reservepumpe weiterläuft. Drücke Stop im laufenden Betrieb oder überschreibe im pausierten Zustand Stop im Tab Eingänge auf TRUE: Beides stoppt.
  5. Spule einen aufgezeichneten Zyklus zurück und vergleiche die Status-Variablen des Aufrufers mit dem bausteinlokalen Zustand und den ausgeführten Bausteinzeilen.

Der Simulationsvertrag

  • Fester virtueller Task mit 20 ms. Wiedergabegeschwindigkeit und 3D-Bildrate verändern die Ergebnisse nicht.
  • Jedes Testszenario beginnt mit einer frischen Steuerung und einem frischen Anlagenzustand.
  • Änderungen stoppen die Ausführung. Ergebnisse und Replay gehören zur getesteten Programmversion.
  • REAL rechnet mit 32 Bit Genauigkeit. Ein nicht unterstützter Ganzzahl-Überlauf erzeugt eine Diagnose.
  • Zähler halten INT-Werte. Die anderen Zählerbreiten (SINT, DINT und die vorzeichenlosen Typen) und die LTIME-Timer sind hier nicht umgesetzt.
  • Gültige NORM_X/SCALE_X-Berechnungen werden in FBD unterstützt. Ungültige Bereiche stoppen mit einer Diagnose; native ENO-/Fehlerergebnisse werden nicht nachgebildet.
  • Diagramme verwenden einen aktiven Pfad und boolesche N/S/R-Aktionen. Native zeitgesteuerte Aktionen, parallele Pfade und Optionen für den letzten Zyklus oder Reset gehören nicht zu diesem Modell.
  • Die Ganzzahldivision verwirft den Nachkommaanteil: 7 / 2 ist 3. Dezimalvergleiche verwenden die Genauigkeit des Operanden; ein REAL-Wert von 0.1 ist gleich 0.1. Verwende für Divisionen mit Nachkommaanteil einen REAL-Operanden.
  • SCL akzeptiert REAL-Konstanten mit Typ wie REAL#2.0. Mehrdeutige Gleitkommaberechnungen verwenden vor der Zuweisung an eine REAL-Variable die doppelte Genauigkeit der S7-1500.
  • Erhalt der Daten nach dem Aus- und Wiedereinschalten, echte I/O, Netzwerk-Timing und Hersteller-Firmware gehören nicht zum Modell.

Lies die Originaldokumentation

Diese Academy lehrt eine begrenzte Teilmenge. Eine native Überprüfung erfordert Kompilieren und Testen in der genannten Software des Herstellers.

Die Bewertung des Gesprächs läuft in diesem Browser. Der aktuelle Ablauf vor Ort ist ein lokaler Prototyp und kein sicherer Dienst für Fernbewertungen. Die Exportdateien sind Beta und müssen in TIA Portal V20 oder Studio 5000 auf Import und Verhalten geprüft werden.

Das Grundverhalten wurde mit den offiziellen Logix-Handbüchern, dem S7-1200-Handbuch und der Richtlinie zu S7-1200/1500 abgeglichen. Die Siemens-Dokumente sind älter als V20. Das Verhalten von TwinCAT folgt den Referenzseiten zu Beckhoffs Tc2_Standard und dem TwinCAT 3 PLC Handbuch. Diese Prüfung ersetzt keinen Test auf der Zielsteuerung, besonders bei Diagramm-Timing und wiederverwendbaren Bausteinen.

Siemens TIA Portal V20Studio 5000 v38Logix-Handbuch zu FunktionsbausteinenLogix-SFC-HandbuchTwinCAT 3 PLC languagesTwinCAT Tc2_Standard TONTwinCAT Tc2_Standard CTU