3. Języki (metody) programowania (arkusz IEC 1131-3)

3.3. Język listy rozkazów IL (STL)

Język IL (ang. Instruction List) występujący również pod nazwą metody STL (ang. Statement List), określany jest często jako analog języka niskiego poziomu typu asembler. Tworzenie programu dla sterownika PLC polega na pisaniu wiersz po wierszu (np. w edytorze typu Notatnik) programu, który obejmuje wykorzystanie instrukcji logicznych, arytmetycznych, operacji relacji, operacji na blokach funkcyjnych takich jak: liczniki, czasomierze, komparatory itp.

Asembler (ang. assembler) - termin związany z programowaniem i tworzeniem kodu maszynowego dla konkretnego mikroprocesora. Symbolizuje tworzenie tego kodu maszynowego na podstawie kodu źródłowego, wykonanego w niskopoziomowym języku programowania, który bazuje na podstawowych operacjach mikroprocesora, gdzie jednemu rozkazowi napisanemu przez programistę odpowiada jeden rozkaz mikroprocesora

 

Należy podkreślić, że traktowanie języka IL jako typowego asemblera (np. dla mikroprocesora jednostki CPU) jest nie do końca trafione. Wynika to z zasadniczego faktu, iż tworzenie programu sterującego (według powyższej definicji) w asemblerze np. dla rodziny mikroprocesorów o oznaczeniu 8051 firmy INTEL polega na używaniu instrukcji, które przekładają się bezpośrednio na pojedyncze rozkazy dla takiego mikroprocesora, zaś tworzenie programu sterującego w metodzie STL dla sterownika PLC, którego jednostka CPU zawiera ten sam mikroprocesor 8051 nie przekłada się na pojedyncze rozkazy dla takiego mikroprocesora, tylko interpretacja poszczególnych instrukcji tego języka IL zależy od systemu operacyjnego, który został zaimplementowany w tym sterowniku PLC. Nie występuje odpowiedniość pojedynczego rozkazu mikroprocesora CPU w stosunku do pojedynczego rozkazu języka IL tak, jak to ma miejsce, przypomnijmy, w języku asemblera. Można zasadnie stwierdzić, że w języku asemblera mamy do czynienia z rozkazami dla mikroprocesora, zaś w języku IL mamy do czynienia z poleceniami dla systemu operacyjnego sterownika PLC. Jednak w obu przypadkach, tj. w języku asemblera i w języku IL (STL) musi istnieć tzw. listę rozkazów (ang. Instruction List).

Rozkazy w języku IL

Według normy IEC 1131-3 listę rozkazów tworzy sekwencja rozkazów. Każdy rozkaz powinien zaczynać się od nowej linii, zawierać operator (tzw. mnemonik) z opcjonalnymi modyfikatorami i jeżeli jest to niezbędne dla konkretnej operacji, powinien zawierać jeden lub większą liczbę operandów (tzw. argumentów), rozdzielonych przecinkami. Operandy mogą mieć postać dowolnej reprezentacji danych zdefiniowanych w normie. Dla danych, które reprezentują w programie sterownika PLC dane zewnętrzne, przewidziano tzw. literały, zaś dla danych, które reprezentują pewien sposób identyfikowania obiektów danych, których zawartość może się zmieniać, np. dane związane z wejściami, wyjściami czy pamięcią sterownika PLC, przewidziano zmienne. Przykładową reprezentację danych zewnętrznych - literałów ilustrują tabele 12 do 14.

 

Tabela 12: Właściwości literałów w postaci liczbowej

 

Opis

Przykłady

Liczby całkowite

-12    0    123_456    +986

Liczby rzeczywiste

-12.0    0.0    0.456    3.14159_26

Liczby rzeczywiste z wykładnikami

-1.34E-12  lub  -1.34e-12    1.234E6  lub  1.234e6

Liczby dwójkowe

2#1111_1111 (255)     2#1110_0000 (240)

Liczby ósemkowe

8#377 (255)    8#340 (240)

Liczby szesnastkowe

16#FF   lub  16#ff (255)   16#E0  lub 16#e0 (240)

Boolowskie zero i jedynka

0      1

Boolowskie

FAŁSZ i PRAWDA      FALSE TRUE

 

Tabela 13: Właściwości literałów w postaci czasów trwania

Opis

Przykłady

Literały bez podkreśleń

z przedrostkiem krótkim

T#14ms   T#14.7s   T#14.7m   T#14.7h   t#14.7d

t#5d14h12m18s3.5ms

Literały bez podkreśleń

z przedrostkiem długim

TIME#14ms   time#14.7s

Literały z podkreśleniem

z przedrostkiem krótkim

T#14ms   T#14.7s   T#14.7m   T#14.7h   t#25h_15m

t#5d_14h_12m_18s_3.5ms

Literały z podkreśleniem

z przedrostkiem długim

TIME#25h_15m

