Quello che segue è un Emulatore di PLC Siemens Simatic S5 realizzato in JavaSaript quindi compatibile con tutti i moderni browser.

Sgart.it - Emulatore PLC Siemens S5 - v. 0.1 (BETA)

Cicle: 0

  
Per interagire con l'eulatore, avvialo tramite il pulsane run e clicca sugli ingressi verdi (vedi esempi)

E' un progetto che avevo in testa da molto tempo ma solo ora ho trovato il "tempo" di realizzarlo.
Tramite JavaScript ho cercato di emulare l'hardware di un Controllore logico programmabile PLC (Programmable Logic Controller) della Siemens serie Simatic Step 5 (S5) che usavo tempo fa nel mio precedente lavoro. Per la precisione l'hardware emulato è una CPU 103 e la momeoria e di circa 10000 word.
Si tratta di un PLC ormai superato dalla nuova serie S7 ma esistono ancora molte installazioni che lo usano e comque penso possa tornare utile a livello didattico per provare piccoli programmi. Dico piccoli ma in realta si dovrebbero poter scrivere anche grossi programmi solo che non penso siano utili in un ambiente di emulazione.
Si tratta di una versione beta a cui mancano alcune funzioni e soprattutto non ho avuto ancora il tempo di testare tutto adeguatamente.
Se trovi delle anomalie puoi segnalarmele alla mail info[at]sgart.it

L'emulatore supporta sia il linguaggio con la notazione inglese STL (Statement List a) che quella tedesca AWL (Anweisungs-Liste). Nel menu a tendina trovi qualche esempio.

L'emulatore parte cercando di interpretare le istruzioni e/o direttive (parser), se trova delle variabili prima le sostituisce e poi "parsa" la riga. Il risultato è l'ottenimento dell'Opcode (codice macchina) che solitamente corrisponde a 1 word (2 byte) e in alcuni casi 2 word. La fase successiva e quella di link per risolvere i salti definti tramite label (stringa di caratteri) e ricavare l'esatto indirizzo di memoria.

Sono supportati tutti i tipi di blocchi OB (Organization Block), PB (Program Block), FB (Function Block) , SB (Sequence Block) e DB (Data Block).
Le istruzioni di base sono implemetate quasi tutte (logiche, lettura, trasferimento, salti assoluti, condizionali...) più sotto trovi l'elenco delle esclusioni.
Le caratteristiche dell'emulatore sono:
  • Ingressi 128 byte
  • Uscite 128 byte
  • Flag 256 byte
  • Temporizzatore 128 byte
  • Contatori 128 byte
  • Blocchi OB 256 byte
  • Blocchi PB 256 byte
  • Blocchi FB 256 byte
  • Blocchi SB 256 byte
  • Blocchi DB 256 byte
  • Memoria 10240 words

E' possibile inserire delle direttive/impostazioni prima delle istruzioni per controllare il comportamento dell'emulatore. Le direttive devono avere come primo carattere sulla line la chiocciola @:
  • @PIO= permette di definire la sequenza degli ingressi (I o E), uscite (Q o A) e flag (F o M) disegnati in altro. Gli ingressi verdi sono cliccabili. Es.: @PIO=IIQQF
  • @AUTORUN= se presente ed ha il valore on indica che il codice deve andare in esecuzione appena caricato, in caso contrario è necessario premere il pulsante run
  • @LANGUAGE=DE se presente il codice viene interpretato in AWL quindi con le istruzioni in lingua tedesca

Tramite il carattere cancelletto # è possibile inserire dei commenti.
Sono gestite le variabile a cui è possibile assegnare dei valori per rendere più leggibile il codice (vedi esempi). Le variabili devono essere definite prima del loro utilizzo al di fuori di qualsiasi blocco e devono iniziare con il caattere meno - seguito da delle lettere (es.: -PSTOP = 0.0 ).


L'elaborazione del programma avviene secondo lo schema classico, ovvero:
  • vengono letti gli ingressi
  • viene elaborato il programma
  • viene trasferito il risultato sulle uscite
la sequenza si ripete all'infinito finchè non si preme il pulsante stop.

Il programma parte sempre da OB 1 quando questo non è presente ne viene generato uno dal parser con un salto assoluto al primo blocco (non DB) definito.
Cosa manca e note:
  • La gestione dei blocchi OB speciali (OB 21, 22, 34...) solo OB 1 è supportato
  • Il Data Block 1 (DB1) non è supportato
  • I Function Block non supportano i parametri e sono trattati come PB
  • Le istruzioni relative agli operandi forlami dei blocchi FB non sono ancora implementate
  • Le istruzioni di accesso diretto alla memoria non sono supportate
  • Gli interrupt non sono supportati
  • Non sono anora implementate le istruzioni O (OR) e A (AND) per il momento vanno usati i corrispettivi con le parentesi O( e A( e chiusi alla fine con ) (il numero massimo di parentesi annidabili è 6)
  • Non è implementato il Watchdog quindi occhio ai cicli infiniti (lo stack delle chiamate è limitato a 16 livelli)
  • il tempo di ciclo visualizzato im millisecondi è puramente indicativo e dipende dal tuo hardware/software (pc / browser)
  • e qualcos'altro che mi sono sicuramente dimenticato di elencare
Per far funzionare l'emulatore è necessario avere una delle ultime versione dei browser in grado di supportare l'elemento canvas.
Tieni anche presente che un browser recente permettere l'esecuzione del codice JavaScript in modo molto più efficente e veloce... oltre ad essere più sicuro.

Vanno sicuramente bene le ultime versione di Firefox, Chrome, Opera, Safari e Internet Explorer dalla versione 9, meglio dalla 10.

Vedi anche Simatic S5 PLC