Le istruzioni descrivono come vengono utilizzate le diverse espressioni.
In ST è possibile utilizzare le seguenti istruzioni:
Istruzione |
Esempio |
---|---|
|
|
Chiamata di un blocco funzione e uso dell'uscita del blocco funzione |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
istruzione vuota |
|
Assegnazione predefinita
A sinistra dell'assegnazione è presente l'operando (variabile, indirizzo) a cui il valore dell'espressione a destra è assegnato dall'operatore di assegnazione :=
.
Vedere anche la descrizione dell'operatoreMOVE
MOVE, che ha la stessa funzione.
Per un esempio con assegnazione, consultare il paragrafo Esempio di una chiamata con assegnazioni del capitolo Chiamata di un blocco funzione.
Esempio
a:= b;
a
recupera il valore di b
.
Imposta l'operatore S=
Il valore verrà impostato: se viene impostato su TRUE, resterà TRUE.
Esempio
a S= b;
a
è impostato su TRUE se b
è TRUE durante l'elaborazione dell'assegnazione.
Se b
è FALSE durante l'elaborazione dell'assegnazione, il valore di a
non viene modificato.
Azzera l'operatore R=
Il valore verrà reimpostato: se viene impostato su FALSE, resterà FALSE.
Esempio
a R= b;
a
è impostato su FALSE non appena b
= TRUE.
Esempio
a S= b R= fun1(par1,par2)
In questo caso, b
sarà il valore di uscita reimpostato di fun1
. a
, tuttavia, non ottiene il valore impostato di b
, ma il valore di uscita impostato di fun1
.
Si tenga presente che un'assegnazione può essere utilizzata come un'espressione. Si tratta di un'estensione dello standard IEC 61131-3.
Operatore assegnazione REF
Questo operatore genera un riferimento a un valore.
Sintassi
<variable name> REF= <variablename> ;
Esempio
refA : REFERENCE TO DUT;
B : DUT;
C : DUT;
A REF= B; // corresponds to A := ADR(B);
A := C; // corresponds to A^ := C;
Un blocco funzione (abbreviato FB, Function Block) viene chiamato in un testo strutturato secondo la seguente sintassi:
<nome dell'istanza FB>(variabile di ingresso FB:=<valore o indirizzo>|, <ulteriore variabile di ingresso FB:=<valore o indirizzo>|...ulteriori variabili di ingresso FB);
Esempio
Nell'esempio che segue, un blocco funzione timer (TON
) viene chiamato con assegnazioni per i parametri IN
e PT
. La variabile risultante Q
viene assegnata alla variabile A
. Il blocco funzione del timer viene istanziato da TMR:TON;
. La variabile risultante, come in IL, viene indirizzata secondo la sintassi <nome istanza FB>.<variabile FB>:
TMR(IN := %IX5, PT := 300);
A:=TMR.Q;
È disponibile anche un'altra sintassi per le uscite:
fb(in1:=myvar, out1=>myvar2);
RETURN
Utilizzare l'istruzione RETURN
per lasciare una POU.
Sintassi
RETURN;
Esempio
IF b=TRUE THEN
RETURN;
END_IF;
a:=a+1;
Se b
è TRUE, l'istruzione a:=a+1;
non viene eseguita. Di conseguenza, il POU viene lasciata immediatamente.
IF
Con l'istruzione IF
, è possibile testare una condizione e, a seconda di questa condizione, eseguire le istruzioni.
Sintassi
IF <boolean_expression1> THEN
<IF_instructions>
{ELSIF <boolean_expression2> THEN
<ELSIF_instructions1>
..
..
ELSIF <boolean_expression n> THEN
<ELSIF_instructions-1>
ELSE
<ELSE_instructions>}
END_IF;
Il segmento tra parentesi graffe {} è facoltativo.
Se <espressione_booleana1> restituisce TRUE, vengono eseguite solo <istruzioni_IF> e, di conseguenza, nessuna delle altre istruzioni. In alternativa, le espressioni booleane, che iniziano con <espressione_booleana2>, sono valutate una dopo l'altra fino a che una non restituisce TRUE. Solo le istruzioni che si trovano dopo questa espressione booleana e prima del successivo ELSE o ELSIF vengono valutate. Se nessuna delle espressioni booleane restituisce TRUE, vengono valutate solo le istruzioni <istruzioni_ELSE>.
Esempio
IF temp<17
THEN heating_on := TRUE;
ELSE heating_on := FALSE;
END_IF;
In questo esempio, il riscaldamento viene acceso quando la temperatura scende sotto 17 gradi. Altrimenti, resta spento.
CASE
Con l'istruzione CASE
, è possibile combinare varie istruzioni condizionate con la stessa variabile di condizione in un costrutto.
Sintassi
CASO <Var1> DI
<value1>: <instruction 1>
<value2>: <instruction 2>
<value3, value4, value5>: <instruction 3>
<value6..value10>: <instruction4>
..
..
<value n>: <instruction n>
ELSE <ELSE instruction>
END_CASE;
Un'istruzione CASE
viene elaborata secondo il seguente modello:
Se la variabile in <Var1>
ha valore <Valore I>, viene eseguita l'istruzione <Istruzione I>.
Se <Var 1>
non ha nessuno dei valori indicati, verrà eseguita <Istruzione ELSE>.
Se la stessa istruzione deve essere eseguita per più valori delle variabili, è possibile scrivere questi valori uno dopo l'altro, separati da virgole, esprimendo la condizione dell'esecuzione comune.
Se la stessa istruzione deve essere eseguita per una gamma di valori di una variabile, scrivere il valore iniziale e quello finale separandoli da due punti. In tal modo, si esprime la condizione della condizione comune.
Esempio
CASE INT1 OF
1, 5: BOOL1 := TRUE;
BOOL3 := FALSE;
2: BOOL2 := FALSE;
BOOL3 := TRUE;
10..20: BOOL1 := TRUE;
BOOL3:= TRUE;
ELSE
BOOL1 := NOT BOOL1;
BOOL2 := BOOL1 OR BOOL2;
END_CASE;
FOR
Con il loop FOR
, è possibile programmare processi ripetuti.
Sintassi
INT_Var:INT;
FOR <INT_Var> := <INIT_VALUE> TO <END_VALUE> {BY <dimensioni passo>} DO
<Istruzioni>
END_FOR;
Il segmento tra parentesi graffe {} è facoltativo.
Le <istruzioni> sono eseguite finché il contatore <INT_Var>
non è maggiore di <END_VALUE>. Questo viene verificato prima dell'esecuzione delle <istruzioni>, in modo che queste non vengano eseguite se <INIT_VALUE> ha valore maggiore di <END_VALUE>.
Quando le <istruzioni> vengono eseguite, <INT_Var>
è aumentato di <Dimensioni passo>. Le dimensioni del passo possono avere qualsiasi valore intero. Se non viene specificato, è impostato a 1. Il loop termina quando <INT_Var>
è maggiore di <END_VALUE>.
Esempio
FOR Counter:=1 TO 5 BY 1 DO
Var1:=Var1*2;
END_FOR;
Erg:=Var1;
Si supponga che l'impostazione predefinita di Var1
sia 1. Il valore sarà quindi 32 dopo il loop FOR
.
FOR
.
AVVERTIMENTO | |
---|---|
È possibile utilizzare l'istruzione CONTINUE
in un loop FOR
. Si tratta di un'estensione dello standard IEC 61131-3.
WHILE
Un'alternativa al loop FOR
è il loop WHILE
, che esegue il loop se, e finché, una condizione booleana è e resta TRUE. Se la condizione non è inizialmente TRUE, il loop non viene eseguito. Se la condizione che inizialmente era TRUE diventa FALSE, il loop viene terminato.
Sintassi
WHILE <boolean expression> DO
<istruzioni>
END_WHILE;
Evidentemente, l'espressione booleana iniziale e continuativa deve assumere un valore FALSE in un punto delle istruzioni del loop. Altrimenti, il loop non verrà terminato, creando una condizione di loop infinita.
AVVERTIMENTO | |
---|---|
Di seguito è riportato un esempio di istruzioni del loop che ne provocano la conclusione:
WHILE Counter>0 DO
Var1 := Var1*2;
Counter := Counter-1;
END_WHILE
È possibile utilizzare l'istruzione CONTINUE
in un loop WHILE
.
REPEAT
Il loop REPEAT
è un'alternativa al loop FOR
, come per il loop WHILE
. Il loop REPEAT
differisce dal loop WHILE
perché la condizione di uscita viene valutata solo dopo che il loop è stato eseguito almeno una volta, al suo termine.
Sintassi
REPEAT
<istruzioni>
UNTIL <boolean expression>
END_REPEAT;
Le <istruzioni> sono eseguite ripetutamente, finché l'<espressione booleana> non restituisce TRUE. Se l'<espressione booleana> è prodotta già alla prima valutazione UNTIL, le <istruzioni> vengono eseguite solo una volta. L'<espressione booleana> deve assumere il valore TRUE in un punto delle istruzioni del loop. Altrimenti, il loop non verrà terminato, creando una condizione di loop infinita.
AVVERTIMENTO | |
---|---|
Di seguito è riportato un esempio di istruzioni del loop che ne provocano la conclusione:
REPEAT
Var1 := Var1*2;
Counter := Counter-1;
UNTIL
Counter<=0
END_REPEAT;
È possibile utilizzare l'istruzione CONTINUE
in un loop REPEAT
. Si tratta di un'estensione dello standard IEC 61131-3.
CONTINUE
In quanto estensione dello standard IEC 61131-3, l'istruzione CONTINUE
è supportata dai loop FOR
, WHILE
e REPEAT
. CONTINUE
fa in modo che l'esecuzione proceda con il successivo ciclo di loop.
Esempio
FOR Counter:=1 TO 5 BY 1 DO
INT1:=INT1/2;
IF INT1=0 THEN
CONTINUE; (* to avoid division by zero *)
END_IF
Var1:=Var1/INT1; (* only executed, if INT1 is not "0" *)
END_FOR;
Erg:=Var1;
EXIT
L'istruzione EXIT
termina il loop FOR
, WHILE
o REPEAT
in cui si trova senza considerare altre condizioni.
JMP
È possibile utilizzare l'istruzione JMP
per un salto incondizionato a una riga di codice contrassegnata da una label di salto.
Sintassi
JMP <label>;
La <label> è un identificatore arbitrario ma univoco, collocato all'inizio di una riga di programma. L'istruzione JMP
deve essere seguita dall'indicazione della destinazione del salto, che deve corrispondere a una label predefinita.
AVVERTIMENTO | |
---|---|
Di seguito è riportato un esempio di istruzioni nelle condizioni logiche create che evita loop infiniti tra il salto e la sua destinazione:
aaa:=0;
_label1: aaa:=aaa+1;
(*instructions*)
IF (aaa < 10) THEN
JMP _label1;
END_IF;
Se la variabile i
, inizializzata con 0, ha valore inferiore a 10, l'istruzione di salto dell'esempio riportato sopra determina un ritorno ripetuto alla riga di programma definita dall'etichetta _label1
. Porta quindi all'elaborazione ripetuta delle istruzioni comprese tra l'etichetta e l'istruzione JMP
. Poiché le istruzioni includono anche l'incremento della variabile i
, la condizione di salto viene violata (al nono controllo) e il flusso del programma procede.
Per ottenere questa funzionalità, nell'esempio è anche possibile utilizzare un loop WHILE
o REPEAT
. In generale, è meglio evitare di utilizzare le istruzioni di salto, perché riducono la leggibilità del codice.
In un oggetto di testo strutturato è possibile inserire i commenti in due modi:
Iniziare il commento con (*
e chiuderlo con *)
. I commenti inseriti in questo modo possono occupare più righe. Esempio: (*Questo è un commento.*)
I commenti su riga singola sono un'estensione dello standard IEC 61131-3: //
indica l'inizio del commento, che termina alla fine della riga. Esempio: // Questo è un commento.
I commenti possono essere posizionati ovunque nella parte di dichiarazione o di implementazione dell'editor ST.
Commenti nidificati: è possibile inserire commenti all'interno di altri commenti.
Esempio
(*
a:=inst.out; (* to be checked *)
b:=b+1;
*)
In questo esempio, il commento che inizia con la prima parentesi non è chiuso dalla parentesi che segue checked
, ma solo dall'ultima.