time#5d_14h_12m_18s_3.5ms

 

 

Tabela 14: Właściwości literałów daty i czasu dnia:

Opis

Przykłady

Literał daty (długi przedrostek)

DATE#

Literał daty (krótki przedrostek)

D#

Literał czasu dnia (długi przedrostek)

TIME_OF_DAY#

Literał czasu dnia (krótki przedrostek)

TOD#

Literał daty i czasu dnia (długi przedrostek)

DATE_AND_TIME#

Literał daty i czasu dnia (krótki przedrostek)

DT#

 

W odniesieniu do deklaracji zmiennych w programie dla sterownika PLC należy stwierdzić, że zmienna może być deklarowana jako przynależąca do jednego z typów elementarnych lub do jednego z typów pochodnych. Elementarne typy danych zgodnie z normą IEC 1131-3 ilustruje tablica 15, zaś pochodne typy danych Tablica 16.

Tabela 15: Elementarne typy danych zgodnie z normą IEC 1131-3

Lp.

Słowo kluczowe

Typ danych

Liczba bitów

1.

BOOL

Boolowski

1

2.

SINT

Liczba całkowita krótka

8

3.

INT

Liczba całkowita

16

4.

DINT

Liczba całkowita podwójnej długości

32

5.

LINT

Liczba całkowita długa

64

6.

USINT

Liczba całkowita krótka bez znaku

8

7.

UINT

Liczba całkowita bez znaku

16

8.

UDINT

Liczba całkowita podwójnej długości bez znaku

32

9.

ULINT

Liczba całkowita długa bez znaku

64

10.

REAL

Liczby rzeczywiste

32

11.

LREAL

Liczby rzeczywiste długie

64

12.

TIME

Czas trwania

UWAGA 1

13.

DATE

Data (wyłącznie)

UWAGA 1

14.

TIME_OF_DAY lub TOD

Czas dnia (wyłącznie)

UWAGA 1

15.

DATE_AND_TIME lub DT

Data i czas dnia

UWAGA 1

16.

STRING

Ciąg znaków o zmiennej długości

UWAGA 1

17.

BYTE

Ciąg bitów o długości 8

8

18.

WORD

Ciąg bitów o długości 16

16

19.

DWORD

Ciąg bitów o długości 32

32

20.

LWORD

Ciąg bitów o długości 64

64

UWAGA 1: Długość tego typu elementarnych danych jest zależna od implementacji.

 

Tabela 16: Pochodne typy danych zgodnie z normą IEC 1131-3

Lp.

Właściwość / przykład tekstowy

1.

Alias, nowa nazwa dla typu elementarnego:

TYPE R: REAL; END_TYPE

2.

Typ wyliczeniowy (ang. Enumerated data type):

TYPE ANALOG_SIGNAL_TYPE: (SINGLE_ENDED, DIFFERENTIAL); END_TYPE

3.

Typ okrojony (ang. Subrange data type)

TYPE ANALOG_DATA: INT ( -4095...4095); END_TYPE

4.

Deklaracja tablicy danych (ang. Array data type)

TYPE ANALOG_16_INPUT: ARRAY [1...16] OF ANALOG_DATA; END_TYPE

5.

Deklaracje typu strukturalnego (ang. Structured data type)

TYPE

  ANALOG_CHANNEL_CONFIG:

    STRUCT

       RANGE: ANALOG_RANGE;

       MIN_SCALE: ANALOG_DATA;

       MAX_SCALE: ANALOG_DATA;

    END_STRUCT;

  ANALOG_16_INPUT_CONFIG:

    STRUCT

       SIGNAL_TYPE: ANALOG_SIGNAL_TYPE;

       FILTER_PARAMETER: SINT (0...99);

       CHANNEL: ARRAY [1...16] OF ANALOG_CHANNEL_CONFIG;

    END_STRUCT;

END_TYPE

 

Rozkaz w języku IL może być poprzedzony etykietą, która wtedy pełni rolę identyfikatora, po której jest umieszczany dwukropek „:”. Jeśli występuje komentarz, to powinien on być ostatnim elementem wiersza. Norma dopuszcza, aby między rozkazami mogły być wprowadzane puste wiersze. Przykłady rozkazów w języku IL ilustruje Tabela 17.

 

Tabela 17: Przykłady użycia rozkazów w języku IL (STL)

ETYKIETA

OPERATOR

OPERAND

KOMENTARZ

START:

LD

ANDN

ST

%IX1

%MX5

%QX2

(*Wciśnij przycisk*)

(*Nie zatrzymane*)

(*Włączone*)

 

Operatory, modyfikatory i operandy w języku IL

Standardowe operatory z dopuszczalnymi ich modyfikacjami powinny mieć postać taką, jaką wyszczególnia Tabela 18. Jeżeli nie podano inaczej, to semantykę operatora określa poniższe wyrażenie:

wynik:= wynik OP operand

