Programování dle normy IEC 61131 Strukturovaný text (ST) Miloš Hernych TECHNICKÁ UNIVERZITA V LIBERCI Fakulta mechatroniky, informatiky a mezioborových studií Tento materiál vznikl v rámci projektu ESF CZ.1.07/2.2.00/07.0247, který je spolufinancován Evropským sociálním fondem a státním rozpočtem ČR
Stavební bloky programu Každý program pro PLC se skládá z POU (Program Organisation Unit) Může být Dodáno výrobcem SW/HW Naprogramováno uživatelem Typy POU Funkce Funkční blok Program
Obecná struktura POU Hlavička POU Deklarační část Definice vstupů a výstupů Definice vnitřních proměnných Výkonná část Vlastní tělo programu Ukončení POU
Funkce (FUN) Nejjednodušší varianta Bez vnitřní paměti - se stejnými vstupními parametry vždy stejný výsledek Může vracet pouze jeden datový element (proměnnou, pole, strukturu) Může být použita jako operand ve výrazu Ve výsledném kódu pouze jednou V rámci funkce je možné volat jinou funkci nebo funkční blok
FUNCTION Název_funkce Deklarace funkce VAR_INPUT deklarace proměnných END_VAR definice jmen a typů vstupních proměnných funkce VAR_IN_OUT deklarace proměnných END_VAR definice jmen a typů vstupně-výstupních proměnných - při volání funkce se předává ukazatel na proměnnou, ne data VAR deklarace proměnných END_VAR definice jmen a typů statických lokálních proměnných (alokuje trvale místo v paměti PLC) VAR_TEMP deklarace proměnných END_VAR definice jmen a typů lokálních proměnných funkce bez paměti, místo v paměti PLC dynamicky alokuje a uvolňuje VAR CONSTANT deklarace konstant END_VAR Tělo funkce v jazyku IL, ST, LD nebo FBD END_FUNCTION - závěrečné klíčové slovo
Volání funkce Jménem funkce a předávanými parametry v kulaté závorce Počet parametrů a datové typy musí souhlasit s deklarací Možnosti předávání parametrů Výčet v přesném pořadí dle deklarace Přiřazením k názvům proměnných
Příklad definice a použití funkce
Funkční blok (FB) Může si pamatovat hodnoty vnitřních proměnných Může vracet více než jeden výsledek Každé volání FB ve výsledném kódu alokuje vlastní prostor - vytváří instanci V rámci funkčního bloku je možné volat funkci nebo jiný funkční blok
FUNCTION_BLOCK Název_FB Deklarace FB VAR_INPUT deklarace proměnných END_VAR definice jmen a typů vstupních proměnných funkce VAR_OUTPUT deklarace proměnných END_VAR definice jmen a typů výstupních proměnných funkce VAR_IN_OUT deklarace proměnných END_VAR definice jmen a typů vstupně-výstupních proměnných - při volání FB se předává ukazatel na proměnnou, ne data VAR deklarace proměnných END_VAR definice jmen a typů statických lokálních proměnných (pamatuje si hodnotu z předchozího volání FB, alokuje trvale místo v paměti PLC) VAR_TEMP deklarace proměnných END_VAR definice jmen a typů lokálních proměnných funkce bez paměti, místo v paměti PLC dynamicky alokuje a uvolňuje VAR CONSTANT deklarace konstant END_VAR Tělo funkčního bloku v jazyku IL, ST, LD nebo FBD END_FUNCTION_BLOCK - závěrečné klíčové slovo
Příklad definice a použití FB
Program (PRG) Je vykonáván v rámci zdrojů (Resources) Může volat funkce a funkční bloky Funkce a funkční bloky nemohou volat program
PROGRAM Název_PRG Deklarace programu VAR_INPUT deklarace proměnných END_VAR definice jmen a typů vstupních proměnných funkce VAR_OUTPUT deklarace proměnných END_VAR definice jmen a typů výstupních proměnných funkce VAR_IN_OUT deklarace proměnných END_VAR definice jmen a typů vstupně-výstupních proměnných - při volání FB se předává ukazatel na proměnnou, ne data VAR deklarace proměnných END_VAR definice jmen a typů statických lokálních proměnných (pamatuje si hodnotu z předchozího volání FB, alokuje trvale místo v paměti PLC) VAR_TEMP deklarace proměnných END_VAR definice jmen a typů lokálních proměnných funkce bez paměti, místo v paměti PLC dynamicky alokuje a uvolňuje VAR CONSTANT deklarace konstant END_VAR Tělo programu v jazyku IL, ST, LD nebo FBD END_PROGRAM - závěrečné klíčové slovo
Příklad definice a použití PRG
Konfigurační prvky Konfigurace (Configuration) Označuje PLC systém, provádějící naprogramované POU Zdroj (Resource) Označuje procesorový modul v PLC, který zajistí provádění konkrétního programu Úloha (Task) Přiřazuje proces, v kterém bude POU prováděná Spouštěna periodicky nebo hranou
Příklad použití
Identifikátory Řetězce znaků, čísel a podtržení, označujících: jména konstant jména proměnných jména odvozených datových typů jména funkcí, funkčních bloků a programů jména úloh Začínají písmenem nebo podtržením, nesmí obsahovat mezery Mohou obsahovat pouze znaky anglické abecedy Nerozlišují se malá a velká písmena Maximální délka 64 znaků Nesmí obsahovat více podtržítek za sebou
Literály Slouží pro přímou prezentaci hodnot proměnných Rozdělují se na: numerické literály řetězce znaků časové literály U literálůčasových příp.ke zdůraznění datového typu slouží znak #
Numerický literál Slouží k definici konstant v pevné nebo plovoucí řádové čárce: Integer literál: 145, INT# 10, 47_231_110 Real literál: 21.3, REAL#12.0, 1_123.452_1 Real literál s exponentem: 7.45E3, -4.78E-2 Literál o základu 2: 2#101011 Literál o základu 8: USINT#8#12 Literál o základu 16: 16#4FAB Bool literál: FALSE, TRUE, BOOL#0, BOOL#1
Literályřetězce znaků Uvozeny jednoduchou uvozovkou Speciální znaky za $ $$ Znak dolar $ Znak jednoduchý apostrof $L,$l Znak Line feed (16#0A) $N,$n Znak New line $P,$p Znak New page $R,$r Znak Carriage return (16#0D) $T,$t Znak tabelátor (16#09) $xy Znak, definovaný HEX prezentací čísla xy
Časové literály Obsahují informaci o: Době trvání mezi 2 událostmi T#, t#, TIME#, time# D dny, H hodiny, M minuty, S sekundy, MS - milisekundy Absolutním čase D# nebo DATE# - datum TOD# nebo TIME_OF_DAY# - čas během dne DT# nebo DATE_AND_TIME# - absolutní čas
Datové typy Elementární Rodové Odvozené Jednoduché Typu pole Typu struktura Kombinace typu pole a struktura Typu pointer
Datové typy elementární BOOL Boolean 1 b <0,1> SINT Short integer 8 b < 128,127> INT Integer 16 b < 32 768,32767> DINT Double integer 32 b < 2 147 483 648,2 147 483 647> USINT Unsigned short integer 8 b <0, 255> UINT Unsigned integer 16 b <0, 65 535> UDINT Unsigned double integer 32 b <0, 4294967295> REAL Real (Single precision) 32 b <±1.18E-39, ±3.4E+38> LREAL Long real (Double precision) 64 b <±2.2E-308, ±1.8E+308> TIME Duration 24d 20:31:23.647 DATE Date (only) Od 1.1.1970 00:00:00 TIME_OF_DAY, TOD Time of day (only) 24d 20:31:23.647 DATE_AND_TIME, DT Date and time of day Od 1.1.1970 00:00:00 STRING String Max.255 znaků
Rodové typy Vyjadřují celou skupinu proměnných ANY ANY_BIT ANY_NUM ANY_DATE TIME BOOL ANY_INT ANY_REAL DATE STRING BYTE WORD DWORD INT UINT REAL SINT USINT LREAL DINT UDINT DATE_AND_TIME TIME_OF_DAY
Jednoduché odvozené typy Z elementárních dat.typů Výčtové typy TYPE TInt : INT; Tzacatek : Time := T#7h00m; Tden : (pracovni, volny, svatek); END_TYPE VAR Znamka : Tint; ZacatekSkoly : Tzacatek; Den : Tden; END_VAR
Datové typy pole Prvky mohou být elementární a odvozené Pole Jednorozměrná TYPE TPole1 : ARRAY[0..9] OF USINT; TPole2 : ARRAY[1..10] OF INT := [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; TPole3 : ARRAY[0..99] OF SINT := [ 50(10), 20, 49(30)]; END_TYPE Vícerozměrná (Mosaic max.4) TYPE TDvourozm : ARRAY [1..4,1..2] OF UINT := [ 11, 12, 21, 22, 31, 32, 41, 42]; Ttrojrozm : ARRAY [1..2, 1..2, 1..2] OF INT := [ 111, 112, 121, 122, 211, 212, 221, 222]; END_TYPE
Datový typ struktura Struktura může být definovaná z elementárních a odvozených typů, i hierarchicky TYPE Tcas: STRUCT Zacatek, Konec TVyuka: STRUCT Vyucujici Cas END_STRUCT; END_TYPE : TIME;END_STRUCT; : STRING; : Tcas; PROGRAM Rozvrh VAR ZLR : TVyuka; END_VAR ZLR.Vyucujici ZLR.Cas.Zacatek ZLR.Cas.Konec END_PROGRAM := Ja ; := T#8h50m; := T#10h25m;
Kombinace typu struktura a pole Struktury a pole je možné libovolně kombinovat TYPE Tcas: STRUCT Zacatek, Konec TVyuka: STRUCT Vyucujici Cas END_STRUCT; END_TYPE : TIME;END_STRUCT; : STRING; : Tcas; PROGRAM Rozvrh VAR ZLR : array [1..5] of TVyuka; END_VAR ZLR[1].Vyucujici := Ja ; ZLR[3].Cas.Zacatek := T#8h50m; ZLR[5].Cas.Konec := T#12h15m; END_PROGRAM
Proměnné Měly by být deklarovány v každé POU Obecná deklarace: Třída kvalifikátor jméno_prom : dat_typ := úvodní_hodnota; konec_deklarace Příklad: VAR Pravda : bool END_VAR CONSTANT := TRUE;
Globální Třídy proměnných Lokální Vstupní a výstupní proměnné
Globální proměnné Jsou dostupné ze všech POU VAR_GLOBAL Základní varianta Pomocí klíč.slova AT umožňuje asociovat s konkrétním místem v paměti PLC, jinak překladač umístí automaticky a) BinarniVstup AT %X0.3 : bool; //ekvivalent #DEF BinarniVstup %X0.3 b) AT %Y1 : usint; //v POU je pak možné volat přímo %Y1 VAR_GLOBAL CONSTANT Deklaruje konstanty VAR_GLOBAL RETAIN Deklaruje zálohované proměnné VAR_EXTERNAL Dovoluje využít proměnných, deklarovaných v mnemokódu nebo přímé odkazy na místo v paměti PLC
Lokální proměnné Dostupné pouze v POU, ve které jsou deklarovány VAR proměnné se inicializují pouze při restartu systému, zůstávají trvale alokovány v paměti VAR_TEMP Proměnné se inicializují při každém volání POU VAR_EXTERNAL Dovoluje využít proměnných, deklarovaných v mnemokódu nebo přímé odkazy na místo v paměti PLC #REG BIT AHOJ VAR_EXTERNAL AHOJ AT END_VAR : bool; %Y0.4 : bool; %Y0.4 := AHOJ;
Vstupní a výstupní proměnné Předávají data do a z POU VAR_INPUT Předávají hodnotou data do POU U binárních proměnných možné předávat hranu: VZESTUPNA : bool R_EDGE;// 1 pouze při 0 -> 1 SESTUPNA : bool F_EDGE; // 1 pouze při 1 -> 0 VAR_OUTPUT Předávají hodnotou data z POU VAR_IN_OUT Předávají referencí data z a do POU
Přehled použití tříd v POU Třída proměnné PROGRAM FUNCTION_BLOCK FUNCTION mimo POU VAR_INPUT VAR_OUTPUT VAR_IN_OUT VAR_EXTERNAL VAR_GLOBAL VAR VAR_TEMP
Strukturovaný text - ST Skládá se z jednotlivých příkazů (statements), které Provádí výpočty (zpracování výrazů) a přiřazení Řídí tok vykonávání programu Volají a ukončují POU
Výrazy Výsledkem jejich vyhodnocení je hodnota, odpovídající příslušnému datovému typu Skládá se z Operátorů Operandů Literál Proměnná Volání funkce Jiný výraz
Operátory Operátor Operace Priorita ( ) závorky 1 ** umocňování 2 - znaménko 3 NOT negace 3 *, / násobení, dělení 4 MOD modulo 4 +,- sčítání, odčítání 5 <, >, <=,>= porovnávání 6 =, <> rovnost, nerovnost 7 &, AND logické AND 8 XOR logické exkluzivní OR 9 OR logické OR 10
Příkazy jazyka ST Příkaz Popis Příklad použití := Přiřazení C:=A+B; Volání funkčního bloku JmenoFB(VSTUP:=10, VYSTUP=>C); IF Příkaz výběru IF %X1.0 THEN C:=1;ELSE C:=0;END_IF: CASE Příkaz výběru CASE A OF 0: C := 1; 1: C := 10; ELSE C := 11; END_CASE; FOR WHILE REPEAT Iterační příkaz s počáteční a koncovou hodnotou, příp.inkrementem Iterační příkaz s podmínkou na počátku Iterační příkaz s podmínkou na konci FOR I := 0 TO 100 BY 5 DO C:=C+I;END_FOR; WHILE I > 100 DO I:=I+1;END_WHILE; REPEAT I:=I+1;UNTIL I<100; END_REPEAT; EXIT Předčasné ukončení iterace EXIT; RETURN Předčasné ukončení POU RETURN;
Direktivy Slouží k řízení překladu, vkládají se do {} {PUBLIC} označená proměnná je zveřejněna ejn na v souboru.pub VAR STOP {PUBLIC} AT %X1.3: bool;end_var {$ IF <výraz>}... [{$ ELSE }...] {$ END_IF } Definuje kód, který se podle výsledku výrazu bude/nebude při překladu překládat
Direktivy {$DEFINE <jméno>}{$undef < jméno >} Definují/ruší definici jména, které následně může řídit překlad direktivami $IFDEF/$IFNDEF a $IF: {$IFDEF < jméno>}... [{ $ELSE }...] {$END_IF} {$IFNDEF < jméno>}... [{ $ELSE }...] {$END_IF} DEFINED Testuje platnost definice jména v direktivě {$IF}: {$IF DEFINED (FOXTROT)} {$END_IF}
Direktivy {$ASM}{$END_ASM>} Deklarují začátek a konec mnemokódu PLC, vloženého do POU dle IEC 61 131: C:=A+B; {ASM} LD WR %X0.0 %Y1.1 {END_ASM} A:=A+1;
Direktivy {ST_WARNING OFF}/{ST_WARNING ON} Začátek a konec části programu, ve které budou ignorována varovná hlášení překladače {OFFSET_REG=xxx} /{END_OFFSET_REG} Začátek a konec části programu, ve které bude překladač mapovat proměnné a instance od adresy xxx v paměti Vypíná automatickou kontrolu překrytí proměnných!!! {OFFSET_REG=5000} B:usint;//mapuje proměnnou A do registru %R5001 {END_OFFSET_REG}
Knihovny Knihovny funkcí a funkčních bloků Standardní Dle normy IEC 61 131, výrobce část nebo všechny implementuje do vývojového prostředí Rozšířené Dodávané výrobcem s vývojovým prostředím pro specifické použití s konkrétním HW apod. Vytvořené uživatelem Možnost vytvářet vlastní uživatelské fce a fb
Knihovna numerických, aritmetických a logických fcí ABS ADD AND SQRT MUL OR LN SUB XOR LOG DIV NOT EXP MOD SHL SIN EXPT SHR COS MOVE ROR TAN ATAN ASIN ACOS ROL
Funkce výběru a porovnávání SEL MAX MIN LIMIT OUT:=SEL(bool, IN1, IN2); OUT:=MAX(IN1,IN2, INn); OUT :=MIN(IN1,IN2, INn); OUT:=LIMIT(Minim,IN,Maxim);//MIN(MAX(IN,Minim),Maxim) GT GE EQ LE LT NE OUT:=GT(IN1,IN2,..INn);//(IN1>IN2)&(IN2>IN3)& &(INn-1)>INn)-klesající OUT:=GE(IN1,IN2,..INn);//(IN1>=IN2)&(IN2>=IN3)& &(INn-1)>=INn)-monotónní dolů OUT:=EQ(IN1,IN2,..INn);//(IN1=IN2)&(IN2=IN3)& &(INn-1)=INn) - rovnost OUT:=LE(IN1,IN2,..INn);//(IN1<=IN2)&(IN2<=IN3)& &(INn-1)<=INn) monotónní nahoru OUT:=LT(IN1,IN2,..INn);//(IN1<IN2)&(IN2<IN3)& &(INn-1)<INn) - rostoucí OUT:=NE(IN1,IN2);//(IN1<>IN2) - nerovnost
Knihovna konverzí typu Konvertuje vstupní proměnnou z jednoho typu proměnné do jiného TRUNC ořezání ANY_REAL na ANY_INT Typ1_TO_Typ2 Příklady: REAL_TO_BOOL UDINT_TO_DATE TIME_TO_STRING REAL_TO_SINT
Knihovna funkcí práce s řetězci LEN vrací délku řetězce LEFT vrací X znaků řetězce zleva RIGHT vrací X znaků řetězce zprava MID vrací X znaků řetězce od pozice Y CONCAT vrací spojení několika řetězců INSERT vloží do řetězce od pozice X podřetězec DELETE z řetězce vymaže X znaků od pozice Y REPLACE nahradí v řetězci X znaků od pozice Y FIND vrací pozici podřetězce v řetězci <,>,=,<> - porovnávání 2 řetězců, znak po znaku
Práce se signály Knihovna StdLib CTD FB čítače dolů CTU FB čítače nahoru CTUD FB obousměrného čítače F_TRIG FB vzest.hrany R_TRIG FB sestupné hrany RS FB klopného obvodu RS s preferencí R SR FB klopného obvodu RS s preferencí S TON FB časovače zpožděný ON TOF FB časovače zpožděný OFF TP FB tvarovače Práce s datem a časem ADD_TIME fce součtu dvou proměnných TIME ADD_TOD_TIME - fce součtu proměnné TOD a TIME ADD_DT_TIME fce součtu proměnné DT a TIME SUB_TIME fce rozdílu dvou proměnných TIME SUB_DATE_DATE - fce rozdílu dvou proměnných DATE SUB_TOD_TIME fce rozdílu TOD-TIME SUB_TOD_TOD fce rozdílu dvou TOD SUB_DT_TIME - odečte od DT proměnnou TIME SUB_DT_DT - fce rozdílu dvou proměnných DATE_AND_TIME CONCAT_DATE_TOD fce sečte TIME_OF_DAY s DATE, výsledkem DT
Specifické knihovny Tecomat
Zdroje http://www.tecomat.cz. [online]. [cit. 2012-06-14].