3-1
3 Standard IEC 1131-3 programowania sterowników PLC
3.1 Wstęp
Ponieważ nie istnieje sterownik standardowy, to każdy z producentów sterowników
programowalnych oferował własne rozwiązania sprzętowe i programowe. Dostarczane
oprogramowanie umożliwiało zwykle programowanie sterowników na poziomie zbliżonym do
sprzętowego. Sytuacja ta jest bardzo niekorzystna dla użytkowników wynikająca z konieczności z
programowania na niskim poziomie oraz z kłopotami wynikającymi z przenoszenia oprogramowania z
sterownika jednego producenta na sterownik innego producenta. Najkorzystniejszym rozwiązaniem
byłoby przyjęcie możliwości standardowych języków programowania wyższego poziomu niezależnych
od rozwiązań sprzętowych. Jednolity sposób programowania ma istotne znaczenie:
• zmniejsza czas na ponowne przeszkolenia programistów i czasy zaznajomienia się z systemem,
• powoduje wystąpienia mniej błędów wynikłych z stosowania standardowych bloków funkcyjnych,
• jasna definicja sprzęgów.
Zalety jednolitego programowania doceniają przede wszystkim użytkownicy. Opracowane
oprogramowanie może zostać ponownie użyte. Użytkownik nie jest z tego powodu związany z
konkretnym producentem.
Możliwość użycia raz opracowanego oprogramowania posiada następujące zalety:
• ponowne użycie przetestowanych bloków,
• obniżka kosztów,
• przyspieszenie rozwoju.
Oprogramowanie systemów sterowania powinno umożliwić wykrywanie błędów na etapie
konfigurowania. Nowoczesne metody rozwoju oprogramowania wykrywają błędy możliwie
najwcześniej. Dla systemów sterowania należy wykryć jak najwięcej błędów w trybie off-line
(pośrednim). Wymaga to stworzenia oprogramowania umożliwiającego testowanie wielu wariantów
rozwiązań i sprzęgów sprzętowych.
IEC 111-3 jest pierwszą próbą standaryzacji języków programowania w sterowaniu
przemysłowym. Istnieją organizacje międzynarodowe, które wspomagają standaryzację
programowania sterowników przemysłowych. Organizacja PLCopen ma na celu promowanie
standaryzacji w przemysłowych systemach sterowania. Organizacja ta zdefiniowała warunki
zgodności z standardem. Każde oprogramowanie może zostać przetestowane, czy spełnia te
warunki. Zostały zdefiniowane trzy klasy zgodności z standardem. Standard IEC 1131 zajmuje się
różnymi aspektami systemów sterujących rozpoczynając od definicji wymagań poszczególnego
sprzętu do komunikacji pomiędzy sterownikami. Trzecia część tego standardu dotyczy języków
programowania i jest oznaczana przez IEC 1131-3.
3.2 Własności standardu IEC 1131-3
Struktura oprogramowania sterowników zgodna z standardem ma postać hierarchiczną
przedstawioną na rys. 3.1.
Cały system sterowania rozwiązujący określony problem może być sformułowany jako
konfiguracja. Złożony problem może być podzielony na kilka konfiguracji komunikujących się
pomiędzy sobą poprzez zdefiniowane sprzęgi. Ogólnie konfiguracja odpowiada oprogramowaniu
wymaganemu dla jednego PLC. Dla bardziej złożonych aplikacji, jakim jest oprogramowanie całej linii
produkcyjnej, oprogramowania różnych sterowników muszą ze sobą współdziałać, w takim przypadku
oprogramowanie dla każdego sterownika będzie traktowane jako oddzielna konfiguracja.
Konfiguracja składa się z jednego lub kilku zasobów (resources), dostarczających wspomaganie
dla wszystkich własności niezbędnych do wykonywania programów. Zasób może być traktowany jako
sprzęg do maszyny wirtualnej, która umożliwia wykonanie programu IEC. Program IEC nie może
funkcjonować jeśli nie został załadowany do zasobu. Zasób istnieje wewnątrz PLC, ale może być
zdefiniowany poza nim. Na przykład zasób może być symulowany na komputerze PC, dla
wspomagania testowania sterowników. Dla sterowników PLC z wieloma kartami procesorowymi,
można definiować zasób oddzielnie dla każdej karty. Jednym z podstawowych funkcji zasobów jest
dostarczenie sprzęgu pomiędzy programem, a fizycznymi kanałami I/O sterownika.
1
3-2
Program IEC może być zbudowany z różnych elementów oprogramowania, z których każdy
może być zapisany w różnych językach IEC. Wykonanie różnych części programu, na przykład
wybranych bloków funkcyjnych może być kontrolowane poprzez użycie zadań. Zadanie jest
przeznaczone do sterowania wykonaniem programów lub bloków funkcyjnych. Wykonanie to może
być realizowane w sposób okresowy lub w przypadku zadziałania wyzwalacza (trigger-a).
Konfiguracja
Zasoby
Zasoby
Zadanie
Program
Blok funkcyjny
Blok funkcyjny
Funkcja
Blok funkcyjny
Funkcja
Funkcja
Rys. 3.1. Struktura oprogramowania
Blok funkcyjny umożliwia tworzenie oprogramowania w sposób hierarchiczny. Blok funkcyjny
może być zbudowany z innych bloków funkcyjnych. Blok funkcyjny definiuje dane jako zbiór
parametrów wejściowych i wyjściowych oraz z zmiennych wewnętrznych. Blok funkcyjny posiada
również algorytm, które jest wykonywany za każdym wywołaniem bloku funkcyjnego. Ponieważ blok
funkcyjny może zapamiętywać zmienne wewnętrzne, to posiada on własny stan umożliwiający jego
użycie dla złożonych problemów sterowania. Funkcje w odróżnieniu od bloków funkcyjnych nie mają
możliwości zapamiętywania zmiennych wewnętrznych. Funkcja może mieć jedną wielkość wyjściową.
Plik konfiguracyjny może mieć postać:
CONFIGURATION przyklad
RESOURCE zasob1 ON procesor1
TASK
zadanie1
(INTERVAL:=t#20ms,
PRIORITY:=1);
TASK zadanie2
(INTERVAL:=t#10ms,
PRIORITY:=
2);
PROGRAM prog1 WITH zadanie2:pblok1;
PROGRAM prog2 WITH zadanie1:pblok2;
END_RESOURCE
RESOURCE
...
TASK
zadanie3
(SINGLE:=x1,
PRIORITY:=1);
PROGRAM prog3 WITH zadanie3:pblok3;
...
END_RESOURCE
END_CONFIGURATION
W przykładzie tym program prog1 przydzielony do bloku pblok1 i jest wywoływany cyklicznie co 20ms
z wyższym priorytetem od programu prog2, wywoływanego o ile to możliwe co 10ms. Zadanie
zadanie3 rozpoczyna wykonywanie programu prog3, gdy wartość x1 ulega zmianie z 0 na 1.
Różnica pomiędzy blokiem funkcyjnym, a programem polega na tym, że w bloku funkcyjnym
nie mogą być zdefiniowane zmienne bezpośrednie. Np. adresy sprzętowe mogą być dostępne w
bloku poprzez zmienne zewnętrzne.
2
3-3
PROGRAM prog1 (* przykład programu *)
(* przydzielenie zmiennych i I/O *)
VAR
cisnienie_powietrza: BOOL AT %0X2.7;
(*
podstawienie
dla
wyjścia 2.7 *)
wylacznik_koncowy: BOOL AT %IX3.2;
(*
podstawienie
dla
wejścia wartości 3.2 *)
END_VAR
(*
cześć rozkazowa *)
(* jezeli wylącznik_koncowy nieaktywny *)
LDN
wylacznik_koncowy
(* warunkowe wywołanie sterowania sprężarką )
CALC sterowanie_cisnieniem( wartosc:= cisnienie_powietrza);
END_PROGRAM
Przykład ten pokazuje, ze blok funkcyjny sterowanie_cisnieniem jest elastyczny może być używany w
różnych otoczeniach bez modyfikacji.
Programy
mogą być definiowane w różnych językach programowania. W standardzie
wprowadzono dla każdego języka programowania wprowadzono część deklaracyjną jednolitą dla
wszystkich języków programowania.
VAR
Wejscie1 AT %IX5.1;
(* Symboliczne podstawienie zmiennej Wejscie1 do bitu 1 Modulu 5 )
dlugość INT; (*Deklaracja symbolu dlugosc *);
Temp AT %MW12:INT:= 30;
(* Deklaracja zmiennej Temp w słowie wejściowym 12 z wartoscią początkową 30 *)
END_VAR
Zmiennej długość nie przydzielono ustalonej lokacji w pamięci, jest ona realizowana automatycznie.
Bezpośrednie przydzielenie poszczególnego adresu w sterowniku jest możliwe przy użyciu operatora
AT. Bezpośredni adres jest zaznaczany znakiem %. Struktura identyfikatorów bezpośrednich adresów
sterownika jest w standardzie IEC ściśle określona.
3.3 Typy danych
3.3.1 Identyfikatory
Identyfikatory
są stosowane dla nazywania różnych elementów języków IEC takich jak
zmienne, nowe typy danych, bloki funkcyjne, programy, itp. Identyfikator jest ciągiem znaków liter, cyfr
i podkreśleń, przy czym pierwszy znak nie może być cyfrą i nie mogą wystąpić dwa podkreślenia
razem. W standardzie zakłada się, że co najmniej 6 pierwszych znaków zapewnia jednoznaczną
identyfikację nazwy.
3.3.2 Słowa kluczowe
Słowa kluczowe definiują różne konstrukcje języków programowania. Należy unikać
stosowania identyfikatorów będących słowami kluczowymi, np.:
TYPE TRUE PROGRAM TASK RETURN STEP FUNCTION
Również identyfikatory funkcji standardowych należy traktować jako zarezerwowane, np:
TON RS SIN COS.
3.3.3 Komentarze
Komentarze muszą być ograniczone znakami (* *). Komentarze są przeznaczone do
zamieszczania uwag programisty i są ignorowane w trakcie tworzenia programu wynikowego.
3
3-4
3.3.4 Typy Danych
Standard predefiniuje niektóre typy danych jako typy standardowe. Do nich są zaliczane
BOOL, INT, WORD, DWORD, REAL i inne. Użytkownik może definiować typy złożone jak struktury i
tablice. Dla każdego typu danych podawany jest format literałów. Literał określa jak stała danego typu
jest reprezentowana. Przykładowo literałami całkowitymi są 0, -34, 2399.
3.3.5 Całkowite typy danych
W standardzie IEC możliwych jest kilka całkowitych typów danych (tab. 3.1).
Typ danych
Opis
Liczba bitów
Zakres
SINT
Short integer
8
-128 do 127
INT
Integer
16
-32768 do 32767
DINT Double
integer
32
-231 do 231 -1
LINT Long
integer
64
-263 do 263 -1
USINT
Unsigned short integer
8
0 do 255
UINT Unsigned
integer
16
0 do 216 -1
UDINT Unsigned
double
integer
32
0 do 232 -1
ULINT
Unsigned long integer
64
0 do 264 -1
Tab. 3.1. Całkowite typy danych
Literały całkowite używane są do przedstawiania liczb całkowitych. Przykłady literałów: -100,
0, 134, +897, 23_123. Liczby całkowite można przedstawić również w postaci dwójkowej, ósemkowej
lub szesnastkowej: 2#1111_1111 - odpowiada liczbie 255, 8#020 odpowiada liczbie 16, a 16#FF
odpowiada liczbie 255.
3.3.6 Typy zmiennoprzecinkowe
Typy zmiennoprzecinkowe (tab. 3.2) różnią się długością zapisu w pamięci.
Typ danych
Opis
Liczba bitów
Zakres
REAL Real 32
- 1038 do 1038
LREAL Long
real
64
-- 10308 do 10308
Tab. 3.2. Typy zmiennoprzecinkowe
Literały liczb rzeczywistych mogą zawierać literę e lub E symbolizującą podstawę potęgi równą 10:
10.345, -0.012, 21_485.32, 1.7E-12, -23.01e12.
3.3.7 Typy czasowe
Typy czasowe (TIME) służą do określania upływu czasu (tab. 3.3). Typ ten używany jest do
zapisu czasu trwania określonej fazy, a także służy do definiowania ograniczeń czasowych
związanych z zdarzeniami (np. timeout).
Typ danych
Opis
Liczba bitów
TIME Upływ czasu
Zależna od implementacji
Tab. 3.3 Typy czasowe
Wyróżnia się literały czasowe w formie dłuższej np. TIME#16d_5h_3m_4s_1ms. (definiuje przedział
czasu równy 16 dniom, 5 godzinom, 3 minutom, 4 sekundom i jednej milisekundzie). Ten sam zapis w
krótszej formie będzie postaci: T#16d5h3m4s1ms. Jeżeli wartość odpowiadająca danej jednostce
czasu wynosi 0, to wartość ta wraz nazwą jednostki może zostać opuszczona.
4
3-5
3.3.8 Typy do zapisu daty i czasu
Wyróżnia się kilka typów przeznaczonych do zapisu czasu zegarowego i daty kalendarzowej
(tab. 3.4).
Typ danych
Opis
Liczba bitów
DATE Data
kalendarzowa
Zależna od implementacji
TIME_OF_DAY lub TOD
Czas dzienny
Zależna od implementacji
DATE_AND_TIME lub DT
Data i czas dzienny
Zależna od implementacji
Tab. 3.4. Typy do zapisu daty i czasu
Literały zapisujące datę i czas mogą występować w postaci długiej lub skróconej:
DATE#1997-05-14 lub D#1997-05-14,
TIME_OF_DAY#10:00:12.12 lub TOD#10:00:12.12
(12.12 sek. po dziesiątej),
DATE_AND_TIME#1997-05-14-10:00:12.12
lub DT#1997-05-14-10:00:12.12.
3.3.9 Łańcuchy znaków
Łańcuchy znaków są stosowane do operacjach tekstowych. Wyróżnia się jeden typ (tab. 3.5).
Typ danych
Opis
Liczba bitów
STRING
Łańcuch znaków
Zależna od implementacji
Tab. 3.5. Łańcuchy znaków.
Literały łańcuchów znaków zawarte są pomiędzy apostrofami, np. ‘Wartosc’. W takim ciągu
mogą wystąpić znaki kontrolne, które są poprzedzone znakiem dolara. Wyróżnia się następujące
znaki kontrolne: $$ - znak dolara, $’ - znak apostrofu, $L lub $l - przejście do następnego wiersza, $P
lub $p przejście do nowej strony, $R lub $r przejście na początek linii, $T lub $t znak tabulacji.
3.3.10 Ciągi bitowe
Ciągi bitowe przeznaczone są do operacji na bajtach lub słowach pamięci. Tab. 3.6 zawiera
przegląd typów ciągów bitowych.
Typ danych
Opis
Liczba bitów
BOOL Ciąg bitów - 1 bit
1
BYTE Ciąg bitów - 8 bitów
8
WORD Ciąg bitów - 16 bitów
16
DWORD Ciąg bitów - 32 bitów
32
LWORD Ciąg bitów - 64 bitów
64
Tab. 3.6. Ciągi bitowe
Dla typu BOOL wyróżnia się literały TRUE i FALSE.
5
3-6
3.3.11 Uogólnione typy danych
Podobne typy danych mogą być grupowane w zbliżone typy danych, tworząc strukturę
hierarchiczną (rys. 3.2). Uogólnione typy danych rozpoczynają się od przedrostka ANY_ i mogą być
użyte do przeciążania wartości.
ANY
ANY_NUM
ANY_BIT
ANY_DATE
STRING
TIME
ANY_REAL
ANY_INT
LREAL
REAL
SINT
INT
DINT
LINT
USINT
UINT
ULINT
UDINT
BOOL
BYTE
WORD
DWORD
LWORD
DATE_AND_TIME
DATE
TIME_OF_DAY
Rys. 3.2. Struktura hierarchiczna podstawowych typów danych.
Użycie typu uogólnionego ANY_NUM może być użyte dla różnych typów danych całkowitych i
rzeczywistych.
3.3.12 Pochodne typy danych
W standardzie możliwe jest tworzenie nowych typów danych zwartych w obramowaniu
definicji TYPE i END_TYPE. Dla przykładu
TYPE
CISNIENIE:
REAL;
END_TYPE
definiuje nowy typ danych o nazwie CISNIENIE, który odpowiada typowi podstawowemu REAL.
Standard ten ma możliwość definiowania typów rekordowych (strukturowych). Typ taki ujęty
jest w obramowaniu STRUCT i END_STRUCT. Przykład:
TYPE CZUJNIK_CISNIENIA:
STRUCT
WEJSCIE:
CISNIENIE;
STAN:
BOOL;
DATA_KALIBRACJI:
DATE;
END_STRUCT
END_TYPE
W standardzie może być również zdefiniowany typ wyliczeniowy. Polega on na przypisaniu
różnym wartościom, różnych nazw. Przykład:
TYPE STAN_URZADZENIA:
(INICJALIZACJA, ROZRUCH, RUCH, ZATRZYMYWANIE, POSTOJ, AWARIA);
END TYPE
Okrojone typy danych definiują typ będący podzbiorem zbioru liczb całkowitych. Przykład:
TYPE
ZASILANIE:
INT(-6..+12);
END
6
3-7
Wygodną możliwością zapisu danych tego samego rodzaju są tablice. Dla typu tablicowego
podajemy wymiar w sposób jak to obrazuje przykład.
TYPE DRGANIA:
ARRAY[1..50] OF REAL;
END_TYPE
TYPE DRGANIA_TURBINY:
ARRAY[1..3][1..4] OF DRGANIA;
END TYPE
3.3.13 Wartości początkowe podstawowych typów danych
Zakłada się, że wszystkie zmienne mają zerową wartość początkową. W przypadku
łańcuchów przyjmowany jest łańcuch pusty, natomiast data przyjmuje wartość D#0001-01-01.
Dla typów pochodnych mogą być definiowane wartości początkowe. Dla przykładu zapis
TYPE
CISNIENIE: REAL:= 1.0;
END_TYPE
powoduje zadanie podanej wartości początkowej równej 1.0 dla wszystkich zmiennych typu ciśnienie.
3.1 Zmienne
Wewnątrz elementów oprogramowania mogą być definiowane różne zmienne. Zmienne
lokalne mogą być definiowane wewnątrz konfiguracji, zasobu, programu, bloku funkcyjnego i funkcji.
Zmienne są ważne lokalnie w jednostce organizacyjnej, w której zostały zadeklarowane. Wyjątek
stanowią zmienne globalne definiowane jako VAR_GLOBAL. Zmienne globalne umożliwiają
przekazywanie danych pomiędzy blokami funkcyjnymi lub programami. Zmienne globalne mogą być
również definiowane na poziomie zasobów lub konfiguracji.
Wyróżniamy następujące typy zmiennych lokalne (VAR), wejściowe (VAR_INPUT), wyjściowe
(VAR_OUTPUT), wejściowe i wyjściowe (VAR_IN_OUT), globalne VAR_GLOBAL) oraz zmienne
zewnętrzne (VAR_EXTERNAL). Definicja zmiennych rozpoczyna się od jednego z wymienionych słów
kluczowych, a kończy się na słowie END_VAR.
Przykłady:
VAR_INPUT
STAN_DOLNY:
BOOL;
BRAK_CISNIENIA:
BOOL;
END_VAR
VAR_GLOBAL
CISNIENIE_GAZOWNI:
REAL;
END_VAR
3.4.1 Atrybuty zmiennych
Zmienne mogą posiadać dodatkowe atrybuty jak RETAIN, CONSTANT i AT.
Wartości niektórych ważnych zmiennych mogą być zapamiętane w celu zapewnienia
prawidłowego działania przy awarii zasilania. Standard rozwiązuje to poprzez podanie kwalifikatora
RETAIN do słowa kluczowego w deklaracji. Zmienne definiowane w ten sposób zachowują swoje
wartości nawet w przypadku awarii zasilania.
VAR_OUT RETAIN
profil_szybkosci
: ARRAY[1..4] OF REAL;
max_szybkosc
REAL;
END_VAR
Powyższy przykład definiuje, że wartości tablicy profil_szybkości i zmiennej prostej max_szybkosc
mają być zapamiętane nawet w przypadku braku zasilania i mają być zainicjalizowane przy restarcie
systemu.
Atrybut CONSTANT wskazuje na to, że wartości wymienionych zmiennych nie mogą być
zmieniane w trakcie wykonywania programu.
7
3-8
Atrybut AT służy do ustalenia lokacji zmiennej o podanym identyfikatorze, np.:
VAR
DANE_WEJ AT %IW10: ARRAY[1..8] OF SINT;
END_VAR
Tablica DANE_WEJ mają mieć lokację w pamięci rozpoczynającą się od słowa 10 pamięci
wejściowej.
3.4.2 Zmienne reprezentowane bezpośrednio
Odwołanie bezpośrednie do określonych lokacji pamięci sterownika jest możliwe, a zmienne
takie poprzedzone są znakiem %. Po tym znaku występują dwie litery, które charakteryzują typ
zmiennej. Pierwsza litera dotyczy kierunku przesyłania danej:
• I wielkość wejściowa, do otrzymywania wartości z analogowych lub cyfrowych kanałów,
• Q wielkość wyjściowa, do wysyłania danych do kanałów wyjściowych,
• M wielkość z wewnętrznej pamięci, do przechowywania pośrednich wyników.
Druga litera określa wielkość zajętej pamięci przez daną: X - bit, B - bajt, W - słowo (16b), D -
podwójne słowo (32b), L - długie słowo (64b).
Po tych znakach występują pola numeryczne rozdzielone kropkami wskazujące na lokację na lokację
w pamięci.
Przykłady:
%I100
(* Bit pamięci wejściowej 100
*)
%IW126 (*
Słowo pamięci wejściowej 122
*)
%QL100 (*
Długie słowo pamięci wyjściowej 100 *)
Zmienne takie mogą być definiowane i używane tylko wewnątrz programu. Oprogramowanie,
które używa wielu zmiennych reprezentowanych bezpośrednio może być trudne do przeniesienia na
sterownik innego typu.
3.4.3 Ścieżki dostępu
Ścieżki dostępu są mechanizmem przekazywania danych i informacji pomiędzy różnymi
konfiguracjami IEC. Każda konfiguracja może posiadać zbiór zmiennych, które mogą być dostępne
dla innych zdalnych konfiguracji. Konfiguracje mogą się komunikować poprzez sieć Ethernet,
magistralę miejscową lub magistralę systemową. Ścieżki dostępu są dostarczane poprzez zmienne
zdefiniowane jako VAR_ACCESS. Zmienne te mogą być tylko zmiennymi wejściowymi lub
wyjściowymi programu, zmiennymi globalnymi, zmiennymi reprezentowanymi bezpośrednio. Zmienne
takie mogą mieć atrybut READ_ONLY, który oznacza, że urządzenie zewnętrzne może tylko czytać
wymienioną zmienną albo READ_WRITE, w tym przypadku urządzenie zewnętrzne może czytać i
zapisywać zmienną.
Przyk³ad:
VAR_ACCESS
POZIOM_WODY:
NISKI:
INT
READ_ONLY;
ZAWOR: PRZEPUSTOWOSC: REAL READ_WRITE;
END_VAR
Urządzenia zewnętrzne mogą mieć dostęp do ścieżek POZIOM_WODY, ZAWOR w celu czytania
wartości NISKI i odczytu lub zapisu wartości PRZEPUSTOWOSC.
3.4.4 Inicjalizacja zmiennych
Każdemu typowi danych może być nadana defaultowa wartość początkowa określona dla
danego typu danych. Podczas deklaracji zmiennej można nadać jej wartość początkową.
Przykład
VAR
liczba_przebiegow: INT:= 10;
cisnienie: REAL:= 22.6;
END_VAR
VAR
AT %I100: WORD := 2#0000_1101;
END_VAR
8
3-9
3.5 Języki programowania
Standard IEC 1131 umożliwia elastyczny wybór języków programowania spośród trzech
graficznych i dwóch tekstowych, które mogą być użyte do zapisu różnych części programu. Użycie
tych języków umożliwia korzystanie z oprogramowania niezależnego od producenta.
3.5.1 Sekwencyjne schematy funkcyjne (SFC – Sequential Function Charts)
Metoda ta może być traktowana jako zastosowanie pojęć sieci Petriego. Miejsca sieci
Petriego odpowiadają krokom SFC, natomiast przejścia sieci Petriego odpowiadają przejściom
SFC. Przejścia definiują warunki przejścia z jednego kroku, do następnego.
1
4
e
3
c
6
h
7
i
5
f
8
k
d
g
j
1
a
4
3
6
7
i
5
f
8
k
d
g
j
Rys 3.3 Sekwencja kroków z: (a) alternatywnymi gałęziami, (b) równoległymi gałęziami
Struktura programu zapisywana jest przy użyciu SFC (sekwencyjnych schematów
funkcyjnych). SFC ułatwia zapis sekwencji instrukcji zapisanych w postaci kroków i przejść(rys 3.4).
Kroki reprezentują akcje, które mogą być również wykonane równolegle. Tranzycje określają warunki
jakie muszą być spełnione by przejść do następnego kroku. Język ten stosuje się wówczas, gdy
wykonanie programu zależy od czasu lub zdarzeń.
Pojedyncze linie rozgałęzione - służą do połączenia jednego bloku z wieloma przejściami
(rys. 3.3). Praktyczne umożliwia to wybór jednej z dróg dla której spełniony jest warunek przejścia.
Podwójne linie łączące - służą do połączenia jednego przejścia z kilkoma blokami (rys. 3.3),
których instrukcje wykonywane są dalej równolegle.
Krok3
Lt#10s
Akcja_1
Krok3
S
Akcja_2
%QX12.3:=%IX1.2 &
MX3.7
%IX2.4
Rys. 3.4. Przykład sekwencyjnego schematu funkcyjnego.
9
3-10
Własności języka SFC:
• formułowanie instrukcji dla kroków i przejść w jednym z pozostałych czterech języków,
• możliwość wyboru sekwencji równoległych lub alternatywnych (z możliwością określenia
priorytetów),
• dopuszczalne sprzężenia zwrotne, zakładając, że są one prawidłowo użyte.
3.5.2 Schematy drabinkowe
Schematy drabinkowe LD (Ladder Diagram) są graficzną reprezentacją logicznych równań
przez układ graficznych symboli. Diagram LD zawiera się pomiędzy lewą i prawą szyną mocy, do
których jest dołączony (rys. 3.5). Elementy mogą być łączone liniami pojedynczymi lub grupowymi.
Lewa szyna mocy, jak również wszystkie linie połączone z nią, posiadają stan logiczny prawdy. Stan
ten jest przenoszony przez kontakt w przypadku, gdy jest zamknięty. Każdy kontakt jest
przyporządkowany zmiennej wejściowej lub wewnętrznej. Gdy zmienna przyjmuje stan 1, kontakt
ulega zamknięciu. Gdy linia połączona z cewką posiada "moc", to cewka jak również
przyporządkowana do niej zmienna wyjściowa zostają uaktywnione (przyjmują wartość 1).
Rys. 3.5. Przykład schematu drabinkowego
Schematy drabinkowe reprezentują formalizm elektrycznych diagramów połączeń stosując
sterowanie bazujące na przełącznikach binarnych. Wadą tych schematów jest to, że jeżeli mają
być zaprogramowane nie tylko operacje binarne, to schematy te muszą być rozszerzone o
dodatkowe elementy. Rysunek 3.6 podaje podstawowe elementy schematów drabinkowych,
natomiast rysunki 3.7 i 3.8 przedstawiają sposób użycia elementów dla połączenia szeregowego i
równoległego.
P
N
bezpośredni
kontakt
odwrócony
kontakt
kontakt dla
wzrastajacego
zbocza
kontakt dla
opadającgo
zbocza
S
R
cewka
bezpośredna
cewka
odwrócona
cewka
ustawiająca
cewka
resetująca
Rys. 3.6. Elementy schematów drabinkowych.
] [
( )
]/ [
A
B
P
Rys 3.7. Połączenie szeregowe
P
A
B
=
*
_
10
3-11
] [
( )
]/ [
] [
A
B
C
P
Rys 3.8. Połączenie równoległe
P
A
B
C
=
+
+
_
Kontakt
może występować w różnych modyfikacjach: standardowy, zanegowany - (/),
uaktywniany zboczem narastającym - (P), uaktywniany zboczem opadającym - (N). Z kolei cewki
mogą mieć postać: standardową, zanegowaną - (/), ustawialną - (S), kasowalną - (R).
3.5.3 Schematy bloków funkcyjnych
Bloki funkcyjne FBD (Functional Block Diagram) są graficznym językiem, umożliwiającym
budowę całościowych procedur przez pobieranie bloków funkcyjnych z bibliotek i ich łączenie.
Elementy języka FBD opisują zależność funkcyjną pomiędzy zmiennym wejściowymi a wyjściowymi.
3.5.4 Bloki funkcyjne
Bloki funkcyjne wywodzą się ze schematów obwodów cyfrowych. W standardzie IEC wyróżnia się
funkcje i bloki funkcyjne. Zakłada się, że obiekt typu funkcja posiada tylko jedne wyjście i dla tych
samych wejść wydaje tą samą wartość wyjścia. Bloki funkcyjne posiadają kilka wyjść i dla tych
samych wartości wejść mogą posiadać różne wartości wyjść, ze względu na wewnętrzne
sprzężenia zwrotne i pamięć. Funkcje i bloki funkcyjne mogą być zdefiniowane hierarchicznie.
>=1
>=1
&
a
b
c
d
k
k= (a+b)*(c+d)
Rys 3.9. Przykład użycia prostych bloków funkcyjnych
Funkcje lub bloki funkcji mogą realizować przetwarzanie binarne, numeryczne, analogowe lub
znakowe. Rysunki 3.9 i 3.10 przedstawiają użycie prostych bloków funkcyjnych.
/
&
Tolerancja
X1
2.0
Y1
Y2
B_Error
L1_OK
XIN1
XIN2
XIN3
Q
Rys. 3.10. Przykład bloku funkcyjnego.
11
3-12
3.5.5 Lista Instrukcji
Lista instrukcji IL (Instruction List) jest językiem niskiego poziomu, podobnym do języka
asemblera. Język ten jest efektywny dla małych aplikacji lub służy dla optymalizacji części
aplikacji. Większość operacji standardowego języka IL ma postać:
wynik := wynik OP operand
Instrukcje odnoszą się zawsze do aktualnego wyniku (rejestru). Operator wskazuje,
jakiego typu operacja będzie wykonywana. Wynik jest ponownie zapisywany do rejestru i
traktowany jako aktualny wynik.
Program IL jest listą instrukcji, z których każda musi zaczynać się od nowej linii, zawierać
operator z kompletnymi modyfikacjami i ewentualnie jeden lub więcej operandów oddzielonych
separatorem ",". Etykieta zawsze poprzedza znak ":" i może być umieszczona przed instrukcją lub w
wolnej linii. Nazwa nie może przekraczać 16 znaków, pierwszy znak musi być literą, następne literą,
liczbą bądź znakiem "_". Może być definiowana tylko raz w programie. Rozmieszczenie elementów w
programie ma postać:
ETYKIETA
OPERATOR
OPERAND
KOMENTARZ
Start
LD
zm1
(*wczytanie
zm1*)
AND
zm2
(*koniunkcja
z
zm2*)
ST
wynik
(*wynik
operacji zapisany do wynik*)
W języku IL nie ma możliwości operowania na zmiennych typu rzeczywistego i zmiennych
będących komunikatem. Maksymalna ilość modyfikatorów służących do grupowania wynosi 32.
Operatory języka IL są zdefiniowane. Bloki funkcyjne mogą być wywoływane przy użyciu instrukcji
CAL. Funkcja może być wywołana bezpośrednio.
LD %IX1
(* ładuj wartość bezpośrednio z wejścia *)
ST C10.CU
(* parametr wejściowy CU dla FB C10 *)
CAL C10
(* wywołanie bloku funkcyjnego
*)
...
LD kontakt1
ANDN zamkniecie_kompresora
3.5.6 Tekst strukturalny
Tekst strukturalny ST (Structured Text) ma składnię podobną do języka Pascal. W języku ST
zdefiniowane są instrukcje podstawiania, wyboru IF i CASE, iteracyjne FOR, WHILE, REPEAT,
wywołanie funkcji lub bloku funkcji oraz przerwania wykonania funkcji. Język ST stanowi główne
narzędzie do budowy złożonych procedur, dlatego nie może być przedstawiony jako język graficzny.
Domyślnie używa się go przy opisie akcji w blokach i przejściach SFC. Program ST jest listą wyrażeń
zakończonych średnikiem, będącym separatorem instrukcji.
Typy wyrażeń języka ST:
- przyporządkowanie: zmienna := wyrażenie;
- wywołanie podprogramu lub funkcji C:
zmienna := podprogram (par1,par2,...);
- wywołanie bloku funkcji C: nazwabloku (par1,par2,...); rezultat := nazwabloku.par1;
- wyrażenie wyboru:
Tekst strukturalny jest językiem wysokiego poziomu zawierający istotne elementy języków
programowania tego poziomu:
- ga³êzie wyboru (IF-THEN_ELSE i CASE OF) i pêtle iteracyjne (FOR, WHILE, REPEAT).
Elementy te mogą być również zagnieżdżone. Ponieważ elementy języka SFC mogą być
przedstawione przy użyciu ST, umożliwia to zapis całego programu w ST.
I:= 25;
WHILE j<5 DO
Z;=
F(I+J);
END_WHILE
IF B_1 THEN
%QW100:=INT_TO_BCD(Display)
ENDIF
CASE TW OF
1,5:
TEMP:=
TEMP_1;
2:
TEMP:=
40;
12
3-13
4:
TEMP:=
FTMP(TEMP_2);
ELSE
TEMP:=
0;
B_ERROR:=
1;
END_CASE
3.6 Przykład programu
Przypuśćmy, że zasilanie wieżowca w wodę polega na napełnianiu trzech zbiorników
wodnych znajdujących się na różnych poziomach wieżowca.
Dla tego przykładu zadeklarowano następujące zmienne, będące zmiennymi boolowskimi:
Zmienne wejściowe:
dpn1, dpn2, dpn2 - oznaczają „poziom dolny nieosiągnięty” w danym zbiorniku. Woda w
zbiorniku
jest
poniżej poziomu dolnego.
gpp1, gpp2, gpp3 - oznaczają „poziom górny przekroczony” dla danego zbiornika.
Zmienne wyjściowe:
up1, up2, up3 - oznaczają „uruchomiona pompa” zbiornika o podanym numerze.
gpp1
gpp2
gpp3
dpp1
dpp2
dpp3
Pompa1
Pompa2
Pompa3
up1
up2
up3
wejścia
wyjścia
PLC
Wodociągi miejskie
Rys. 3.11. Schemat zasilania wodnego w wieżowcu.
13
3-14
Opracowano pięć wersji programu dla systemu sterowania z rys. 3.11. Deklaracje zmiennych będzie
wspólna dla wszystkich języków i jest postaci:
VAR_INPUT
gpp1:
BOOL;
dpn1:
BOOL;
gpp2:
BOOL;
dpn2:
BOOL;
gpp3:
BOOL;
dpn3:
BOOL;
END_VAR
VAR_OUT
up1:
BOOL;
up2:
BOOL;
up3:
BOOL;
END_VAR
Pierwszy program sterownika przedstawiony na rys. 3.12 został napisany przy użyciu
sekwencyjnych schematów blokowych, natomiast instrukcje w blokach tego języka zapisano stosując
tekst strukturalny.
NOT(up1) AND dpn1
AND NOT(dpn2);
Czy włączenia pompy 1?
up1(S);
Właczenie pompy 1
3
Pusty krok
2
up1 AND (gpp1 OR dpn2);
Czy wyłączenie pompy 1?
up1(R);
Wyłączenie pompy 1
4
Puste przejscie (tranzycja)
2
2
3
4
up1(R); up2(R); up3(R);
Inicjalizacja
1
Puste przejscie (tranzycja)
1
NOT(up2) AND dpn2
AND NOT(dpn3);
Czy włączenia pompy 2?
up2(S);
Właczenie pompy 2
102
Pusty krok
101
up2 AND (gpp2 OR dpn3);
Czy wyłączenie pompy 2?
up2(R);
Wyłączenie pompy 2
103
Puste przejscie (tranzycja)
101
101
102
103
NOT(up3) AND dpn3;
Czy włączenia pompy 3?
up3(S);
Właczenie pompy 3
202
Pusty krok
201
up3 AND gpp3;
Czy wyłączenie pompy 3?
up3(R);
Wyłączenie pompy 3
203
Puste przejscie (tranzycja)
201
201
202
203
Rys. 3.12. Przykładowy program przedstawiony przy pomocy SFC.
14
3-15
Na Rys. 3.13 przedstawia wariant programu dla języka schematów drabinkowych.
dpn1
S
dpn2
gpp1
R
dpn2
dpn2
S
dpn3
gpp2
R
dpn3
dpn1
S
gpp3
R
up1
up1
up2
up2
up3
up3
Rys. 3.13. Rozwiązanie przykładu dla programu przedstawionego przy użyciu schematów
drabinkowych.
Rozwiązanie problemu sterowania przy użyciu bloków funkcyjnych przedstawia rys. 3.14.
dpn1
dpn2
&
sr
gpp1
dpn2
>=1
up1
dpn2
dpn3
&
sr
gpp2
dpn3
>=1
up2
dpn3
dpn3
sr
up3
Rys. 3.14. Rozwiązanie przykładu dla programu przedstawionego przy użyciu bloków funkcyjnych.
15
3-16
Rozwiązanie zadania przy użyciu tekstu strukturalnego przedstawia się następująco:
IF dpn1 AND NOT(dpn2) THEN
up1:=
TRUE;
END_IF;
IF gpp1 OR dpn2 THEN
up1:=
FALSE;
END_IF;
IF dpn2 AND NOT(dpn3) THEN
up2:=
TRUE;
END_IF;
IF gpp2 OR dpn3 THEN
up2:=
FALSE;
END_IF;
IF dpn3 THEN
up3:=
TRUE;
END_IF;
IF gpp3 THEN
up3:=
FALSE;
END_IF;
Rozwiązanie zadania przy użyciu listy instrukcji:
LD
dpn1
ANDN
dpn2
JMPCN
nxt1
ST
up1
nxt1:
LD
gpp1
OR
dpn2
JMPCN
nxt2
STN
up1
nxt2:
LD
dpn2
ANDN
dpn3
JMPCN
nxt3
ST
up2
nxt3:
LD
gpp2
OR
dpn3
JMPCN
nxt4
STN
up2
nxt4:
LD
dpn3
JMPCN
nxt5
ST
up3
nxt5:
LD
gpp3
JMPCN
nxt6
STN
up3
nxt6: RET
16
3-17
3.6.1 Funkcje
Użytkownik może sam definiować funkcje lub może korzystać z funkcji standardowych. Nowo
deklarowane funkcje są zawarte pomiędzy słowami FUNCTION i END_FUNCTION. Dla przykładu
funkcja wyznaczająca wartość średnią z dwóch wielkości wejściowych będzie postaci.
FUNCTION SREDNIA : REAL
VAR_INPUT
WARTOSC1, WARTOSC2 : REAL;
END_VAR
SREDNIA:=
(WARTOSC1 + WARTOSC2)/2;
END_FUNCTION;
W standardzie przyjęto pewien zbiór funkcji podstawowych. Należą do nich funkcje wyznaczające
wartość bezwzględną, pierwiastek, logarytmy, potęgi oraz typowe funkcje trygonometryczne (tab.3.7).
Funkcje te zwracają wartość tego samego typu co argument funkcji.
Nazwa funkcji Typ danej
Opis
ABS ANY_NUM
wartość bezwzględna
SQRT ANY_REAL
pierwiastek
kwadratowy
LN ANY_REAL
logarytm
naturalny
LOG ANY_REAL
logarytm
EXP ANY_REAL
wykładnik
SIN
ANY_REAL
sinus w radianach
COS
ANY_REAL
cosinus w radianach
TAN
ANY_REAL
tangens w radianach
ASIN
ANY_REAL
arcus sinus, wynik w radianach
ACOS
ANY_REAL
arcus cosinus, wynik w radianach
ATAN
ANY_REAL
arcus tangens, wynik w radianach
Tab. 3.7. Funkcje numeryczne
Typowe operacje arytmetyczne są wyrażone w języku ST w postaci symbolicznej. Operacje te
mogą być przedstawione w innych językach w postaci wywołań funkcji o podanych nazwach (tab.3.8).
Nazwa funkcji Typ danej
Operator ST Liczba Parametrów Opis
ADD ANY_NUM
+ >=2
wynik:=
we1+we2+...
MUL ANY_NUM
* >=2
wynik:=
we1*we2*..
SUB ANY_NUM
- 2
wynik:=
we1-we2
DIV ANY_NUM
/ 2
wynik:=
we1/we2
MOD
ANY_INT
MOD
2
wynik:= we1MOD we2
EXPT ANY_REAL
** 2
wynik:= we1we2
MOVE ANY :=
1
wynik:=
we1
Tab. 3.8. Funkcje arytmetyczne
Przy programowaniu sterowników duża część programowania dotyczy przetwarzania
logicznego, które realizuje się poprzez użycie operacji na łańcuchach bitowych lub na bitach. Typy
tych operacji zawarte są w tab. 3.9 i tab. 3.10.
Nazwa
funkcji
Typ
danej
Opis
SHL ANY_BIT
przesunięcie łańcucha bitów o n pozycji w lewo, wypełnienie zerami
po prawej
SHR ANY_BIT
przesunięcie łańcucha bitów o n pozycji w prawo, wypełnienie zerami
po lewej
ROR ANY_BIT
przesunięcie rotacyjne łańcucha bitów o n pozycji w prawo
ROL ANY_BIT
przesunięcie rotacyjne łańcucha bitów o n pozycji w lewo
Tab. 3.9. Operacje na łańcuchach bitowych
17
3-18
Nazwa funkcji Typ danej
Symbol
Liczba
parametrów
Opis
AND
ANY_BIT
&
>=2
wynik:= we1 & we2 &...
OR
ANY_BIT
>=1
>=2
wynik:= we1 OR we2 OR...
XOR
ANY_BIT
&
>=2
wynik:= we1 XOR we2 XOR...
NOT
BOOL
&
1
wynik:= NOT we1
Tab. 3.10. Operacje bitowe
Do operacji logicznych nalezą również funkcje porównywania, które zawarto w tab. 3.11.
Nazwa funkcji Symbol Opis
GT
>
wynik:= we1 > we2
GE
>=
wynik:= we1 >= we2
EQ
=
wynik:= we1 = we2
LE
<=
wynik:= we1 <= we2
LT
<
wynik:= we1 < we2
NE
<>
wynik:= we1 <> we2
Tab. 3.11. Funkcje porównywania
Dalszym rozszerzeniem przetwarzania logicznego są funkcje wyboru, które przedstawiono w postaci
blokowej na rys. 3.15, a ich znaczenie opisano w tab. 3.12.
SEL
G
IN0
IN1
BOOL
ANY
ANY
ANY
MAX
ANY
ANY
ANY
ANY
...
LIMIT
MN
IN
MX
ANY
ANY
ANY
ANY
MIN
ANY
ANY
ANY
ANY
...
MUX
ANY_INT
ANY
ANY
ANY
...
K
Rys. 3.15. Funkcje wyboru w zapisie blokowym
Nazwa funkcji Symbol Opis
SEL ANY
Wybór:
Jeżeli G prawdziwe to wynik:= IN1, w przeciwnym
przypadku wynik:= we0.
MAX
ANY
Maksimum: wynik równy jest maksymalnej wartości wszystkich
wejść
MIN
ANY
Minimum: wynik równy jest minimalnej wartości wszystkich
wejść
LIMIT
ANY
Ograniczenie: wynik równy wartości IN ograniczonej minimum
MN i maksimum MX
MUX
ANY
Multiplekser: wynik jest wartością wejściową wybraną przez
wskaźnik K
Tab. 3.12. Funkcje wyboru dla zapisu z rys. 3.15.
Zdefiniowano także funkcje operujące na łańcuchach znaków. Opis tych funkcji zawarto w tab. 3.13 i
na rys. 3.16.
18
3-19
Nazwa funkcji Opis
LEFT Wynikiem
jest
łańcuch znakowy otrzymany z L znaków łańcucha
wejściowego.
RIGHT Wynikiem
jest
łańcuch znakowy otrzymany z L znaków łańcucha
wejściowego
MID Wynikiem
jest
łańcuch składający się z L-znaków otrzymany z łańcucha
wejściowego IN rozpoczynając od znaku P
CONCAT Wynikiem
jest
łańcuch otrzymany z złożenia łańcuchów wejściowych
INSERT Wynikiem
jest
łańcuch otrzymany z łańcucha IN1, poprzez wstawienie do
niego od pozycji P łańcucha IN2
DELETE Wynikiem
jest
łańcuch otrzymany z łańcucha wejściowego poprzez
usunięcie z niego L znaków począwszy od pozycji P.
REPLACE Wynikiem
jest
łańcuch otrzymany z łańcucha IN1 w którym dokonano
wymiany L znaków począwszy od pozycji P, z łańcuchem IN2
LEN
Wynikiem jest długość łańcucha wejściowego
FIND
Wynikiem jest pozycja w łańcuchu IN1, w którym znaleziono łańcuch IN2.
Funkcja zwraca 0, gdy nie znaleziono takiego łańcucha.
Tab. 13. Funkcje operujące na łańcuchach znaków dla zapisu z rys. 16.
LEFT
IN
L
STRING
ANY_INT
STRING
RIGHT
IN
L
STRING
ANY_INT
STRING
MID
IN
L
STRING
ANY_INT
STRING
CONCAT
STRING
STRING
P
ANY_INT
STRING
...
INSERT
IN1
P
STRING
ANY_INT
STRING
DELETE
IN
L
STRING
ANY_INT
STRING
REPLACE
IN1
L
STRING
ANY_INT
STRING
FIND
STRING
STRING
P
ANY_INT
STRING
LEN
STRING
INT
IN2
STRING
IN2
STRING
P
ANY_INT
Rys. 3.16. Bloki funkcji operujących na znakach.
19
3-20
3.6.2 Kontrola wykonania funkcji
Przy wykonywaniu funkcji można wykorzystać specjalne wejście EN (zmienna boolowska),
które mówi, czy funkcja może być wykonana. Funkcje mają również specjalne wyjście ENO, które
mówi czy funkcja została prawidłowo wykonana. W przypadku błędu wykonania, wyjście ENO
przyjmuje wartość FALSE. Wielkości te są wykorzystywane do łączenia funkcji, w ten sposób aby
dana funkcja była wykonywana tylko wtedy, gdy funkcja poprzedzająca została prawidłowo
wykonana(rys.3.17).
ADD
EN
ENO
SQRT
EN
ENO
Rys. 3.17. Zasada kontroli wykonywania funkcji
Przy definicji nowego typu funkcji, zmienne EN i ENO są zdefiniowane w sposób niejawny w
postaci:
VAR_INPUT
EN : BOOL := 1;
END_VAR
VAR_OUTPUT
ENO : BOOL;
END_VAR
Zmienne te mogą być użyte w jeżykach Structured Text i Instruction List. Ilustrują to dwa
poniższe przykłady:
ENO := (przyspieszenie>0);
lub
LD przyspieszenie
(*
Załaduj przyśpieszenie
*)
GT
0 (*
Sprawdź, czy dodatnie
*)
ST
ENO
(* Ustaw ENO, jeżeli dodatnie *}
3.7 Bloki funkcyjne
Istotną własnością różniącą blok funkcyjny od funkcji jest możliwość zachowania danych.
Można w nim zdefiniować zbiór zmiennych wejściowych i wyjściowych oraz zmiennych wewnętrznych
i chwilowych. Wykonanie bloku funkcyjnego bazuje na zmiennych wejściowych i wewnętrznych i
powoduje wyznaczenie zmiennych wyjściowych i nowych wartości zmiennych wewnętrznych.
FUNCTION_BLOK Przyklad
VAR_INPUT:
X:
BOOL;
Y:
BOOL;
END_VAR
VAR_OUTPUT:
Z:
BOOL;
END_VAR;
(* instrukcje ciała bloku funkcji *)
END_FUNCTION_BLOCK
Deklaracja
powyższa przedstawia sprzęg do bloku funkcyjnego z dwoma boolowskimi
parametrami wejściowymi i jednym boolowskim parametrem wyjściowym.
3.8 Wnioski
Standard IEC1131 stanowi znaczny postęp w unifikacji oprogramowania sterowników.
Niestety większość producentów z uporem narzuca swoje rozwiązania lub dokonuje jedynie
częściowych przesunięć w kierunku standardu, nie dbając o pełną z nim zgodność. Działanie to
wynika głównie z tego, że producent chce związać klientów już „zdobytych”.
20