Professional Documents
Culture Documents
W dalszym cigu trwaj prace nad udoskonaleniem i rozszerzeniem normy IEC 61131, poniewa dotyczy ona nowoczesnej technologii. Std cigy nacisk na wprowadzanie innowacji. Komitet IEC wyda dwa raporty, z ktrych jeden zawiera propozycje rozszerze do normy (Technical Report 2), a drugi wskazwki dotyczce implementacji jzykw programowania dla sterownikw programowalnych (Technical Report 3). Ponadto przedstawiona zostaa korekta bdw dostrzeonych po publikacji normy (ang. Corrigendum), a take dokument zawierajcy propozycje poprawek i udoskonale (ang. Amendments). W przygotowaniu jest rwnie cz dotyczca jzyka dla sterowania z wykorzystaniem zbiorw rozmytych (ang. Fuzzy Control Language). W 1996r ukazay si polskie tumaczenia pierwszej i drugiej czci normy, oznaczone odpowiednio jako: PN-IEC 1131-1:1996. Sterowniki programowalne Postanowienia oglne oraz PN-IEC 1131-2:1996. Sterowniki programowalne Wymagania i badania dotyczce sprztu. W 1998 ukazaa si trzecia cz normy, oznaczona jako PN-EN 61131-3:1998. Sterowniki programowalne Jzyki programowania a w 2002 r cz pita: PN-EN 61131-5:2002. Sterowniki programowalne Cz5: Komunikacja.
Wyrniono nastpujce elementy jzykw programowania dla sterownikw PLC: Typy danych (ang. Data types); Jednostki organizacyjne oprogramowania (ang. Program organization units); Elementy schematu funkcji sekwencyjnej (ang. Sequential Function Chart); Elementy konfiguracji (ang. Configuration elements). Typy danych su okreleniu struktury danych w sterowniku, zarwno staych jak i zmiennych, a w szczeglnoci zakresu wartoci jakie mog przyjmowa dane oraz obszaru pamici potrzebnego do ich przechowywania. Jednostki organizacyjne oprogramowania stanowi najmniejsze niezalene jednostki oprogramowania aplikacji uytkownika. Skadaj si na nie: Funkcje (ang. Functions), Bloki funkcjonalne (ang. Function blocks), Programy (ang. Programs). Elementy konfiguracji wspomagaj instalowanie i uruchamianie programw w systemach sterownikowych. Zalicza si do nich: Konfiguracje (ang. Configurations), Zasoby (ang. Resources), Zadania (ang. Tasks), Zmienne globalne (ang. Global variables), cieki dostpu (ang. Access paths). Konfiguracja jest elementem jzyka, ktry odpowiada systemowi sterownikw programowalnych rozumianemu jako cao, obejmujc wszystkie pozostae elementy oprogramowania. Zasb z kolei jest programowym odpowiednikiem sprztu realizujcego funkcje przetwarzania sygnaw, cznie z funkcjami okrelonymi przez podczone czujniki i elementy wykonawcze (ang. sensor and actuator interface) oraz urzdzenia operatorskie MMI (ang. Man-Machine Interface).
Struktura programu
Jednostki organizacyjne oprogramowania, oznaczane dalej w skrcie POU (z ang. Program Organization Unit), takie jak programy, bloki funkcjonalne (w skrcie FB, ang. Function Block) czy funkcje stanowi najmniejsze, niezalene jednostki oprogramowania aplikacji uytkownika. POU mog wywoywa si wedug przedstawionej wyej kolejnoci, ktra odpowiada zmniejszajcym si moliwociom funkcjonalnym, lub wywoywa si wzajemnie w ramach danego typu POU. Oznacza to, e z poziomu programu mona wywoywa FB lub funkcj, z FB mona wywoywa inny FB lub funkcj, a funkcja moe wywoywa tylko inn funkcj. Niedopuszczalne jest wywoywanie rekurencyjne, tzn. POU nie moe wywoywa siebie ani bezporednio, ani porednio, chocia w jzykach stosowanych w komputerach PC takie wywoania s dopuszczalne. W normie nie wystpuje takie pojcie jak podprogram (ang. subroutine) rol podprogramw wystpujcych w innych jzykach peni tu bloki funkcjonalne i funkcje. Podstawowa rnica midzy funkcj a blokiem funkcjonalnym polega na tym, e wywoanie funkcji z tymi samymi argumentami (parametrami wejciowymi) zawsze daje t sam warto na wyjciu (warto funkcji), w przeciwiestwie do bloku funkcjonalnego, ktrego wywoanie z tymi samymi argumentami wejciowymi niekoniecznie musi prowadzi do tych samych wartoci wyjciowych. FB posiada bowiem wewntrzne zmienne zawierajce pewn informacj o stanie (mona powiedzie, e jest to element dynamiczny), podczas gdy funkcja nie zawiera wewntrznej informacji o stanie (jest to wic element statyczny). Wszystkie wartoci zmiennych wyjciowych oraz konieczne wartoci zmiennych wewntrznych FB s przechowywane pomidzy kolejnymi chwilami wykonania, std kady wystpujcy w programie FB posiada swoj wasn nazw oraz struktur danych (w normie nazywane jest to ukonkretnieniem albo egzemplarzem ang. instance). Kady FB musi mie zdefiniowanych tyle ukonkretnionych egzemplarzy, ile razy jest wywoywany w danym POU, co wynika std, e kady egzemplarz musi mie swoj wasn struktur danych do przechowywania stanu. Jeeli np. w POU (programie lub FB) wystpuje konieczno uycia dwch czasomierzy typu TON, to trzeba zadeklarowa dwa egzemplarze (dwie nazwy) takiego czasomierza. Programy stoj na szczycie hierarchii POU i maj moliwo dostpu do wej i wyj sterownika, zmiennych globalnych i cieek dostpu oraz udostpniania ich innym POU. Kady POU zawiera nastpujce elementy: typ i nazwa POU (w przypadku funkcji take typ danej wyjciowej); deklaracja zmiennych (wejciowych, wyjciowych i lokalnych); ciao POU (kod programu). Typ POU okrelony jest przez odpowiednie sowo kluczowe: PROGRAM, FUNCTION_BLOCK lub FUNCTION, po ktrym wystpuje nazwa wasna POU. Dodatkowo w przypadku funkcji okrela si take typ funkcji, np.: FUNCTION ALARM :BOOL; oznacza deklaracj funkcji o nazwie ALARM, ktra na wyjciu daje warto typu BOOL.
Deklaracja zmiennych Zmienne (ang. variables) wykorzystywane s do przechowywania i przetwarzania informacji. Umieszczone s one w pamici danych sterownika, chocia ich lokalizacja nie musi ju by bezporednio wskazana przez uytkownika (w postaci podania konkretnego adresu w pamici), w przeciwiestwie do stosowanych poprzednio metod deklaracji zmiennych w sterownikach. Wg normy deklarowane zmienne mog by umieszczone w pamici sterownika automatycznie przez system programujcy, natomiast musz mie ustalony typ danej (ang. data type). W normie IEC 61131-3 zdefiniowano pewn liczb elementarnych typw danych (BOOL, BYTE, INT itd.), ktre rni si zarwno wartociami, jakie mog przyjmowa, jak i liczb zajmowanych bitw. Moliwe jest take definiowanie przez uytkownika swoich wasnych typw danych, czyli typw pochodnych, w postaci np. tablic lub struktur. Zmienne mog by take przyporzdkowane pewnym adresom wej lub wyj (zmienne reprezentowane bezporednio), oraz mog by podtrzymywane bateryjnie w czasie zaniku napicia zasilania. Wszystkie uywane w POU zmienne musz by zadeklarowane, przy czym moe to by zrobione poza POU (np. zmienne globalne), wewntrz POU (zmienne lokalne) lub jako parametry wejciowe i wyjciowe. Na pocztku POU, po deklaracji jego nazwy, wystpuje cz deklaracyjna dla zmiennych. Przykad deklaracji zmiennych: VAR (* pocztek deklaracji zmiennych w programie *) S1 AT %I1 : BOOL; (* zmienna S1 typu BOOL, przypisana do wejcia %I1 *) S2 AT %I2 : BOOL; (* zmienna S2 typu BOOL, przypisana do wejcia %I2 *) K3A : BOOL; (* zmienna K3A typu BOOL, bez podania adresu *) OPOZNIENIE : TON; (* ukonkretnienie bloku czasomierza TON *) END_VAR (* koniec deklaracji zmiennych *) VAR RETAIN (* deklaracja zmiennych z podtrzymaniem bateryjnym *) K1 AT %Q1 : BOOL; (* zmienna K1 typu BOOL, przypisana do wyjcia %Q2 *) END_VAR (* koniec deklaracji zmiennych *) W przedstawionym przykadzie zmiennej K3A nie przyporzdkowano adresu w pamici sterownika, a wic system programujcy automatycznie dokona lokalizacji tej zmiennej w pamici. Gdyby programista da przechowywania tej zmiennej w konkretnym bicie pamici sterownika, to deklaracja tej zmiennej wygldaaby w nastpujcy sposb:
K3A AT %M1 : BOOL;
Deklaracja OPOZNIENIE : TON; informuje o tym, e w programie bdzie uywany blok funkcjonalny typu TON o konkretnej nazwie OPOZNIENIE i system programujcy musi zarezerwowa odpowiedni struktur danych dla tego bloku. Struktura tych danych jest zdefiniowana przez deklaracj standardowego bloku TON. Kwalifikator RETAIN umoliwia okrelenie tych zmiennych, ktrych wartoci powinny by przechowywane w pamici w czasie zaniku napicia zasilania, tu dotyczy to zmiennej K1 przyporzdkowanej do wyjcia %Q1.
Kod jednostki oprogramowania Zadanie do zaprogramowania: Jeeli zmienna STOP ma warto 0 lub wejcie %I4 ma warto 1, to wycz wyjcie %Q1, w przeciwnym razie jeeli wejcie %I1 ma warto 1 i wyjcie %Q2 ma warto 0, to zacz wyjcie %Q1, w przeciwnym razie pozostaw %Q1 bez zmian. lub inaczej: %Q1:=NOT (NOT STOP OR %I4) AND (%Q1 OR %I1 AND NOT %Q2) Zadanie zrealizowa przy pomocy przerzutnika RS.
Przykad w jzyku IL: (* pierwszy szczebel drabinki *) LD %I1 ANDN %Q2 S %Q1 (* drugi szczebel drabinki )
LDN STOP
OR R
%I1 %Q2
STOP %I4
Przykad w jzyku ST: (* wywoanie przerzutnika *) FlipFlop( S:= %I1 AND NOT %Q2, R1:=NOT STOP OR %I4 ); (* ustawienie wyjcia *) %Q1 := FlipFlop.Q1
Literay
Przedstawianie danych w postaci liczbowej: Opis Liczby cakowite Liczby rzeczywiste Liczby rzeczywiste z wykadnikami Liczby dwjkowe Liczby semkowe Liczby szesnastkowe Boolowskie zero i jedynka Boolowskie FASZ i PRAWDA -12 -12.0 0 Przykady 123_456 0.0 0.456 +986 3.14159_26
-1.34E-12 lub -1.34e-12 1.234E6 lub 1.234e6 2#1111_1111 (255) 8#377 (255) 2#1110_0000 (240) 8#340 (240)
FALSE
Przykady przedstawiania danych w postaci czasw trwania: Opis Literay bez podkrele z przedrostkiem krtkim Literay bez podkrele z przedrostkiem dugim Literay z podkreleniem z przedrostkiem krtkim Literay z podkreleniem z przedrostkiem dugim Przykady T#14ms T#14.7s T#14.7m T#14.7h t#14.7d t#5d14h12m18s3.5ms TIME#14ms time#14.7s T#14ms T#14.7s T#14.7m T#14.7h t#25h_15m t#5d_14h_12m_18s_3.5ms TIME#25h_15m time#5d_14h_12m_18s_3.5ms
Przedrostki uywane przy przedstawianiu danych w postaci godziny dnia i daty: Lp. 1 2 3 Data (ang. date) Godzina dnia (ang. time of day) Data i godzina (ang. date and time) Opis DATE# Przedrostek D# TOD# DT#
TIME_OF_DAY# DATE_AND_TIME#
Przykady przedstawiania danych w postaci daty i godziny dnia: Zapis z dugim przedrostkiem DATE#1984-06-25 date#1984-06-25 TIME_OF_DAY#15:36:55.36 time_of_day#15:36:55.36 DATE_AND_TIME#1984-06-2515:36:55.36 date_and_time#1984-06-2515:36:55.36 Zapis z krtkim przedrostkiem D#1984-06-25 d#1984-06-25 TOD#15:36:55.36 tod#15:36:55.36 DT#1984-06-25-15:36:55.36 dt#1984-06-25-15:36:55.36
Liczba cakowita duga bez znaku Liczba rzeczywista Liczba rzeczywista duga Czas trwania Data Godzina dnia
15 DATE_AND_TIME lub DT Data i czas 16 STRING 17 BYTE 18 WORD 19 DWORD 20 LWORD Cig znakw o zmiennej dugoci Bajt cig 8 bitw Sowo cig 16 bitw Sowo podwjne cig 32 bitw Sowo dugie cig 64 bitw 8 16 32 64
Przegld uniwersalnych typw danych: ANY ANY_BIT ANY_NUM ANY_INT BOOL BYTE WORD DWORD LWORD INT SINT DINT LINT UINT USINT UDINT ULINT ANY_REAL REAL LREAL DATE TIME_OF_DAY DATE_AND_TIME TIME STRING i typy pochodne ANY_DATE
Przykady deklaracji wartoci pocztkowych: Lp. 1 2 Przykad TYPE PI : REAL := 3.1415925 ; END_TYPE TYPE ANALOG_RANGE : (BIPOLAR_10V, UNIPOLAR_1_10V, UNIPOLAR_0_10V, UNIPOLAR_1_5V, UNIPOLAR_0_5V, UNIPOLAR_4_20MA, UNIPOLAR_0_20MA, ) := UNIPOLAR_1_5V ; END_TYPE (* -10 do +10 VDC *) (* +1 do +10 VDC *) (* 0 do +10 VDC *) (* +1 do +10 VDC *) (* 0 do +10 VDC *) (* +4 do +20 mADC *) (* 0 do +20 mADC *)
3 4
TYPE ANALOG_DATAZ : INT (-4095..4095) := 0 ; END_TYPE TYPE ANALOG_16_INPUT: ARRAY[1..16] OF ANALOG_DATA := 8(-4095), 8(4095); END_TYPE
Zmienne
Sowa kluczowe do deklaracji zmiennych: Typ zmiennej VAR VAR_INPUT Opis Deklaracja zmiennych wewntrznych w POU. Deklaracja zmiennych dostarczanych do POU z zewntrz, nie mog by zmieniane w POU.
VAR_OUTPUT Deklaracja zmiennych wyprowadzanych z POU na zewntrz do innych POU. VAR_IN_OUT Deklaracja zmiennych dostarczanych do POU z zewntrz i wyprowadzanych na zewntrz, mog by zmieniane.
VAR_EXTERNAL Deklaracja uycia zmiennych zdefiniowanych w konfiguracji jako VAR_GLOBAL, mog by zmieniane. VAR_GLOBAL VAR_ACCESS Deklaracja zmiennych globalnych. Deklaracja cieek dostpu.
(* nazwa zmiennej typ danej warto pocztkowa opcjonalnie *) Moja_zmienna : DINT := 100; END_VAR (* koniec deklaracji bloku zmiennych *)
Zmienne proste
Przedrostki okrelajce pooenie i rozmiar zmiennej: Lp. 1 2 3 4 5 6 7 8 9 Przedrostek I Q M X brak B W D L Opis Pooenie wejcie (ang. Input) Pooenie wyjcie (ang. Output) Pooenie pami (ang. Memory) Rozmiar pojedynczy bit Rozmiar pojedynczy bit Rozmiar bajt (8 bitw) Rozmiar sowo (16 bitw) Rozmiar sowo podwjne (32 bity) Rozmiar sowo poczwrne (64 bity)
Przykady deklaracji i uycia zmiennych prostych: VAR (* zmienne reprezentowane bezporednio *) AT %IW1 : INT; (* sowo wejciowe o adresie 1, zmienna typu INT *) AT %QD8 : DINT; (* podwjne sowo wyjciowe rozpoczynajce si od adresu 8, zmienna typu DINT *)
(* zmienne symboliczne ulokowane *)
XXX AT %QW3 : INT; (* sowo wyjciowe o adresie 3, zmienna typu INT *) YYY AT %QX16 : BOOL; (* bit 16 na wyjciu *) (* zmienne symboliczne z automatycznym przydziaem pamici *) A,B,C : INT; (* przydzielenie 3 kolejnych sw pamici na 3 zmienne typu INT *) DDD : DINT (* przydzielenie kolejnych 2 sw pamici na zmienn typu DINT *) RRR : REAL; (* przydzielenie kolejnych 2 sw pamici na zmienn typu REAL *) END_VAR
(* ciao POU w jzyku IL *)
... LD %IW1 (* uycie bezporedniej reprezentacji zmiennej *) ST XXX (* uycie zmiennej symbolicznej XXX *)
Deklaracja typu danych umoliwia systemowi programujcemu sprawdzenie poprawnoci uycia zmiennej w POU ju w trakcie kompilacji. Wprowadzenie np. do programu cigu instrukcji:
LD %IW1 (* aduj do akumulatora zmienn typu INT *) ST DDD (* przelij zawarto akumulatora do zmiennej typu DINT *)
dla deklaracji zmiennych jw. powinno spowodowa w trakcie kompilacji zasygnalizowanie bdu wynikajcego z mieszania zmiennych nalecych do rnych typw danych.
Zmienne wieloelementowe
Zmiennymi wieloelementowymi s tablice i struktury. Przykady deklaracji zmiennych wieloelementowych: VAR WEJSCIA AT %IW1 : ARRAY[0..3] OF INT; INPUT_TAB : ANALOG_ARRAY; MODULE_CONFIG : ANALOG_16_INPUT_CONFIG; END_VAR (* tablica jednowymiarowa *) (* tablica dwuwymiarowa *) (* struktura *)
Tablica jest zbiorem elementw tego samego typu, do ktrych dostp uzyskuje si za pomoc jednego lub wicej indeksw umieszczonych w nawiasach kwadratowych i oddzielonych przecinkami. Zmienna w postaci tablicy moe by zadeklarowana przy uyciu sowa kluczowego ARRAY z podaniem zakresu zmian indeksw, albo jako zmienna naleca do typu danych, ktry zosta zdefiniowany jako tablica. Zmienn strukturaln jest zmienna deklarowana jako struktura, ktrej elementy nale do rnych typw danych. Kolejne elementy struktury reprezentowane s przez identyfikatory oddzielone kropkami. Zmienna o nazwie MODULE_CONFIG jest zadeklarowana jako struktura. Przypisanie wartoci SINGLE_ENDED do elementu SIGNAL_TYPE tej zmiennej mona przedstawi w nastpujcy sposb:
MODULE_CONFIG.SIGNAL_TYPE:=SINGLE_ENDED.
Jednym z elementw zmiennej strukturalnej MODULE_CONFIG jest take tablica CHANNEL, ktra zawiera 16 elementw bdcych strukturami zadeklarowanymi jako typ ANALOG_CHANNEL_CONFIG, w ktrym z kolei wystpuje element RANGE. Przypisanie wartoci BIPOLAR_10V do elementu RANGE struktury, ktra jest pitym elementem tablicy CHANNEL w strukturze MODULE_CONFIG mona zapisa wic jako: MODULE_CONFIG.CHANNEL[5].RANGE:=BIPOLAR_10V.
Atrybuty zmiennych
Atrybut Opis
zmienna podtrzymywana staa (tzn. zmienna niemodyfikowana) zmienna reaguje tylko na zbocze narastajce zmienna reaguje tylko na zbocze opadajce zmienna moe by tylko czytana zmienna moe by czytana i zapisywana
Przykady deklaracji atrybutw dla zmiennych: VAR CONSTANT (* deklaracja staej *) PI : REAL := 3.1415925; END_VAR VAR_OUTPUT RETAIN (* deklaracja zmiennej wyjciowej podtrzymywanej *) Q : WORD; END_VAR VAR_INPUT (*deklaracja zmiennych wejciowych *) WEJ1 : BOOL R_EDGE; (* reagujcej tylko na zbocze narastajce *) WEJ2 : BOOL F_EDGE; (* reagujcej tylko na zbocze opadajce *) END_VAR VAR_ACCESS (* deklaracja cieki dostpu *) CSX : P1.Z : REAL READ_ONLY (* dostp do zmiennej tylko do odczytu *); END_VAR Atrybut CONSTANT suy do deklaracji zmiennej, ktrej warto nie zmienia si w trakcie wykonywania programu, naley wic j traktowa jako sta. Nie zawsze w tekcie programu naley wpisywa warto sta jako litera. Lepiej czasami jest zadeklarowa sta w bloku deklaracji zmiennych. Nie powoduje to zwikszenia zajtoci pamici (a czasami pozwala wrcz na zaoszczdzenie), natomiast nie prowadzi do niejednoznacznoci. Np. litera 1 moe zarwno oznacza dan typu BOOL, jak i liczb cakowit typu INT, UINT, SINT itp. Natomiast w przypadku uycia deklaracji: VAR CONSTANT Jedynka : INT := 1; Jeden : DINT :=1; END_VAR staa Jeden rni si od staej Jedynka typem danej, mimo e obie stae maj t sam warto. A co za tym idzie, podlegaj one dziaaniom czy funkcjom okrelonym dla innych typw danych, np. staej Jeden nie mona uy jako parametru wejciowego w funkcji MUL_INT.
VAR_INPUT WE1 : INT; WE2 : BOOL F_EDGE; WE3 : BOOL R_EDGE; END_VAR VAR_OUTPUT WY : INT; END_VAR VAR_IN_OUT WEWY : BOOL; END_VAR
Funkcje
Podstawow zasad tworzenia funkcji jest, by instrukcje zawarte w ciele funkcji zastosowane do zmiennych wejciowych zawsze dostarczay jednoznaczny wynik w postaci wartoci funkcji, bez wzgldu na to jak czsto i w jakiej chwili funkcja jest wywoywana. W tym sensie funkcje mog by traktowane jako rozszerzenie podstawowego zbioru operacji sterownika. W jzykach tekstowych funkcje uywane mog by jako operatory (rozkazy) w jzyku IL lub jako operandy w wyraeniach jzyka ST. W jzykach graficznych funkcje reprezentowane s w postaci prostoktw o wymiarach zalenych od liczby wej. Graficzne przedstawianie negacji sygnaw boolowskich: Lp. 1 2 Opis Negacja wejcia Negacja wyjcia Symbol
O O
Przykady uycia wejcia EN i wyjcia ENO: Lp. 1 Opis Jzyk LD uycie EN i ENO jest obowizkowe. Przykad
FUN ZEZW BEZBLEDU EN ENO( ) A C B FUN ZEZW EN ENO BEZBLEDU A C B FUN A C B
Para EN /ENO nie wystpuje w jzykach tekstowych, std pewna trudno w bezporednim tumaczeniu programu z jzyka graficznego na tekstowy. Deklaracja funkcji pochodnej (ang. derived function) Przykad deklaracji funkcji w jzyku ST: FUNCTION MOJA_FUN : REAL VAR INPUT A, B : REAL; C : REAL:=1.0 ; MOJA_FUN:=A*B/C ; (* Nazwa funkcji i jej typ *) (* Parametry wejciowe *) (* Nadanie wartoci pocztkowej *)
END_VAR
Bloki funkcjonalne
Blok funkcjonalny (FB, ang. function block) jest jednostk organizacyjn oprogramowania, ktra z chwil wykonania moe dostarcza na wyjciu jedn lub wiele wartoci, w przeciwiestwie do funkcji, ktra ma tylko jedno wyjcie. Wywoanie FB z tymi samymi parametrami wejciowymi niekoniecznie musi prowadzi do tych samych wartoci wyjciowych, poniewa blok posiada struktur danych zawierajc informacj o stanie bloku (jest wic elementem dynamicznym). Tak wic wszystkie wartoci zmiennych wyjciowych, konieczne wartoci zmiennych wewntrznych oraz, w zalenoci od implementacji, wartoci parametrw wejciowych lub odwoania do nich s przechowywane pomidzy kolejnymi chwilami wykonania FB. W programie FB mog by wykorzystywane wielokrotnie, ale dla kadego wywoania musi by utworzona odpowiednia struktura danych, w ktrej przechowywana bdzie informacja o stanie wywoywanego FB. Tworzenie takiej struktury danych nazywa si tworzeniem egzemplarza FB lub ukonkretnianiem (ang. instantiation). Kady utworzony egzemplarz (ang. instance) musi posiada swj identyfikator (swoj nazw). Deklaracja zmiennej i deklaracja egzemplarza FB: VAR (* Nazwa Ala : Licznik1 : Licznik2 : END_VAR Typ danej lub FB *) BOOL; (* deklaracja zmiennej *) CTU; (* deklaracja egzemplarza FB *) CTU; (* deklaracja innego egzemplarza FB *)
Przykad struktury danych dla licznika CTU: TYPE CTU: STRUCT (* wejcia *) CU : BOOL R_EDGE; R : BOOL; PV : INT; (* wyjcia *) Q : BOOL; CV : INT; END_STRUCT; END_TYPE
Tekstowo (w jzyku ST) (* Deklaracja *) VAR FF75: SR; END_VAR (* Wywoanie *) FF75(S1:=%IX1, R:=%IX2); (* Przypisanie wyjcia *) %QX3:= FF75.Q1;
Deklaracja bloku funkcjonalnego pochodnego (ang. derived function block) Przebiegi czasowe dla przekanika dwupooeniowego z histerez czasow
Y
Yzad
1s
t Q
1
t
Tw Tz Tw Tz Tz
Przykad deklaracji bloku funkcjonalnego w jzyku ST realizujcego zadanie przekanika: FUNCTION_BLOCK PRZEKAZNIK (* cze zewntrzne *) 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 (* Ciao Bloku Funkcjonalnego *) IF We THEN IF (Y < Yzad) THEN Timer_ON(IN:=We, PT:=Tz); END_IF (* Wejcia *) (* Wejcie uruchamiajce FB, domylnie = 0 *) (* Warto zadana *) (* Opnienie zaczenia, domylnie = 100ms *) (* Opnienie wyczenia, domylnie = 100ms *) (* Wyjcie *) (* Domylnie = 0 *) (* Zmienne wewntrzne, lokalne *) (* nazwy egzemplarzy blokw funkcjonalnych *)
IF (Y > Yzad) THEN (* Y powyej Yzad *) Timer_OFF(IN:=We, PT:=Tw); (* ustaw czas, po ktrym ma by wyczony *) END_IF FlipFlop(S:=Timer_ON.Q, R1:=Timer_OFF.Q); (* wywoanie przekanika *) Q:=FlipFlop.Q1; (* nadanie wyjcia *) END_IF END_FUNCTION_BLOCK
(** Ciao Bloku Funkcjonalnego **) TimerON FlipFlop LTINT EN ENO TON RS IN QS Q1 Q Tz PT ET R1 TimerOFF GTINT EN ENO TON IN Q Tw PT ET
We Y Yzad
We Y Yzad
ENDFUNCTIONBLOCK
Wywoywanie FFB
Wzajemne wywoywanie POU podlega nastpujcym zasadom: Programy mog wywoywa funkcje lub bloki funkcjonalne (FB), ale nie odwrotnie; FB mog wywoywa inne FB; FB mog wywoywa funkcje, ale nie odwrotnie; Funkcje mog wywoywa tylko inne funkcje. Niedozwolone jest wywoywanie rekursywne, tzn. POU nie moe wywoywa siebie samego, ani bezporednio, ani w sposb poredni, chocia wywoywanie rekursywne jest dopuszczone w innych jzykach programowania, np. dla komputerw PC. Gdyby dopuszczone byo wywoanie rekursywne, to system programujcy sterownik nie byby w stanie obliczy maksymalnej pamici potrzebnej w chwili wykonania programu rekursywnego. Wywoywanie rekursywne mona atwo zastpi przez tworzenie odpowiednich iteracji, np. przez ptl. Przykad rekursywnego wywoania funkcji w jzyku ST: FUNCTION FF1 :BOOL; VAR_INPUT X : INT; END_VAR IF FF1(X) THEN ...... (* Zabronione rekursywne wywoanie definiowanej funkcji *) END_IF END_FUNCTION Przykad rekursywnego wywoania egzemplarza FB w jzyku ST: FUNCTION_BLOCK FB1 VAR_INPUT We1 : INT; END_VAR VAR MojFB : FB1; (*Zabronione rekursywne tworzenie egzemplarza definiowanego FB *) XX : INT; END_VAR FB1(XX); (*Zabronione rekursywne wywoanie definiowanego FB *)
END_FUNCTION_BLOCK
(* Deklaracja funkcji FF1 *) FUNCTION FF1 : BOOL; VAR_INPUT X : INT; END_VAR VAR Y : REAL; END_VAR ... Y:=FF2(0.0); (*Zabronione wywoanie funkcji FF2 powodujce rekurencj *) ... END_FUNCTION (* Deklaracja funkcji FF2 *) FUNCTION FF2 : REAL; VAR_INPUT X : REAL; END_VAR ... IF FF1(5) THEN ..... (*Zabronione wywoanie funkcji FF1 powodujce rekurencj *) ... END_IF END_FUNCTION
Wywoanie funkcji lub FB powoduje przekazanie parametrw wejciowych do zmiennych wejciowych wywoywanego POU. Zmienne wejciowe zadeklarowane w definicji POU s nazywane parametrami formalnymi, natomiast wprowadzane do nich dane wejciowe nazywa si parametrami aktualnymi, by podkreli, e zawieraj one aktualne wartoci wej. Przykady uycia nazw parametrw formalnych: Przykad
ADD B A C D
Opis Graficzne przedstawienie uycia funkcji ADD w jzyku FBD brak nazw parametrw formalnych.
A := ADD(B, C, D) ;
SHL B IN A C N
Uycie funkcji ADD w jzyku ST bez nazw parametrw formalnych. Graficzne przedstawienie wywoania funkcji SHL. Wystpuj nazwy parametrw formalnych. Uycie funkcji SHL w jzyku ST z nazwami parametrw formalnych.
A := SHL(IN:=B, N:=C);
Funkcje lub FB mog by wywoywane nawet wtedy, gdy lista parametrw wejciowych jest niekompletna lub przedstawiona w innej kolejnoci ni wystpuje w deklaracji POU. W takim przypadku nazwy parametrw formalnych musz pojawi si w sposb jawny, aby system programujcy mg prawidowo przypisa odpowiednie parametry aktualne do formalnych. Jeeli lista parametrw jest niekompletna, to pominitym wejciowym parametrom formalnym nadawane s wartoci pocztkowe zdefiniowane przez uytkownika lub domylne. Takie rozwizanie zapewnia, e zmienne wejciowe zawsze maj nadan warto. Przykad deklaracji FB o trzech parametrach wejciowych: FUNCTION_BLOCK Fblok VAR_INPUT Par1 : BOOL; Par2: TIME; Par3 : INT; END_VAR (* ciao FB *) END_FUNCTION_BLOCK (* Deklaracja FB*)
Przykady w jzyku IL wywoania FB z rnymi listami wej: VAR FB1, FB2, FB3 : Fblok; (* utworzenie 3 egzemplarzy bloku Fblok *) AT %I1 : BOOL; AT %IW1 : INT; END_VAR (* Wywoanie z pen list wej *) CAL FB1(Par1 := %I1, Par2 := t#10s, Par3:= %IW1) (* Wywoanie z list wej w innej kolejnoci *) CAL FB2(Par3 := %IW1, Par1 := %I1, Par2:= t#10s) (* Wywoanie z niepen list wej *) CAL FB1(Par2 := t#10s, Par1:= %I1)
Funkcje standardowe
W normie wyrniono siedem grup funkcji standardowych:
1. Funkcje konwersji typw (ang. Type conversion functions); 2. Funkcje liczbowe (ang. Numerical functions); 3. Funkcje na cigach bitw (ang. Bit string functions); 4. Funkcje wyboru i porwnania (ang. Selection and comparison functions); 5. Funkcja na cigach znakw (ang. Character string functions); 6. Funkcje na typach danych zwizanych z czasem (ang. Functions of time data types); 7. Funkcje na wyliczeniowych typach danych (ang. Functions of enumerated data types).
Przykad funkcji przecionej i funkcji o nadanych typach. Lp. 1 Opis Funkcja przeciona (ang. overloaded function) tu dla danych liczbowych typu uniwersalnego ANY_NUM Przykad
ADD ANYNUM
Funkcja o nadanych typach (ang. typed function) tu dla parametrw typu INT.
ADDINT INT
Deklaracja zmiennych VAR A : INT ; B : INT ; C : INT ; END_VAR VAR A : INT ; B : REAL ; C : REAL ; END_VAR VAR A : INT ; B : INT ; C : REAL ; END_VAR
C:= A + B;
(* ST *)
ADD A INTTOREAL C B
C:=INT_TO_REAL(A) + B;
(* ST *)
ADD A INTTOREAL C B
C:=INT_TO_REAL(A + B);
(* ST *)
Deklaracja zmiennych VAR A : INT ; B : INT ; C : INT ; END_VAR VAR A : INT ; B : REAL ; C : REAL ; END_VAR VAR A : INT ; B : INT ; C : REAL ; END_VAR
C:=ADD_INT( A, B); (* ST *)
ADDREAL A INTTOREAL C B
C:=ADD_REAL(INT_TO_REAL(A), B); (* ST *)
ADDINT A INTTOREAL C B
C:=INT_TO_REAL(ADD_INT(A, B));
(* ST *)
Dla przedstawionych w tabeli przykadw w jzyku ST zaoono, e uyte w nich zmienne zostay zadeklarowane jako: VAR A :INT; B :REAL; C :WORD; END_VAR W jzyku IL pierwszy przykad mona by zapisa w nastpujcy sposb (pozostae wygldayby podobnie): LD B INT_TO_REAL ST A
Lp.
Nazwa funkcji
Opis
1 2
ABS SQRT
ANY_NUM ANY_REAL
Funkcje logarytmiczne 3 4 5 LN LOG EXP ANY_REAL ANY_REAL ANY_REAL Logarytm naturalny Logarytm dziesitny Funkcja wykadnicza o podstawie e
Funkcje trygonometryczne 6 7 8 9 10 11 SIN COS TAN ASIN ACOS ATAN ANY_REAL ANY_REAL ANY_REAL ANY_REAL ANY_REAL ANY_REAL Sinus kta w radianach Cosinus kta w radianach Tangens kta w radianach Arcus sinus Arcus cosinus Arcus tangens
Lp.
Funkcje arytmetyczne rozszerzalne (o zmiennej liczbie wej) 12 13 ADD MUL + * Dodawanie Mnoenie OUT := IN1+IN2++INn OUT := IN1*IN2**INn
Funkcje arytmetyczne o staej liczbie wej 14 15 16 17 18 SUB DIV MOD EXPT MOVE ** := / Odejmowanie Dzielenie OUT := IN1 IN2 OUT := IN1 / IN2
Reszta z dzielenia OUT := IN1 modulo IN2 Potgowanie Przepisanie OUT := IN1IN2 OUT := IN
Lp. 1 2 3 4
Przesu bity w argumencie IN o N pozycji w lewo wprowadzajc 0 na pozycje bitw z prawej strony Przesu bity w argumencie IN o N pozycji w prawo wprowadzajc 0 na pozycje bitw z lewej strony Przesu cyklicznie w prawo N bitw w argumencie IN (rotacja bity z prawej strony przechodz na lew) Przesu cyklicznie w lewo N bitw w argumencie IN (rotacja bity z lewej strony przechodz na praw)
LD B AND C AND D *** oznacza nazw funkcji lub symbol ST A Lp. 5 6 7 8 Nazwa AND OR XOR NOT Symbol & >=1 =2k+1
(* jzyk IL *)
Opis Mnoenie Boolowskie OUT:=IN1 & IN2 & & INn Suma Boolowska Suma wykluczajca Negacja OUT:=IN1 OR IN2 OR OR INn OUT:=IN1 XOR IN2 XOR XOR INn OUT:=NOT IN1
Opis i przykady w jzyku ST Wybr wartoci: OUT:=IN0 jeli G=0 OUT:=IN1 jeli G=1
Przykad: A:=SEL(G:=0, IN0:=X, IN1:=255); daje w wyniku A:=X. Wybr wartoci maksymalnej: Przykad: OUT:=MAX{IN1, IN2, , INn} A:=MAX(B, C, D); Wybr wartoci minimalnej: Przykad: OUT:=MIN{IN1, IN2, , INn} A:=MIN(B, C, D); Ogranicznik: OUT:=MIN{MAX{IN, MN}, MX} Przykad: A:=LIMIT(IN:=B, MN:=0, MX:=255); daje w wyniku A:=0 gdy B < 0, A:=255 gdy B > 255, poza tym A:=B. Multiplekser wybiera jedno z N wej w zalenoci od wartoci wejcia K. Przykad: A:=MUX(K:=0, IN0:=B, IN1:=C, IN2:=D); daje w wyniku A:=B.
2a
2b
4
ANYINT ANY : ANY
MUX K ANY
Przedstawiony w tablicy przykad dla multipleksera w jzyku ST w przypadku jzyka IL wygldaby nastpujco: LD 0 MUX B, C, D ST A
Przykad uycia w jzyku ST A := GT(B, C, D); lub A := (B > C) & (C > D);
oznacza nazw funkcji lub symbol Opis =1 gdy kolejne wejcia tworz sekwencj malejc OUT:=(IN1 > IN2) & (IN2 > IN3) & & (INn-1 > INn) =1 gdy kolejne wejcia tworz sekwencj nie rosnc OUT:=(IN1 >= IN2) & (IN2 >= IN3) & & (INn-1 >= INn) =1 gdy wszystkie wejcia s sobie rwne OUT:=(IN1 = IN2) & (IN2 = IN3) & & (INn-1 = INn) =1 gdy kolejne wejcia tworz sekwencj nie malejc OUT:=(IN1 <= IN2) & (IN2 <= IN3) & & (INn-1 <= INn) =1 gdy kolejne wejcia tworz sekwencj rosnc OUT:=(IN1 < IN2) & (IN2 < IN3) & & (INn-1 < INn) =1 gdy kolejne wejcia rni si midzy sob OUT:=(IN1 <> IN2) & (IN2 <> IN3) & & (INn-1 <> INn)
Lp.Nazwa Symbol 5 6 7 8 9 10 GT GE EQ LE LT NE
>
>=
<=
<
<>
W przedstawionym przykadzie porwnania w jzyku ST zakada si, e zmienna A jest typu BOOL, a pozostae zmienne s dowolnego typu (ale wszystkie tego samego) nalecego do typu uniwersalnego ANY. Ten sam przykad mona zapisa w jzyku IL jako: LD B GT C AND( LD C GT D ) ST A (* Wynik porwnania (C > B) staje si wynikiem biecym CR typu BOOL *) (* Wynik biecy CR jest zapamitywany *) (* Wynik porwnania (D > C) staje si wynikiem biecym CR typu BOOL *) (* Koniec zagniedenia wykonanie AND na CR biecym i CR poprzednim *) (* Zapamitanie wyniku biecego w zmiennej A *)
Opis i przykady w jzyku ST Obliczanie dugoci cigu. Np. A:=LEN(ASTRING); daje w wyniku A:=7. L znakw z lewej strony cigu IN. Np. A:=LEFT(IN:=ASTR, L:=3) daje w wyniku A:=AST. L znakw z prawej strony cigu IN. Np. A:=RIGHT(IN:=ASTR, L:=3); daje w wyniku A:=STR. L znakw z cigu IN poczwszy od znaku Ptego. Np. A:=MID(IN:=ASTR, L:=2, P:=2); daje w wyniku A:=ST.
3
STRING ANYINT
4
STRING ANYINT ANYINT
5
STRING : STRING
6
STRING STRING ANYINT
czenie cigw. Np. CONCAT STRING A:=CONCAT(AB,CD,E); daje w wyniku A:=ABCDE. Wstawienie cigu IN2 do cigu IN1 po P-tym INSERT IN1 STRING znaku. Np. IN2 A:=INSERT(IN1:=ABC, IN2:=XY,P:=2); P daje w wyniku A:=ABXYC.
Kasowanie L znakw w cigu IN, poczwszy DELETE STRING IN1 STRING od P-tego znaku. Np. ANYINT L A:=DELETE(IN:=ABXYC, L:=2, P:=3); ANYINT P daje w wyniku A:=ABC. REPLACE IN1 STRING IN2 L P
8
STRING STRING ANYINT ANYINT
Zastpienie L znakw w cigu IN1 przez cig IN2 poczwszy od P-tego znaku. Np. A:=INSERT(IN1:=ABCD,IN2:=X,L:=2,P: =2); daje w wyniku A:=AXD. Znalezienie miejsca pierwszego pojawienia si cigu IN2 w cigu IN1. Np. A:=FIND(IN1:=ABCBC, IN2:=BC); daje w wyniku A:=2.
Standardowe funkcje na typach danych zwizanych z czasem Funkcje numeryczne i konkatenacji Lp. 1 2 3 4 5 6 7 8 9 10 11 12 Nazwa ADD Symbol + IN1 TIME TIME_OF_DAY DATE_AND_TIME TIME DATE TIME_OF_DAY TIME_OF_DAY DATE_AND_TIME DATE_AND_TIME TIME TIME DATE IN2 TIME TIME TIME TIME DATE TIME TIME_OF_DAY TIME DATE_AND_TIME ANY_NUM ANY_NUM TIME_OF_DAY OUT TIME TIME_OF_DAY DATE_AND_TIME TIME TIME TIME_OF_DAY TIME DATE_AND_TIME TIME TIME TIME DATE_AND_TIME
SUB
* /
Opis Przerzutnik SR S1 wejcie ustawiajce (dominujce) R wejcie zerujce Przerzutnik RS S wejcie ustawiajce R1 wejcie zerujce (dominujce) Semafor CLAIM wejcie ustawiajce semafor RELEASE wejcie zwalniajce semafor
(* jzyki tekstowe *) VAR FlipFlop : RS; END_VAR (* jzyk ST *) FlipFlop(S:=ZALACZ, R1:=WYLACZ); %Q1:=FlipFlop.Q1; (* jzyk IL *) CAL FlipFlop(S:=ZALACZ, R1:=WYLACZ); (* wywoanie *) LD FlipFlop.Q1 ST %Q1 (* nadanie wartoci wyjciu *) (* wywoanie *) (* nadanie wartoci wyjciu *) (* deklaracja egzemplarza FB *)
Opis Detektor zbocza narastajcego CLK testowane wejcie Detektor zbocza opadajcego CLK testowane wejcie
(* jzyki tekstowe *) VAR Detektor : R_TRIG; END_VAR (* jzyk ST *) Detektor(CLK:=%I1); %M1:= Detektor.Q; (* jzyk IL *) CAL Detektor (CLK:=%I1); (* wywoanie *) LD Detektor.Q ST %M1 (* nadanie wartoci wyjciu *) (* wywoanie *) (* nadanie wartoci wyjciu *) (* deklaracja egzemplarza FB *)
Opis Licznik dodajcy CU wejcie, ktrego zmiany z 0 na 1 s zliczane R wejcie zerujce licznik PV warto zadana Q wyjcie zaczane gdy CV osignie warto PV CV liczba zliczonych impulsw Licznik odejmujcy CD wejcie, ktrego zmiany z 0 na 1 s zliczane LD wejcie ustawiajce CV na warto PV PV warto zadana Q wyjcie zaczane gdy CV osignie warto 0 CV liczba zliczonych impulsw Licznik dodajco-odejmujacy CU wejcie, jego zmiany z 0 na 1 s zliczane w gr CD wejcie, jego zmiany z 0 na 1 s zliczane w d R wejcie zerujce licznik LD wejcie ustawiajce CV na warto PV PV warto zadana QU wyjcie zaczane gdy CV osignie warto PV QD wyjcie zaczane gdy CV osignie warto 0 CV liczba zliczonych impulsw
3
BOOL BOOL BOOL BOOL INT
(* jzyki tekstowe *) VAR Licznik : CTUD; END_VAR (* jzyk ST *) Licznik(CU:=%I1, CD:=%I2, R:=%I3, LD:=%I4); (* wywoanie *) %Q1:= Licznik.QU; (* nadanie wartoci wyjciu %Q1 *) %Q2:= Licznik.QD; (* nadanie wartoci wyjciu %Q2 *) (* jzyk IL *) CAL Licznik(CU:=%I1, CD:=%I2, R:=%I3, LD:=%I4); (* wywoanie *) LD Licznik.QU ST %Q1 (* nadanie wartoci wyjciu %Q1 *) LD Licznik.QD ST %Q2 (* nadanie wartoci wyjciu %Q2 *) (* deklaracja egzemplarza FB *)
Opis TP generator impulsu TON opnione zaczenie TOF opnione wyczenie IN wejcie uruchamiajce czasomierz PT warto zadana czasu ET czas mierzony
Zegar czasu rzeczywistego RTC BOOL EN Q BOOL PDT ustalone data i czas (adowane przy DT PDT CDT DT zboczu narastajcym na wejciu EN)
CDT biece data i czas (gdy EN = 1) Q kopia EN Przykad uycia czasomierza TON w jzyku FBD, ST i IL: (* jzyk FBD *)
Zegar (* nazwa egzemplarza FB *) TON %I3 IN Q %Q1 t#10s PT ET
(* jzyki tekstowe *) VAR Zegar : TON; END_VAR (* jzyk ST *) Zegar(IN:=%I3, PT:=t#10s); %Q1:= Zegar.Q; (* jzyk IL *) CAL Zegar(IN:=%I3, PT:=t#10s) LD Zegar.Q ST %Q1 (* wywoanie *) (* nadanie wartoci wyjciu %Q1 *) (* wywoanie *) (* nadanie wartoci wyjciu %Q1 *) (* deklaracja egzemplarza FB *)
IN
PT ET 0 t t0 t1 t2 t2 +PT t4 t5
IN
Opis Styk zwierny (normalnie otwarty, ang. normally open contact) Stan poczenia z lewej strony styku jest przenoszony na praw stron, jeeli skojarzona zmienna boolowska ma warto 1. W przeciwnym razie prawe poczenie jest w stanie OFF. Styk rozwierny (normalnie zamknity, ang. normally closed contact) Stan poczenia z lewej strony styku jest przenoszony na praw stron, jeeli skojarzona zmienna boolowska ma warto 0. W przeciwnym razie prawe poczenie jest w stanie OFF. Styk wraliwy na zbocze narastajce (ang. Positive transition-sensing contact) Poczenie z prawej strony styku jest w stanie ON w czasie jednego wykonania, jeli poczenie z lewej strony jest w stanie ON, a skojarzona zmienna boolowska zmienia warto z 0 na 1. Poza tym stan poczenia z prawej strony jest OFF. Styk wraliwy na zbocze opadajce (ang. Negative transition-sensing contact) Poczenie z prawej strony styku jest w stanie ON w czasie jednego wykonania, jeli poczenie z lewej strony jest w stanie ON, a skojarzona zmienna boolowska zmienia warto z 1 na 0. Poza tym stan poczenia z prawej strony jest OFF.
Styki statyczne
*** /
*** P
Opis Cewka (ang. coil) Stan poczenia z lewej strony cewki jest przenoszony na praw stron i zapamitywany w skojarzonej zmiennej boolowskiej. Cewka negujca (ang. negated coil) Stan poczenia z lewej strony cewki jest przenoszony na praw stron, a jego odwrotno jest zapamitywana w skojarzonej zmiennej boolowskiej. Cewka ustawiajca (ang. Set coil, Latch coil) Skojarzona zmienna przyjmuje warto 1, jeeli poczenie z lewej strony jest w stanie ON. Warto ta pozostanie niezmieniona, a do chwili wyzerowania przez cewk kasujc (R). Cewka kasujca (ang. Reset coil, Unlatch coil) Skojarzona zmienna przyjmuje warto 0, jeeli poczenie z lewej strony jest w stanie ON. Warto ta pozostanie niezmieniona, a do chwili ustawienia przez cewk ustawiajc (S). Cewka z zapamitaniem stanu (ang. Retentive coil, Memory coil) Cewka ustawiajca z zapamitaniem stanu (ang. Set retentive coil) Cewka kasujca z zapamitaniem stanu (ang. Reset retentive coil) Cewka wraliwa na zbocze narastajce (ang. Positive transition-sensing coil) Skojarzona zmienna przyjmuje warto 1 na czas jednego wykonania, jeli poczenie z lewej strony zmienio stan z OFF na ON. Stan poczenia z lewej strony jest zawsze przenoszony na praw. Cewka wraliwa na zbocze opadajce (ang. Negative transition-sensing coil) Skojarzona zmienna przyjmuje warto 1 na czas jednego wykonania, jeli poczenie z lewej strony zmienio stan z ON na OFF. Stan poczenia z lewej strony jest zawsze przenoszony na praw.
Cewki zwyke
*** (/)
Cewki zatrzaskiwane
*** (S)
*** (R)
Zasada dziaania uniwersalnego akumulatora: VAR Operand1, Operand2, Wynik : INT :=0; END_VAR Et1: LD Operand1 (* CR Operand1, tu warto 0 *) ADD 10 (* CR CR + 10, tu CR = 10 *) ST Wynik (* Wynik CR, CR bez zmian *) GT 0 (* czy CR > 0? tak, wic CR := TRUE *) JMPC Et2 (* wykonaj skok do etykiety Et2, gdy CR = TRUE, CR bez zmian *) ADD Operand2 (* do CR dodaj Operand2 Bd !!! niezgodno typw *) Et2:
Operatory jzyka IL Lp. Operator Modyfikatory Operand 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 LD ST S R AND OR XOR ADD SUB MUL DIV GT GE EQ NE LE LT JMP CAL RET ) N, (, N( N, (, N( N,(, N( ( ( ( ( ( ( ( ( ( ( C, CN C, CN C, CN N N * * BOOL BOOL BOOL BOOL BOOL * * * * * * * * * * LABEL NAME Opis CR przyjmuje warto operandu (Load) Przesanie CR do operandu (Store) Jeli CR = 1, to operand ustaw na 1 (Set) Jeli CR = 1, to zeruj operand (Reset) Boolowskie AND operandu i CR Boolowskie OR operandu i CR Boolowskie (eXclusive OR) operandu i CR Dodawanie (ADDition) operandu i CR Odejmowanie (SUBtraction) operandu i CR Mnoenie (MULtiplication) operandu i CR Dzielenie (DIVision) CR przez operand Porwnanie: CR > operand (Greater Than) Porwnanie: CR >= operand (Greater than or Equal) Porwnanie: CR = operand (Equal) Porwnanie: CR <> operand (Not Equal) Porwnanie: CR <= operand (Less than or Equal) Porwnanie: CR < operand (Less Than) Skok do etykiety (JuMP to label) Wywoanie (CALl) FB o nazwie NAME Powrt (RETurn) z wywoanej funkcji lub FB Operator ograniczajcy dla modyfikatora (
Przykad zagniedania wyrae w nawiasach LD X1 (* CR X1 *) MUL( X2 (* CR X2 *) SUB( X3 (* CR X3 *) ADD X4 (* CR X3 + X4 *) ) (* CR X2 (X3 + X4) *) ) (* CR X1 * (X2 (X3 + X4)) *) ST Y (* CR bez zmian *) Przykad wywoania funkcji w jzyku IL: FUNCTION MojaFun : INT; (* Deklaracja funkcji *) VAR_INPUT We1, We2, We3 : INT; (* Parametry wejciowe *) END_VAR (* ciao funkcji *) LD We1 ADD We2 ADD We3 ST MojaFun (* Warto funkcji na wyjciu *) END_FUNCTION (* fragment POU wywoujcego MojaFun *) VAR Par1, Par2, Par3, Wynik : INT; (* Deklaracja zmiennych *) END_VAR LD Par1 MojaFun Par2, Par3 ST Wynik (* Wprowadzenie pierwszego parametru wejciowego *) (* Wywoanie funkcji z pozostaymi parametrami wejciowymi *) (* Zapamitanie wartoci MojaFun w zmiennej Wynik *)
Przesyanie wej za pomoc operatorw LD i ST: LD 15 ST C10.PV LD %IX10 ST C10.CU CAL C10
W przykadach przyjto, e C10 jest zadeklarowanym egzemplarzem standardowego licznika CTU, tzn. w jednostce wywoujcej uyta zostaa deklaracja VAR C10: CTU; END_VAR. Operatory wejciowe w jzyku IL dla standardowych blokw funkcjonalnych: Lp. 1 2 3 4 5 6 7 8 9 10 Operatory S1, R S, R1 CLK CLK CU, R, PV CD, LD, PV CU, CD, R, LD, PV IN, PT IN, PT IN, PT Bloki funkcjonalne SR RS R_TRIG F_TRIG CTU CTD CTUD TP TON TOF
Pozostae elementy jzyka IL: TYPE ... END_TYPE; VAR ... END_VAR; VAR_INPUT ... END_VAR; VAR_OUTPUT ... END_VAR; VAR_IN_OUT ... END_VAR; VAR_EXTERNAL ... END_VAR; FUNCTION ... END_FUNCTION; FUNCTION_BLOCK ... END_FUNCTION_BLOCK; PROGRAM ... END_PROGRAM; STEP ... END_STEP; TRANSITION ... END_TRANSITION; ACTION ... END_ACTION
Instrukcje jzyka ST: Lp. 1 2 3 4 Instrukcja Przypisanie Przykady A:=B; CV:=CV+1; Y:=SIN(X); D:=INT_TO_REAL(C)
Wywoanie FB Moj_TMR(IN:=%IX5, PT:=T#300ms); Uycie wyjcia FB A:=Moj_TMR.Q; RETURN IF RETURN; D:=B*B-4*A*C; (* oblicz wyrnik *) IF D < 0.0 THEN NROOTS:=0; (* brak pierwiastkw *) 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; 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 *) J := 101; FOR I := 1 TO 100 BY 2 DO IF WORDS(I) = KEY THEN J := I; EXIT; END_IF; END_FOR; J := 1; WHILE J <= 100 AND WORDS(J) <> KEY DO J := J+2; END_WHILE; J := 1; REPEAT J := J+2; UNTIL J = 101 OR WORDS(J) = KEY END_REPEAT; EXIT;
CASE
FOR
WHILE
REPEAT
EXIT
Kompatybilno jzykw
Kady z jzykw programowania posiada pewne cechy, ktre powoduj, e do zaprogramowania niektrych zagadnie nadaje si lepiej, ni inne jzyki. Jzyk LD jest najodpowiedniejszy do programowania operacji logicznych (algebra Boolea). Jzyki tekstowe s wygodniejsze w procedurach zarzdzania pamici lub przy programowaniu oblicze iteracyjnych. Programy w jzykach graficznych s stosunkowo atwe do analizy, czego nie mona powiedzie o jzyku IL, ktry za to jest najbardziej elastyczny, itd. Niektre pakiety programowania umoliwiaj wykonanie takiego przetumaczenia, aczkolwiek norma nie stawia takich wymaga. Podstawowy problem stanowi tu niepena kompatybilno poszczeglnych jzykw programowania. Szczeglna trudno pojawia si przy przechodzeniu z jzykw graficznych na tekstowe i odwrotnie. Wynika to z rnego sposobu przetwarzania w obu grupach jzykw. Te pierwsze s przede wszystkim jzykami proceduralnymi, tzn. instrukcje s wykonywane w nich jedne po drugich, podczas gdy podstaw w jzykach graficznych jest przepyw sygnau (prdu w jzyku LD), ktry moe by realizowany rwnolegle. Przykad dla porwnania wasnoci jzyka LD i IL: a) jzyk LD
%I1 >> Et1 %Q1 ( )
Std, aby ustrzec si tego typu niejednoznacznoci, w niektrych systemach programowania wprowadza si pewne ograniczenia w jzykach graficznych, takie jak np.: nie dopuszcza si do wprowadzania operacji logicznych w obwodzie po operacjach przypisania (np. w jzyku LD po wprowadzeniu cewki nie mona ju dalej rozwija obwodu); albo w ogle nie dopuszcza si do stosowania instrukcji sterujcych (typu skok), albo jeli si dopuszcza, to w trakcie wykonywania obwodu z gry na d napotkanie takiej instrukcji powoduje zakoczenie wykonywania danego obwodu. Waciwie to stosowanie instrukcji skoku w jzykach graficznych stoi w pewnej sprzecznoci z zasad rwnolegego przetwarzania sygnau w obwodzie. Ponadto w jzykach tych w ogle nie wystpuj instrukcje dla oblicze iteracyjnych (typu REPEAT, WHILE, FOR), std tumaczenie tego typu konstrukcji z jzyka ST na jzyki graficzne wymaga tworzenia skomplikowanych obwodw, w ktrych w sposb jawny operuje si wskanikiem ptli i sprawdza warunki jej zakoczenia za pomoc funkcji porwnania (np. EQ). Wykorzystanie wasnoci rwnolegego przetwarzania w jzykach graficznych poprzez czenie jednego wyjcia z wiksz liczb wej wymaga przy tumaczeniu na jzyki tekstowe wprowadzania dodatkowych zmiennych w celu uzyskania kompatybilnoci programw.
b) jzyk IL LD %I1 AND %I2 ST Pomoc AND %I3 ST %Q1 LD Pomoc AND %I4 ST %Q2
Kolejny problem, to wystpowanie przy wywoaniu funkcji w jzykach graficznych pary EN / ENO, dla ktrej nie ma odpowiednika w jzyku tekstowym. W tym przypadku trzeba by uzupeni odpowiednie wywoanie funkcji przez warunek typu IF ... THEN. Stosunkowo najatwiej jest wykona tumaczenie w obrbie jzykw tekstowych, aczkolwiek take tutaj mona natrafi na pewne trudnoci wynikajce ze specyfiki jzyka. W jzyku ST nie wystpuj instrukcje skoku, ktre w IL umoliwiaj realizacj ptli, std przejcie z tekstu napisanego w IL na ST moe nastrcza pewne problemy. Z kolei w IL nie ma instrukcji iteracyjnych, wic trzeba je organizowa niejako na piechot, poprzez wprowadzanie wskanika dla iteracji i wykorzystanie instrukcji porwnania lub skokw.