SCL LABOR 2.1

Die Werkbank für zyklisches Denken.

LOKAL IM BROWSER Keine Maschinenverbindung
Lernmodell, keine SPS. Dokumentiertes SCL-Subset mit Siemens-SCL als Lernziel. Kein TIA Portal, kein PLCSIM, keine vollständige Kompatibilität und keine Sicherheitsprüfung. Unabhängig von Siemens.
Ersetzt Code und Symbole · setzt den Zustand zurück
0 ms0 ScansVirtuell · Δt = 100 ms / Scan
Nicht übersetztNoch kein gültiger Programmzustand.

01 / PROGRAMM

SCL · Lernsubset

    02 / VIRTUELLE STATION

    Nicht übersetzt
    Virtuelle S7-Lernansicht / Simulation Kein Controller verbunden
    LAB / CONTROLCPUVirtuelles Lernmodell
    RUNSTOPERROR
    SIMULATION / OFFLINE

    Noch kein übersetzter Zustand.

    STOP = Lernpause: letzte Scan-Ausgänge bleiben erhalten. Kein natives SPS-STOP-Verhalten, keine Ersatzwerte.

    03 / PROZESSABBILD

    Scanwerte / Vorgaben
    Eingaben sind Vorgaben für den nächsten Scan. „Scanwert“ zeigt den zuletzt übernommenen Snapshot.

    Adressen sind Lernbeschriftungen, keine Hardwarezuordnung. * REAL direkt als technische Größe, ohne Rohwertskalierung.

    04 / DIAGNOSE

    Worker · transaktionale Scans

    Noch kein übersetztes Programm.

    Fehlermeldung wählen → Codeposition öffnen · Ctrl / ⌘ Enter: Übersetzen · Tab: Einrücken
    05 / Externe Symboltabelle bearbeiten BOOL · INT · REAL · TIME · Instanzen

    Ein Symbol wählen und seine Definition übernehmen oder neu hinzufügen. Jede Änderung stoppt die Ausführung und erfordert erneutes Übersetzen. Externe Werte starten bei FALSE / 0. Quelltext-Deklarationen erscheinen nach dem Übersetzen im Monitor und werden nur im Code geändert. Namenskonflikte werden abgewiesen.

    NameBereichTypAdresse / HinweisAktion

    06 / Projektdatei Import & Export · lokal · JSON
    Nur Code + Symbole · JSON · max. 64 KB · kein Upload

    V2-Grammatik, Zeitmodell & Sicherheitsgrenzen
    KonstruktExakt unterstützte Form / Regel
    DeklarationVAR_INPUT | VAR_OUTPUT | VAR | VAR_TEMP
    Name [, Name] : BOOL | INT | REAL | TIME [:= Literal];
    END_VAR
    — nur vor Anweisungen. VAR zusätzlich TON / TOF / TP / CTU / CTD ohne Initialwert. Namen immer mit # referenzieren; case-insensitiv. Externe Tabelle zuerst, dann Code; jede Namenskollision ist ein Fehler.
    SpeicherVAR/VAR_OUTPUT bleiben zwischen Scans erhalten. VAR_TEMP startet jeden Scan erneut beim Literal bzw. FALSE/0. Compile/Reset stellt alle Initialwerte her, keine Remanenz über Neuladen. Eingänge und Instanzfelder sind schreibgeschützt.
    AuswahlCASE INT-Ausdruck OF -1, 2..4: Anweisungen ELSE Anweisungen END_CASE; — ELSE optional, inklusive INT-Konstanten −32768…32767, keine Überlappung.
    SchleifenFOR #i := INT TO INT [BY INT] DO … END_FOR;
    WHILE BOOL DO … END_WHILE;
    REPEAT … UNTIL BOOL END_REPEAT;
    — FOR schreibbares INT, Grenzen/BY einmal abgetastet, BY ≠ 0, inklusive Grenze. Letzte ausgeführte Variable bleibt stehen. Jede Iteration verbraucht Budget, auch leer. EXIT/CONTINUE abgewiesen.
    Timer#t(IN := BOOL, PT := TIME); TON/TOF/TP, nur .Q/BOOL und .ET/TIME lesen. TOF schaltet bei TRUE sofort ein, FALSE-Flanke startet Verzögerung mit ET=0; TRUE bricht Verzögerung ab. TP startet bei steigender Flanke, läuft unabhängig von IN; aktive Pulse ignorieren weitere Flanken, gehaltenes TRUE retriggert nicht. PT=0: TON sofort TRUE, TOF bei FALSE sofort FALSE, TP kein Puls. PT wird während aktiver Zeitmessung bei jedem Aufruf neu angewendet. Abgeschlossener TOF hält Q=FALSE/ET bis TRUE; größeres PT startet ihn nicht neu.
    Zähler#u(CU := BOOL, R := BOOL, PV := INT);
    #d(CD := BOOL, LD := BOOL, PV := INT);
    — CTU/CTD, nur .Q/BOOL und .CV/INT lesen. PV 0…32767. Nur steigende Flanke zählt; R/LD hat Priorität und speichert trotzdem den Eingang. CTU sättigt bei 32767, Q = CV ≥ PV; CTD sättigt bei 0, Q = CV = 0. Initial CV=0, CTD.Q=TRUE.
    InstanzaufrufeAlle benannten Parameter sind Pflicht, Reihenfolge beliebig, keine doppelten/unbekannten. Pro Instanz höchstens ein syntaktischer Aufruf und ein ausgeführter Aufruf pro Scan; Schleifen-Mehrfachaufruf ist Laufzeitfehler. Ausgelassener Aufruf hält sichtbare Werte und Flankenspeicher. Spätere Timeraufrufe berücksichtigen virtuelle Zeit seit Start, nicht Wanduhrzeit.
    Reine FunktionenABS(x), MIN(a,b), MAX(a,b), LIMIT(lo,x,hi) für INT/REAL (gemischt → REAL); lo > hi ist Fehler. BOOL_TO_INT(BOOL) → 0/1; INT_TO_REAL(INT); REAL_TO_INT(REAL) rundet nächste Ganzzahl, halbe Werte weg von Null; INT-Grenzen geprüft. Keine weiteren Bibliotheksfunktionen.
    Limits20.000 Quellzeichen · 6.000 Tokens · 2.000 AST-Knoten · 48 Parse-Ebenen · 20.000 Compile-Operationen und 20.000 Scan-Operationen (inklusive Schleifen und Auswahl). Maximal 64 Symbole gesamt. Worker-Zeitlimit 2500 ms; Projektdatei 65536 UTF-8-Bytes. Fehler verwerfen den gesamten Scan.

    Unterstützt

    Symbole aus Deklarationen und externer Tabelle, mit # und ohne Beachtung der Groß-/Kleinschreibung. BOOL, INT, REAL, TIME und TON/TOF/TP/CTU/CTD-Instanzen. Zuweisungen, IF / ELSIF / ELSE / END_IF; Klammern; TRUE/FALSE; AND, OR, XOR, NOT; + − * / MOD; = <> < > <= >=. Kommentare // und (* … *).

    Priorität: unär → * / MOD → + − → Vergleiche → AND → XOR → OR. Beide Operanden werden ausgewertet. / ergibt REAL, MOD benötigt INT. INT wird nur nach REAL automatisch erweitert.

    Zahlen bewusst vereinfacht

    INT: Ganzzahlen −32768…32767 bei Eingabe und Zuweisung, kein Umlauf. Zwischenwerte sind exakt darstellbare JS-Ganzzahlen (kein 16-Bit-Überlaufmodell). REAL: endliches IEEE-754 binary64 statt Siemens REAL/binary32. TIME: nichtnegative ganzzahlige Millisekunden bis 2147483647, Literale z. B. T#2s oder T#1m200ms (ganze Komponenten d/h/m/s/ms, addiert). Keine TIME-Arithmetik.

    Ein Scan = 100 virtuelle Millisekunden

    Zu Beginn werden alle Eingangsvorgaben atomar übernommen. Anweisungen laufen von oben nach unten. Spätere Anweisungen sehen vorherige Schreibzugriffe; unbeschriebene Ausgänge und Speicher bleiben erhalten. Pause bedeutet keine Scans, kein Zeitfortschritt. Run fordert etwa alle 100 ms einen Scan an, ohne Nachholen: Hintergrundtabs können langsamer sein. Die virtuelle Zeit ist nicht die Wanduhr.

    TON: #Delay(IN := #Start, PT := T#2s); liest .Q und .ET. Erste TRUE-Abtastung: ET=0, danach Fortschritt in 100-ms-Schritten, begrenzt auf PT. PT=0 schaltet sofort. FALSE setzt ET/Q zurück. Pro Instanz genau ein Aufruf im Quelltext erlaubt. Ohne ausgeführten Aufruf bleiben ET/Q unverändert; ein späterer Aufruf berücksichtigt die seit der Flanke vergangene virtuelle Zeit. Reset und Übersetzen stellen alle Initialwerte und Eingangsvorgaben her.

    Nicht unterstützt / keine reale Steuerung

    Keine Arrays, Strings, DB/OB/FB/FC-Struktur, EXIT/CONTINUE, benutzerdefinierten Funktionen, weiteren IEC-/Siemens-Bibliotheken oder Hardware. Die Tabelle oben ist die vollständige Grammatik dieses Lernsubsets. Unbekannte Syntax wird als Fehler abgewiesen. Quelltext-, Token-, AST-, Tiefen- und Operationslimits; Parser und Scans laufen im Web Worker. Bei Laufzeitfehlern wird der gesamte Scan zurückgerollt und angehalten. Keine Netzwerk-Ausführung, Konten, Telemetrie oder echten Anlagenanschlüsse. Nicht für Anlagenbetrieb oder Sicherheitsfunktionen verwenden.