Powyższy zapis oznacza, że wyznaczana wartość wyrażenia zastępowana jest jego bieżącą wartością, przetworzoną przez operator z uwzględnieniem operandu. Przykładowo rozkaz AND %IX1 wygląda jak poniżej:

wynik:= wynik AND %IX1.

 

Tabela 18: Operatory języka IL (STL)

Lp.

Operator

Modyfikatory

Operand

Semantyka

1.

LD

N

UWAGA 2

Ustaw bieżącą wartość wyniku równą operandowi

2.

ST

N

UWAGA 2

Zapamiętaj bieżący wynik w miejscu operandu

3.

 

S

R

UWAGA 3

UWAGA 3

BOOL

BOOL

Ustaw operand boolowski na „1”

Ustaw operand boolowski na „0” (jeśli był na „1”)

4.

5.

6.

7.

AND

&

OR

XOR

N, (

N, (

N, (

N, (

BOOL

BOOL

BOOL

BOOL

Boolowskie AND

Boolowskie AND

Boolowskie OR

Boolowskie ExOR

8.

9.

10.

11.

ADD

SUB

MUL

DIV

(

(

(

(

UWAGA 2

UWAGA 2

UWAGA 2

UWAGA 2

Dodawanie

Odejmowanie

Mnożenie

Dzielenie

12.

13.

14.

15.

16.

17.

GT

GE

EQ

NE

LE

LT

(

(

(

(

(

(

UWAGA 2

UWAGA 2

UWAGA 2

UWAGA 2

UWAGA 2

UWAGA 2

Porównanie: >

Porównanie: >=

Porównanie: =

Porównanie: <>

Porównanie: <=

Porównanie: <

18.

19.

20.

JMP

CAL

RET

C, N

C, N

C, N

LABEL

NAME

 

Skocz do etykiety

Wywołaj blok funkcji (UWAGA 4)

Powróć z wywołanej funkcji lub bloku funkcji

 

)

 

 

Wykonaj wstrzymaną operację

UWAGI:

UWAGA 2: Operatory powinny być albo przeciążone albo z nadanym typem. Bieżący wynik i operand powinny być tego samego typu.

UWAGA 3: Operacje te są wykonywane wtedy i tylko wtedy, gdy bieżąca wartość wyniku jest równa boolowskiej „1”.

UWAGA4: Po nazwie bloku funkcji występuje umieszczona w nawiasach zwykłych lista argumentów. 

 

 

Funkcje i bloki funkcji języka IL (STL)

Funkcje można wywołać poprzez umieszczenie nazwy funkcji w polu operatora. Wynik bieżący może być wykorzystywany jako pierwszy argument funkcji. Argumenty dodatkowe, jeśli są wymagane, powinny być podane w polu operandu. Wartość określona przez funkcję, w wyniku pomyślnego wykonania rozkazu RET lub po osiągnięciu fizycznego końca funkcji, może stać się wynikiem bieżącym.

Bloki funkcji mogą być wywołane warunkowo lub bezwarunkowo za pomocą operatora CAL (wywołanie). Wywołanie to może mieć jedną z trzech postaci, które podano w Tabeli 19, zaś standardowe operatory wejściowe bloków funkcji języka IL (STL) pokazuje Tabela 20.

 

Tabela 19: Właściwości wywołania bloków funkcji dla języka IL (STL)

Lp.

Opis wywołania bloków funkcji/przykład

1.

CAL z listą wejść:

CAL         C10  (CU:= %IX10, PV:= 15)

2.

CAL z załadowaniem/zapamiętaniem wejść:

LD            15

ST            C10.PV

LD            %IX10

ST             C10.CU

CAL           C10

3.

Użycie operatorów wejściowych:

LD             15

PV            C10

LD             %IX10

CU            C10

UWAGA:

W powyższych przykładach zakłada się istnienie takich deklaracji jak VAR C10:= CTU; END_VAR.

 

 

Tabela 20: Standardowe operatory wejściowe bloków funkcji języka IL (STL)

Lp.

Operatory

Typ FB

1.

S1, R

SR

2.

S, R1

RS

3.

CLK

R_TRIG

4.

CLK

F_TRIG

5.

CU, R, PV

CTU

6.

CD, LD, PV

CTD

7.

CU, CD, R, LD, PV

CTUD

8.

IN, PT

TP

9.

IN, PT

TON

10.

IN, PT

TOF

 

 

Przykład programu dla sterownika PLC w języku IL (STL)

Network 1

LD                   I0.0                                                    

ON                  I0.1

AN                   I0.7

=                      M0.0

Network 2

LD                   M0.0

AN                   I0.3

=                      Q0.0

Network 3

LD                   I0.1

OR                   M0.1

=                      M0.1

=                      Q0.1

Network 4

LD                   I0.7

A                     I0.5

A                     M0.5

A                     T35

OR                   M0.7

=                      Q0.4