Podręcznik
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.
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