01 / PROGRAMM
SCL · Lernsubset02 / VIRTUELLE STATION
Nicht übersetztNoch kein übersetzter Zustand.
STOP = Lernpause: letzte Scan-Ausgänge bleiben erhalten. Kein natives SPS-STOP-Verhalten, keine Ersatzwerte.
03 / PROZESSABBILD
Scanwerte / VorgabenAdressen sind Lernbeschriftungen, keine Hardwarezuordnung. * REAL direkt als technische Größe, ohne Rohwertskalierung.
04 / DIAGNOSE
Worker · transaktionale ScansNoch kein übersetztes Programm.
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.
| Name | Bereich | Typ | Adresse / Hinweis | Aktion |
|---|
06 / Projektdatei Import & Export · lokal · JSON
V2-Grammatik, Zeitmodell & Sicherheitsgrenzen
| Konstrukt | Exakt unterstützte Form / Regel |
|---|---|
| Deklaration | VAR_INPUT | VAR_OUTPUT | VAR | VAR_TEMP — 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. |
| Speicher | VAR/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. |
| Auswahl | CASE INT-Ausdruck OF -1, 2..4: Anweisungen ELSE Anweisungen END_CASE; — ELSE optional, inklusive INT-Konstanten −32768…32767, keine Überlappung. |
| Schleifen | FOR #i := INT TO INT [BY INT] DO … END_FOR; — 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); — 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. |
| Instanzaufrufe | Alle 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 Funktionen | ABS(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. |
| Limits | 20.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.