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.

Język wysokiego poziomu – typ języka programowania, którego składnia i słowa kluczowe mają maksymalnie ułatwić rozumienie kodu programu, jednocześnie dystansując się od wymagań sprzętowych

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;