Podręcznik
3. Języki (metody) programowania (arkusz IEC 1131-3)
3.4. Język ST (Język tekstu strukturalnego)
Zgodnie z normą IEC 1131-3 Język ST (ang. Structural Text) jest odpowiednikiem języka algorytmicznego wysokiego poziomu, zawierający struktury programowe i polecenia podobne do występujących w językach typu PASCAL lub C.
Składnikiem języka ST jest wyrażenie. Jest ono konstrukcją języka, która po wyznaczeniu jej wartości wytwarza wartość zgodną z jednym z typów danych, określonych w p.3.3.3. Wyrażenia są tworzone z operatorów oraz operandów. Operatorem może być literał, którego definicje podano w p.3.3.3 jak również zmienna może być zmienną zgodnie z p.3.3.3.
Operatory języka ST
Wyznaczanie wartości wyrażenia obejmuje zastosowanie operatorów do operandów w kolejności wynikającej z określonego w normie pierwszeństwa operatorów. Najpierw stosowany jest operator mający najwyższe pierwszeństwo (priorytet) w wyrażeniu, potem stosowany jest operator o kolejnym niższym pierwszeństwie, itd., aż do zakończenia procesu wyznaczania wartości. Operatory języka ST zawarto w Tabeli 21.
Tabela 21: Operatory języka ST
Lp. |
Operacja |
Symbol |
Priorytet |
1. |
Wyrażenie nawiasowe |
(Wyrażenie) |
NAJWYŻSZY |
2.
|
Obliczanie wartości funkcji Przykłady: |
Identyfikator LN(A), MAX(X, Y), itd. |
|
3. |
Potęgowanie |
** |
|
4. 5. |
Negacja Uzupełnienie |
- NOT |
|
6. 7. 8. |
Mnożenie Dzielenie Modulo |
* / MOD |
|
9. 10. |
Dodawanie Odejmowanie |
+ - |
|
11. |
Porównanie |
<, >, <=, >= |
|
12. 13. |
Równość Nierówność |
= <> |
|
14. 15. |
Boolowskie AND Boolowskie AND |
& AND |
|
16. |
Boolowskie wykluczające OR (ExOR) |
XOR |
|
17. |
Boolowskie OR |
OR |
NAJNIŻSZY |
Norma IEC 1131-3 stanowi, że operatory o jednakowym pierwszeństwie mogą być stosowane w kolejności ich zapisu w wyrażeniu, począwszy od strony lewej do prawej. Na przykład, gdy A=1, B=2, C=3 i D=4, czy są typu INT, to wyrażenie A + B – C * ABS(D) będzie miało wartość „-9”, natomiast wyrażenie przy tych samych danych (A + B – C) * ABS(D) będzie miało wartość „0”.
Jeśli operator ma dwa operandy, najpierw określana jest wartość operandu w skrajnym lewym położeniu. Na przykład w wyrażeniu SIN(A) * COS(B) najpierw wyznaczana będzie wartość wyrażenia SIN(A), następnie COS(B), po czym dopiero wartość iloczynu.
Wartości wyrażeń boolowskich mogą być określone tylko w zakresie niezbędnym do wyznaczania wartości wynikowej. Na przykład, gdy A<=B, to wyznaczając tylko wartość wyrażenia (A>B) można stwierdzić, że wartość wyrażenia (A>B) & (C<D) jest równa boolowskiej zero.
dd
Instrukcje języka ST
Instrukcje języka ST zgodne z normą IEC 1131-3 podano w Tabeli 22. Norma stanowi, że instrukcje te powinny być w programie dla sterownika PLC zakończone średnikami „ ; ”.
Tabela 22: Instrukcje języka ST
Lp. |
Typ instrukcji/Odniesienie |
Przykłady użycia |
1. |
Przypisanie |
A := B; CV := CV+1; Y := SIN(X); D := INT_TO_REAL(C) |
2. |
Wywołanie bloku funkcjonalnego (funkcji) oraz użycie wyjścia FB |
CMD_TMR(IN:=%IX5, PT:= T#300ms); A:=CMD_TMR.Q; |
3. |
RETURN |
RETURN; |
4. |
IF |
D:= B*B - 4*A*C; (* oblicz wyróżnik *) IF D < 0.0 THEN NROOTS:= 0; (* brak pierwiastków *) ELSIF D = 0.0 THEN (* jeden pierwiastek *) NROOTS := 1; X1 := – B / (2.0*A); ELSE (* dwa pierwiastki *) NROOTS := 2; X1 := (–B + SQRT(D))/(2.0*A); X2 := (–B – SQRT(D))/(2.0*A); END_IF; |
5. |
CASE |
ERROR:=0; (* zmienna boolowska *) XW:=BCD_TO_INT(Y); (* wyznacz wartość wybieraka *) CASE XW OF (* instrukcja wyboru *) 1,4 : DISPLAY := TEKST1; 2 : DISPLAY := TEKST2; (* blok instrukcji ) Y := SIN(Z); (* kolejne instrukcje, gdy XW = 2 *) 3,5..10: DISPLAY := STATUS (XW – 3); ELSE DISPLAY := ’’; (* XW poza zakresem 1..10 *) ERROR := 1; END_CASE; (* koniec instrukcji wyboru *) |
6. |
FOR |
J := 101; FOR I := 1 TO 100 BY 2 DO IF WORDS(I) = ’KEY’ THEN J := I; EXIT; END_IF; END_FOR; |
7 |
WHILE |
J := 1; WHILE J <= 100 AND WORDS(J) <> ’KEY’ DO J := J+2; END_WHILE; |
8. |
REPEAT |
J := –1; REPEAT J := J+2; UNTIL J = 101 OR WORDS(J) = ’KEY’ END_REPEAT; |
9. |
EXIT |
EXIT; |
10 |
Instrukcja pusta |
; |
UWAGA: Jeśli jest realizowana instrukcja EXIT, to powinna być ona zaimplementowana we wszystkich instrukcjach FOR, WHILE, REPEAT, które są realizowane w danej implementacji. |
Opis instrukcji języka ST
Ad1: Instrukcja przypisania zastępuje bieżącą wartość pojedynczej lub wieloelementowej zmiennej wynikiem procesu określania wartości wyrażenia. Instrukcja przypisania powinna zawierać odniesienie do zmiennej, która znajduje się z lewej strony po której następuje operator przypisania „ := „, a następnie wyrażenie, którego wartość będzie wyznaczana. Na przykład instrukcja A := B; będzie wykorzystana do zastąpienia pojedynczej danej zmiennej A bieżącą wartością B, w przypadku gdy obie te wartości są typu INT.
Ad2: Instrukcje sterujące funkcji i bloku funkcji składają się z mechanizmów wywoływania bloków funkcji FB oraz zwracania sterowania jednostce wywołującej przed fizycznym końcem funkcji lub bloku funkcji. Takie wywołanie może stanowić część wyznaczania wartości wyrażenia.
Bloki funkcji FB mogą być wywołane za pomocą instrukcji zawierającej nazwę bloku funkcji, za którą umieszczona jest w nawiasie lista wartości przypisanych nazwanym parametrom wejściowym, jak podaje Tablica 22. Kolejność, w jakiej parametry wejściowe są wyspecyfikowane w wywołaniu bloku funkcji nie powinna być istotna. Nie jest wymagane, aby wszystkim parametrom wejściowym były przypisywane wartości przy każdym wywołaniu bloku funkcji. Jeśli w wywołaniu bloku funkcji określonemu parametrowi nie jest przypisana wartość, to powinna być stosowana wartość poprzednia lub początkowa, jeżeli nie było żadnego wcześniejszego przypisania.
Ad3: Instrukcja RETURN stwarza możliwość wcześniejszego wyjścia z funkcji lub bloku funkcji, np. w rezultacie określenia wartości instrukcji IF.
Ad 4: Instrukcja IF jest jedną z instrukcji wyboru, tzw. warunkowe rozgałęzienie programu. Instrukcja ta określa, że grupa instrukcji będzie wykonywana tylko wówczas gdy wartość związanego z nią wyrażenia boolowskiego (tzw. warunku) będzie wynosiła „1”. Jeżeli wynikiem sprawdzenia tego warunku będzie „0”, to nie będzie wykonywana żadna instrukcja lub będzie wykonana grupa instrukcji występująca po słowie kluczowym ELSE lub po słowie kluczowym ELSIF, jeżeli związany warunek boolowski będzie równy „1”.
Ad 5: Instrukcja CASE jest drugą z tzw. instrukcji wyboru. Instrukcja ta zawiera wyrażenie, które może być sprowadzone do zmiennej typu INT („selektor”) oraz listy grup instrukcji, przy czym każda grupa jest oznakowana jedną lub wieloma liczbami całkowitymi lub zakresami wartości całkowitych. W ten sposób określa się, że będzie wykonana pierwsza grupa instrukcji, w której zakresie znajduje się wyliczona wartość. Jeżeli wartość nie występuje w żadnym z zakresów to wykonywana będzie sekwencja instrukcji znajdująca się za słowem kluczowym ELSE, w przypadku, gdy występuje ono w instrukcji CASE. W innych przypadkach nie będzie wykonywana żadna z sekwencji instrukcji.
Ad6÷8: Instrukcje FOR, WHILE oraz REPEAT należą do grupy tzw. instrukcji iteracji, czyli czynności powtarzania tej samej operacji w pętli przez z góry określoną liczbę razy lub aż do spełnienia określonego warunku (boolowskiego). W instrukcjach tych określono, że grupa związanych z nimi instrukcji powinna być wykonywana repetycyjnie. Instrukcja FOR jest wykorzystywana wówczas, gdy liczba iteracji może być określona wcześniej, natomiast w innych przypadkach są stosowane instrukcje WHILE lub REPEAT.
Ad9: Instrukcja EXIT może być wykorzystana do zakończenia iteracji przed spełnieniem warunku zakończenia iteracji. Jeśli instrukcja EXIT znajduje się wewnątrz zagnieżdżonej konstrukcji iteracyjnej, wyjście powinno nastąpić z najbardziej wewnętrznej pętli, w której ta instrukcja jest umieszczona, zaś sterowanie powinno być przekazane do instrukcji znajdującej się bezpośrednio za znakiem końca pierwszej pętli (END_FOR, END_WHILE lub END_REPEAT), występującym po instrukcji EXIT. Przykład użycia instrukcji EXIT pokazuje poniższy fragment programu w języku ST:
SUM := 0;
FOR I := 1 TO 3 DO
FOR J := 1 TO 2 DO
IF FLAG THEN EXIT; END_IF
SUM := SUM + J;
END_FOR;
SUM := SUM + I;
END_FOR;
W wykonaniu instrukcji przedstawionych w powyższym fragmencie programu, który został utworzony w języku ST, wartość zmiennej SUM będzie wynosiła 15 wówczas, gdy wartość zmiennej boolowskiej FLAG wyniesie „0”, zaś wynosić 6, gdy wartość zmiennej boolowskiej FLAG wyniesie „1”.
Przykład programu dla sterownika PLC w języku ST
VAR_INPUT
We : BOOL;
Y : INT;
Yzad : INT;
Tz : TIME := t#100ms;
Tw : TIME := t#100ms;
END_VAR
VAR_OUTPUT
Q : BOOL;
END_VAR
VAR
Timer_ON : TON;
Timer_OFF : TON;
FlipFlop : SR;
END_VAR
IF We THEN
IF (Y < Yzad) THEN
Timer_ON(IN: = We, PT := Tz);
END_IF;