Content extract
					
					Az S40 PLC-programozási nyelv (IEC1131-3 kompatibilis) elemkészletének ismertetése  programstruktúra adattípusok, változók deklarálása utasításkészlet függvények funkcióblokkok     Tartalomjegyzék 1. 2. 3.  A kézikönyvről. 5 A Sucosoft programstruktúrája . 5 Adattípusok, változók deklarálása . 6 Elemi adattípusok felsorolása . 6 Adattípusok felosztása . 7 Származtatott adattípusok . 8 Változó fajták . 12 Változó típusok . 14  4.  POU-k programutasítási része. 17 Utasításkészlet Függvények Funkcióblokkok  5.  . 17 . 19 . 20  Függvények . 23 Adattípusokat konvertáló függvények . 25 Numerikus függvények. 27 Aritmetikai függvények . 27 Állapotbit vizsgáló függvények . 28 Bit mozgatások . 30 Logikai függvények . 31 Összehasonlítási függvények. 31 Operációs rendszer-függvények . 31 Megszakítást tiltó / engedélyező függvények. 32 Karakterlánccal kapcsolatos függvények. 34 Kiválasztási függvények . 37  6.
 Funkcióblokkok. 40  16BitBinaryToBCD  16Bit Compare  16BitCounter ADRtoSTR BCDTo16BitBinary BlockCompare BlockTransfer CompareArray COMtoSTR CounterAlarm DATconcat DateConcat DateSplit  16-bit bináris kódolású szám -> decimálissá alakítása . 43 . 45 16-bites előre- /hátraszámláló . 46 vett adatbájtok STRING típusú változóvá alakítása . 48 Decimális kódolású szám -> 16-bit binárissá alakítása . 49 adatblokkok összehasonlítása, adott adat keresése a blokkban (címváltozók alkalmazásával). 50 adatblokk másolása, inicializálása (címváltozók alkalmazásával). 55 adatblokkok összehasonlítása, adott adat keresése a blokkban. 58 vett adatbájtok STRING típusú változóvá alakítása . 62 számláló megszakításkezelés . 64 dátum és idő (DATE AND TIME) típusú változó összeállítása egyedi UINT típusú adatokból. 68 dátum (DATE) típusú változó összeállítása egyedi UINT típusú adatokból . 70 dátum (DATE)
típusú változó szétválasztása egyedi UINT típusú adatokra . 71  3     DATsplit DE4netK Deserialize EdgeAlarm FifoBx FifoWx GetRealTimeClock LifoBx LifoWx MI4netK MS TimeFalling MS TimeRising ReadMC ReloadData RealTimeClock RTC S TimeFalling S TimeRising SaveData SCO Serialize SetRealTimeClock SR x SRB x SRW x STRtoADR STRtoCOM TimeConcat TimeGenerator TimePulse TimerAlarm TimeSplit TODconcat TODsplit TransferArray WriteMC  7.  4  dátum és idő (DATE AND TIME) típusú változó szétválasztása egyedi UINT típusú adatokra . 72 DF4 frekvenciaváltók kommunikációs modulja . 74 tömbből tetszőleges formátumú adatok kiválasztása . 77 változásfigyelés megszakításkezelés. 79 8-bites csőtár regiszter . 83 16-bites csőtár regiszter . 86 Valós idejű óra kiolvasása. 89 8-bites veremtár regiszter. 90 16-bites veremtár regiszter. 92 MI4 kijelzők kommunikációs modulja . 94 Elejtésre késleltetett időzítő (milliszekundumos megadással). 95 Meghúzásra
késleltetett időzítő (milliszekundum megadással). 97 adatok olvasása a flash-memóriából . 99 adatok olvasása a flash-memóriából (címváltozók alkalmazásával). 102 valós idejű óra összehasonlítása egyedi bemeneti adatokkal . 104 valós idejű óra állítása. 108 Elejtésre késleltetett időzítő (szekundumos megadással) . 109 Meghúzásra késleltetett időzítő (szekundum megadással) . 111 adatok írása a flash-memóriába (címváltozók alkalmazásával). 113 transzparens soros vonali kommunikáció . 115 tetszőleges adatstruktúra bájtos tömbbe való másolása . 125 Valós idejű óra állítás. 128 bites léptető regiszter . 130 bájtos lépető regiszter. 133 szavas lépető regiszter. 136 STRING típusú változó adott címterületre másolása. 139 STRING típusú változó adott címterületre másolása. 140 idő (TIME) típusú változó összeállítása egyedi UINT típusú adatokból . 141 ütemadó impulzusgenerátor . 143
impulzusképző . 145 időzítéses megszakításkezelés. 147 idő (TIME) típusú változó szétválasztása egyedi UINT típusú adatokra . 150 napi idő (TOD) típusú változó összeállítása egyedi UINT típusú adatokból . 152 idő (TIME OF DAY) típusú változó szétválasztása egyedi UINT típusú adatokra. 153 adatblokk másolása, inicializálása . 154 adatok írása a flash-memóriába. 156  Sucosoft határértékek . 159     A Sucosoft programstrukturája 1.  A kézikönyvről  Ezen dokumentáció az AWB2700-1306 számú dokumentáció szerkesztett fordítása, mely az alapvető ismereteket és az általunk legfontosabb utasítások, függvények, funkcióblokkok fordítását tartalmazza a kompakt PLC-kre (PS4-200, PS4-300) vonatkozóan. Az egyes programnyelvi kifejezések az összes PLC típusra (PS4, PS416) azonosak. A különbségek csak az egyes PLC-k memórianagyságában, a támogatott adattípusokban illetve a különböző perifériákból adódhatnak.
Ezen esetekben külön hivatkozunk az adott típusokra A PS4-200 jelölés a PS4-141/-151-MM1 valamint a PS4-201/-271-MM1, a PS4-300 jelölés a PS4-341-MM1 kompakt PLC-kre, a PS416 jelölés pedig az összes moduláris CPU típusra (CPU-200, CPU-300, CPU-400) vonatkozik. Megjegyzések nélküli leírás részek minden PLC típusra érvényes.  2.  A Sucosoft programstruktúrája  A Sucosoft által használt programnyelvek megfelelnek az IEC1131-3 szabványnak. A különböző felhasználói programok strukturált kialakításához három porgramorganizációs egység (továbbiakban POU) áll rendelkezésre. •  PROGRAM (főprogram)  •  FUNCTION (függvények, továbbiakban FU)  •  FUNCTIONBLOCK (funkcióblokkok, továbbiakban FB)  A gyakran fellépő feladatok megkönnyítésére a Sucosoft a standard függvények és funkcióblokkok sorozatát kinálja fel. A Sucosoft mind az IEC1131-3 által, mind a Moeller Electric által definiált gyártó-definiált függvényeket és a
funkcióblokkokat tartalmaz. (A fordítás csak a Moeller Electric által definiált gyártós pecifikus programelemeket ismerteti.) Az eredeti kézikönyvben az egyes függvények, funkcióblokkok eredetük szerint IEC vagy KM jelöléssel találhatók meg. A strukturált program feldolgozását a hívó POU (függvény, funkcióblokk) megszakítja, és a meghívott POU-ban történik tovább a programfeldolgozás. A hívás lehet közvetlen vagy (az előző programrész eredményétől függő) feltételhez kötött. Minden POU egy deklarációs részből és egy utasításrészből áll. Az összes adatelemet, mely az utasításrészben felhasználásra kerül, deklarálni kötelező. A program kommentárokat is tartalmazhat. A kommentárokat (* . *) jelek közé kell elhelyezni. A kommnetárok egymásba ágyazhatók, ezáltal egyes programrészek egyszerűen kizárhatók 8kikommentározhatók) a programfutásból. Egy-egy POU tartalma adott kulcsszavakkal határolódik el
egymástól, melyet a POU-editor (a programszerkesztő automatikusan generál. PROGRAM. END PROGRAM; FUNCTION END FUNCTION; FUNCTION BLOCKEND  FUNCTION BLOCK;  5     Adattípusok 3.  Adattípusok, változók deklarálása  Az IEC1131-3 elemi és származtatott adattípusokat deklarál. A kulcsszavak kis és nagybetűvel egyaránt írhatók.  Elemi adattípusok felsorolása Az elemi adattípusokat az adott kulcsszavak egyértelműen meghatározzák. A kezdeti értékek a := hozzárendelési operátorral adhatók meg. Amennyiben nincs (kezdeti (inicializálási) érték a változóhoz hozzárendelve, akkor a változók a default értékeket veszik fel. Kulcsszó  adattípus  bitfoglalás  default érték  BOOL  kétértékű bináris szám, értéke: 1(igaz) vagy 0,(hamis)  1  0  SINT  short integer; rövid egész szám értéke: -128.+127  8  0  INT  integer; egész szám értéke: -32 768.+32 767  16  0  DINT 1)  double integer; dupla egész szám értéke:-2 147 483 648.+2 147 483 647
 32  0  USINT  unsigned short integer; előjel nélküli rövid egész szám, értéke: 0255  8  0  UINT  unsigned integer; előjel nélküli egész szám, értéke 065 535  16  0  UDINT 1)  unsigned double integer; előjel nélküli dupla egész szám, értéke: 04 294 967 295  32  0  REAL 1)  real; valós szám, értéke: +/-3,4 E+/-38  32  0  TIME  időtartam; megadása nap, óra, perc, sec., msec értéktart.: -129d+1ms+128d-1ms; PS4-200 esetén: -65d+1ms.-64d-1ms matematikai műv. esetén:064d-1ms  T#0s  DATE  dátum formátum; YYYY-MM-TT  D#1900-01-01  TIME OF DAY  időpont formátum: HH:MM:SS  TOD#00:00:00  DATE AND TIME dátum és idő  DT 1900-01-0100:00:00  STRING  változó hosszúságú karakterlánc  2)  ’ ’(szóköz)  BYTE  bitsorozat 8bit szélességben  8  0  WORD  bitsorozat 16bit szélességben  16  0  DWORD*  bitsorozat 32bit szélességben  32  0  1)  6  csak a PS4-300 és Ps416 esetén     Adattípusok 2)  A karakterlánc hosszának default értéke 32jel.
Amennyiben más értékre van szükség, akkor azt a deklarálás során kell kerek zárójelek között megadni. pl. Text : STRING(12) := ’ABC’; maximális STRING hossz PS4-200 esetén: 253jel, PS4-300 és PS416 esetén: 1024jel  BOOL R EDGE és BOOL F EDGE adattípusok (csak PS4-200 és PS4-300 esetén) A BOOL R EDGE (felfutó él) és a BOOL F EDGE (lefutó él) adattípusok az elemi típusok között szerepelnek. A jelváltozást kiértékelő adattípusok csak változó bemenetként (VAR INPUT) használhatók felhasználó által definiált funkcióblokkok bemenetein. Ha a bemeneteken egy felfutó vagy lefutó élváltozás történt, akkor a R EDGE vagy a F EDGE-nek deklarált bemenetek az ezt követő híváskor logikai 1 értéket vesznek fel.  Adattípusok felosztása ANY  ANY  ANY NUM ANY BIT ANY DATE ANY STRING TIME szárm. adattíp ADDRESS# FUNCTION  BLOCK ANY REAL  ANY INT  REAL REAL*  SINT SINT INT INT  BOOL BOOL BYTE BYTE  DATE DATE TIME OF DATE (TOD) TIME TIME OF
DAY (TOD)  DINT DINT* USINT USINT  WORD WORD DWORD DWORD*  DATE AND TIME(DAT) (DAT) DATE AND TIME  UINT UINT UDINT UDINT*  felsorolás  ANY ARRAY STRUCT ARRAY[.]  # az új fejlesztések esetén nem ajánlott! * csak aPS4-300 illetve PS416 estén  7     Adattípusok Az ADDRESS adattípus és az ANY kategóriajelölések csak mint általános adattípus jelölések a standard funkciók és funkcióblokkok bemeneti és kimeneti paramétereinél használatosak.  Származtatott adattípusok A származtatott adattípusokat az elemi adat adattípusokból lehet új, a felhasználó által adott kulcsszóval előállítani. A deklarálás a TYPEEND TYPE kulcsszavakkal történik A származtatott adattípusok definiálásával a VAREND VAR kulcsszavak közé egyedi adattípusú változókat tud bevezetni. példa: TYPE Analogertek : INT ; END TYPE VAR Ertek1 : Analogertek ; END VAR A származtatott adattípusok csak abban a POU-ban érvényesek, ahol a hozzátartozó típusdefiniálás
megtörtént. Projekt globális származtatott adattípusokat a usertype.typ fájlban tetszőleges szövegszerkesztővel lehet a TYPEEND TYPE kulcsszavakkal definiálni. (Lásd részletesen az AWB2700-1306 kézikönyvet.) Lehetséges származtatott adattípusok: • változók korlátozott értéktartománnyal: alkalmazásával lehetségessé válik az elemi adattípusok értéktartományát az újabb adattípus bevezetésével bekorlátozni. TYPE analogertek 1 : INT (-128.128) ; feszultseg  : INT (0.150) ;  temperatur : INT(-10.10) ; END TYPE VAR Meresi Ertek1 : analogertek 1 ; Meresi Ertek2 : feszultseg ; Kazan Temp END VAR  8  : temperatur ;  Az alsó felső határértékeket két ponttal szóköz nélkül kell megadni. A pozitív értékek elé nem kell előjelet tenni!     Adattípusok • felsorolás adattípusok: A felsorolás adattípus definiálásával egy listát adunk meg, amilyen értékeket a változó a későbbiek folyamán felvehet. A típus definiálásakor a név
megadását követően kerek zárójelben, egymástól vesszővel elválasztva adjuk meg a változó értékeket. A befejező zárójelet követően lehet a kezdeti értéket megadni Amennyiben nincs kezdeti értékadás, akkor az első programfeldolgozáskor a változólista első eleme kerül felhasználásra. példa: típus-inicializálás Az adattípus Kozl Lampa három értéket (piros, sarga, zold) vehet fel. A változó sarga kezdeti értékkel indul. Ha hiányozna az inicializálás, akkor a változó a pirost, mint az első értéket venné fel. TYPE Kozl Lampa : (piros, sarga, zold) :=sarga ; END TYPE VAR K Lampa1 : Kozl lampa ; K Lampa2 : Kozl lampa ; K Lampa3 : Kozl lampa ; Auto Allj :BOOL ; END VAR A program utasításrészében az egyes definiált értékek közvetlenül is felhasználhatók. LD  K Lampa1  EQ  piros  St  Auto Allj  • tömb típusú adatok: Több azonos típusú adatot egy változóba is össze lehet foglalni. Ezt az adattípust tömbnek nevezzük. Egy
tömb tartalmazhat mind elemi mind származtatott adattípust. A definiálás az ARRAY kulcsszóval és az adatelemek számának megadásával történik. A tömbváltozók közvetlen címekkel is összekapcsolható az AT kulcsszó felhasználásával. példa: Tömbváltozó deklarálása A tomb1 ötelemű INT típusú, a tomb2 egy háromdimenziós 24 elemű változót jelent. A 17-es kezdeti értékű tömbelemet a program 5-re átírja. PROGRAM tomb TYPE tomb 5 INT : ARRAY [1.5] of INT :=[1,13,5,34,2] ; tomb 24 INT : ARRAY [1.2,13,14] of INT :=[[[3,7,2,9],[2,8,6,1],[5,7,2,17], [[2,3,0,5],[6,1,2,4],[3,0,1,4]]];  9     Adattípusok END TYPE VAR tomb1 : tomb 5 int ; tomb2 :tomb 24 int ; END VAR . . LD  5  ST  tomb2[1,3,4]  . END PROGRAM • Struktúra adattípus definiálása: (csak a PS4-300 és a PS416 estén) Különböző típusú adatelemek egy adattípusba való összerendelésére szolgál az adatstruktúra. Az adatstruktúra tartalmazhat elemi vagy származtatott adattípusokat
is A deklaráláshoz a STRUCT kulcsszót kell megadni, majd ezt követi az egyes elemek felsorolása típus megadásukkal együtt. Egy struktúraelem megszólítása a struktúra változó névmegadással majd ponttal elválasztva a struktúraelem nevével történik. példa: kezdeti értékadás a deklarálás során PROGRAM struktur TYPE Berendezes Adatok : STRUCT meres1: BOOL := 1 ; meres2: INT := -15 ; meres3: UINT := 100; meres4: REAL := 10.2; END STRUCT END TYPE VAR allomas1 : Berendezes Adatok ; allomas2 : Berendezes Adatok ; END VAR LD .  10  allomas1. meres3     Adattípusok END PROGRAM példa: kezdeti értékadás a deklarálás után PROGRAM struktur TYPE Berendezes Adatok : STRUCT meres1: BOOL ; meres2: INT ; meres3: UINT ; meres4: REAL ; END STRUCT := (meres1 :=1, meres2 := -15, meres3 := 100, meres4 : =10.2) ; END TYPE VAR allomas1 : Berendezes Adatok ; allomas2 : Berendezes Adatok ; END VAR A Berendezes Adatok típus bevezetésével és az allomas1 és az allomas2
változókhoz való hozzárendeléssel az allomas1 és allomas2 változók mindegyike tartalmaz egy-egy BOOL, INT, UINT és REAL adattípust. Amennyiben a származtatott adattípusok típusdeklarációjában nem történik kezdeti értékadás, akkor az egyedi adatelemek kezdeti értékként a default értéküket veszik fel.  11     Változók Változó fajták A PLC-ben alkalmazott adatelemeket változóknak nevezzük. A változók csoportosítása: • változók, melyek a közbenső belső adattárolásra szolgálnak •  közvetlen címzésű változók, melyek a bemenetekhez, kimenetekhez, vagy meghatározott memóriaterülethez illetve a PLC kommunikációs memóriaterületéhez kapcsolódnak.  A változókat jellel, névvel lehet azonosítani. A nevek betűvel vagy aláhúzásjellel ( ) kezdődhetnek, és egyébként kis- és nagybetűk, számok, aláhúzások sorozatából áll. Szóközöket, ékezetes betűket a név nem tartalmazhat. A kulcsszavakat szintén nem lehet
változónévként használni. A változónevek maximális hossza 64 karakter. A kis és nagybetűs jeleknek nincs megkülönböztető jelentősége. Közvetlenül ábrázolható változók A fizikai PLC címek (be-/kimenetek, memóriaterületek) közvetlenül is megszólíthatók. A direkt ábrázolású változókat is kötelező deklarálni, azonban a direkt címekhez szimbolikus nevek hozzárendelése is megengedett. Direkt címzés esetén az operandusokat %-jellel és a fizikai címükkel lehet megszólítani. A deklarációs részben a fizikai címet (szóközzel elválasztva) AT kulcsszóval kell megadni. példa: Program poe4 VAR AT  AT %I0.0000 : BOOL ;  Bemenet1  AT %I0.0001 : BOOL ;  Eredmeny : BOOL ; END VAR LD  Bemenet1  AND %I0.0000 ST  Eredmeny  Ajánlatos a szimbolikus nevek használata a direkt címzésű változók esetén is, mert használatuk esetén a címváltoztatást egyszerűbb átvezetni. Ebben az esetben elegendő ugyanis a deklarációs részben a
szimbolikus név és a direkt változó hozzárendelését javítani, az utasításrész változatlan maradhat. (Ellenkező esetben minden egyes direkt változó helyén el kell végezni a módosítást.) Közvetlenül címzésű változókat csak a főprogramban (PROGRAM nevű POU) lehet deklarálni. Igény esetén egy tömbhöz is lehet közvetlenül címeket hozzárendelni, de csak az azonos típusú címzéseket (BOOL, BYTE, SINT, USINT, WORD, INT stb.) lehet összefogni egy tömbbe. A PS4-200 és PS4-300 estén a bitváltozókat csak a 8 egészszámú többszöröseként  12     Változók lehet összefogni. A PROGRAM POU-ban deklarált globális direkt címzésű változókat a funkcióblokkokban, mint külső (EXTERNAL) deklarált változókként lehet felhasználni. Egy másik, gyorsabb lehetőség a funkcióblokkok esetén a változók paraméter átadása a VAR IN OUT típusokon keresztül. Ez a lehetőség azonban csak az írható változókra (PLC kimenetekre,
memóriahelyekre, kommunikációs adatokra) vonatkozik. A Sucosoft a következő fizikai címeket ismeri: I: Q: M: IA: QA: IC: IS: SD: RD:  digitális bemenet digitális kimenet memóriaterület analóg bemenet analóg kimenet számláló bemenet status információs bemenet (diagnosztika) intelligens Suconet K résztvevőnek küldendő adat intelligens Suconet K résztvevőtől fogadott adat  A következő fizikai címek a közvetlen periféria hozzáféréshez használhatók: IP: digitális bemenet (PS4-200/-300) QP: digitális kimenet (PS4-200/-300) IPA: analóg bemenet (PS4-300) QPA: analóg kimenet (PS4-300) IPC: számláló bemenet (PS4-300) A rendelkezésre álló konfigurált hardver határozza meg, hogy milyen címek állnak rendelkezésre. Az egyes adatok nagyságát a következő szimbólumokkal jelöljük: szimbólum jelentése nagyság példa bit 1 bit %I0.0000 B bájt 8 bit %IB0.000 W szó 16bit %IW0.000 D duppla szó 32bit %ID0.004 A direkt című változók memóriabeli
szervezése a következő kimeneti változón (Q) látható: QD0.000 QW0.000  QD0.004 QW0.002  QW0.004  QW0.006  QB0.000 QB0001 QB0002 QB0002 QB0004 QB0005 QB0006 QB0007 Q0.0000 Q00010 Q00020 Q00020 Q00040 Q00050 Q00060 Q00070 Q0.0007 Q00017 Q00027 Q00027 Q00047 Q00057 Q00067 Q00077  13     Változók Változó típusok A programozási egység deklarációs részében minden felhasználásra kerülő változót definiálni kell. A különböző változótípusokat a megfelelő kulcsszavakkal lehet jellemezni A következőkben összefoglalva látható a különböző változótípusok és jellemzésük. Kulcsszó  Felhasználás  VAR  lokális változók; érvényességi körük csak az adott POU-ra, ahol definiálásra kerültek, vonatkozik.  VAR GLOBAL  A globálisként deklarált változó érvényességi területe a teljes programra vonatkozik, azaz egy a PROGRAM POUban globálisan deklarált változó bármelyik programbeli funkcióblokkban (FB-ben) is előhívható. Az FB-ben,
ahol egy globálisan deklarált változó felhasználásra kerül, a változót azonos névvel, mint VAR EXTERNAL típusként kell deklarálni.  VAR EXTERNAL  Ha egy FB-ben egy globálisan deklarált változó kerül felhasználásra, akkor az azonos névvel és VAR EXTERNAL típusként kell deklarálni.  VAR INPUT  Egy változó bemeneti változóként kerülhet definiálásra egy POU-ban (FU (= függvény), FB), ha ebben a programozási egységben a változót csak olvassák, vagy csak paraméterátadásra használják, vagyis a változó értékét nem szabad megváltoztatni.  VAR OUTPUT  Egy FB kimeneti változójaként definiált változót az FB a hívás folyamán képes írni, azaz azt megváltoztatni.  VAR IN OUT  Az IN OUT típusú változót az FB képes meghívni, és ugyanazon a néven módosított értéket adni. Mivel a az FBn belül értékadás történhet, írásvédett változót (pl. CONSTANT) a VAR IN OUT-ként nem lehet használni.  TYPE  A TYPE kulcsszó a
származtatott adattípusok jelölésére szolgál.  Minden egyes adatblokkot az END VAR, vagy END TYPE kulcsszavakkal kell lezárni. A VAR IN OUT változó mutató (pointer), amely az adott típusú deklarált változóra mutat. A változó csak FB-ben alkalmazható, és az FB hívása előtt már érvényes értékkel kell rendelkeznie. A nem inicializált VAR IN OUT változók a fordítás során szintaktikai hibát okoznak. A mutatót az FB hívása előtt akkor is inicializálni kell, ha az FB-ben a hívás során közvetlenül nem kerül felhasználásra. A mutatókat az FB hívásakor kerek zárójelben kell megadni Példa: Mutató egy 201szavas tömbváltozóra A „demo” nevű FB-ben alkalmazott „w array” VAR IN OUT típusú változó nem 201 szót tartalmazó tömb, hanem egy mutató, mely erre a tömbre mutat. A „demo” FB-ben a „word array” globális tömbre történik a hivatkozás.  14     Változók A mutatók alkalmazása a következő előnyöket nyújtja:
•  A „demo” hívásakor nem kell a tömböt átmásolni (időnyereség), és a VAR IN OUT változóra való hivatkozás mind az írást, mind az olvasást biztosítja.  •  A funkcióblokk így neutrális maradhat, mivel az EXTERNAL deklaráció is elmarad, mely egyébként adott globális változókhoz kapcsolódna.  PROGRAM user VAR GLOBAL word array : array[0.200] of word ; END VAR VAR my function block : demo ; END VAR cal my function block(w array :=word array) END PROGRAM FUCTION BLOCK demo VAR IN OUT w array : array[0.200] of word ; END VAR VAR seged1 : word ; seged2 : word ; END VAR ld w array[100] st seged1 ld seged2 st w array[200] END FUNCTION BLOCK A lokális és globális változók további tulajdonságokkal is kiegészíthető. Kulcsszó  Felhasználás  RETAIN  A RETAIN kulcsszóval az adott változót remanensnek definiálhatjuk, azaz meleg start esetén a változó megtartja utolsó kikapcsolás előtti értékét. A RETAIN kulcsszó a VAR vagy a VAR GLOBAL
után szóközzel írandó.  CONSTANT  Amennyiben egy adatelem konstansként, azaz értéke állandóként definiálandó, akkor a CONSTANT attribútum használható. A CONSTANT kulcsszó a VAR vagy a VAR GLOBAL után szóközzel írandó.  AT  Ha egy változóhoz fizikai címet kíván hozzárendelni, akkor ehhez az AT kulcsszó használható. PS4-200 esetén a memóriaváltozókat nem lehet a RETAIN kulcsszóval remanensé tenni. Ebben az esetben egy összefüggő memóriaterületet kell kijelölni, melyet a kód élőállítás -> Opciók -> PS-opciók -> Compiler menüpont alatt lehet kijelölni. 15     Változók PS4-300 esetén a memóriaváltozókat mind a RETAIN kulcsszóval, mind a remanens memóriaterület kijelölésével (kód élőállítás -> Opciók -> PSopciók -> Compiler) remanensé lehet tenni. A PS4-200 esetén egy funkcióblokk egyes változóit remanenssé beállítani nem lehet. Ebben az esetben az egész funkcióblokkot kell remanensként
deklarálni. Változótípusok felhasználása VAR INPUT  FU  FB  ▲▲  ▲▲  VAR OUTPUT  ▲▲  VAR IN OUT  ▲▲  VAR GLOBAL  PRG  ▲▲  VAR EXTERNAL  ▲▲  VAR  ▲▲  ▲▲  ▲▲  TYPE  ▲▲*  ▲▲*  ▲▲*  ▲▲ többszörös felhasználás lehetséges *  lokálisan egy POU-n belül, vagy globálisan a usertype.typ fájl megfelelő szerkesztésével!  Funkcióblokkok helyfoglalása A funkcióblokkot abban a POU-ban (PROGRAM vagy egy másik FB), ahol meghívásra kerül, külön deklarálni szükséges. A definiálás ebben az esetben szintén egy egyedi névadással és a típus (funkcióblokk prototípusának) megadásával történik. Pl szamlalo : CTU ; azaz a funkcióblokk egy egyedi, szamlalo névvel ellátva, és CTU típusként kerül meghívásra. A bemeneti változókat a meghívás előtt kell paraméterezni, a kimeneteket vagy előtte, vagy a meghívás után lehet további változókhoz hozzárendelni. A függvényektől eltérően csak azokat a
bemeneti változókat kell paraméterezni, amelyek lényegesek a funkcióblokk hívása esetén. Kivételek a VAR IN OUT típusú változók, melyeket minden híváskor paraméterezni kell, különben szintaktikai hiba lép fel a fordítás során.  16     Utasításkészlet 4.  POU-k programutasítási része  Utasításkészlet Operátor  Operandus  Jelentés  LD  ANY  az operandus bemásolása a z akkumulátorba  LDN  ANY BIT  ST  ANY  STN  ANY BIT  S  BOOL  az operandus = 1, ha az akku értéke 1  R  BOOL  az operandus = 0, ha az akku értéke 1  a negált operandus bemásolása a z akkumulátorba az akkumulátor tárolása az operandusba az akku negált értékének tárolása az operandusba  AND(N) 1)  ANY BIT  logikai ÉS kapcsolat (eredmény negálva)  &(N) 1)  ANY BIT  logikai ÉS kapcsolat (eredmény negálva)  OR(N) 1)  ANY BIT  logikai VAGY kapcsolat (eredmény negálva)  XOR(N) 1)  ANY BIT  logikai kizáró VAGY kapcsolat (eredmény negálva)  ADD 1)  ANY INT 
összeadás  SUB 1)  ANY INT  kivonás  1)  ANY INT  szorzás  1)  ANY INT  osztás  GT  1)  ANY INT  összehasonlítás: nagyobb; akku = 1, ha igaz  GE  1)  ANY INT  összehasonlítás: nagyobb/egyenlő; akku = 1, ha igaz  EQ  1)  ANY INT  összehasonlítás: egyenlő; akku = 1, ha igaz  NE  1)  ANY INT  összehasonlítás: nem egyenlő; akku = 1, ha igaz  LE  1)  ANY INT  összehasonlítás: kisebb/egyenlő; akku = 1, ha igaz  LT  1)  ANY INT  összehasonlítás: kisebb; akku = 1, ha igaz  JMP  címke  feltétel nélküli ugrás; ugrás helye a címke  JMPC(N)  címke  feltételes ugrás; feltétel (nem) igaz, ha az akku = 1  CAL  FB-név  feltétel nélküli hívás; adott nevű FB hívása  CALC(N)  FB-név  feltételes hívás; feltétel (nem) igaz, ha az akku = 1  RET  -  feltétel nélküli visszaugrás az adott nevű FB-ből  RETC(N)  -  feltételes visszaugrás; feltétel (nem) igaz, ha az akku = 1  MUL DIV  1) Az utasítás zárójelekkel együtt is használható. Az
utasítás a zárójelben megadott kifejezés eredményére vonatkozik. A zárójelek több szinten egymásba is ágyazhatók.  17     Utasításkészlet Programírási szabályok Egy utasítás szekvencia mindig LD(N) utasítással kezdődik. A szekvenciát az operandus írási utasítások (ST(N), S,R), valamint a feltételes ugrások, hívások és visszatérési utasítások zárják le. Kivételt képeznek a feltétel nélküli ugrások és hívások, valamint ta visszatérési utasítások. Ugrási címkéket az utasítási sor elejére kell írni és kettősponttal kell lezárni. Ugrási célként csak a szekvencia kezdetét lehet megadni. Fontos követelmény: Az utasításokat csak azonos típusú adatokkal lehet végrehajtani. A Sucosoftban természetesen konstansokkal is lehet dolgozni. Lehet adatelemeket CONSTANT attribútummal ellátva és a kívánt kezdeti értékkel inicializálva deklarálni. Másik lehetőség a programvégrehajtás során direkt értékadás
alkalmazása névvel ellátott adatelem felhasználása nélkül. A konstansok különböző adattípusaihoz előírt helyesírási konvenció tartozik. A konstanson belül szóközök alkalmazása helyett térelválasztónak az aláhúzás jel megengedett. (A szóközök csak a SRTING változókban használhatók!) Konstansok áttekintése Konstansok  Példa  Jelentés  INT  -13 45165 vagy 45 165 +125  egész szám; -13 egész szám; 45 165 egész szám; 125  REAL 1)  13.12 123.45 0.123 –1.23E-3  valós szám: 13,12 valós szám: 123,45 valós szám: 0,123 valós szám:0,00123  bináris szám  2#0111 111 vagy 126  126 decimálisan  hexadecimális szám  16#123 vagy 291  291 decimálisan  STRING  ’ABC’  karakterlánc ABC  TIME  T#12.3ms vagy TIME#12.3ms  12,3ms időtartam  DATE  DATE#1995-12-24 vagy D#1995-12-24  dátum: 1995 12. 24  TIME OF DAY  TOD#12:05:14.56 vagy TIME of DAY#12:05:14.56  időpont: 12óra 5perc, 14,56másodp.  DATE AND TIME DT#1995-12-24-12:05:14.56 v dárum
és idő együtt: DATE AND TIME#19951995 12. 24 12-24212:05:14.56 12óra 5perc, 14,56másodperc 1)  csak a PS4-300 és Ps416 esetén  A PROGRAM a Sucosoft legfelső strukturális szintje. Ebben a POU-ban célszerű az alapvető vezérlési utasításokon túl a többi strukturált POU-t (függvények, funkcióblokkok) meghívni. A függvények hívása a függvény nevének beírásával, a funkcióblokkok hívása a Cal utasítással történik.  18     Utasításkészlet Függvények Rendszeresen ismétlődő feladatokhoz célszerű függvényeket alkalmazni. A függvény több beállítható induló paramétert tartalmazhat, a végrehajtás eredménye pedig egyetlen kimeneti adatban helyezkedik el, mely lehet egyetlen, de akár többelemű, tömb típusú is. A függvények érvényességi területe globális, azaz minden POU részére rendelkezésre áll, és nem kell külön a hívó POU-ban deklarálni. A függvény hívása a függvény nevének megadásával és a bemeneti
adatok teljes paraméterátadásával történik. A függvény első paraméterét bemenetként az akkumulátoron keresztül, a további paramétereket egymástól vesszővel elválasztva (a függvénynevet szóközzel követően) a függvény argumentumaként kell megadni. A függvény az eredményt a függvény nevének megadásával az akkumulátoron keresztül adja vissza a meghívó POU-nak. A függvények nem képesek az eredmények tárolására A függvény a lokális paramétereket minden függvényhíváskor az adattípusuknak megfelelően (lásd az elemi adattípusokat felsoroló táblázatot az előző fejezetben) inicializálja. Ha a hívás az eredmény állítása nélkül fejeződik be, akkor a függvény automatikusan visszaállítja a lokális változók típusnak megfelelő kezdeti értékét. Példa: összeadási függvény FUNCTION szumma : INT VAR INPUT A : INT ; B : INT ; C : INT ;  (* deklarációs rész )  END VAR LD A (* utasításrész ) ADD B ADD C ST szumma
PROGRAM pr sum VAR tenyezo1 : INT := 1 ; tenyezo2 : INT := 2 ; tenyezo3 : INT := 3 ; eredmeny : INT ; END VAR LD tenyezo1 Szumma tenyezo2, tenyezo3 ST eredmeny END PROGRAM Egy függvényen belül további függvények is hívhatók Viszont egy függvénybe nem lehet funkcióblokkot beágyazni, továbbá nem lehet funkcióblokk nevet bemeneti paraméterként felhasználni.  19     Utasításkészlet A Sucosoft a gyakori feladatok számára nagyszámú gyártó specifikus függvényt ajánl fel. Online változtatás vagy állapotkijelzés, mint a PROGRAM vagy a FB esetén, a függvényeken belül nem lehetséges. A felhasználói függvények algoritmusának tesztelésére ezért célszerű FB-t kialakítani, majd később a leellenőrzött funkcióblokkot függvénnyé átalakítani. A PS4-200 esetén a felhasználó által megírható függvényeket a Sucosoft egyelőre nem támogatja.  Funkcióblokkok A gyakran előforduló feladatokhoz a függvényeken kívül funkcióblokkokat is
lehet használni. A funkcióblokkok ellentétben a függvényekkel több kimeneti paraméterrel is rendelkezhetnek. A funkcióblokk a változóit megőrzi a következő hívásig, melyek így tovább feldolgozásra közvetlenül felhasználhatók. Egy funkcióblokk további FB-ket hívhat. A következő táblázat mutatja a funkcióblokk be/kimeneti változóinak megengedett használatát: Használat  funkcióblokkon belül  funkcióblokkon kivűl  bemenet olvasása  LD IN1 AND IN2 ST Q1  LD ST  FBx.IN1 %QW0.002  bemenet írása  nem megengedett!  LD ST CAL  Start FBx.IN1 FBx  kimenet olvasása  LD OUT1 AND IN2 ST OUT1  CAL LD ST  FBx(IN1 := Be, ) FBx.OUT1 %QW0.002  kimenet írása  LD ST  nem megengedett!  100 OUT1  Ha a bemeneti operandust, mint él figyelést kell alkalmazni, akkor a változót ennek megfelelően (pl. start : BOOL R EDGE ;) kell deklarálni! A él figyelésű változók használata csak a PS4-200 és a PS4-300 családban lehetséges. Az IEC szabvány két azonos
eredménnyel járó eljárást engedélyez a funkcióblokkok paraméterátadására. A következő példában (a feladat többszörös középértékképzés) két hívással mutatjuk be a két eljárást.  20     Utasításkészlet A középértékképzést végző funkcióblokk prototípusa a következő: FUNCTION BLOCK kozepertek VAR INPUT Reset : BOOL ; Bem1 : USINT ; Bem2 : USINT ; END VAR VAR OUTPUT atlag : USINT ; END VAR LD Bem1 ADD Bem2 DIV 2 St atlag END FUNCTION BLOCK Az FB-t hívó program felépítése: A kozepertek FB a programban különböző nevekkel kétszer kerül meghívásra (instancálásra). PROGRAM poe3 VAR Instanz1 nev : kozepertek ; Instanz2 nev : kozepertek ; ertek1 AT %IB0.000 : USINT ; ertek2 AT %IB0.001 : USINT ; eredmeny1 AT %QB0.000 : USINT ; eredmeny2 AT %QB0.001 : USINT ; torles AT %I0.0020 : BOOL ; END VAR (* FU hívás - 1. eljárás *) Cal Instanz1 nev (Reset := torles, Bem1 := ertek1, Bem2 := ertek2) LD Instanz1 nev.atlag St eredmeny1 (* FU hívás
- 2. eljárás *) LD torles St torles LD ertek1 ST Instanz2 nev.bem1 LD ertek2 ST Instanz2 nev.bem2 Cal Instanz2 nev LD Instanz2 nev.atlag St eredmeny2 END PROGRAM A csak egyszer kialakított FB szükség szerint többször is (más-más nevekkel) meghívható.  21     Utasításkészlet A neveket a fölérendelt hívó POU-ban kell deklarálni. A deklarálás során az egyedi neveket (itt: Instanz1 nev, Instanz2 nev) és a funkcióblokk prototípusát (itt: kozepertek) is meg kell adni. A Sucosoft a szükséges memóriaterületet az instancált FB-hez hozzárendeli, azaz a funkcióblokk minden egyes alkalmazásánál a belső adatok is letárolásra kerülnek. A funkcióblokk hívásakor (Cal Instanz1 nev) a történik meg a tulajdonképpeni paraméterezés, azaz ekkor rendelődnek hozzá a funkcióblokk bemeneti paramétereihez az adott specifikus változók. Az egyes operandusokat kerek zárójelben egymástól vesszővel elválasztva kell megadni. A funkcióblokk kimeneti
paramétereit direkt hozzárendeléssel lehet átadni más változóknak: LD Instanz1 nev.atlag ST eredmeny1 A második eljárás esetén a funkcióblokk hívása előtt az egyes instanz-specifikus változókat, az akkumulátor segítségével, átadjuk a funkcióblokk bemeneti paramétereinek. Maga a funkcióblokk hívás nem tartalmaz semmilyen paraméter átadást A funkcióblokk eredmények hasonló módon letárolódnak, és az LD utasítással megszólíthatók. Továbbá úgynevezett Moeller-specifikus funkcióblokk hívás is realizálható. Ekkor a be/kimeneti paraméterátadás – egymástól elválasztva a ”|”-jellel – egyszerre történik Példa: Cal Instanz3 nev (Reset := torles, Bem1 := ertek1, Bem2 := ertek2 | eredmeny := atlag) Természetesen a három eljárás egymással keverve is használható, azaz lehet egyes értékeket akkumulátoron át paraméterezni, és a többi szükségeset pedig a CAL hívással együtt!  22     Függvények 5.  Függvények  A
Sucosoft S40 a függvények nagy választékát nyújtja a programozás részfeladatainak megkönnyítésére. Az IEC 1131-3 által definiált függvényeken kívül a Moeller Electric a PLC-khez további gyártó specifikus függvényeket is készített, melyek kihasználják a PLC egyedi adottságait. Ezek használata tovább könnyítheti az egyes felhasználói alkalmazások elkészítését. Az alábbiakban csoportosítva felsoroljuk a fontosabb függvényeket:  Függvények  Jelentésük  Adattípusokat konvertáló függvények . 25 * TO   típuskonverziók elemi adattípusok között  TRUNC  REAL szám egészét adja ANY INT adattípusban  Numerikus függvények. 27 ABS  abszolút értékképzés  NEG  2-es komplemens képzés  Aritmetikai függvények . 27 ADD  összeadás  MUL  szorzás  SUB  kivonás  DIV  egész számú osztás  MOD  maradékértéket adó osztás  Állapotbit vizsgáló függvények . 28 IsCarry  aritmetikai műveletet követően átvitel bit = ?  IsZero 
aritmetikai műveletet követően eredmény nulla bit = ?  IsOverflow  aritmetikai műveletet követően túlcsordulás = ?  ISPositive  aritmetikai műveletet követően eredmény pozitív = ?  IsBitTrue  akkumulátor adott bit = ?  GetCarryRegister Átvitelregisztert az akkumulátorba felhozni  Bit mozgatások . 30 SHL  bitmintát adott értékkel balra tolni  SHR  bitmintát adott értékkel jobbra tolni  ShiftLeftCarry  bitmintát - carry biten - át adott értékkel balra tolni  ShiftRightCarry  bitmintát - carry biten - át adott értékkel jobbra tolni  ROL  bitmintát adott értékkel balra forgatni  ROR  bitmintát adott értékkel jobbra forgatni  23     Függvények Logikai függvények. 31 AND, &  logikai ÉS kapcsolat  OR  logikai VAGY kapcsolat  XOR  logikai KIZÁRÓ VAGY kapcsolat  NOT  bitminta bitenkénti negálása  Összehasonlítási függvények. 31 GT  NAGYOBB, MINT összehasonlítás  GE  NAGYOBB, EGYENLŐ összehasonlítás  EQ  EGYENLŐ összehasonlítás 
LE  KISEBB, EGYENLŐ összehasonlítás  NT  KISEBB, MINT összehasonlítás  NE  NEM EGYENLŐ összehasonlítás  Operációs rendszer-függvények . 31 PLC Message  rendszerdiagnosztikai status-bájt/szó kiolvasása  PLC ReadCLock valósidejű óra egyedi elemeinek kiolvasása  Megszakításkérést tiltó / engedélyező függvények. 32 Disable Interrupt megszakításkérés tiltás Enable Interrupt megszakításkérés engedélyezés  Karakterlánccal kapcsolatos függvények . 34 LEN  adott karakterlánc hosszát megállapítani  CONCAT  karakterláncokat egybefűzni  DELETE  karakterláncból adott karaktereket törölni  FIND  karakterláncban adott karaktersorozatot megtalálni  INSERT  karakterláncba választható hosszúságú karaktereket befűzni  LEFT  karakterláncból balról választható hosszúságú karakterek kiválasztása  MID  karakterlánc belsejéből választható hosszúságú karakterek kiválasztása  REPLACE  karakterláncban választható helyen adott
karaktersorozat behelyettesítése  RIGHT  karakterlánc jobbról választható hosszúságú karakterek kiválasztása  Kiválasztási függvények . 37 LIMIT  értékkorlátozás  MAX  maximumérték keresés  MIN  minimumérték keresés  MUX  multiplexer  SEL  feltételes operandus kiválasztás  24     Függvények Adattípusokat konvertáló függvények * TO   típuskonverziók elemi adattípusok között  Az IEC programnyelv előírásai alapján a szoftver csak azonos adattípusú operandusok közötti műveleteket enged meg. Például ha egy (FB, FU) bemeneti változójának BYTE adattípusúnak kell lenni, akkor az átadandó változót, mely történetesen USINT adattípussal rendelkezik, átadás előtt az USINT TO BYTE konverziós függvénnyel át kell alakítani. A konverzió mindig az akkumulátorban levő adatra vonatkozik, a függvény eredménye is az akkumulátorban képződik. A numerikus adatok konverziója során ügyeljen arra, hogy a cél adattípus a
megengedett értéket ne lépje túl. Ha a bemeneti operandus túl nagy, akkor a kimeneti operandus a rendelkezésre álló bithosszúságra redukálódik, mely hibás értéket eredményezhet! A Sucosoft az alábbi konverziós függvényeket biztosítja az elemi adattípusok között  BOOL  BYTE  WORD  DWORD 1)  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X  X 1)  X  X  USINT  X  X  X  X  X  X  X  X  X  X  X  X  REAL 1)  X  X  X  X  X  X  BOOL  X  X  X  X  X  X  BYTE  X  X  X  X  X  X  X  WORD  X  X  X  X  X  X  X  X  DWORD 1)  X  X  X  X  X  X  X  X  DINT UINT  UDINT  1)  DATE AND TIME X  X  X  X  X  X  X  STRING 1)  X  ADDRESS 2)  X  1) 2)  X X  X X X  TIME BCD  X  BCD  REAL 1)  X  STRING 1)  UDINT 1)  X  DATE  UINT  X  TOD  USINT  INT  DINT1)  SINT  INT  bemenet  SINT  kimenet  X  X  csak a PS4-300 és PS416 esetén csak a PS4-200 és PS4-300 esetén  25     Függvények
Megjegyzések: 1.  Az előjeles numerikus értékek bitsorozattá való átalakítása során a függvény figyelembe veszi az előjelet. High Low pl. 0010 0101 0000 0000 0010 0101 SINT átalakítása WORD típussá, illetve pl.  2.  átalakítása  1111 1111 0010 0101 WORD típussá  A BYTE típusú adat legfelsőbb bitje nincs kiértékelve, ha az UINT/INT átalakításra kerül. A BYTE értéke a Low-bájtba kerül, míg a felső(High)-bájt o-val töltődik fel High Low pl. 0010 0101 0000 0000 0010 0101 BYTE átalakítása UINT típussá, illetve pl.  3.  1010 0101 SINT  1010 0101 BYTE  átalakítása  0000 0000 1010 0101 UINT  típussá  REAL TO ANY INT átalakítás során a tizedesvessző utáni szám az egészszámú kerekítés szabályai szerint történik. Ha a tizedesvessző utáni szám = 0,5, akkor a kerekítés a közelebb levő páros számra történik. Egyszerűbb megoldás a TRUNC függvény, mely a REAL adattípust ANY INT típussá alakítja, miközben csak az
egészrészt veszi figyelembe. (A TRUNC csak a PS4-300 és a PS416-ra van értelmezve.) pl.: 14 –1.4 1.6 –1.6 1.5 2.5 0.5 3.5  1 -1 2 -2 2 2 0 4  Ha a cél adattípus értéktartományát az átalakított eredmény túllépi, akkor a rendelkezésre álló bithossz redukálódik. pl. REAL TO SINT esetén 2049.1 1 2178.0 -126 4.  A TIME TO UINT és a TIME TO USINT függvények esetén a 65535, illetve 255nél nagyobb eredmények érvénytelenek. Az eredmény helyessége az IsOverflow függvénnyel kérdezhető le.  5.  A STRING TO UINT függvény csak a string változó baloldali két karakterét dolgozza fel. A high-bájtban az első, a low-bájtban a második karakter értéke jelenik Egy karakter esetén a jel értéke a low-bájtban helyezkedik el.  26     Függvények Numerikus függvények ABS  A függvény a bemenetre adott ANY NUM abszolút értékét adja vissza. Az adattípus az átalakítás során nem változik. Vigyázat: A legkisebb SINT (-128) és a INT (-32768)
értékeket a függvény nem változtatja meg, mivel a –128 és 128, illetve a –32768 és 32768 bináris értéke azonos. Ha ilyen értékek lépnek fel az ABS függvényben, akkor hiba generálás nem történik.  NEG A függvény ANY NUM adattípusokra vonatkozik. Az adattípus az átalakítás során nem változik. Előjeles számok esetén a függvény kimenet = (-1)*bemenet, azonban előjel nélküli számok esetén a függvény eredménye egy másik szám!  Aritmetikai függvények  ADD SUB MUL DIV  ADD SUB  Numerikus értékek adattípusokkal való műveletek szabályai: Numerikus értékek (ANY NUM) közötti műveletek esetén a be- illetve kimeneti operandusoknak azonos típusúak kell lenni. ADD, SUB, esetén, ha az eredmény túllépi az adattípusra megengedett tartományt, akkor a túlcsordulás állapot bit bebillen, mely az IsOverFlow függvénnyel kérdezhető le. MUL esetén, ha az eredmény túllépi az adattípusra megengedett tartományt, akkor a túlcsordult
érték az átvitel regiszterbe (melynek mérete mindig megegyezik a bemeneti operandusok méretével) kerül. Értéke a GetCarryRegister függvénnyel kérdezhető le. DIV művelet esetén az egész osztás maradéka az átvitel regiszterbe (melynek mérete mindig megegyezik a bemeneti operandusok méretével) kerül. Értéke a GetCarryRegister függvénnyel kérdezhető le. Időtartam illetve dátum és óra adattípusokkal való műveletek szabályai: ADD esetén a második operandus csak TIME típusú lehet, amit az elsőként megadott TIME, TIME OF DATE, DATE AND TIME1) típushoz lehet hozzáadni. A kimenet adattípus megegyezik az első operandus adattípusúval. SUB esetén az alábbi táblázat szerinti változatok lehetségesek: bemenet1 – bemenet2 = Különbség (kimenet) TIME TIME TIME DATE1) DATE TIME TIME OF DAY TIME TIME OF DAY TIME OF DAY TIME OF DAY TIME 1) TIME DATE AND TIME DATE AND TIME DATE AND TIME1) DATE AND TIME TIME 1) csak a PS4-300 és a PS416 esetén Csak
a PS4-200-ra vonatkozóan: A TIME adattípus csak pozitív tartományban ad helyes eredményt!  MUL DIV  A MUL és DIV esetén az első operandus lehet TIME adattípus, míg a második csak ANY NUM adattípust vehet fel.  27     Függvények Cím (ADDRESS) adattípusokkal való műveletek szabályai: A címekkel kapcsolatos mind a négy alapművelet megengedett, de csak a PS4-200 és a PS4-300 esetén lehetséges! Az alábbi táblázat szerinti változatok lehetségesek: bemenet1 bemenet2 kimenet ADDRESS ANY INT ADDRESS ADDRESS ADDRESS ADDRESS MOD  A függvény ANY NUM adattípusokra vonatkozik. Az adattípus az átalakítás során nem változik. A függvény az egészszámú osztás maradékát helyezi el a kimeneten (akkumulátorban) Csak aPS4-300 és a PS416 esetén értelmezett függvény!  Állapotbit vizsgáló függvények A vizsgáló függvények kiválóan alkalmasak feltételes ugrások, hívások feltételeinek meghatározásához. IsOverflow, IsPositive, IsZero: Az
állapotbit vizsgáló függvények közvetlenül az aritmetikai műveletek után használva adja a megfelelő eredményt BOOL adattípusban. IsOverflow: aritmetikai művelet során történt-e túlcsordulás? (igen = 1; nem = 0) IsPositive: aritmetikai művelet eredménye 0, vagy pozitívszám? (igen = 1; nem = 0) IsZero: aritmetikai művelet eredménye 0? (igen = 1; nem = 0) PROGRAM overflow VAR Edge : R TRIG; Signal : AT %I0.0000 : BOOL; Pulse : BOOL; Number1 : SINT := 127; END VAR  (* felfutó vizsgálatát végző FB )  LD Number1 ADD 12 IsOverflow CALC Edge (CLK := Signal) LD Edge.Q ST Pulse END PROGRAM IsCarry: A függvénnyel, a bitmozgatási függvényeket követően, az átviteli bit értékelhető ki. Bemenete ANY INT, kimenete BOOL. PROGRAM carrybit VAR Edge : R TRIG; Signal : AT %I0.0000 : BOOL; Pulse : BOOL; Byte1 : BYTE := 2#11110000; END VAR  28     Függvények LD Byte1 SHL 3 BYTE TO USINT IsCarry CALC Edge (CLK := Signal) LD Edge.Q ST Pulse END PROGRAM  (* Carry
regiszter = 1 )  IsBitTrue: az akkumulátorba elhelyezett bitminta (ANY BIT) tetszőleges bitjének vizsgálatára alkalmas. PROGRAM bittest VAR BitPattern : BYTE := 2#11010011 Position :UINT := 4; BitValue : BOOL; END VAR LD BitPattern IsBitTrue Position ST BitValue . . END PROGRAM  (* bit értéke: 1 )  GetCarryRegister A függvény a ANY INT adatokon végzett MUL esetén előforduló túlcsordulás, valamint a DIV esetén a maradék megjelenítésére szolgál. USINT, SINT, UDINT, DINT adattípusok esetén a túlcsordulásról nem generálódik jelzés. A compiler ennek megfelelő hibajelzést ad PROGRAM remainder VAR Number: INT := 127; Result integ : INT; ResultRemainder : INT; END VAR LD Number DIV 4 ST Result integ GetCarryRegister ST ResultRemainder . . END PROGRAM  (* osztás eredménye : 31, egész ) (* maradék : 3 )  29     Függvények Bit mozgatások SHL SHR  a Az akkumulátorban levő ANY BIT típusú bitmintát a függvény operandusaként megadott értékkel (ANY INT)
balra/balra tolja. A toláskor felszabaduló helyek 0-val töltődnek fel. Az eredmény az akkumulátorban a bemeneti bitmintával azonos adattípusban áll rendelkezésre. PROGRAM rot bal VAR BitPattern : BYTE := 2#01110001; Places : INT := 3; NewBitPattern: BYTE; END VAR LD BitPattern ROL Places ST NewBitPattern END PROGRAM  (* új bitminta: 2#10001011 )  ShiftLeftCarry, ShiftRightCarray: A függvények egy hellyel balra illetve jobbra tolja bemenetként megadott bitmintát. Például BYTE adattípus esetén: új átviteli bit  bitminta  régi átviteli bit  ShiftLeftCarry:  C  7  0  C  ShiftRightCarry:  C  7  0  C  PROGRAM shi jobb VAR BitPattern : BYTE := 2#01011100; NewBitPattern : BYTE; END VAR LD BitPattern ShiftRightCarry ST NewBitPattern (* új bitminta: x0101110 ahol "x" ) (* a 7. bitpozicíóban az átvitelbit régi értéke *) . .  END PROGRAM ROL A függvények az akkumulátor tartalmát (ANY BIT) a függvény paramétereként ROR megadott értékkel (ANY INT)
balra vagy jobbra forgatja, azaz a kitolt biteket a másik oldalon visszatölti. Az új bitminta az akkumulátorban áll rendelkezésre PROGRAM rot le VAR BitPattern : BYTE := 2#01110001; Places : INT := 3; NewBitPattern: BYTE; END VAR  30     Függvények LD BitPattern ROL Places ST NewBitPattern END PROGRAM  (* az új bitminta: 2#10001011 )  Logikai függvények A függvények a szokásos logikai függvények (része a Sucosoft utasításkészletnek), melyek csak azonos adattípusokon (ANY BIT) végezhető el. Az eredmény a bemenetekkel azonos típusú, és az akkumulátorban képződik.  Összehasonlítási függvények A függvények a szokásos logikai függvények (része a Sucosoft utasításkészletnek), melyek csak azonos adattípusokon (ANY INT) végezhető el. Az eredmény BOOL típusú, és az akkumulátorban képződik.  Operációs rendszer-függvények PLC Message: A függvénnyel a bemenetre adott felsorolás típusú változó egyik elemének értéke határozható
meg. A bemenet MESSAGE TYPE (Moeller által definiált, csak olvasható rendszerdiagnosztikai) változó, a kimenet BOOL típusú. A MESSAGE TYPE változó az egyes PLC típusok esetén a következő elemeket tartalmazza (minden típusra a standard beállítás az ISA): PS4-200 esetén: TYPE MESSAGE TYPE (* start utáni első programciklus ) (ISA, IRE, (* RESET nyomógomb működtetve ) IFO, (* RUN üzemmódban a FORCE aktív ) REC, (* újraindítás esetén a maradék-ciklus fut ) ICS, (* a vezérlés hidegen indítva ) NKD 1, (* az SBI1-en (SBI -= Suconet K busz) friss adatok vannak ) NKD 2, (* az SBI2-en (SBI -= Suconet K busz) friss adatok vannak ) NKD 3 (* az SBI3-en (SBI -= Suconet K busz) friss adatok vannak ) ) := ISA ; END TYPE PS4-300 esetén: TYPE MESSAGE TYPE (ISA, (* =0: start utáni első programciklus ) IRE, (* =1: RESET nyomógomb működtetve ) IFO, (* =2: RUN üzemmódban a FORCE aktív ) REC, (* =3: újraindítás esetén a maradék-ciklus fut ) ICS, (* =4: a
vezérlés hidegen indítva ) NKD 1, (* =5: az SBI1-en (SBI -= Suconet K busz) friss adatok vannak ) NKD 2, (* =6: az SBI2-en (SBI -= Suconet K busz) friss adatok vannak ) NKD 3, (* =7: az SBI3-en (SBI -= Suconet K busz) friss adatok vannak ) ICT, (* =8: ECT az első programciklusban ) IAH, (* =9: EAH az első programciklusban ) IRT, (* =10: ERT az első programciklusban ) ) := ISA ; END TYPE  31     Függvények PS416 esetén: TYPE MESSAGE TYPE (ICS (* =0: start utáni első programciklus hideg indítással) ISA, (* =1: start utáni első programciklus ) RTW, (* =2: run time warning -figyelmeztetés ) REC, (* =3: újraindítás esetén a maradék-ciklus fut ) DAKE, (* =4: AK-Error, az egység nem szólítható meg, esetleg nincs bent ) KOM, (* =5: a kommunikációs partner nem válaszol ) ) := ISA ; END TYPE Példa: Rendszerdiagnosztikai távirat kiértékelése LD ISA PLC Message JMPCN No new start PLC ReadClock: A függvénnyel a bemenetre adott felsorolás típusú változó egyik
elemének értéke határozható meg. A bemenet PLC Clock (Moeller által definiált, csak olvasható) változó, a kimenet USINT típusú. A PLC Clock standard beállítása a CK YEAR): PLC CLOCK: CK YEAR, (* évek száma ) CK MONTH, (* hónap ) CK DAY, (* nap ) CK WEEKDAY, (*hétnap sorszám; 0 = vasárnap ) CK HOURS, (* órák ) CK MINUTES, (* percek ) CK SECONDS (* másodpercek ) ) := CK YEAR; END TYPE PROGRAM RD Clock VAR Hours : USINT ; END VAR LD CK HOURS PLC ReadClock ST Hours END PROGRAM  Megszakítást tiltó / engedélyező függvények A függvények bemeneti paramétere a Moeller által specifikált, ALARM CHANNEL felsorolás típusú változó, mely a PLC típusától függ: PS4-200 esetén: TYPE ALARM CHANNEL (CounterAlarm Channel, TimerAlarm Channel, EdgeAlarm Channel) := CounterAlarm Channel ; END TYPE  32     Függvények PS4-300 esetén: TYPE ALARM CHANNEL (* 0 ) (CounterAlarm Channel, TimerAlarm Channel, (* 1 ) EdgeAlarm Channel 1, (* 2 ) EdgeAlarm Channel 2 (* 3 )
) := CounterAlarm Channel ; END TYPE PS416 esetén: TYPE ALARM CHANNEL (CounterAlarm Channel1, (* 0 ) TimerAlarm Channel, (* 1 ) EdgeAlarm Channel 1, (* 2 ) EdgeAlarm Channel 2, (* 3 ) EdgeAlarm Channel 3, (* 4 ) EdgeAlarm Channel 4, (* 5 ) EdgeAlarm Channel 5, (* 6 ) EdgeAlarm Channel 6, (* 7 ) EdgeAlarm Channel 7, (* 8 ) EdgeAlarm Channel 8) (* 9 ) ):= CounterAlarm Channel ; END TYPE Disable Interrupt: A függvény használatával egy lehetséges megszakításkérés letiltásra kerül. Így a főprogrambeli írást, olvasást a megszakítást okozó forrás nem tudja félbeszakítani, azaz az adatok szinkronizálhatók. (Lehetséges megszakításkérő források a CounterAlarm, EdgeAlarm, és a TimerAlarm (PS4-200, PS4-300 esetén), illetve a CAlarm, FAlarm, TAlarm (PS416 esetén).) A függvényt önálló szekvenciaként kell alkalmazni. Lásd a következő alkalmazást PROGRAM D Alarm VAR GLOBAL Intermediate storage: INT ; Edgealarm : EdgeAlarm ; I Routine : AlarmFB ; END VAR LD
ICS PLC Message CALC Edgealarm (EnableDisable := 1, Number := 0, RisingEdge := 0, SetPointValue := 1, Subroutine := I Routine) LD EdgeAlarm Channel Disable Interrupt LD 500 ST Intermediate storage LD EdgeAlarm Channel Enable Interrupt END PROGRAM  (*start figyelés, mert a megszakításkérést (*FB-t csak egyszer kell hívni )  (* EdgeAlarm megszakításk. tiltás *)  (* megszakításkérés engedélyezés )  33     Függvények FUNCTION BLOCK AlarmFB VAR EXTERNAL Intermediate storage: INT ; END VAR LD 30000 ST Intermediate storage END FUNCTION BLOCK Enable Interrupt: A függvény használatával egy korábban letiltott megszakításkérést lehet engedélyezni. (Lehetséges megszakításkérő források a CounterAlarm, EdgeAlarm, és a TimerAlarm (PS4-200, PS4-300 esetén), illetve a CAlarm, FAlarm, TAlarm (PS416 esetén). A függvényt önálló szekvenciaként kell alkalmazni. Példaként lásd az előző alkalmazást  Karakterlánccal kapcsolatos függvények Az alábbi STRING
változókat kezelő függvények csak a PS4-300 és a PS416 vezérlésekre érvényesek. LEN Egy karakterlánc hosszát adja meg INT adattípusban. PROGRAM how long VAR Text: STRING := 'Term'; TextLength : INT; END VAR LD Text LEN ST TextLength END PROGRAM  (* szöveg hossza: 7 )  CONCAT Több karakterláncot fűz egy újabb karakterláncba. PROGRAM n texts VAR Text1 : String := 'ab'; Text2 : STRING := 'cd'; Text3 : STRING := 'ef'; Texts 1 2 3 : STRING; END VAR LD Text1 CONCAT Text2, Text3 ST Texts 1 2 3 END PROGRAM  (* Texts 1 2 3: 'abcdef' )  Másik alkalmazási lehetőség, dátum és idő egy változóba való összefűzése. PROGRAM deadline VAR Date : DATE := D#1997-05-10; Time : TIME OF DAY := T0D#6:35:00.00; Date and Time : DATE AND TIME; END VAR  34     Függvények LD Date CONCAT Time ST Date and Time END PROGRAM  (*dátum és idő: DT#1997-05-10-6:35 )  DELETE A megadott karakterláncban az L pozíciótól kezdve P számú
karaktert letöröl. P és L ANY INT típusúak. H L = 0, vagy P > mint az eredeti bemeneti karakterlánc hossza, akkor a karakterlánc változatlan marad. PROGRAM Delete VAR Text1 : STRING := 'abABCDcd'; Length : UINT := 3; Position : UINT := 5; Text2 : STRING; END VAR LD Text1 DELETE Length, Position ST Text2 END PROGRAM  (* Text2: 'abABd' )  FIND A bemenetként megadott STRING változóban keresi az argumentumban megadott STRING változót. Kimenete INT típusú szám, mely megmutatja a keresett változó helyét. Ha nem találja, akkor a kimenet értéke 0 Ha a változós többször is előfordul a bemenetben, akkor az első előfordulás helyét mutatja a kimenet értéke. PROGRAM find VAR Basic Text : STRING := 'On condition'; Find Text : STRING := 'on'; Position : INT; END VAR LD Basic Text FIND Find Text ST Position (* Position: 5 ) END PROGRAM INSERT A függvény első argumentumaként megadott STRING változót a másodikként, P
változóval (ANY INT) megadott értéktől kezdve beszúrja a bemeneti STRING változóba. Ha a P értéke nagyobb mint a bemeneti STRING változó hossza, akkor a bemeneti változó változatlan marad. PROGRAM insert VAR Text1 : STRING := 'abcd'; Text2 : STRING := 'ABCD'; Position : INT := 2; NewText : STRING; END VAR LD Text1 INSERT Text2, Position ST NewText END PROGRAM  (* NewText: 'abABCDcd' )  35     Függvények LEFT A bemenetként megadott STRING változó bal szélső részét veszi át L (ANY INT) értékben. PROGRAM li text VAR String : STRING := 'Teststring'; CharNo : INT := 4; n left Chars : STRING; END VAR LD String LEFT CharNo ST n left Chars END PROGRAM  (* n left Chars: 'Test' )  MID A bemenetként megadott STRING változóból L számú karaktert metsz ki a P argumentumtól kezdődően. Az L és P a függvény első és második argumentuma, és ANY INT típusúak. PROGRAM parttext VAR String : STRING := 'Test
string'; CharNo : INT := 7; Start : INT := 5; Text Section : STRING; END VAR LD String MID CharNo, Start ST Text Section END PROGRAM  (* Text Section: 'Characters' )  Replace A bemenetként megadott STRING változóba behelyezi az első argumentumként megadott STRING változót a harmadik argumentumként megadott P (ANY INT) pozíciótól kezdődően. Ugyanakkor a P-től kezdve a második argumentumként megadott L (ANY INT) hosszban a bemeneti STRING változó karakterei törlődnek. L = 0 megfelel az INSERT függvénynek. Ha a P nagyobb, mint a bemenetként megadott STRING változó hossza, akkor a függvény a bemeneti STRING értéket adja vissza. PROGRAM replace VAR Old Text : STRING := 'abbCDEe';  Characters : STRING := 'cd'; New Text : STRING; END VAR LD Old Text REPLACE New Characters, 4, 3 (*L=4, P=3) ST New  Text (* New  Text: 'abcde ) END PROGRAM  36     Függvények RIGHT A bemenetként megadott STRING változó jobb szélső
részét veszi át L (ANY INT) értékben. PROGRAM re text VAR String : STRING := 'TestString'; StringNo : INT := 6; n right chars : STRING; END VAR LD String RIGHT StringNo ST n right chars END PROGRAM  (*n right chars: 'String' )  Kiválasztási függvények Az alábbi STRING változókat kezelő függvények csak a PS4-300 és a PS416 vezérlésekre érvényesek. LIMIT Értékkorlátozás LIMIT  *)  *)  MIN  *)  IN  *)  MX  *)  a támogatott adattípusok: ANY BIT, ANY INT, ANY DATE, TIME, STRING(1) Az összes adattípusnak azonosnak kell lenni! MN IN MX  alsó határérték korlátozandó változó felső határérték  Az MN és az MX írják elő a az alsó és felső korlátértéket. Ha az IN-re adott érték a korlátok között van, akkor az IN, ha kisebb, akkor az MN ha nagyobb, akkor az MX jelenik meg a kimeneten. PROGRAM limits VAR max value : INT := 124; min value : INT := 17; MeasVal AT %IW0.0010:INT; Result : INT; END VAR LD min value LIMIT MeasVal,
max value ST Result END PROGRAM  (*IW0.0010  mostani értéke: 135 *)  (* Result: 124 )  37     Függvények MAX MIN  *) IN1 INn  Maximum, (minimum) kiválasztás MAX (MIN) *)  IN1  *)  IN2  .  .  *)  INn  *)  a támogatott adattípusok: ANY BIT, ANY INT, ANY DATE, TIME, STRING Az összes adattípusnak azonosnak kell lenni! bemeneti értékek, melyekből a legnagyobb kerül kiválasztásra   Az MAX függvény a bemenetek közül a legnagyobbat, a MIN függvény a legkisebbet adja vissza. A STRING adattípusok közül a leghosszabb/legkisebb karakterlánc kerül kiválasztásra. Ha azonos hosszúakat talál a függvény, akkor az először nagyobb/kisebb értékű karakterrel rendelkező kerül kiválasztásra. PROGRAM minimum VAR Value1 : SINT := 155; Value2 : SINT := -24; Value3 : SINT := -3; Value4 : SINT := 5; Lowest : SINT; END VAR LD Value1 MIN Value2, Value3, Value4 ST Lowest END PROGRAM MUX  (*Lowest: -24 )  Multiplexer MUX ANY INT  *)  38  K  *)  IN0  *)  IN1  .  .  *)  IN6  *)
 a támogatott adattípusok: ANY BIT, ANY INT, ANY DATE, TIME, STRING Az IN0IN6 adattípusnak azonosnak kell lenni!     Függvények K  IN0 IN6  Kiválasztó operandus. Az operandus értéke adja meg, hogy melyik bemenetet kell a függvény értékeként visszaadni. Érvényes értékek, K = 06, ha Kennél nagyobb, akkor a legnagyobb érvényes értéket választja ki. max. 7 bemeneti érték, melyekből a legnagyobb kerül kiválasztásra   Példaprogram: két bemeneti érték közüli választás PROGRAM select VAR IN No : USINT := 2; Numb0 : INT := 15; Numb1 : INT := -123; Numb2 : INT := 1; SelectedNo : INT; MUX a, b, c, d, e, f, g, h, i, j, K : BYTE; result : BYTE; END VAR LD IN Nr MUX Numb0, Numb1, Numb2 ST SelectedNo (* SelectedNo: 1 ) END PROGRAM SEL  feltételes operandus kiválasztás SEL BOOL  *) G IN0 IN1  G  *)  IN0  *)  IN1  *)  a támogatott adattípusok: ANY BIT, ANY INT, ANY DATE, TIME, STRING Az IN1, IN2 adattípusnak azonosnak kell lenni! kiválasztási feltétel G =
0 estén kiválasztandó operandus G = 1 estén kiválasztandó operandus PROGRAM select VAR Text1 : STRING := 'ABC'; Text2 : STRING := 'abc'; SelectorSwitch AT %I0.0003 : BOOL; Selected : STRING; END VAR LD SelectorSwitch SEL Text1, Text2 ST Selected (* a változó tartalmát az I0.0003 határozza meg *) END PROGRAM  39     Funkcióblokkok 6.  Funkcióblokkok  A Sucosoft S40 a funkcióblokkok nagy választékát nyújtja a programozás részfeladatainak megkönnyítésére. Az IEC 1131-3 által definiált funkcióblokkokon kívül a Moeller Electric a PLC-khez további gyártó specifikus funkcióblokkokat is készített, melyek kihasználják a PLC egyedi adottságait. Ezek használata tovább könnyítheti az egyes felhasználói alkalmazások elkészítését. Az alábbiakban csoportosítva felsoroljuk a fontosabb funkcióblokkokat:  A.  Időzítők  MS TimeFalling  elejtésre késleltetett időzítő (milliszekundumos megadással). 95  MS TimeRising 
meghúzásra késleltetett időzítő (milliszekundumos megadással). 97  S TimeFalling  elejtésre késleltetett időzítő (szekundumos megadással) . 109  S TimeRising  meghúzásra késleltetett időzítő (szekundumos megadással) . 111  TimeGenerator  ütemadó impulzusgenerátor . 143  TimePulse  impulzusképző. 145  B.  Számlálók és összehasonlítások  16Bit Compare  16 bites összehasonlítások. 45   16bitCounter  16-bites előre- / hátraszámláló . 46  C.  Dátum, idő műveletek  GetRealTimeClock valós idejű óra kiolvasása. 89 RealTimeClock  valós idejű óra összehasonlítása egyedi bemeneti adatokkal . 104  RTC  valós idejű óra állítása. 108  SetRealTimeClock valós idejű óra állítása. 128 DATconcat  dátum és idő (DATE AND TIME) típusú változó összeállítása egyedi UINT típusú adatokból . 68  DATsplit  dátum és idő (DATE AND TIME) típusú változó szétválasztása egyedi UINT típusú adatokra . 72  DateConcat  dátum (DATE)
típusú változó összeállítása egyedi UINT típusú adatokból . 70  DateSplit  dátum (DATE) típusú változó szétválasztása egyedi UINT típusú adatokra . 71  TimeConcat  idő (TIME) típusú változó összeállítása egyedi UINT típusú adatokból . 141  TimeSplit  idő (TIME) típusú változó szétválasztása egyedi UINT típusú adatokra . 150  TODconcat  napi idő (TOD) típusú változó összeállítása egyedi UINT típusú adatokból . 152  40     Funkcióblokkok TODsplit  D.  napi idő (TOD) típusú változó szétválasztása egyedi UINT típusú adatokra . 153  Regiszter műveletek  SR x  bites léptető regiszter. 130  SRB x  bájtos lépető regiszter. 133  SRW x  szavas lépető regiszter. 136  LifoBx  8-bites veremtár regiszter . 90  LifoWx  16-bites veremtár regiszter . 92  FifoBx  8-bites csőtár regiszter. 83  FifoWx  16-bites csőtár regiszter. 86  E.  Kódkonvertálások   16BitBinaryToBCD 16-bit bináris kódolású szám ->
decimálissá alakítása . 43 BCDTo16BitBinary decimális kódolású szám -> 16-bit binárissá alakítása . 49  F.  Tömb/adatblokk műveletek  CompareArray  adatblokkok összehasonlítása, adott adat keresése a blokkban. 58  TransferArray  adatblokk másolása, inicializálása . 154  Serialize  tetszőleges adatstruktúra bájtos tömbbe való másolása . 125  Deserialize  tömbből tetszőleges formátumú adatok kiválasztása . 77  BlockCompare  adatblokkok összehasonlítása, adott adat keresése a blokkban (címváltozók alkalmazásával) . 50  BlockTransfer  adatblokk másolása, inicializálása (címváltozók alkalmazásával). 55  G.  String feldolgozás  ADRtoSTR  vett adatbájtok STRING típusú változóvá alakítása (címváltozókkal) . 48  STRtoADR  STRING típusú változó adott címterületre másolása (címváltozókkal) . 139  COMtoSTR  vett adatbájtok STRING típusú változóvá alakítása (tömbváltozókkal). 62  STRtoCOM  STRING típusú
változó adott címterületre másolása (tömbváltozókkal) . 140  H.  Kommunikáció  SCO  transzparens soros vonali kommunikáció . 115  DE4netK  DF4 frekvenciaváltók kommunikációs modulja . 74  MI4netK  MI4 kijelzők kommunikációs modulja . 94  I.  Memóriakártya írás, olvasás  ReadMC  adatok olvasása a flash-memóriából . 99  WriteMC  adatok írása a flash-memóriába. 156  ReloadData  adatok olvasása a flash-memóriából (címváltozók alkalmazásával) . 102  SaveData  adatok írása a flash-memóriába (címváltozók alkalmazásával). 113  41     Funkcióblokkok J.  Megszakítás kezelések  CounterAlarm  számláló megszakításkezelés . 64  EdgeAlarm  változásfigyelés megszakításkezelés. 79  TimerAlarm  időzítéses megszakításkezelés. 147  42      16BitBinaryToBCD  16BitBinaryToBCD  16-bit bináris kódolású szám -> decimálissá alakítása  16BitBinaryToBCD BinaryValue  INT  Signed  BOOL  DecimalHigh  UINT  DecimalLow  UINT  Az
operandusok jelentése: BinaryValue  a binárisan kódolt bemeneti érték  Signed  a BCD szám előjele, (0 = pozitív, 1 = negatív)  DecimalHigh  a BCD szám 5. dekádja  DecimalLow  a BCD szám 1.- 4 dekádjai  Leírás: 16 bites binárisan kódolt számot átalakít 5 dekás hosszúságú BCD számmá. Az előjel a Signed kimeneten jelenik meg. ( 0 ⇒ + , 1 ⇒ - ) 4. dekád  3. dekád  2. dekád  1. dekád  DecimalLow 5. dekád DecimalHigh bináris szám  BCD  Signed  DecimalHigh  DecimalLow  0000  0  0  0  0  0  0  0  0  0  0  0001  1  0  0  0  0  0  0  0  0  1  .  .  7FFF  32767  0  0  0  0  3  2  7  6  7  8000  -32768  1  0  0  0  3  2  7  6  8  8001  -32767  1  0  0  0  3  2  7  6  7  0  0  0  0  0  0  0  1  . FFFF  . -1  1  43      16BitBinaryToBCD Példaprogram: PROGRAM du16 bcd VAR Converter1 :  16BitBinaryToBCD; BinaryNumb : INT; Sign : BOOL; HighNumber : UINT; LowNumbers : UINT; END VAR CAL Converter1(BinaryValue := BinaryNumb) LD Converter1.Signed ST Sign LD
Converter1.DecimalHigh ST HighNumber LD Converter1.DecimalLow ST LowNumbers END PROGRAM  44      16Bit Compare  16Bit Compare  16Bit Compare INT  InputValue1  Greater  BOOL  INT  InputValue2  Equal  BOOL  Less  BOOL  Az operandusok jelentése: InputValue1  első összehasonlítandó szám  InputValue2  második összehasonlítandó szám  Greater  eredmény: első szám nagyobb  Equal  eredmény: a két szám egyenlő  Less  eredmény: első szám kisebb  Leírás: A funkcióblokk a két bemeneti szám értékét hasonlítja össze. Az eredméyn három biten jelenik meg. Less  Equal  Greater  InputValue1 < InputValue2  1  0  0  InputValue1 = InputValue2  0  1  0  InputValue1 > InputValue2  0  0  1  Példaprogram: PROGRAM length VAR Compare length :  16Bit Compare; Length1 : INT := 10; Length2 : INT := 10; L1 equal L2 : BOOL; END VAR CAL Compare length(InputValue1 := Length1, InputValue2 := Length2) LD Compare length.Equal ST L1 equal L2 END PROGRAM  45      16BitCounter 
16BitCounter  16-bites előre- /hátraszámláló  16BitCounter  BOOL  Forward  Zero  BOOL  BOOL  Backward  OutputValue  UINT  BOOL  Set  BOOL  ReSet  UINT  InputValue  Az operandusok jelentése: Forward  Előreszámlálás, felfutó él  Backward  Visszaszámlálás, felfutó él  Set  Érték beírás, felfutó él  ReSet  Visszaállítás, törlés.  InputValue  Beírandó érték  Zero  Jelzés: számláló állapota=0  OutputValue  Számláló aktuális értéke  Leírás: A funkcióblokk impulzusok előre- / hátraszámlálására szolgál. A Forward bemenetre jutó felfutó él eggyel növeli, a Backward bemenetre jutó felfutó él eggyel csökkenti a számláló tartalmát. A számláló aktuális értéke az OutputValue kimeneten leolvasható. A Set bemenetre adott felfutó éllel lehet az InputValue értékét a számlálónak átadni. A ReSet bemenetre adott 1-el a számláló tartalma törölhető, tartós 1-el pedig a számláló letiltásra kerül. A számláló
értelmezési tartománya: 0.65535 A számok gyűrűszerűen körbefutják a tartományt. Ha számláló nem remanensként van deklarálva, akkor minden kezdéskor 0 értéket vesz fel, és így a Zero kimenet 1-t vesz fel. Remanens deklarálás esetén a számláló megtartja eredeti értékét. Megjegyzés! A pulzusok hosszának és a pulzusok közti szünetidőnek legalább egy-egy ciklusidőnél hosszabbnak kell lennie, hogy a számláló minden számlálandó pulzust figyelembe 1 vegyen. a maximális számlálási frekvencia: F = 2 * TCiklusidő  46      16BitCounter Példaprogram: PROGRAM parts 16 VAR RETAIN Count parts :  16BitCounter; END VAR VAR Light barrier AT %I0.0000 : BOOL; Quantity UINT; Clear : AT %I0.0001 : BOOL; END VAR CAL Count parts(Forward := Light barrier, ReSet := Clear) LD Count parts.OutputValue ST Quantity END PROGRAM  47     ADRtoSTR ADRtoSTR  vett adatbájtok STRING típusú változóvá alakítása ADRtoSTR TextSring  ANY STRING BOOL  Enable  UINT  StrLen 
TextSring  ReceiveVariable  ADDRESS Az operandusok jelentése: Enable  Az átalakítási folyamat engedélyezése  StrLen  Az átalakítandó jelek száma  ReceiveVariable  A memóriaterület kezdőcíme, ahol az adatok találhatók  TextSring  Karakterlánc, mely a memóriaterület adataiból létrejött.  Leírás: A soros vonalon vett és az adott memóriaterületen elhelyezett adatokat a funkcióblokk átalakítja egy STRING típusú változóvá. Az Enable bemenetre adott 1es szinttel indítható az átalakítási művelet Az StrLen bemenetre adott számmal lehet az átalakítandó karakterek számát, azaz az eredményül kapott STRING változó hosszát megadni. Amennyiben a deklarálás során a STRING változó karakterhossza rövidebb a vételi tömbben elhelyezett adatok számánál, akkor csak a STRING változóban definiált hosszúságú adatok kerülnek beolvasásra. Példaprogram: PROGRAM Str Gen VAR Marker to String : ADRtoSTR; ReceiveText : STRING(4) :=
´'HALT'; StartAddress AT %MB0.00100 : ARRAY[120] OF BYTE; ReceiveLength : UINT := 4; END VAR CAL Marker to String(Enable := 1, StrLen := ReceiveLength, ReceiveVariable := &StartAddress, TextString := ReceiveText) (* A karaterláncot a %MB0.00100-től kezdődő adatokkal tölti fel! *) END PROGRAM  48     BCDTo16BitBinary BCDTo16BitBinary  Decimális kódolású szám -> 16-bit binárissá alakítása BCDTo16BitBinary  BOOL  Signed  BinaryValue  UINT  DecimalValue  INT  Az operandusok jelentése: Signed  a BCD szám előjele, (0 = pozitív, 1 = negatív)  DecimalValue  a BCD szám (4 dekádban)  BinaryValue  a binárisan kódolt kimeneti érték  Leírás: 4 dekádos binárisan kódolt előjeles decimális számot átalakít előjeles bináris számmá. dekás hosszúságú BCD számmá Értéktartomány: -9999+9999 A konvertálandó 4 dekádos BCD számok: +11, +9999, -1311, -9999. Signed  DecimalValue  BinaryValue (hexadecimális)  BinaryValue (előjeles, decimális)
 0  0  0  1  1  B  11  0  9  9  9  9  270F  9999  1  1  2  1  1  FAE1  -1311  1  9  9  9  9  DBF1  -9999  Példaprogram: PROGRAM bcd du16 VAR Converter3 : BCDTo16BitBinary; DecimalNumber : UINT := 13; Sign : BOOL := 0; BinaryNumber : INT; END VAR CAL Converter3(Signed := Sign, DecimalValue := DecimalNumber) LD Converter3.BinaryValue ST BinaryNumber END PROGRAM  49     Blockcompare BlockCompare  adatblokkok összehasonlítása, adott adat keresése a blokkban (címváltozók alkalmazásával) BlockCompare Mode  Greater  BOOL  ADDRESS  SourceAddress  Equal  BOOL  ADDRESS  DestinationAddress  Less  BOOL  ElementNumber  Output  USINT  Error  USINT  BOOL  USINT  Az operandusok jelentése: Mode  üzemmód: (0 = adatkeresés, 1 = blokk összehasonlítás)  SourceAddress  a forrástartomány kezdőcíme  DestinationAddress céltartomány kezdőcíme ElementNumber  másolandó elemek száma  Greater  összehasonlítás eredménye nagyobb jelzés  Equal  összehasonlítás eredménye azonos
jelzés  Less  összehasonlítás eredménye kisebb jelzés  Output  pozíció megadása, hol van az első eltérés, vagy a keresett adat helye  Error  hibajelzés  Leírás: A funkcióblokknak kétféle üzemmódja van (adat keresés, és adatterületek összehasonlítása), Az üzemmód választás a Mode bemenetre adott értékkel történhet. Új fejlesztések esetén a BlockCompare helyett a CompareArray funkcióblokkot ajánlott alkalmazni! Keresési üzemmód A keresés üzemmód egy adatterületen elhelyezkedő egyedi érték megkeresésére szolgál. A keresendő adatot a SourceAddress bemeneten megadott című változó tartalmazza. Az ellenőrizendő tartomány kezdőcímét a DestinationAddress bemeneten levő változó, a tartomány nagyságát az ElementNumber bemenet adja meg. (A változócímeket a címváltozó elé írt & címoperátor jelzi Ha a megadott helytől kezdve (DestinationAddress) átvizsgálva, a kijelölt területen belül (ElementNumber) a
funkcióblokk megtalálja a keresett adatot (SourceAddress),  50     BlockCompare akkor a megtalált adat helyzete az Output kimeneten megjelenik, és az Equal kimenet magasba ( =1 ) kerül. A kimenetek állapota, amikor az értéket megtalálta az alábbi: Output = 0 . (ElementNumber - 1)  Equal = 1; Less = Greater = 0  Ha a megadott értéket nem találja meg a kijelölt területen, akkor az Output kimenet egyenlő az ElementNunber változóval, az Equal kimenet = 0 lesz, a Less és a Greater kimenetek pedig az utolsó adatérték összehasonlításkor felvett értékűket tartják meg. A kimenetek állapota, amikor az értéket nem találta meg, tehát az alábbi: Output = ElementNumber  Equal = 0;  Less =1, Greater = 0 (Less = 0, Greater = 1)  A következő példa a MB23 merker bájtban tárolt "7D" értéket keresi a MB27 és a MB32 által határolt adatterületen Változócímek  Eredmény  Output = 3  változó értékek  %MB0.0023  7D  %MB0.0024  00  %MB0.0025  00 
%MB0.0026  00  %MB0.0027  3D  %MB0.0028  70  %MB0.0029  4D  %MB0.0030  7D  %MB0.0031  7D  %MB0.0032  7D  %MB0.0033  00  %MB0.0034  00  Less = 0 Equal= 1  találatkor abbahagyja a keresési eljárást  Greater = 0 A "7D" értéket a DestinationAddress + (Output értéke) címen találta meg. ( Jelen esetben MB 27 + 3 )  51     Blockcompare Példaprogram: PROGRAM search VAR search fb : BlockCompare; SourceAddress AT %MB0.0023 : BYTE := 16#7D; (* a 23. bájt Marker 7Dhex kezdeti értékkel van inicializálva *) DestinationAddress AT %MB0.0027 : BYTE; Start AT %I0.0000 : BOOL; (* keresés indítása ) Found : USINT; Result greater : BOOL; Result equal : BOOL; Result less : BOOL; END VAR LD Start CALC search fb(Mode := 0, (* keresési üzemmód! ) SourceAddress := &SourceAddress, DestinationAddress := &DestinationAddress, ElementNumber := 6 (* keresési tartomány: 6 bájt ) ) LD search fb.Output ST Found (* találati hely, ahol az első azonosság kiderült ) (* értéke:
"DestinationAddress" + "Output" ) LD search fb.Greater ST Result greater LD search fb.Equal ST Result equal LD search fb.Less ST Result less END PROGRAM Összehasonlítási üzemmód Az adatterület összehasonlítási üzemmód két adatterület tartalmát hasonlítja össze. Az adatterületek kezdeteit a SourceAddress, és a DestinationAddress bemeneteken, az összehasonlítandó terület méretét az ElementNumber bemeneten kell megadni. Ha a két adatterület tartalma azonos, akkor az Output kimeneten az ElementNumber értéke jelenik meg, az Equal kimenet pedig 1-el jelzi az azonosságot. A kimenetek állapota, amikor az adatterületek azonosak az alábbi: Output = ElementNumber;  EQ = 1;  LT = 0;  GT = 0;  Ha a megadott adatterületek nem azonosak, akkor az Output kimenet jelzi az első eltérő adat helyét. Az Equal = 0 jelzi a különbséget, a Less és a Greater kimenetek az eltérő adatértékek összehasonlításkor felvett viszonyt mutatják. A
kimenetek állapota, amikor az adatterületek nem azonosak az alábbi: Output = 0 . (ElementNumber – 1);  52  EQ = 0;  Less =1, Greater = 0 (Less = 0, Greater = 1)     BlockCompare A következő példa a MB23 és MB26 közötti bájtok tartalmát hasonlítja össze az MB30 és a MB 33 közötti bájtok tartalmával. Változócímek  Eredmény  Output = 4  változó értékek  %MB0.0023  7D  %MB0.0024  3B  %MB0.0025  64  %MB0.0026  A6  %MB0.0027  00  %MB0.0028  00  %MB0.0029  00  %MB0.0030  7D  %MB0.0031  3B  %MB0.0032  64  %MB0.0033  A6  %MB0.0034  00  Less = 0  összehasonlítás eredménye  Equal = 1 Greater = 0 A két adatterület azonos (Equal = 1 és az Output = ElementNumber). Példaprogram: PROGRAM compare VAR compare fb : BlockCompare; SourceAddress AT %MB0.0023 : BYTE; DestinationAddress AT %MB0.0030 : BYTE; Start AT %I0.0000 : BOOL ; Discrepancy : USINT; Result greater : BOOL; Result equal : BOOL; Result less : BOOL; END VAR  (* összehasonlítás indítás )  53    
Blockcompare LD Start CALC compare fb(Mode := 1, (* összehasonlítási üzemmód! ) SourceAddress := &SourceAddress, DestinationAddress := &DestinationAddress, ElementNumber := 4) (* összehasonlítandó blokkméret: 4) LD such fb.Output ST Discrepancy LD such fb.Greater ST Result greater LD such fb.Equal ST Result equal LD such fb.Less ST Result less END PROGRAM  54  (*első pozícíó, ahol eltérés volt ) (* DestinationAddress + Output )     BlockTransfer BlockTransfer  adatblokk másolása, inicializálása (címváltozók alkalmazásával) BlockTransfer  BOOL  Mode  ADDRESS  SourceAddress  ADDRESS  DestinationAddress  USINT  ElementNumber  Error  USINT  Az operandusok jelentése: Mode  üzemmód: (0 = inicializálás, 1 = blokk másolás)  SourceAddress  a forrástartomány kezdőcíme  DestinationAddress céltartomány kezdőcíme ElementNumber  másolandó elemek száma  Error  hibajelzés  Leírás: A funkcióblokknak kétféle üzemmódja van (adatok
inicializálása, és adatterület másolása). Az üzemmód választás a Mode bemenetre adott értékkel történhet. Az ElementNumber bemenetre adott szám a az adatblokk nagyságát adja meg bájtban kifejezve. Az Error kimeneten az esetleges hibakód jelenik meg: 0  nincs hiba,  1  az elemek száma (ElementNumber) nulla.  2  érvénytelen forráscím a SourcsAddresse bemeneten  3  érvénytelen céltartomány cím a SourcsAddresse bemeneten  4  a forráscím azonos a céltartomány címével Új fejlesztések esetén a BlockTransfer helyett a TransferArray funkcióblokkot ajánlott alkalmazni!  Másolási üzemmód A másolás üzemmód egy adott adatterületen elhelyezkedő adatmennyiséget visz át egy másik területre. A másolandó tartomány kezdőcímét a SourceAddress bemeneten  55     BlockTransfer megadott című változó tartalmazza. A céltartomány kezdőcímét a DestinationAddress bemeneten levő változó címe, a tartomány nagyságát az ElementNumber bemenet
adja meg. (A változócímeket a címváltozó elé írt & címoperátor jelzi. Példaprogram: A következő példa a MB23-tól az MB26ig terjedő merker bájtban tárolt értéket viszi át az MB30-tól az MB33ig terjedő adatterületre. Változócímek  változó értékek  %MB0.0023  7D  %MB0.0024  3B  %MB0.0025  64  %MB0.0026  A6  %MB0.0027  00  %MB0.0028  00  %MB0.0029  00  %MB0.0030  7D  %MB0.0031  3B  %MB0.0032  64  %MB0.0033  A6  %MB0.0034  00  PROGRAM copy VAR copy fb : BlockTransfer; SourceAddress AT %MB0.0023 : BYTE; DestinationAddress AT %MB0.0030 : BYTE; Start AT %I0.0000 : BOOL; END VAR  (* másolás indítása)  LD Start CALC copy fb(Mode := 1, (* másolás üzemmód! ) SourceAddress := &SourceAddress, DestinationAddress := &DestinationAddress, ElementNumber := 4) (* másolandó elemek száma konstans ) END PROGRAM  56     BlockTransfer Inicializálási üzemmód Az inicializálási üzemmódban egy adott adott értéket ír be egy kijelölt tartomány minden
változójába. A másolandó változó címét a SourceAddress bemeneten megadott című változó tartalmazza. A céltartomány kezdőcímét a DestinationAddress bemeneten levő változó címe, a tartomány nagyságát az ElementNumber bemenet adja meg. (A változócímeket a címváltozó elé írt & címoperátor jelzi. Példaprogram: A következő példa a MB23 merker bájtban tárolt "7D" értéket viszi be a MB27 és a MB32 által határolt adatterületre Változócímek  változó értékek  %MB0.0023  7D  %MB0.0024  00  %MB0.0025  00  %MB0.0026  00  %MB0.0027  7D  %MB0.0028  7D  %MB0.0029  7D  %MB0.0030  7D  %MB0.0031  7D  %MB0.0032  7D  %MB0.0033  00  %MB0.0034  00  PROGRAM init VAR init fb : BlockTransfer; SourceAddress AT %MB0.0023 : BYTE := 16#7D; (* MarkerByte 23 initialised with the data value 7D ) DestinationAddress AT %MB0.0027 : BYTE; Start AT %I0.0000 : BOOL; (* a művelet indítása ) END VAR LD Start CALC init fb(Mode := 0, (* inicializálási
üzemmód! ) SourceAddress := &SourceAddress, DestinationAddress := &DestinationAddress, ElementNumber := 6) (* elemek száma konstans: 6bájt ) END PROGRAM  57     CompareArray CompareArray  adatblokkok összehasonlítása, adott adat keresése a blokkban CompareArray Source  ANY ARRAY  Destination  ANY ARRAY BOOL  Source Destination  Mode  UINT  SourceOffset  Greater  BOOL  UINT  DestinationOffset  Equal  BOOL  UINT  ElementNumber  Less  BOOL  Output  UINT  Error  USINT  Az operandusok jelentése: Mode  üzemmód: (0 = adatkeresés, 1 = blokk összehasonlítás)  Source  a forrástömb  Destination  céltömb  SourceOffset  a forrástömbbön belüli eltolás értéke  DestinationOffset  a céltömbbön belüli eltolás értéke  ElementNumber  másolandó bájtok száma  Greater  összehasonlítás eredménye nagyobb jelzés  Equal  összehasonlítás eredménye azonos jelzés  Less  összehasonlítás eredménye kisebb jelzés  Output  pozíció megadása, hol van az első
eltérés, vagy a keresett adat helye  Error  hibajelzés  Leírás: A funkcióblokknak kétféle üzemmódja van (adat keresés, és adatterületek összehasonlítása), Az üzemmód választás a Mode bemenetre adott értékkel történhet. A forrás és a cél-tömb tetszőleges nagyságú tömb lehet. A tömb típusa ANY INT vagy ANY BIT lehet, kivéve a BOOL (bites) tömböket. Az Error kimenet a következő értékeket veheti fel:  58  0  nincs hiba,  1  az elemek száma (ElementNumber) nulla.  2  A SourceOffset értéke nagyobb, mint a Source tartomány értéke     CompareArray 3  Az elemek száma túllépi a a forrástartomány értékét  4  A DestinationOffset értéke nagyobb, mint a Destination tartomány értéke  5  Az elemek száma túllépi a céltartomány értékét  Keresési üzemmód A keresés üzemmód egy tömben elhelyezkedő egyedi érték megkeresésére szolgál. A keresendő adatot a Source bemeneten megadott tömb a SourceOffset által megadott
változója tartalmazza. Az ellenőrizendő tartomány kezdetét a Destination bemeneten levő tömb és a DestinationOffset változó együttesen adja meg. Az átvizsgálandó blokk hosszát az ElementNumber határozza meg. Ha az átvizsgálás során a funkcióblokk a céltartomány és az elemszám által meghatározott területen a keresett adatot megtalálja, akkor a megtalált adat helyzete az Output kimeneten megjelenik, és az Equal kimenet magasba (=1) kerül. A kimenetek állapota, amikor az értéket megtalálta az alábbi: Output = 0 . (ElementNumber - 1)  Equal = 1; Less = Greater = 0  Ha a megadott értéket nem találja meg a kijelölt területen, akkor az Output kimenet egyenlő az ElementNumber változóval, az Equal kimenet = 0 lesz, a Less és a Greater kimenetek pedig az utolsó adatérték összehasonlításkor felvett értékűket tartják meg. A kimenetek állapota, amikor az értéket nem találta meg, tehát az alábbi: Output = ElementNumber  Equal = 0;  Less
=1, Greater = 0 (Less = 0, Greater = 1)  A következő példa a MB23 merker bájtban tárolt "7D" értéket keresi a MB27 és a MB32 által határolt adatterületen Példaprogram: PROGRAM search VAR search fb : CompareArray; SourceAddress AT %MB0.0023 : ARRAY [11] OF BYTE := [16#7D]; (* Az MB23 7D kezdeti értéket kap ) DestinationAddress AT %MB0.0027 : ARRAY [11] OF BYTE; Start AT %I0.0000 : BOOL; Found : UINT; Result greater : BOOL; Result equal : BOOL; Result less : BOOL; END VAR  59     CompareArray LD Start CALC search fb(Mode := 0, (* keresési üzemmód ) Source := SourceAddress, Destination := DestinationAddress, ElementNumber := 6) (* keresési tartomány hossza: 6 bájt ) LD search fb.Output ST Found  (* keresett érték helye: Destination + Output )  LD search fb.Greater ST Result greater LD search fb.Equal ST Result equal LD search fb.Less ST Result less END PROGRAM Összehasonlítási üzemmód Az adatterület összehasonlítási üzemmód két adatterület
tartalmát hasonlítja össze. Az adatterületek kezdeteit a Source és a SourceOffset, valamint a Destination és a DestinationOffset bemenetek határozzák meg. Az összehasonlítandó terület méretét az ElementNumber bemeneten kell megadni. Ha a két adatterület tartalma azonos, akkor az Output kimeneten az ElementNumber értéke jelenik meg, az Equal kimenet pedig 1-el jelzi az azonosságot. A kimenetek állapota, amikor az adatterületek azonosak az alábbi: Output = ElementNumber;  EQ = 1;  LT = 0;  GT = 0;  Ha a megadott adatterületek nem azonosak, akkor az Output kimenet jelzi az első eltérő adat helyét. Az Equal = 0 jelzi a különbséget, a Less és a Greater kimenetek az eltérő adatértékek összehasonlításkor felvett viszonyt mutatják. A kimenetek állapota, amikor az adatterületek nem azonosak az alábbi: Output = 0 . (ElementNumber – 1); EQ = 0;  Less =1, Greater = 0 (Less = 0, Greater = 1)  A következő példa a MB23 és MB26 közötti bájtok
tartalmát hasonlítja össze az MB30 és a MB 33 közötti bájtok tartalmával. Példaprogram: PROGRAM compare VAR compare fb : CompareArray; SourceAddress AT %MB0.0023 : ARRAY [17] OF BYTE := [16#7D]; DestinationAddress AT %MB0.0030 : ARRAY [17] OF BYTE := [16#7D];  60     CompareArray Start AT %I0.0000 : BOOL; Deviation : USINT; Result greater : BOOL; Result equal : BOOL; Result less : BOOL; END VAR LD Start CALC compare fb(Mode := 1, Source := SourceAddress, Destination := DestinationAddress, ElementNumber := 4) LD compare fb.Output ST Deviation LD compare fb.Greater ST Result greater LD compare fb.Equal ST Result equal LD compare fb.Less ST Result less  (* összehasonlítási mód) (* összehasonlítási tartomány: 4bájt ) (* eltérés helye: Destination" + Output )  END PROGRAM  61     COMtoSTR COMtoSTR  vett adatbájtok STRING típusú változóvá alakítása COMtoSTR ReceiveVariable  ANY ARRAY  TextString  ANY STRING UINT  StrLen  BOOL  Enable  ReceiveVariable
TextString  Az operandusok jelentése: ReceiveVariable  A tömb kezdőcíme, ahol az adatok találhatók  TextSring Karakterlánc, mely a tömb adataiból létrejött. StrLen  Az átalakítandó jelek száma  Enable  Az átalakítási folyamat engedélyezése  Leírás: A soros vonalon vett és az adott tömbterületen elhelyezett adatokat a funkcióblokk átalakítja egy STRING típusú változóvá. Az Enable bemenetre adott 1-es szinttel indítható az átalakítási művelet. Az StrLen bemenetre adott számmal lehet az átalakítandó karakterek számát, azaz az eredményül kapott STRING változó hosszát megadni. Amennyiben a deklarálás során a STRING változó karakterhossza rövidebb a tömbben elhelyezett adatok számánál, akkor csak a STRING változóban definiált hosszúságú adatok kerülnek beolvasásra. Példaprogram: PROGRAM Str Gen VAR EnableReceive AT%I0.0000 : BOOL; Array to String : COMtoSTR; ReceiveText : STRING(20): ReceiveArray : ARRAY[1.20] of Byte;
ReceiveLength: UINT; ReceiveFromSerial : COM ; END VAR (* Vett adatok a soros interfészről ) LD EnableReceive ANDN ReceiveFromSerial.ReceiveActive ST ReceiveFromSerial.ReceiveStrobe  62     COMtoSTR CAL ReceiveFromSerial(Mode := 1; ReceiveStrobe := ; SlotNumber := 0; (*PS4-300 esetén mindig 0 ) ReceiveNumber := 20 ; ReceiveVariable := ReceiveArray; | ReceiveActive := ; ReceivedBytes := ; ReceiveError := ; InterfaceStatus := ; SlotError := ) (* A karakterlánc másolása a tömbbe ) LD EnableReceive ANDN ReceiveFromSerial.ReceiveActive ST Array to String.Enable CAL Array to String(Enable := ; StrLen := ReceiveFromSerial.ReceivedBytes; TextString := ReceiveText, ReceiveVariable := ReceiveArray) END PROGRAM  63     CounterAlarm CounterAlarm  számláló megszakításkezelés CounterAlarm BOOL  EnableDisable  USINT  Error  USINT  Number  CountValue  UINT  UINT  Predivide  CallUpValue  UINT  UINT  SetpointValue  ANY FUNCTION BLOCK  SubRoutine  Az operandusok jelentése: EnableDisable 
Megszakításkérő funkcióblokk engedélyezése / tiltása, felfutó élvez. (engedély=1, tiltás=0)  Number  megszakításkérő csatornaszám (PS4-141/-151/-201/-341 = 0)  Predivide  Számláló előosztója  SetpointValue  Számláló alapjel  SubRoutine  megszakításkérést kiszolgáló funkcióblokk neve  Error  hibajelzés  CountValue  aktuális számlálóérték  CallUpValue  megszakításkérő hívások száma  Leírás: A funkcióblokk az alapkészülék (PS4-150/200/-300) %I0.0000 bemenetéhez van hozzárendelve. Az EnableDisable bemenet engedélyezi a számláló működését. A számláló indul, ha a bemeneten pozitív él váltás (0  1) következik be. A számláló leáll, és törlődik, ha ez a bemenet visszakapcsol (1  0). A CountValue kimeneten a hardverszámláló aktuális értéke látható A Predivide bemenet (értéktartománya: 165535) azt határozza meg, hogy mennyi impulzusnak kell a hardver bemenetre érkezni, hogy a számláló tartalma eggyel
növekedjen. (előosztó funkció) A SetpointValue bemenet (értéktartománya: 165535) határozza meg, hogy a számláló mely értékénél kell a megszakítás, azaz mikor kell a funkcióblokkot felhívni.  64     CounterAlarm A rendszer maximálisan megengedett kiterhelése három tényező együttesétől függ: A Predivide, a SetpointValue értékétől és a rákapcsolt jel frekvenciájától. A nevezett tényezőket úgy kell megválasztani, hogy milliszekundumonként maximálisan két megszakítás lépjen csak fel. Az Error kimenet tartalmazza az esetleges fellépő hibák kódjait: 0 nincs hiba 1 alapjel (SetpointValue) = 0 2 előosztó (Predivide) = 0 3 érvénytelen megszakításkérő csatornaszám (csak a PS4-300 estén) 4 megszakításkérő csatornaszámot már felhasználták (csak a PS4-300 estén) 5 a számláló csatorna nincs fel- / leszámlálóként paraméterezve (csak a PS4-300 estén) A CounUpValue kimenet (értéktartomány: 065535) jelzi, hogy az alapjel
értéket hányszor érte el a számláló, azaz hányszor történhetett megszakítás. Az SubRoutine bemenet biztosítja az eseményvezérelt programvezérlés beillesztését. Ennek érdekében ezen a bemeneten lehet a megszakításkérést kiszolgáló funkcióblokk nevét megadni. Mikor az esemény bekövetkezik (a CounterValue számláló eggyel növekszik) és az alprogram végrehajtódik. Ha erre a bemenetre nincs funkcióblokk kapcsolva, akkor csak a CounterValue számláló tartalma nő, és nincs megszakításkérés kiszolgálás. A megszakításkérést kiszolgáló funkcióblokk nem tartalmazhat sem bemenő, sem kimenő paramétereket. Egy ilyen funkcióblokk csak lokális változókat, vagy csak a főprogramban deklarált globális változókat, mint külső változókat (VAR EXTERNAL) tartalmazhat. Eseményvezérelt program alkalmazásakor az alábbi szempontokat kell figyelembe venni: • Az esemény bekövetkezte a felhasználói program végrehajtását megszakítja,
a regiszterek állapotát elmenti, és a SubRoutine bemeneten megadott címre ugorva végrehajtja az alprogramot. A megszakításkérő funkcióblokk nem szakítható meg egy másik megszakításkérő funkcióblokkal (az összes megszakításkérő funkcióblokknak azonos a prioritása). • A felhasználói program 5ms időtartamra (kb. 1000 utasítássor végrehajtása) korlátozza a megszakításkérő funkcióblokk végrehajtási idejét, mivel a megszakításkérő funkcióblokk működését a rendszerprogram sem tudja (még tápkimaradáskor sem) megszakítani. Ha a végrehajtási idő túllépi ezt a korlátot, akkor a táp kikapcsolásakor EDC hiba keletkezhet. • A megszakításkérő funkcióblokk végrehajtási ideje hozzáadódik a felhasználói program végrehajtási idejéhez, így a ciklusidő ellenőrzésbe is bekerül! • Mivel az eseményvezérelt program futtatásakor korlátozás nélkül elérhetők a globális változók is, a ciklikus felhasználói program
és az eseményvezérelt program által közösen irható /olvasható adatokat reteszelés nélkül nem szabad  65     CounterAlarm felhasználni. Például a ciklikus felhasználói programban és a megszakításkérő funkcióblokkban ugyanabban a bájtban használt bithozzáférést csak a Disable Interrupt és a Enable Interrupt utasításokkal való szinkronizálással szabad korrekten végrehajtani. • A lehető leggyorsabb reagálás érdekében a megszakításkérő funkcióblokkban célszerű a közvetlen periféria hozzáférést használni, melyek az alapkészüléken állnak rendelkezésre (%QP0.000x, %QPB0000) • A megszakításkérő funkcióblokkok az alkalmazói programban elvileg többször is használhatók, de ezt általában kerülni érdemes, mivel a megszakításkérő funkcióblokk típusok ugyanazzal az eseményforrással, és így a programban csak az utoljára érvényesülő funkcióblokk határozza meg feldolgozást. A többszöri felhasználás azt
jelenti, hogy az egyedi funkcióblokk-típus minden egyes alkalmazásához külön-külön adatterületet foglal le. A megszakításkérő funkcióblokkok bemeneteinek értékadása csak a híváskor történő zárójeles értékadással történhet. Közvetlen paraméter hozzárendelés a zárójelen kívül, vagy a hívást követően nem megengedett!  impulzusok  max: 3kHz  %I0.0000 Predivide=5 SetpointValue=1 CountValue  0  1  2  3  4  0  1  2  3  4  0  .  CallUpNumber  0  0  0  0  0  1  1  1  1  1  2  .  0  Ugrás a funkcióblokkra Predivide =65535 SetpointValue =1 CountValue  0  1  2  3  4  .  .  .  .  65535  CallUpNumber  0  0  0  0  0  0  0  0  0  0  .  .  0  1  Ugrás a funkcióblokkra Predivide =3 SetpointValue =2 CountValue  0  1  2  0  1  2  0  1  2  0  1  2  0  1  CallUpNumber  0  0  0  0  0  0  1  1  1  1  1  1  2  2  Ugrás a funkcióblokkra  66     CounterAlarm Példaprogram: PROGRAM calarm VAR CountAlarm : CounterAlarm; Error : USINT; CountValue : UINT; END VAR (*
CounterAlarm funkcióblokk hívása számlálandó impulzusok a %I0.0000 bemeneten *) LD ICS PLC Message CALC CountAlarm(EnableDisable := 1, Number := 0, Predivide := 100, SetpointValue := 1)  (* Első programciklus vizsgálata, ) (* mert a a megszakításkérő FB-t ) (* csak egyszer kell hívni! )  LD CountAlarm.Error ST Error LD CountAlarm.CountValue ST CountValue  (* Mutatja az aktuális értéket )  END PROGRAM  67     DATconcat DATconcat  dátum és idő (DATE AND TIME) típusú változó összeállítása egyedi UINT típusú adatokból DATconcat UINT  MilliSecond  UINT  Second  UINT  Minute  UINT  Hour  UINT  Day  UINT  Month  UINT  Year  OutputDAT Error  DT BOOL  Az operandusok jelentése: MilliSecond  dátum idő változó milliszekundum része  Second  dátum idő változó szekundum része  Minute  dátum idő változó perc része  Hour  dátum idő változó óra része  Day  dátum idő változó nap része  Month  dátum idő változó hónap része  Year  dátum idő
változó év része  OutputDAT  az eredményül kapott dátum idő változó  Error  Hibajelzés  Leírás: A bemenetként UINT formátumban megadott egyedi értékeket a funkcióblokk a DAT AND TIME (DT) formátumú változóvá alakítja. Az egyes bemeneti értékek a nekik megfelelő értéktartományt nem léphetik át. Az év megengedett tartománya 1993.2092 között változhat Amennyiben a megengedett értékeket túllépik, akkor az Error kimeneten jelenik. meg (= 1)  68  hiba     DATconcat Példaprogram: PROGRAM dtgen VAR DateTimeConcatenation : DATconcat; Millisecond : UINT; Second : UINT; Minute : UINT; Hour : UINT; Day : UINT; Month : UINT; Year : UINT; Error : BOOL; Date 1 : DATE AND TIME; END VAR CAL DateTimeConcatenation(MilliSecond := Millisecond, Second := Second, Minute := Minute, Hour := Hour, Day := Day, Month := Month, Year := Year | Date 1 := OutputDAT, Error := Error) END PROGRAM  69     DateConcat DateConcat  dátum (DATE) típusú változó összeállítása
egyedi UINT típusú adatokból DateConcat UINT  Day  UINT  Month  UINT  Year  OutputDate  DATE  Error  BOOL  Az operandusok jelentése: Day  dátum változó nap része  Month  dátum változó hónap része  Year  dátum változó év része  OutputDAT  az eredményül kapott dátum változó  Error  Hibajelzés  Leírás: A bemenetként UINT formátumban megadott egyedi értékeket a funkcióblokk a DATE formátumú változóvá alakítja. Az egyes bemeneti értékek a nekik megfelelő értéktartományt nem léphetik át. Az év megengedett tartománya 1993.2092 között változhat Amennyiben a megengedett értékeket túllépik, akkor az Error kimeneten jelenik. meg (= 1) Példaprogram: PROGRAM dategen VAR Dateconcaten : DateConcat; Datum : Date; Day : UINT; Month : UINT; Year : UINT; Error : BOOL; END VAR CAL Dateconcaten(Day := Day, Month := Month, Year := Year | Datum := OutputDate, Error := Error) END PROGRAM  70  hiba     DateSplit DateSplit  dátum (DATE) típusú változó
szétválasztása egyedi UINT típusú adatokra DateSplit InputDate  DATE  Day  UINT  Month  UINT  Year  UINT  Error  BOOL  Az operandusok jelentése: InputDAT  a bemeneti dátum változó  Day  dátum változó nap része  Month  dátum változó hónap része  Year  dátum változó év része  Error  Hibajelzés  Leírás: A bemenetként DATE formátumban megadott változót a funkcióblokk UINT formátumú egyedi változókká alakítja át. Az év megengedett tartománya 1993.2092 között változhat, amennyiben az évszám a megengedett értékeket túllépi, akkor az Error kimeneten hiba jelenik. meg (= 1). Példaprogram: PROGRAM datetln VAR DateElements: DateSplit; Datum: Date := D#1999-12-24; Day : UINT; Month : UINT; Year : UINT; Error : BOOL; END VAR CAL DateElements (InputDate := Datum | Day := Day, Month := Month, Year := Year, Error := Error) END PROGRAM  71     DATsplit DATsplit  dátum és idő (DATE AND TIME) típusú változó szétválasztása egyedi UINT típusú
adatokra DATsplit InputDAT  DT  MilliSecond  UINT  Second,  UINT  Minute  UINT  Hour  UINT  Day  UINT  Month  UINT  Year  UINT  Error  BOOL  Az operandusok jelentése: InputDAT  a bemeneti DATE AND TIME dátum idő változó  MilliSecond  dátum idő változó milliszekundum része  Second  dátum idő változó szekundum része  Minute  dátum idő változó perc része  Hour  dátum idő változó óra része  Day  dátum idő változó nap része  Month  dátum idő változó hónap része  Year  dátum idő változó év része  Error  Hibajelzés  Leírás: A bemenetként DATE AND TIME (DT) formátumban megadott változót a funkcióblokk UINT formátumú egyedi változókká alakítja át. Az év megengedett tartománya 1993.2092 között változhat, amennyiben az évszám a megengedett értékeket túllépi, akkor az Error kimeneten hiba jelenik. meg (= 1).  72     DATsplit Példaprogram: PROGRAM dtspalt VAR DT Elements : DATsplit; Date 1 : DT := DT#1999-11-20-22:13:2;
Millisecond : UINT; Second : UINT; Minute : UINT; Hour : UINT; Day : UINT; Month : UINT; Year : UINT; Error : BOOL; END VAR CAL DT Elements (InputDAT := Date 1 | Millisecond := MilliSecond, Second := Second, Minute := Minute, Hour := Hour, Day := Day, Month := Month, Year := Year, Error := Error) END PROGRAM  73     DE4netK DE4netK  DF4 frekvenciaváltók kommunikációs modulja DE4netK SendData  SendData  ReadData  ReadData  BOOL  Enable  StatusWord  BOOL  Start  BOOL  Quickstop  BOOL  DCBrake  BOOL  TripReset  BOOL  ParameterSet  BOOL  MotorPotUp  BOOL  MotorPotDown  BOOL  FixedFrequency1  BOOL  FixedFrequency2  BOOL  FixedFrequency3  BOOL  Reversal  BOOL  FreezeRamp  ARRAY [0.11] OF BYTE ARRAY [0.11] OF BYTE  INT  ReferenceFrequency  ActualFrequency  INT  BYTE  Command  EchoCommand  BYTE  UINT  ParameterNumber  EchoParameterNumber  UINT  Busy  BOOL  ReceiveValue  UINT  ReceiveValueOffset  UINT  ErrorCode  USINT  UINT  TransmitValue  UINT  TransmitValueOffset  Az operandusok
jelentése:  74  WORD  SendData  operátorlista a küldő regiszter számára  ReadData  operátorlista a fogadó regiszter számára  Enable  1: frekvenciaváltó engedélyezése 0: frekvenciaváltó tiltása  Start  1: motort az alapjelre felfutatni 0: motort megadott lassulással leállítani  Quickstop  1: motort quick-stop-lassulással leállítani  DCBrake  1: egyenáramú fékezést aktivizálni     DE4netK TripReset  0 -> 1 átmenettel az aktuális hibajel törölhető  ParameterSet  0: 1-es paraméterkészlet aktiválása 1: 2-es paraméterkészlet aktiválása  MotorPotUp  1: motorpoti felfelé funkció aktiválás  MotorPotDown  1: motorpoti lefelé funkció aktiválás  FixedFrequency1  1: 1. fix frekvencia kiválasztás, ha FixedFrequency2 és FixedFrequency3 azonosan 0.  FixedFrequency2  1: 2. fix frekvencia kiválasztás, ha FixedFrequency3 = 0  FixedFrequency3  1: 3. fix frekvencia kiválasztás  Reversal  motor forgásirányváltás  FreezeRamp  0. fordulatszám
felfutás engedélyezés 1. fordulatszám felfutás letiltás  ReferenceFrequency  motorfordulatszám alapjel  Command  parancs végrehajtás, (0: nincs parancs, 1: paraméter olvasás, 2: paraméter írás)  ParameterNumber  az átveendő paraméter száma  TransmitValue  az átveendő paraméter értéke  TransmitValueOffset  a 65535-nél nagyobb paraméterek eltolási értéke  StatusWord  frekvenciaváltó status szava  ActualFrequency  aktuális frekvencia kijelzés  EchoCommand  végrehajtott parancs, (0: nincs parancs, 1: paraméter olvasás, 2: paraméter írás)  EchoParameterNumber a végrehajtott parancs száma Busy  1: a végrehajtás folyamatban jelzés  ReceiveValue  kiolvasott parméter érték  ReceiveValueOffset  a 65535-nél nagyobb kiolvasott paraméterek eltolási értéke  ErrorCode  hibajelzés  Leírás: A DE4netK funkcióblokk képezi az illesztő felületet az alkalmazói PLC program és a frekvenciaváltót a Suconet K buszra illesztő DE4-NET-K modul
között. Miután a PLC és a DF4 között a kapcsolat felépült, minden további programozási ráfordítás nélkül a folyamatadatok folyamatosan olvashatók. A DF4 paramétereit a Suconet K-n keresztül lehet megváltoztatni. A reakcióidő alacsony értéken tartása érdekében a funkcióblokkot a be- illetve a kimenetek aktualizálása érdekében minden ciklusban csak egyszer érdemes meghívni! A funkcióblokk következő be-/kimenetei (folyamatadatok) minden egyes híváskor  75     DE4netK automatikusan íródnak illetve kiolvasásra kerülnek: Bemenetek: Enable, Start, Quickstop, DCBrake, TripReset, ParameterSet, MotorPotUp, MotorPotDown, FixedFrequency1, FixedFrequency2, FixedFrequency3, Reversal, FreezeRamp, ReferenceFrequency, Kimenetek: StatusWord, ActualFrequency A frekvenciaváltó összes további paraméterét a kiválasztott paramétercsatornán keresztül lehet írni, olvasni. A SendData és aReadData operátorokat a mindenkori első adási illetve vételi
adatbájthoz kell hozzárendelni. Az ezt követő további 11bájt automatikusan a tömbbel deklarálásra kerül. A rendelkezésre álló paraméterekről, értelmezési tartományukról a status szóról a frekvenciaváltó kezelési utasítása ad felvilágosítást. Paraméterek olvasása: Az aktuális paraméter számát a ParameterNumber mezőbe beírni., Command = ’1 beállítani. A Busy automatikusan átvált 0 -> 1-re . Várni, amíg a Busy jel visszavált 0-ba. ha ErrorCode = 0, akkor a ReceiveValue és az esetleges ReceiveValueOffset értéket kiolvasni, melyek a kérdéses paraméter értékét adja vissza. ha ErrorCode ≠ 0, akkor ki kell értékelni a hibakód értékét. Command = 0 parancsot kiadni, és majd a indulhat a következő feladat. Paraméterek írása: Az aktuális paraméter számát a ParameterNumber mezőbe beírni, a TransmitValue és a TransmitValueOffset mezőkbe a kívánt paraméter értékét beírni. Command = ’2 beállítani. A Busy
automatikusan átvált 0 -> 1-re . Várni, amíg a Busy jel visszavált 0-ba. ha ErrorCode = 0, a parancs helyesen végrehajtásra került. ha ErrorCode ≠ 0, a parancs nem lett végrehajtva, ki kell értékelni a hibakód értékét. Command = 0 parancsot kiadni, és majd a indulhat a következő feladat. A lehetséges hibakódok: 0 nincs hiba 1  érvénytelen szolgáltatás  5  érvénytelen paraméterszám  6  nem megengedett parancsparaméter  10  nincs hozzáférési jogosítvány, illetve írási kísérlet csak olvasható paraméterre  14  határérték túllépés  254 idő túllépés, ha a reakcióidő egy írási/olvasási megbízás esetén > 5sec. 255 egyéb hiba, a megbízás jelenleg nem hajtható végre.  76     Deserialize Deserialize  tömbből tetszőleges formátumú adatok kiválasztása Deserialize  ANY ANY ARRAY UINT  Destination  Destination  Buffer BufferOffset  Buffer DestinationLength  UINT  Error  USINT  Az operandusok jelentése: Destination  cél
változó  Buffer  forrástartomány  BufferOffset  eltolás értéke a céltartományon belül  DestinationLength a célváltozó hossza bájtban megadva Error  hibajelzés  Leírás: A Deserialize funkcióblokk egy tetszőleges típusú változót választ ki elő egy adott forrástartománynak egy megadott helyéről. Az előzetesen megadott helyet a Buffer és a BufferOffset változókkal lehet meghatározni. A DestinationLength kimeneti változó a céladatok hosszát adja meg bájtos méretben. A Buffer tetszőleges méretű tömb lehet, típusa ANY BIT és ANY INT értékű lehet, kivéve a BOOL típust. Az Error kimenet az alábbi értékeket veheti fel: 0  nincs hiba  1  puffer túllépés  2  az Offset a Bufferen kívül helyezkedik el  3  a Destination a Bufferen belül helyezkedik el  4  A DestinationLength értéke 0 A BOOL adattípus, mint forrásváltozó típus nem támogatott, és a fordítás során (Compiler) megfelelő hibajelzés jelentkezik! Nézd még a Serialize
funkcióblokknál megemlítetteket is!  A következő példa 20bájt kimásolása egy 30bájtos tömbből!  77     Deserialize Példaprogram: PROGRAM sendstruct VAR deserie fb : Deserialize; struct buffer AT %RDB1.100 : ARRAY [130] OF BYTE; CheckSumOffset : UINT := 0; CheckSum : UINT; DTOffset : UINT := 2; ReceiveDatum : DT; (* vett adatok ) DataOffset: UINT := 10; ReceiveData :Array [1.20] OF BYTE; (* falhasználói adatok ) DeserializedLength : UINT; Error : USINT; END VAR (* Vett adatok kiválasztása ) CAL deserie fb(Destination := CheckSum, Buffer := struct buffer, BufferOffset := CheckSumOffset, | DeserializedLength := DestinationLength) LD deserie fb.Error USINT TO BOOL JMPC  Fail  (* történt hiba ? ) (* hibakezelés )  CAL deserie fb(Destination := ReceiveDatum, Buffer := struct buffer, BufferOffset := DTOffset, | DeserializedLength := DestinationLength) LD deserie fb.Error USINT TO BOOL JMPC  Fail  (* történt hiba ? ) (* hibakezelés )  CAL deserie fb(Destination :=
ReceiveData, Buffer := struct buffer, BufferOffset := DataOffset, | DeserializedLength := DestinationLength) LD deserie fb.Error USINT TO BOOL JMPC  Fail (* vett adatok kiválasztása befejeződött )  Fail:  78  (* hibakezelés )  (* történt hiba ? ) (* hiba kezelés )     EdgeAlarm EdgeAlarm  változásfigyelés megszakításkezelés EdgeAlarm BOOL  EnableDisable  USINT  Number  UINT  RisingEdge  UINT  SetpointValue  ANY FUNCTION BLOCK  SubRoutine  Error  USINT  CallUpValue  UINT  Az operandusok jelentése: EnableDisable  Megszakításkérő funkcióblokk engedélyezése / tiltása, felfutó élvez. (engedély=1, tiltás=0)  Number  megszakításkérő csatornaszám (PS4-141/-151/-201 = 0, PS4-341MM1 esetén 0 és 1)  RisingEdge  él választás (0 = felfutó, 1 = lefutó)  SetpointValue  Számláló alapjel  SubRoutine  megszakításkérést kiszolgáló funkcióblokk neve  Error  hibajelzés  CallUpValue  megszakításkérő hívások száma  Leírás: A funkcióblokk a
PS4-201-MM1 alapkészülék %I0.0001 bemenetéhez van hozzárendelve. A PS4-141-MM1 és PS4-151-MM1 esetén a hozzárendelés a %I0.0010 bemenethez történik A PS4-341-MM1 két élvezérelt bemenettel (%I0.0010, és %I00011) rendelkezik Az EnableDisable bemenet engedélyezi a számláló működését. A számláló indul, ha a bemeneten pozitív élváltás (0  1) következik be. A számláló leáll, és törlődik, ha ez a bemenet visszakapcsol (1  0). A RisingEdge bemenet adja meg, hogy milyen irányú jelváltozást kell feldolgozni. A SetpointValue bemenet (értéktartománya: 165535) határozza meg, hogy az előosztott számláló mely értékénél kell a megszakítás, azaz mikor kell a funkcióblokkot felhívni. A rendszer maximálisan megengedett kiterhelése két tényező együttesétől függ: A SetpointValue értékétől és a rákapcsolt jel frekvenciájától. A nevezett tényezőket úgy kell megválasztani, hogy milliszekundumonként maximálisan két megszakítás
 79     EdgeAlarm lépjen csak fel. Az Error kimenet tartalmazza az esetleges fellépő hibák kódjait: 0 nincs hiba 1 alapjel (SetpointValue) = 0 3 érvénytelen megszakításkérő 4 megszakításkérő csatornaszámot már felhasználták (csak a PS4-300 estén) A CallUpNumber kimenet (értéktartomány: 065535) jelzi, hogy az alapjel értéket hányszor érte el a számláló, azaz hányszor történhetett megszakítás. Az SubRoutine bemenet biztosítja az eseményvezérelt programvezérlés beillesztését. Ennek érdekében ezen a bemeneten lehet a megszakításkérést kiszolgáló funkcióblokk nevét megadni. Mikor az esemény bekövetkezik (a CounterValue számláló eggyel növekszik) és az alprogram végrehajtódik. Ha erre a bemenetre nincs funkcióblokk kapcsolva, akkor csak a CounterValue számláló tartalma nő, és nincs megszakításkérés kiszolgálás. Eseményvezérelt program alkalmazásakor az alábbi szempontokat kell figyelembe venni: • Az esemény
bekövetkezte a felhasználói program végrehajtását megszakítja, a regiszterek állapotát elmenti, és a SubRoutine bemeneten megadott címre ugorva végrehajtja az alprogramot. A megszakításkérést kiszolgáló funkcióblokk nem tartalmazhat sem bemenő, sem kimenő paramétereket. Egy ilyen funkcióblokk csak lokális változókat, vagy kívül deklarált globális változókat, mint külső változókat (VAR EXTERNAL) tartalmazhat. • A megszakításkérő funkcióblokk nem szakítható meg egy másik megszakításkérő funkcióblokkal (az összes megszakításkérő funkcióblokknak azonos a prioritása). A felhasználói program 5ms időtartamra (kb. 1000 utasítássor végrehajtása) korlátozza a megszakításkérő funkcióblokk végrehajtási idejét, mivel a megszakításkérő funkcióblokk működését a rendszerprogram sem tudja (még tápkimaradáskor sem) megszakítani. Ha a végrehajtási idő túllépi ezt a korlátot, akkor a táp kikapcsolásakor EDC hiba
keletkezhet. • A megszakításkérő funkcióblokk végrehajtási ideje hozzáadódik a felhasználói program végrehajtási idejéhez, így a ciklusidő ellenőrzésbe is bekerül! • Mivel az eseményvezérelt program futtatásakor korlátozás nélkül elérhetők a globális változók is, a ciklikus felhasználói program és az eseményvezérelt program által közösen irható /olvasható adatokat reteszelés nélkül nem szabad felhasználni. Például a ciklikus felhasználói programban és a megszakításkérő funkcióblokkban ugyanabban a bájtban használt bithozzáférést csak a Disable Interrupt és a Enable Interrupt utasításokkal való szinkronizálással szabad korrekten végrehajtani. • A lehető leggyorsabb reagálás érdekében a megszakításkérő funkcióblokkban célszerű a közvetlen periféria hozzáférést használni, melyek az alapkészüléken állnak rendelkezésre (%QP0.000x, %QPB0000) • A megszakításkérő funkcióblokkok az alkalmazói
programban elvileg többször is  80     EdgeAlarm használhatók, de ezt általában kerülni érdemes, mivel a megszakításkérő funkcióblokk típusok ugyanazzal az eseményforrással, és így a programban csak az utoljára érvényesülő funkcióblokk határozza meg feldolgozást. A többszörös alkalmazásnak csak akkor van értelme, ha a funkcióblokkot a kiszolgáló rutinon belül újra kell paraméterezni, és él-figyelési reteszelést kell megoldani. A többszöri felhasználás azt jelenti, hogy az egyedi funkcióblokk-típus minden egyes alkalmazásához külön-külön adatterületet foglal le. A megszakításkérő funkcióblokkok bemeneteinek értékadása csak a híváskor történő zárójeles értékadással történhet. Közvetlen paraméter hozzárendelés a zárójelen kívül, vagy a hívást követően nem megengedett!  RisingEdge=0 SetpointValue=1 CallUpVAlue  0  1  2  3  4  5  6  7  8  9  10  1  1  2  .  Ugrás a funkcióblokkra  RisingEdge =0
SetpointValue =5 CallUpVAlue  0  0  0  0  0  1  1  1  2  2  2  Ugrás a funkcióblokkra  81     EdgeAlarm Példaprogram: PROGRAM alarm VAR Flankenalarm : EdgeAlarm; Error : USINT; CountValue : UINT; Pump : reakt fb;  (*Az FB deklarálása, melyet aktíválni (* kell, ha az alarm fellép )  END VAR (* Ha egy adott szintet a elér a tárolóban a vízszint, akkor alarmot kell kiváltani, és működtetni a szivattyút. A jelfeldolgozás pozitív élre történi. *) LD ICS PLC Message CALC Flankenalarm(EnableDisable := 1, Number := 0, RisingEdge := 0, SetPointValue := 1, SubRoutine := Pump)  (* Első programciklus vizsgálata, ) (* mert a a megszakításkérő FB-t ) (* egyszer kell hívni! )  LD EdgeAlarm.Error ST Error LD EdgeAlarm.CallUpNumber ST CountValue END PROGRAM  82  (* Az alarmok számát jelzi )     FifoBx FifoBx  8-bites csőtár regiszter * BOOL  FillPulse  BOOL  ReadOutPulse  BOOL  ReSet  USINT  DataInput  Full  BOOL  Empty  BOOL  DataOutput  USINT  Az operandusok
jelentése: FillPulse  betöltő impulzus, felfutó él  ReadOutPulse  kiolvasó impulzus, felfutó él  ReSet  visszaállítás, törlés  DataInput  adatbemenet  Full  regiszter tele jelzés  Empty  regiszter üres jelzés  DataOutput  adatkimenet  Leírás: A * helyén az adott prototípus funkcióblokk neve írandó be. A lehetséges nevek a következők: FifoB1, FifoB2, FifoB128, ahol az egyes számok a 8-bites regisztermező hosszát adják meg. A DataInput bemeneten levő érték a FillPulse bemeneten megjelenő felfutó él hatására belép az első legmélyebb szabad regiszter helyre. A regisztert FillPulse impulzussal lehet tölteni, amíg a teljes regiszter tele nem lesz. A regiszter tele állapotát a Full kimenet 1 értékkel jelzi. ReadOutPulse  FillPulse  DataOutput  DataInput  x  7  6  5  4  019  255  035  095  3  2  1  0 014  ReadOutPulse  FillPulse  DataOutput  DataInput  x  7  6  5  4  3  019  255  035  095  014  2  1  0  83     FifoBx A ReadOutPulse bemeneten
megjelenő felfutó él hatására a DataOutput kimeneten megjelenik az először, a legmélyebb szintre beírt érték. Minden további ReadOutPulse impulzus hatására újabb egyre magasabban levő értékek kerülnek kiolvasásra. Az utolsó kiolvasást követően, a regiszter üres állapotát az Empty kimenet 1 értékkel jelzi. ReadOutPulse  FillPulse  DataOutput  DataInput  x  7  6  5  4  019  255  035  095  3  2  1  0 x  ReadOutPulse  FillPulse  DataOutput  DataInput  019  7  6  5  4  255  035  095  014  3  2  1  0  A ReSet bemenetre adott logikai 1 szint törli a teljes regisztermezőt. Példaprogram: PROGRAM fifo8 1 VAR Queue 32 byte : FifoB32; Pulse1 : BOOL; Pulse2 : BOOL; Reset : BOOL; QueueData : USINT; full : BOOL; empty : BOOL; Outputdata : USINT; END VAR CAL Queue 32 byte(FillPulse := Pulse1, ReadOutPulse := Pulse2, ReSet := Reset, DataInput := QueueData)  84  x     FifoBx LD Queue 32 byte.Full ST full LD Queue 32 byte.Empty ST empty LD Queue 32 byte.DataOutput ST
Outputdata END PROGRAM  85     FifoWx FifoWx  16-bites csőtár regiszter * BOOL  FillPulse  BOOL  ReadOutPulse  BOOL  ReSet  UINT  DataInput  Full  BOOL  Empty  BOOL  DataOutput  UINT  Az operandusok jelentése: FillPulse  betöltő impulzus, felfutó él  ReadOutPulse  kiolvasó impulzus, felfutó él  ReSet  visszaállítás, törlés  DataInput  adatbemenet  Full  regiszter tele jelzés  Empty  regiszter üres jelzés  DataOutput  adatkimenet  Leírás: A * helyén az adott prototípus funkcióblokk neve írandó be. A lehetséges nevek a következők: FifoW1, FifoW2, FifoW128, ahol az egyes számok a 16-bites regisztermező hosszát adják meg. A DataInput bemeneten levő érték a FillPulse bemeneten megjelenő felfutó él hatására belép az első legmélyebb szabad regiszter helyre. A regisztert FillPulse impulzussal lehet tölteni, amíg a teljes regiszter tele nem lesz. A regiszter tele állapotát a Full kimenet 1 értékkel jelzi. ReadOutPulse  FillPulse  DataOutput 
DataInput 7  x  5  4  3  2  1  0 13657  00197 02555 18637 00023  ReadOutPulse  FillPulse  DataOutput  DataInput 7  x  86  6  6  5  4  3  00197 02555 18637 00023 03657  2  1  0     FifoWx A ReadOutPulse bemeneten megjelenő felfutó él hatására a DataOutput kimeneten megjelenik az először, a legmélyebb szintre beírt érték. Minden további ReadOutPulse impulzus hatására újabb egyre magasabban levő értékek kerülnek kiolvasásra. Az utolsó kiolvasást követően, a regiszter üres állapotát az Empty kimenet 1 értékkel jelzi. ReadOutPulse  FillPulse  DataOutput  DataInput 7  x  6  5  4  3  2  1  0 x  00197 02555 18637 00023  ReadOutPulse  FillPulse  DataOutput  DataInput 7  00197  6  5  4  3  2  1  0  02555 18637 00023  x  A ReSet bemenetre adott logikai 1 szint törli a teljes regisztermezőt. Példaprogram: PROGRAM fifo16 1 VAR Queue 16 word : FifoW16; Pulse1 : BOOL; Pulse2 : BOOL; Reset : BOOL; QueueData : UINT; full : BOOL; empty : BOOL; Outputdata : UINT; END VAR
CAL Queue 16 word(FillPulse := Pulse1, ReadOutPulse := Pulse2, ReSet := Reset, DataInput := QueueData) LD Queue 16 word.Full ST full LD Queue 16 word.Empty  87     FifoWx ST empty LD Queue 16 word.DataOutput ST Outputdata END PROGRAM  88     GetRealTimeClock GetRealTimeClock  Valós idejű óra kiolvasása GetRealTimeClock Year  USINT  Month  USINT  Day  USINT  Weekday  USINT  Hour  USINT  Minute  USINT  Second  USINT  Az operandusok jelentése: Year  az aktuális évszám, kétjegyűen  Month  hónap  Day  nap  Weekday hétnap sorszáma (0 = vasárnap) Hour  óra  Minute  perc  Second  másodperc  Leírás: A funkcióblokk hívásával a valósidejű órából folyamatosan a kimeneti paraméterekre íródik az aktuális dátum és idő értéke. Nincs szükség külön engedélyező jelre, a hívással egyidejűleg a funkcióblokk biztosítja az értékeket.  89     LifoBx LifoBx  8-bites veremtár regiszter * BOOL  FillPulse  BOOL  ReadOutPulse  BOOL  ReSet  USINT  DataInput  Full 
BOOL  Empty  BOOL  DataOutput  USINT  Az operandusok jelentése: FillPulse  betöltő impulzus, felfutó él  ReadOutPulse  kiolvasó impulzus, felfutó él  ReSet  visszaállítás, törlés  DataInput  adatbemenet  Full  regiszter tele jelzés  Empty  regiszter üres jelzés  DataOutput  adatkimenet  Leírás: A * helyén az adott prototípus funkcióblokk neve írandó be. A lehetséges nevek a következők: LifoB1, LifoB2, LifoB128, ahol az egyes számok a 8-bites regisztermező hosszát adják meg. A DataInput bemeneten levő érték a FillPulse bemeneten megjelenő felfutó él hatására belép az első legmélyebb szabad regiszter helyre. A zsákregisztert FillPulse impulzussal lehet tölteni, amíg a teljes regiszter tele nem lesz. A regiszter tele állapotát a Full kimenet 1 értékkel jelzi. FillPulse  DataInput 0  1  2  3  255  033  025  047  4  5  6  7 062 FillPulse  DataInput  90  0  1  2  3  4  255  033  025  047  062  5  6  7     LifoBx A ReadOutPulse bemeneten
megjelenő felfutó él hatására a DataOutput kimeneten megjelenik az utoljára, a legmagasabb szintre beírt érték. Minden további ReadOutPulse impulzus hatására újabb egyre mélyebben levő értékek kerülnek kiolvasásra. Az utolsó kiolvasást követően, a regiszter üres állapotát az Empty kimenet 1 értékkel jelzi. ReadOutPulse  DataOutput 0  1  2  3  4  255  033  025  047  062  5  6  7  ReadOutPulse  DataOutput 0  1  2  3  255  033  025  047  4  5  6  7 062  A ReSet bemenetre adott logikai 1 szint törli a teljes regisztermezőt. Példaprogram: PROGRAM lifo8 1 VAR Stackregister 64 byte : LifoB64; Pulse1 : BOOL; Pulse2 : BOOL; Reset : BOOL; StackData : USINT; full : BOOL; empty : BOOL; Outputdata : USINT; END VAR CAL Stackregister 64 byte (FillPulse := Pulse1, ReadOutPulse := Pulse2, ReSet := Reset, DataInput := StackData) LD Stackregister 64 byte.Full ST full LD Stackregister 64 byte.Empty ST empty LD Stackregister 64 byte.DataOutput ST Outputdata END PROGRAM  91   
 LifoWx LifoWx  16-bites veremtár regiszter * BOOL  FillPulse  BOOL  ReadOutPulse  BOOL  ReSet  UINT  DataInput  Full  BOOL  Empty  BOOL  DataOutput  UINT  Az operandusok jelentése: FillPulse  betöltő impulzus, felfutó él  ReadOutPulse  kiolvasó impulzus, felfutó él  ReSet  visszaállítás, törlés  DataInput  adatbemenet  Full  regiszter tele jelzés  Empty  regiszter üres jelzés  DataOutput  adatkimenet  Leírás: A * helyén az adott prototípus funkcióblokk neve írandó be. A lehetséges nevek a következők: LifoW1, LifoW2, LifoW128, ahol az egyes számok a 16-bites regisztermező hosszát adják meg. A DataInput bemeneten levő érték a FillPulse bemeneten megjelenő felfutó él hatására belép az első legmélyebb szabad regiszter helyre. A zsákregisztert FillPulse impulzussal lehet tölteni, amíg a teljes regiszter tele nem lesz. A regiszter tele állapotát a Full kimenet 1 értékkel jelzi. FillPulse  DataInput 0  1  2  3  12764  00346  01283  00034  4  5
 6  7 02384 FillPulse  DataInput 0  1  2  3  4  12764  00346  01283  00034  02384  92  5  6  7     LifoWx A ReadOutPulse bemeneten megjelenő felfutó él hatására a DataOutput kimeneten megjelenik az utoljára, a legmagasabb szintre beírt érték. Minden további ReadOutPulse impulzus hatására újabb egyre mélyebben levő értékek kerülnek kiolvasásra. Az utolsó kiolvasást követően, a regiszter üres állapotát az Empty kimenet 1 értékkel jelzi. ReadOutPulse  DataOutput 0  1  2  3  4  12764  00346  01283  00034  02384  5  6  7  ReadOutPulse  DataOutput 0  1  2  3  12764  00346  01283  00034  4  5  6  7 02384  A ReSet bemenetre adott logikai 1 szint törli a teljes regisztermezőt. Példaprogram: PROGRAM lifo16 1 VAR Stackregister 32 word : LifoW32; Pulse1 : BOOL; Pulse2 : BOOL; Reset : BOOL; StackData : UINT; full : BOOL; empty : BOOL; OutputData : UINT; END VAR CAL Stackregister 32 word(FillPulse := Pulse1, ReadOutPulse := Pulse2, ReSet := Reset, DataInput :=
StackData) LD Stackregister 32 word.Full ST full LD Stackregister 32 word.Empty ST empty LD Stackregister 32 word.DataOutput ST OutputData END PROGRAM  93     MI4netK MI4netK  MI4 kijelzők kommunikációs modulja MI4netK RDB Start  ANY ARRAY  SDB Start  ANY ARRAY  Status  BYTE  Az operandusok jelentése: RDB Start  A Suconet K adatátadási terület bemeneti puffer (RDB), pl. ha az MI4-s kijelzőnek az 1-es vonalon az 1-es címe van, és a puffer nagyság 20bájt, akkor: ARRAY [1.20] of BYTE AT %RDB1100  SDB Start  A Suconet K adatátadási terület kimeneti puffer (SDB), pl. ha az MI4-s kijelzőnek az 1-es vonalon az 1-es címe van, és a puffer nagyság 20bájt, akkor: ARRAY [1.20] of BYTE AT %SDB1100  Status  MI4 kommunikációs státusa  Leírás: Az MI4netK a Suconet K hálózaton illeszti az MI4 készülékcsaládot a PLC-hez. A Status a következő információkat és kommunikációs hibajelzéseket adja: 01h PLC küld adatcsomagot az MI4-nek 02h PLC fogad adatcsomagot az
MI4-től 04h nincs adatkérés C0h paraméterezési hiba a bemeneti paraméterekben 80h Az MI4 érvénytelen műveleti kódot küldött / kommunikációs hiba 81h Memóriatartomány túllépés / távirathossz hiba a PLC-merkerek olvasása során. 82h Memóriatartomány túllépés / távirathossz hiba a PLC-merkerek írása során. A funkcióblokk részletes leírása a”Kommunikáció MI4 <->PLC” kézikönyvben található (AWB27-1303).  94     MS TimeFalling MS TimeFalling  Elejtésre késleltetett időzítő (milliszekundumos megadással) MS TimeFalling  BOOL  Set  OutputControl  BOOL  BOOL  ReSet  ElapsedTime  UINT  BOOL  Hold  UINT  PresetTime  Az operandusok jelentése: Set  indítási feltétel, pozitív éllel  ReSet  visszaállítás  Hold  időzítési futás leállítása  PresetTime  Időzítési alapjel milliszekundumban  OutputControl  időzítő kimenete  ElapsedTime  időzítés aktuális ideje  Idődiagramok: (1)  (2)  (3)  (4)  (5)  Set ReSet  Hold TH  TH 
T+TH  T+TH  OutputControl T  T  T  95     MS TimeFalling Leírás: Ha a Set bemenetre felfutó él jut, akkor a kimenet azonnal magasba vált. Ha a Set bemenet alacsonyra vált, a kimenet T idővel később követi. (1) A beállított késleltetési időnek a ciklusidőnél mindig nagyobbnak kell lenni, hogy biztosítva legyen a késleltetés nyomon követése. Az ElapsedTime kimenet a milliszekundumban mutatja a még hátra levő késleltetési időt. A késleltetési idő visszaszámlálása felfüggeszthető a bemenetre adott magas szinttel. A késleltetés megnő azzal az idővel, amíg a Hold bemenet magas, miközben Set bemenet már alacsony. (2), (3) Az OutputControl kimenet csak akkor követi a Set bemenetet a beállított időzítéssel, ha a Hold bemenet alacsony (4), (5). Az időzítő alaphelyzetbe kerül (kimenetei nullák), ha a ReSet bemenetet logikai 1-re kapcsoljuk. Ebben az esetben az időzítés indítása nem lehetséges A Set bemeneten levő pozitív él váltás
csak a ReSet bemenet 1->0 váltása után válik hatásossá. (5) Példaprogram: PROGRAM time4 VAR Timer4 : MS TimeFalling; Start AT %I0.0000 : BOOL; Halt AT %I0.0001 : BOOL; TimeValue4 : UINT := 25; Output4 AT %Q0.0000 : BOOL; END VAR CAL Timer4 (Set := Start, Hold := Halt, PresetTime := TimeValue4) LD Timer4.OutputControl ST Output4 END PROGRAM  96  (* TimeValue4 = 25 milliszekundum )     MS TimeRising MS TimeRising  Meghúzásra késleltetett időzítő (milliszekundum megadással) MS TimeRising  BOOL  Set  OutputControl  BOOL  BOOL  ReSet  ElapsedTime  UINT  BOOL  Hold  UINT  PresetTime  Az operandusok jelentése: Set  indítási feltétel, pozitív éllel  ReSet  visszaállítás  Hold  időzítési futás leállítása  PresetTime  Időzítési alapjel milliszekundumban  OutputControl  időzítő kimenete  ElapsedTime  időzítés aktuális ideje  Idődiagramok: (1)  (2)  (3)  (4)  (5)  Set  ReSet  HOLD TH OutputControl  T  T+TH  T  T  97     MS TimeRising Leírás: Ha a Set
bemenetre felfutó él jut, az OutputControl kimenet T idővel később követi a bemenetet (A T késleltetési dő beállítása a PresetTime bemeneten megadott értékkel történhet.) A Set bemenet lefutó éle a kimeneten azonnal érvényre jut(1) A beállított késleltetési időnek a ciklusidőnél mindig nagyobbnak kell lenni, hogy biztosított legyen a késleltetés követése. Az ElapsedTime kimenet milliszekundumban mutatja a hátra levő késleltetési időt A késleltetési idő visszaszámlálása felfüggeszthető a Hold bemenetre adott magas szinttel. A késleltetés megnő azzal az idővel, amíg a Hold bemenet magas (2) Ha a Hold bemenet magas szinten van, miközben a Set-en pozitív élváltás történik, akkor az indítási folyamat a Hold bemenet 1-es szintű állapotáig késleltetik. (4) Amennyiben a késleltetési idő lefutását követően a vált a Set bemeneten a jel 0-ba, miközben a Hold bemenet 1-ben van, az OutputControl csak akkor vált vissza, ha a
Hold bemenet visszavált 0-ba (3). Az időzítő alaphelyzetbe kerül (kimenetei nullák), ha a ReSet bemenetet logikai 1-re kapcsoljuk. Ebben az esetben az időzítés indítása nem lehetséges A Set bemeneten levő pozitív élváltás csak a ReSet bemenet 1->0 váltása után válik hatásossá. (5) Példaprogram: PROGRAM time3 VAR Timer3 : MS TimeRising; Start AT %I0.0000 : BOOL; Halt AT %I0.0001 : BOOL; Reset AT %I0.0002 : BOOL; TimeValue3: UINT := 7; ActTime3 AT %QW0.002 : BOOL; Output3 AT %Q0.0000 : BOOL; END VAR CAL Timer3 (Set := Start, ReSet := Reset, Hold := Halt, PresetTime := TimeValue3) LD Timer3.OutputControl ST Output3 LD Timer3.ElapsedTime ST ActTime3 END PROGRAM  98  (* TimeValue= 7 Milliseconds )     ReadMC ReadMC  adatok olvasása a flash-memóriából ReadMC  ANY ARRAY  DestinationAddress  BOOL  Strobe  UINT  SegmentNumber  USINT  DataLength  DestinationAddress Active MaxSegmentNumber Error  ANY ARRAY BOOL UINT USINT  Az operandusok jelentése:
DestinationAddress  a céltömb a visszaolvasandó adatok számára  Strobe  visszaolvasási folyamat indítása  SegmentNumber  a szegmens száma (megengedett: 0n)  DataLength  a visszaolvasandó adatbájtok száma  MaxSegmentNumber a fájl utolsó lehetséges szegmensszáma Error  hibajelzés  Leírás: A ReadMC funkcióblokk segítségével a memóriamodulból lehet adatokat a CPU memóriaterületére visszaolvasni. Ez a funkcióblokk a WriteMC blokkal együtt fontos alkalmazási területe a remanens adattárolásnak, receptura-kezelésnek, illetve változók letárolásának egy program aktualizálást megelőzően. A memóriamodult a PLC-be betenni, illetve kivenni csak a PLC feszültségmentes állapotában szabad!  A memóriamodulban az adatok egyenként 128bájt hosszúságú szegmensre vannak felosztva. A szabad adatterület meghatározásához a funkcióblokkot DataLength = 0 értékkel kell meghívni, melynek hatására nem indul be az írási folyamat, ugyanakkor a
MaxSegmentLength visszaadja az utolsó még használható szegmens értékét. A funkcióblokk a programfutással aszinkron módon kerül végrehajtásra, és több programcikluson keresztül is eltarthat. Ezalatt az idő alatt az Active kimenet 1-t ad A hibátlan végrehajtást jelzi az Active kimenet 0-ba történő visszaváltása, miközben az Error kimenet is 0-t ad. Egyszerre több funkcióblokk is lehet egyidejűleg aktív. az operációs rendszer a hívások sorrendjében egymás után hajtja végre az írási műveleteket.  99     ReadMC Az Error kimenet a következő állapotokat veheti fel: 0  nincs hiba  1  nincs memóriamodul beépítve  2  online kapcsolat miatt nem lehetséges a hozzáférés (csak PS4-200 esetén)  3  nem lehetséges a hozzáférés egyidejű WriteMC hívás miatt (csak PS4-200 esetén)  4  érvénytelen SegmentNumber (PS4-200 esetén a megengedett: 0.511; PS4300 esetén a modultól fűggően: 01023)  5  érvénytelen adathossz (megengedett DataLength
érték: 1.128)  6  -  7  nem lehetséges a hozzáférés, mert a memóriamodul , mint forráskód háttér van felhasználva (csak PS4-200 esetén)  8  a memóriamodul formázása nem engedi meg az adattárolási tartomány használatát (csak PS4-300 esetén)  Csak a PS4-200 esetén: Az Active kimenet a PS4-150/-200 esetén mindig 0. A funkcióblokk aktuális állapota csak egy ismételt hívás mellett az Error kimenet lekérdezésével oldható meg. Ha az Error 0-t ad, akkor a művelet hiba nélkül végrehajtódott. Ha a kimenet értéke 3, akkor a funkcióblokk még dolgozik Az Error kimenet aktualizálásához a Strobe bemeneten egy újabb pozitív élet kell generálni. A ReadData funkcióblokk segítségével lehet a letárolt adatokat a memóriamodulból visszaolvasni! Példaprogram: PROGRAM RELOAD VAR StrobeReload AT %I0.0000 :BOOL; ActiveReload AT %Q0.0000 :BOOL; ErrorReload : USINT; FBReloadData : ReadMC; SegmentNumber : UINT; DataLength : USINT; LastSegmentNumber : UINT;
DataArea : ARRAY[0.15] of USINT; END VAR LD 8 ST SegmentNumber LD 16 ST DataLength  100     ReadMC (* 16 bájt olvasása a 8.szegmensből, céltartomány: DataArea nevű tömb *) CAL FBReloadData(Strobe := StrobeReload, SegmentNumber := SegmentNumber, DataLength := DataLength, DestinationAddress := DataArea | ActiveReload := Active, LastSegmentNumber := MaxSegmentNumber, ErrorReload := Error) LD ActiveReload JMPC CONTINUE LD ErrorReload EQ 0 JMPCN ERRORHANDLING (* az adatfeldolgozás folytatása ) JMP CONTINUE ERRORHANDLING: (* hibakezelési rutin ) CONTINUE: (* felhasználói program további része ) END PROGRAM  101     ReloadData ReloadData  adatok olvasása a flash-memóriából (címváltozók alkalmazásával) ReloadData  BOOL ADDRESS  Strobe DestinationAddress  UINT  SegmentNumber  USINT  DataLength  Active  BOOL  MaxSegmentNumber  UINT  Error  USINT  Az operandusok jelentése: Strobe  visszatöltési folyamat indítása  DestinationAddress  visszatöltendő céladatok kezdő
címe (típusa ADDRESS)  SegmentNumber  szegmensszám (0.n)  DataLength  a visszatöltendő adatmezők száma (1.128)  Active  1, ha a visszatöltési folyamat fut  MaxSegmentNumber a fájl utolsó lehetséges szegmensszáma Error  hibajelzés  Leírás: A ReloadData funkcióblokk segítségével a memóriamodulból lehet adatokat a CPU memóriaterületére visszatölteni. A memóriamodul logikailag 512, egyenként 128bájt hosszúságú szegmensre van felosztva. Egyszeri hívással maximum 128bájt olvasható vissza A funkcióblokk egyik legfontosabb alkalmazási területe a remanens memóriaterületnek (pl. a receptura területnek), mely a compiler konfiguráció során a kódgeneráláskor kerül meghatározásra, közbenső letárolása és ezen adatok visszaolvasása egy készülékkonfiguráció megváltoztatása során. Az Error kimenet a következő állapotokat veheti fel:  102  0  nincs hiba  1  nincs memóriamodul beépítve  2  online kapcsolat miatt nem lehetséges a
hozzáférés  3  nem lehetséges a hozzáférés egyidejű SaveData hívás miatt  4  érvénytelen SegmentNumber (megengedett: 0.511)  5  érvénytelen adathossz (megengedett DataLength érték: 1.128)  6  a kezdőcím érvénytelen  7  csak a PS4-200 esetén: nem lehetséges a hozzáférés, mert a memóriamodul , mint forráskód háttér van felhasználva     ReloadData 8  csak a PS4-300 esetén: a memóriamodul formázása nem engedi meg az adattárolási tartomány használatát  Csak a PS4-200 esetén: Az Active kimenet a PS4-150/-200 esetén mindig 0. A funkcióblokk aktuális állapota csak egy ismételt hívás mellett az Error kimenet lekérdezésével oldható meg. Ha az Error 0-t ad, akkor a művelet hiba nélkül végrehajtódott. Ha a kimenet értéke 3, akkor a funkcióblokk még dolgozik Az Error kimenet aktualizálásához a Strobe bemeneten egy újabb pozitív élet kell generálni. A SaveData funkcióblokk segítségével lehet adatokat a memóriamodulra írni!
Példaprogram: PROGRAM R Card VAR ReadData : ReloadData; Start AT %I0.0002 : BOOL; Mem start AT %MB0.00100 : BYTE; Segment NR : UINT; DataLength : USINT; ErrorMessage : USINT; END VAR CAL ReadData(Set := Start, DestinationAddress := &Mem start, SegmentNumber := Segment NR, DataLength := SegmentLength) LD ReadData.Error ST ErrorMessage NE 0 JMPC ErrorEvaluation (*.*)  (* ha nem egyenlő 0, akkor hiba! )  ErrorEvaluation:  (* hiba kiértékelő rutin )  (*.*) END PROGRAM  103     RealTimeClock RealTimeClock  valós idejű óra összehasonlítása egyedi bemeneti adatokkal RealTimeClock Set  Greater  BOOL  TIME OF DAY  RealTime  Equal  BOOL  DAY OF WEEK  WeekDay  Less  BOOL  DATE  RealDate  Error  BOOL  UINT  VariableDate  UINT  VariableTime  BOOL  Az operandusok jelentése: Set  az összehasonlítás engedélyezése  RealTime  a valósidejű órával összehasonlítandó konstans idő (óra, perc), melyet a programozás során lehet megadni, és az a programfutás alatt már nem
változik  WeekDay  a valósidejű órával összehasonlítandó konstans hétnap sorszám, melyet a programozás során lehet megadni, és az a programfutás alatt már nem változik A DAY OF WEEK úgynevezett Moeller adattípus, melynek értelmezése a következő: TYPE DAY OF WEEK: (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday):= Monday; END TYPE  104  RealDate  a valósidejű órával összehasonlítandó konstans dátum (nap, hónap, év), melyet a programozás során lehet megadni, és az a programfutás alatt már nem változik  VariableDate  a valósidejű órával összehasonlítandó változóérték (nap és hónap), ahol a nap a magasabb bájtban, a hónap az alacsonyabb bájtban kerül kódolásra  VariableTime  a valósidejű órával összehasonlítandó változóérték (óra és perc), ahol az óra a magasabb bájtban, a perc az alacsonyabb bájtban     RealTimeClock kerül kódolásra időzítés aktuális ideje Greater  1, ha a megadott
összehasonlítandó érték nagyobb, mint a valósidejű óra értéke  Equal  1, ha a megadott összehasonlítandó érték azonos a valósidejű óra értékével  Less  1, ha a megadott összehasonlítandó érték kisebb, mint a valósidejű óra értéke  Error  1, ha a megadott összehasonlítandó érték érvénytelen  Leírás: A funkcióblokk összehasonlítja a valósidejű óra értékét a megadott bemeneti értékkel. Az összehasonlítás engedélyezése a Set = 1 bemenet állításává történhet Set = 0 esetén az összehasonlítás letiltódik, a kimenetek mindegyike 0-t vesz fel. Az adatok megadására két lehetőség kínálkozik 1. A funkcióblokk hívása RealTime, WeekDay, RealDate bemenetek megadásával Az adatokat programozás során kell megadni. Ezek a konstans értékek programfutatás közben nem változtathatók meg. A funkcióblokk a konstans értékeket csak akkor veszi figyelembe, ha a VariableDate és a VariableTime bemenetek nincsenek
paraméterezve. A paraméterezési példák: RealTime: TOD#20:35:10  WeekDay: -  RealDate: -  RealTime: TOD#20:35:10  WeekDay: Monday  RealDate: -  RealTime: TOD#20:35:10  WeekDay: -  RealDate: D#2000-03-15  Set Less Equal Greater aktív  2. A funkcióblokk hívása VariableDate, VariableTime bemenetek megadásával Ha a VariableDate és / vagy a VariableTime bemeneteken van érvényes érték, akkor a RealTime WeekDay RealDate bemenetek nem aktívak.A beírások szó formátumúak. A beírás megtörténhet a funkcióblokk behívásával, vagy a felhasználói programból.  105     RealTimeClock 15 14 13 12 11 10 9 0 0 0 1 0 0 0 óra 0 0 0 1 0 0 1 nap  8 1  7 0  6 0  5 1  0  0  0  0  4 0  3 2 0 0 perc 0 0 0 hónap  1 1  0 1  17 35 VariableTime  1  1  18 3  VariableDate  1 szó  A változó szóba a szám értelmezési tartományon belül bármely érték beírható, azonban a dátum / idő értelmezési tartományán kívüli érték esetén, például 25 óra, az Error kimenet jelez.
Set 1) VariableDate, VariableTime  V1  V2  Less Equal Greater aktív  aktív  A funkcióblokk kimeneteinek állapota: •  Ha a beállított idő azonos a belső óra értékével, az Equal kimenet 1 percen át logikai 1-el jelzi az azonosságot. Ha beállított érték nagyobb akkor a Greater, ha kisebb a Less kimenet ad logikai 1 jelzést.  •  A jelváltás a "nagyobb, mint" (Greater), és a "kisebb, mint" (Less) között a 24. óra átmenetnél ( 23  0 ) az alábbiak szerint változik: RealTime vagy VariableTime operandusok esetén  minden nap 24 órakor  WeekDay operandus esetén  vasárnap 24 órakor  RealDate vagy VariableDate operandusok esetén  minden hónap végén 24 órakor  VariableDate és VariableTime operandusok esetén  minden év végén 24 órakor  1) Adatcsere a régi = V1, az új = V2 Az új értéket a Set bemeneten történt 0->1 átmenetet követő feldolgozási ciklusban veszi először figyelembe a felhasználói program  106    
RealTimeClock Példaprogram: PROGRAM clock VAR R Time : RealTimeClock; Clock free : BOOL; T Day : TIME OF DAY := TOD#12:00:00; Datum : Date :=D#1999-12-12 ; Midday AT %Q0.0000 : BOOL; END VAR (* idő összehasonlítás ) CAL R Time (Set := Clock free, RealTime := T Day, RealDate :=Datum, WeekDay := Monday) LD R Time.Equal ST Midday END PROGRAM  107     RTC RTC  valós idejű óra állítása RTC BOOL  EN  Q  DATE AND TIME  PDT  CDT  BOOL DATE AND TIME  Az operandusok jelentése: EN  indítási feltétel, pozitív éllel  PDT  beállítandó dátum és idő ( érvényes évszámok: 1993.20092)  Q  CDT-n való idő helyességét jelző bit  CDT  aktuális dátum és idő  Leírás: Az EN-re adott felfutó éllel lehet a PDT-re adott dátum és idő értéket a PLC valós idejű órájába beírni. A beírt érték helyességét a Q jelzi Az aktuális értékeket a CDTn lehet leolvasni, EN-től függetlenül Példaprogram: PROGRAM clock VAR Set Clock : RTC; Set Input AT %I0.0013 : BOOL;
Date and Time: DATE AND TIME := DT#1995-01-01-00:00:00; Clock Set : BOOL; Clock Status : DATE AND TIME; END VAR CAL Set Clock (IN := Set Input, PDT := Date and Time) LD Set Clock.Q ST Clock Set LD Set Clock.CDT ST Clock Status END PROGRAM  108     S TimeFalling S TimeFalling  Elejtésre késleltetett időzítő (szekundumos megadással) S TimeFalling  BOOL  Set  OutputControl  BOOL  BOOL  ReSet  ElapsedTime  UINT  BOOL  Hold  UINT  PresetTime  Az operandusok jelentése: Set  indítási feltétel, pozitív éllel  ReSet  visszaállítás  Hold  időzítési futás leállítása  PresetTime  Időzítési alapjel szekundumban  OutputControl  időzítő kimenete  ElapsedTime  időzítés aktuális ideje  Idődiagramok: (1)  (2)  (3)  (4)  (5)  Set ReSet  Hold TH  TH  T+TH  T+TH  OutputControl T  T  T  109     S TimeFalling Leírás: Ha a Set bemenetre felfutó él jut, akkor a kimenet azonnal magasba vált. Ha a Set bemenet alacsonyra vált, a kimenet T idővel később követi. (1) A
beállított késleltetési időnek a ciklusidőnél mindig nagyobbnak kell lenni, hogy biztosítva legyen a késleltetés nyomon követése. Az ElapsedTime kimenet a szekundumban mutatja a még hátra levő késleltetési időt. A késleltetési idő visszaszámlálása felfüggeszthető a bemenetre adott magas szinttel. A késleltetés megnő azzal az idővel, amíg a Hold bemenet magas, miközben Set bemenet már alacsony. (2), (3) Az OutputControl kimenet csak akkor követi a Set bemenetet a beállított időzítéssel, ha a Hold bemenet alacsony (4), (5). Az időzítő alaphelyzetbe kerül (kimenetei nullák), ha a ReSet bemenetet logikai 1-re kapcsoljuk. Ebben az esetben az időzítés indítása nem lehetséges A Set bemeneten levő pozitív él váltás csak a ReSet bemenet 1->0 váltása után válik hatásossá. (5) Példaprogram: PROGRAM time4 VAR Timer2 : S TimeFalling; Start AT %I0.0000 : BOOL; Halt AT %I0.0001 : BOOL; TimeValue2 : UINT := 25; Output2 AT %Q0.0000 :
BOOL; END VAR CAL Timer2 (Set := Start, Hold := Halt, PresetTime := TimeValue2) LD Timer2.OutputControl ST Output2 END PROGRAM  110  (* TimeValue2 = 25 szekundum )     S TimeRising S TimeRising  Meghúzásra késleltetett időzítő (szekundum megadással) S TimeRising  BOOL  Set  OutputControl  BOOL  BOOL  ReSet  ElapsedTime  UINT  BOOL  Hold  UINT  PresetTime  Az operandusok jelentése: Set  indítási feltétel, pozitív éllel  ReSet  visszaállítás  Hold  időzítési futás leállítása  PresetTime  Időzítési alapjel milliszekundumban  OutputControl  időzítő kimenete  ElapsedTime  időzítés aktuális ideje  Idődiagramok: (1)  (2)  (3)  (4)  (5)  Set  ReSet  HOLD TH OutputControl  T  T+TH  T  T  111     S TimeRising Leírás Ha a Set bemenetre felfutó él jut, az OutputControl kimenet T idővel később követi a bemenetet (A T késleltetési dő beállítása a PresetTime bemeneten megadott értékkel történhet.) A Set bemenet lefutó éle a kimeneten azonnal
érvényre jut(1) A beállított késleltetési időnek a ciklusidőnél mindig nagyobbnak kell lenni, hogy biztosított legyen a késleltetés követése. Az ElapsedTime kimenet másodpercben mutatja a hátra levő késleltetési időt. A késleltetési idő visszaszámlálása felfüggeszthető a Hold bemenetre adott magas szinttel. A késleltetés megnő azzal az idővel, amíg a Hold bemenet magas (2) Ha a Hold bemenet magas szinten van, miközben a Set-en pozitív élváltás történik, akkor az indítási folyamat a Hold bemenet 1-es szintű állapotáig késleltetik. (4) Amennyiben a késleltetési idő lefutását követően a vált a Set bemeneten a jel 0-ba, miközben a Hold bemenet 1-ben van, az OutputControl csak akkor vált vissza, ha a Hold bemenet visszavált 0-ba (3). Az időzítő alaphelyzetbe kerül (kimenetei nullák), ha a ReSet bemenetet logikai 1-re kapcsoljuk. Ebben az esetben az időzítés indítása nem lehetséges A Set bemeneten levő pozitív élváltás
csak a ReSet bemenet 1->0 váltása után válik hatásossá. (5) Példaprogram: PROGRAM time1 VAR Timer1 : S TimeRising; Start AT %I0.0000 : BOOL; Halt AT %I0.0001 : BOOL; TimeValue1 : UINT := 12; Output1 AT %Q0.0000 : BOOL; END VAR CAL Timer1 (Set := Start, Hold := Halt, PresetTime := TimeValue1) LD Timer1.OutputControl ST Output1 END PROGRAM  112  (* TimeValue1 = 12 másodperc )     SaveData SaveData  adatok írása a flash-memóriába (címváltozók alkalmazásával) SaveData BOOL  ADDRESS  Strobe SourceAddress  UINT  SegmentNumber  USINT  DataLength  Active  BOOL  MaxSegmentNumber  UINT  Error  USINT  Az operandusok jelentése: Strobe  letárolandó folyamat indítása  SourceAddress  letárolandó céladatok kezdő címe (típusa ADDRESS)  SegmentNumber  szegmensszám (0.n)  DataLength  a letárolandó adatmezők száma (1.128)  Active  1, ha a letárolási folyamat fut  MaxSegmentNumber a fájl utolsó lehetséges szegmensszáma Error  hibajelzés  Leírás: A SaveData
funkcióblokk segítségével a memóriamodulba lehet adatokat a CPU memóriaterületéről letárolni. A memóriamodul logikailag 512, egyenként 128bájt hosszúságú szegmensre van felosztva. Egyszeri hívással maximum 128bájt olvasható vissza A funkcióblokk egyik legfontosabb alkalmazási területe a remanens memóriaterületnek (pl. a receptura területnek), mely a compiler konfiguráció során a kódgeneráláskor kerül meghatározásra, közbenső letárolása és ezen adatok visszaolvasása egy készülékkonfiguráció megváltoztatása során. Az Error kimenet a következő állapotokat veheti fel: 0  nincs hiba  1  nincs memóriamodul beépítve  2  online kapcsolat miatt nem lehetséges a hozzáférés  3  nem lehetséges a hozzáférés egyidejű ReloadData hívás miatt  4  érvénytelen SegmentNumber (PS4-200 esetén a megengedett: 0.511; PS4300 esetén a modultól függően: 01023)  5  érvénytelen adathossz (megengedett DataLength érték: 1.128)  6  a
kezdőcím érvénytelen  7  csak a PS4-200 esetén: nem lehetséges a hozzáférés, mert a memóriamodul , mint forráskód háttér van felhasználva  113     SaveData 8  csak a PS4-300 esetén: a memóriamodul formázása nem engedi meg az adattárolási tartomány használatát  Csak a PS4-200 esetén: Az Active kimenet a PS4-150/-200 esetén mindig 0. A funkcióblokk aktuális állapota csak egy ismételt hívás mellett az Error kimenet lekérdezésével oldható meg. Ha az Error 0-t ad, akkor a művelet hiba nélkül végrehajtódott. Ha a kimenet értéke 3, akkor a funkcióblokk még dolgozik Az Error kimenet aktualizálásához a Strobe bemeneten egy újabb pozitív élet kell generálni. A ReloadData funkcióblokk segítségével lehet a letárolt adatokat a memóriamodulból visszaolvasni! Példaprogram: PROGRAM S Card VAR SendData : SaveData; Start AT %I0.0002 : BOOL; Mem start AT %MB0.00100 : BYTE; Segment NR : UINT; DataLength : USINT; ErrorMessage : USINT; END VAR CAL
SendData(Set := Start, SourceAddress := &Mem start, SegmentNumber := Segment NR, DataLength := SegmentLength) LD SendData.Error ST ErrorMessage NE 0 JMPC ErrorEvaluation (*.*)  (* ha nem egyenlő 0, akkor hiba! )  ErrorEvaluation:  (* hiba kiértékelő rutin )  (*.*) END PROGRAM  114     SCO SCO  transzparens soros vonali kommunikáció A PLC RS 232, vagy RS 485 interfészein keresztül a kommunikációt az SCO funkcióblokk szervezi. A transzparens ( képernyőn, ember-gép készüléken, vagy egyéb terminálon kivetített, megjelenített, vagy kiválasztott ) adatokat lehet küldeni, vagy fogadni ezeken az interfészeken A felhasználói program, és a PLC-hez csatlakoztatott terminál között az interfészt ez a funkcióblokk reprezentálja. • A kommunikáció az RS 232 interfészen keresztül 9600baud adatátviteli sebességgel, 8 adat bit, 1 stop bit, paritás bit nélkül valósul meg. (baud = bit/ sec) • Az RS 485 interfészen történő adatátvitelkor több
paraméter állítása lehetséges. • A paraméterek a Sucosoft S40 "Topológia konfigurátor” menüben állíthatók. • A funkcióblokkal az RS 232 interfészen keresztül 1 bájttól 63 bájtig, az RS 485 interfészen keresztül 1 bájtól 127 bájtig küldhető át adat. • A funkcióblokk vezérli az adatküldés, és fogadás folyamatát, de nem párhuzamosan, minthogy az adatátvitel fél-duplex módon történik. Az adatküldés feladata magasabb prioritású, mint az adatfogadás feladata. • Ha mindkét interfészen váltakozva akarunk adatot küldeni, akkor két SCO funkcióblokk behívása szükséges, egy az RS 232, egy másik az RS 485 interfész számára.  Az interfészekhez célszerű saját funkcióblokkot rendelni!  A funkcióblokk értékőrző (remanens) beállítási lehetősséggel nem rendelkezik. CTS/RTS "handshake" (fogadóoldali összekötetési módszer IEEE 488 szabvány ) nincs. SCO BOOL  Strobe  USINT  Command  USINT  CardAdress 
ADDRESS USINT  MemoryAddress DataSize  Busy  BOOL  ElementNumber  USINT  Error  USINT  115     SCO Az operandusok jelentése: Strobe engedély (pozitív éllel vezérelve) Command  parancs fajtája (14)  CardAddress  interfész választás (0=RS 232,  MemoryAddress  A vételi ill. az adási terület kezdőcíme  DataSize  A vételi ill. az adási terület nagysága  Busy  funkcióblokk állapot  ElementNumber  A vételi ill. adási adatbájtok száma  Error  Hibaüzenetek  1=RS 485)  A funkcióblokk be- /kimenetei A funkcióblokk kimenetei Stobe: Indítás, engedélyezés A bemenet élvezérelt. A felfutó él ( 0  1 ) a "Command" bemeneten korábban megadott érték alapján indítja az elvégzendő feladatot. A funkcióblokk valamennyi, a felfutó élnél aktuális bemeneti paramétere eltárolódik. A BUSY kimenet magas (1) szintje jelzi a funkcióblokk aktív állapotát, azaz a Strobe jel adatküldés feladatot, vagy adatfogadásra kész állapotot kezdeményezett. Az
adatfogadásra kész állapot a Strobe bemenet lefutó élével lezárható. Command: Parancs A Command bemenetre adottt érték állítja be az SCO funkcióblokk üzemmódját. Az üzemmód kiválasztás csak a Strobe bemenet felfutó élénél aktív. Az RS 232 interfészen keresztül 163 közötti adatbájt, az RS 485 interfészen keresztül 1127 közötti adatbájt küldhető. 1. Adás Először az interfész inicializálódik, majd végrehajtásra kerül az adás. 2. Vételkészség a vételi puffer törlésével Először inicializálódik az RS 232 vagy az RS 485 interfész, majd a DataSize-on megadott nagyságú puffer területet kitörli. A fogadott adatbájtok számát az ElementNumber kimenet mutatja. Amennyiben a puffer terület megtelik, a BUSY kimenet 0-ba vált. Egy új él a Strobe bemeneten törli az összes fogadott adatot. 3. Vételkészség a vételi puffer törlése nélkül A 3. üzemmód akkor használható, ha a kapcsolat az 1, vagy 2 üzemmódban már
létrejött, mivel csak ez a két üzemmód kapcsolja át a portot a SUCOM módból (a PLC default kommunikációs protokollja), az SCO funkcióblokkon keresztüli a transzparens módú soros kommunikációra. Az ElementNumber kimenet mutatja a vett adatbájtok számát. A vételi puffer nem törlődik ebben az üzemmódban Ha az előző műveletből maradt még adat a tárban, akkor az új fogadott adatok a tár szabad területére íródnak. Amennyiben a puffer terület megtelik, a BUSY kimenet  116     SCO 0-ba vált. 4. Az SCO funkcióblokkon keresztül a soros kommunikáció kikapcsolása (SUCOM aktiválás) Megjegyzés! Ha az RS 232 interfészen keresztül több, mint 63 adatbájt érkezik, akkor az automatikusan átkapcsol a SUCOM módra. Cardaddress Interfész kiválasztás A Cardaddress bemenet jelöli ki, hogy melyik interfészen történjen a kommunikáció. 0: RS 232 1: RS 485 MemoryAddress Kezdő cím Az adási, illetve a vételi tartomány kezdő címét lehet megadni
ezen a bemeneten. A vett adatok közvetlenül beíródnak a megadott területre. Az %MB, %SDB, %RDB tartományokat bájt méretben kell megadni. DataSize Az adási, és a vételi tartományok mérete Az egyszerre adásra kerülő bájtok számát a DataSize bemeneten kell megadni. Ha a vételi állapot az aktív, akkor a DataSize bemeneten a puffer területmérete definiálható. Az alábbi értékek engedélyezettek: RS 232 interfész: 1. 63 RS 485 interfész: 1127 A funkcióblokk kimenetei BUSY Az SCO funkcióblokk állapota A funkcióblokk visszajelzése: 0: A funkcióblokk inaktív 1: A funkcióblokk aktív Ha egy adási feladat lett indítva, vagy a vételkész állapot lett aktiválva, akkor a funkcióblokk aktív állapotát a BUSY kimenet 1 értéke jelzi. BUSY = 1. Az adás végrehajtása után a BUSY kimenet alacsony szintre kapcsol. BUSY = 0. Ha a vételi puffer teljesen megtelik, a BUSY kimenet szintén nullára vált. BUSY = 0.  117     SCO ElementNumber Az adatbájtok
száma A már elküldött, vagy a vett adatbájtok számát jelzi ez a kimenet. ERR Hiba üzenetek 0: Nincs hiba 1: Helytelen paraméter a Command bemeneten. A helyes értékek 1, , 4 2: Helytelen paraméter a CardAddress bemeneten. A helyes értékek 0, vagy 1 3: Ütközési konfliktus a SUCOM, vagy a Suconet használatakor. Lehetséges hiba okok: RS 232: SUCOM aktív RS 485: Az SCO funkcióblokk paraméterei nincsenek beállítva (topológia konfigurátorban nem lett kiválasztva). 4: A merkercím túl nagy. A felhasznált memóriának a CPU definiált memóriatartományában kell lenni. (Konfigurációs menü: Programcode Generation -> Options -> Compiler -> Aktiv marker range). 5: Helytelen paraméter a DataSize bemeneten. A helyes értékek: RS 232 interfész: 1. 63 RS 485 interfész: 1127 6: Helytelen paraméter a MemoryAddress bemeneten A MemoryAddress és a DataSize kombinációjából adódóan megsértette a definiált CPU merkerterületet. Pl.: Aktív terület: 120;
MemoryAddress (100) + DataSize (40) = 140 => túl nagy! 7: A fogadó puffer túlcsordulása Több mint 63, illetve 127 bájt érkezett. 8: RS 485 paritás hiba Az adó/vételi interfész paraméterei nem egyeznek meg. 9: Az alkalmazói program egyszerre próbált egy adást és egy vételi feladatot elindítani. Az SCO funkcióblokk használatakor az RS 232, és az RS 485 interfészek az alábbi paraméterekkel rendelkeznek: RS 232  118  Adat átviteli sebesség:  9600 baud ( baud = bit/ sec. )  Adatbitek száma:  8  Stop bit:  1  Paritás vizsgálat:  nincs     SCO RS 485 Az RS 485 interfész paramétereit a Sucosoft S40 "Topológia konfigurátor" menüben lehet kiválasztani. Válassza a Topológia konfigurátorban az Edit -> Set Parameters -> Bus status (Transparens modus) ->Interface Parameters A szoftver a nem megengedett kombinációkat felismeri, és lehetetlenné teszi a beállításukat. Példák: Az SCO funkcióblokk alkalmazását két példán
bemutatjuk be. Adatforgalom (kommunikáció) PLC és nyomtató között soros vonalon. Az RS 485, vagy az RS 232 interfészen keresztül a PLC adatot küld a nyomtatónak. Készülék csatlakozások. Programozó készülék  PLC  Nyomtató  RS485 A példa kipróbálásához szükséges hardver: PLC (pl. PS4-201-MM1 a 04 verziószámtól ) Digitális szimulátor Nyomtató soros vonallal (pl. IPP 144-40E, Metrix) RS 485 / RS 232 nyomtató kábel A példa kipróbálásához szükséges szoftver: Sucosoft S40 a 2.0 verziótól A nyomtató kábel láb ( pin ) kiosztása PLC ( RS-485 )  IPP 144-40E  5 pólusú kerek apa  9 pólusú SUB-D apa  1  Adatkábel ( T / RB )  2  3  0V  1  4  Adatkábel ( TA / RA )  5  PLC ( RS-232 )  IPP 144-40E  9 pólusú kerek apa  9 pólusú SUB-D apa  3  0V  5  5  Tx D  2  119     SCO A példa kipróbálásához szükséges interfészek Az RS-485 paraméterei a Sucosoft S40 "Topológia konfigurátor" menüben állíthatók. A nyomtató interfész
paramétereinek beállítása megtalálható a nyomtató gépkönyvében, amely tájékoztat az igényelt speciális karakterekről is. Példaprogram: A PLC a "Sendchar" program felhasználásával küld adatot a nyomtatónak. A " 'Machine 1 ready to start " szöveg küldendő a PLC-től a soros nyomtatóra. A karakterek a STRING változóban vannak letárolva, és a "STRtoCOM" funkcióblokk készíti elő az SCO funkcióblokkal való küldéshez. A szöveges változó tartalmazza a soremelés vezérlő karaktert is, azaz 23 karakterig lehet a nyomtatóra adatokat küldeni. A %I0.0007 bemenet választja ki a RS232-es vagy a RS485-as interfészt %I0.0007 = 0  =>  RS232  %I0.0007 = 1  =>  RS485  A %I0.0000 bemenet felfutó éle indítja az adási műveletet Mivel az adás alatt a Busy kimenet 1, azaz a %Q0.0000 kimenet rövid időre felvillan, a szöveg pedig kinyomtatásra kerül. PROGRAM Sendchar VAR Start AT %I0.0000 : BOOL; Interface AT
%I0.0007 : BOOL; Active AT %Q0.0000 : BOOL; Error AT %Q0.0003 : BOOL; SendText : STRING ; SendBuffer AT %MB0.00100 : BYTE; Convert : STRtoADR; DataVolume : USINT; Send : SCO; END VAR LD 'Machine 1 ready to start$0D'  (* szöveges változó a soremelés (*(0Dh) vezérlő karakterrel ) (* A puffer startcíme ) (* Stringet adott memóriaterületre (* átvivő FB ) (* szöveg hossza )  (* szöveg tárolása (* STRING változóban )  ST SendText (* A szöveges változó átvitele az adott memóriaterületre ) CAL Convert(Enable := 1, TextString := SendText, TransmitVariable := &SendBuffer) LD Convert.StrLen UINT TO USINT ST DataVolume  120  (* formátum adaptálás (* SCO funkcióblokkhoz )  az     SCO (* A szöveg kiküldése a nyomtatóra ) CAL Send(Strobe := Start, Command := 1, CardAddress := (Interface BOOL TO USINT ), MemoryAddress := &SendBuffer, DataSize := DataVolume) LD Send.Busy ST Active LD Send.Error NE 0 ST Error  (* Adás )  (*kimenet status a %Q0.0000*) (*
hibakijelzés )  END PROGRAM Soros vonali adatforgalom (kommunikáció) PLC és terminál között. Készülék csatlakozások. Terminál  PLC  A példa kipróbálásához szükséges hardver: PLC ( pl. PS4-201-MM1 a 04 verziószámtól felfelé) Digitális szimulátor ZB 4-303-KB1 kábel A példa kipróbálásához szükséges szoftver: Sucosoft S40 a 2.0 verziószámtól Terminál emulátor program ( pl.: Telix ) A példa kipróbálásához szükséges interfészek Az RS-232 paraméterei: 9600 baud, 8 adatbit, 1 stop bit, nincs paritás bit. A terminál paraméterei a terminál emulátor programban beállíthatók.  121     SCO Példaprogram: Az adatcsere a vezérlő és a terminál között a COM9600A program segítségével történik. Adási folyamat A szöveg küldését a terminál felé a %I 0.0001 bemeneten megjelenő felfutó él váltja ki A text 1, és a text 2 közötti választás az %I0.0000 értékétől függ: %I0.0000 = 0 : "Start condition 1 fulfilled" (az
indítási feltétel teljesült) %I0.0000 = 1 : "Limit switch 2 activated" (a határoló kapcsoló 2 aktív) Az elküldendő adatok a %MB0.00200 merkerbájttal kezdődő területen találhatók Vétel A %I0.0006 bemenetre adott értékkel lehet a mode 2 vagy a mode 3 üzemmódok között választani. %I0.0006 = 0,  mode 2 -- 2. üzemmód (vétel puffer törléssel együtt)  A DataSize adja meg a vett adatok részére lefoglalt puffer méretét. A %I0.0002 bemenetre tett érték kapcsolja az SCO funkcióblokkot vételi állapotba, és a funkcióblokk BUSY kimenet magas szintje jelzi a funkcióblokk aktív állapotát. A vett adatok közvetlenül beíródnak a funkcióblokk MemoryAddress bemenetén definiált kezdőcímtől (jelen példában %MB0.000400) kezdődő memóriaterületre Az ElementNumber kimenet a már vett adatok számát mutatja. A BUSY kimenet nullába vált, ha a fogadó puffer teljesen betelt (ElementSize = DataSize). Ha a %I00002 bemenet ismét aktív, a
funkcióblokk fogadja az új adatokat. A funkcióblokk ElementNumber kimenetén megjelenő 0 jelzi, hogy a vételi puffer törlődött. %I0.0006 = 1  mode 3 -- 3. üzemmód (vétel puffer törlés nélkül)  Ez a eljárás megegyezik a 2. üzemmód eljárásával Az egyetlen különbség az, hogy a fogadó puffer nem törlődik. Csak annyi adatbájtot képes fogadni, amennyit a fogadó puffer tárolni képes. Ha a fogadó puffer betelt, ebben az üzemmódban további adat nem fogadható mindaddig, amíg nem törli a fogadó puffer területét a 2. üzemmódban Ebben a példában két független funkcióblokk végzi az adás és a vétel műveleteit. A funkcióblokkok egymást kölcsönösen reteszelik, így az egyidejű működés nem lehetséges (half-duplex üzemmód). PROGRAM COM9600A VAR (* Változódeklarálás az adott fizikai be-/kimenetekhez ) TextSelection : BOOL AT %I0.0000; SendJob : BOOL AT %I0.0001; ReceiveJob : BOOL AT %I0.0002; ReceiveMode : BOOL AT %I0.0006;
ReceiveVolume : BYTE AT %QB0.000; SendBuffer : BYTE AT %MB0.00200; ReceiveBuffer : BYTE AT %MB0.00400; (* lokális változók / közbenső belső változók )  122  (* 0 = Text1; 1 = Text2 )     SCO Text1 : STRING; Text2 : STRING := 'Limit switch 2 activated';  (* Text 2 kezdeti értékadással ) (*kap értéket )  ReceiveText : STRING; DataVolume : USINT; Send active : BOOL; Receive2 active : BOOL; Receive3 active : BOOL; Error SD : BYTE; Error RD : BYTE; (* FB-k deklarálása ) SendFB : SCO; ReceiveFB : SCO; SendConverter : STRtoADR ; ReceiveConverter : ADRtoSTR ; END VAR LD 'Start condition 1 fulfilled' ST Text1  (* Text 1 a program során ka értéket )  LD Receive2 active OR Receive3 active JMPC Not send LD TextSelection JMPC Second Text CAL SendConverter(Enable := 1, TextString := Text1, TransmitVariable := &SendBuffer) LD SendConverter.StrLen UINT TO USINT ST DataVolume  (*formátum adaptálás az SCO-hoz ) (* közvetlenül is tárolható: ST
SendFB.DataSize *)  CAL SendFB(Strobe := (SendJob ANDN Receive2 active ANDN Receive3 active ), Command := 1, CardAddress := 0, MemoryAddress := &SendBuffer, DataSize := DataVolume)  (*adás üzemmód ) (*RS232)  LD SendFB.Busy ST Send active  123     SCO Second Text: CAL SendConverter(Enable := 1, TextString := Text2, TransmitVariable := &SendBuffer) LD SendConverter.StrLen UINT TO USINT ST DataVolume  (*formátum adaptálás az SCO-hoz )  CAL SendFB(Strobe := SendJob, Command := 1, CardAddress := 0, MemoryAddress := &SendBuffer, DataSize := DataVolume)  (* adás üzemmód ) (*RS232)  LD SendFB.Busy ST Send active Not send: LD Send active JMPC Not Receive LD ReceiveMode JMPC ReceiveMode 3 CAL ReceiveFB(Strobe := ReceiveJob, Command := 2, CardAddress := 0, MemoryAddress := &ReceiveBuffer, DataSize := 63)  (*RS232)  LD ReceiveFB.Busy ST Receive2 active ReceiveMode 3: CAL ReceiveFB(Strobe := ReceiveJob, Command := 3, CardAddress := 0, MemoryAddress := &ReceiveBuffer,
DataSize := 63) LD ReceiveFB.Busy ST Receive3 active Not Receive: END PROGRAM  124  (*RS232)     Serialize Serialize  tetszőleges adatstruktúra bájtos tömbbe való másolása Serialize ANY  Source  Source  ANY ARRAY  Buffer  Buffer  UINT  BufferOffset  SourceLength  UINT  Error  USINT  Az operandusok jelentése: Source  forrás változó  Buffer  céltartomány  BufferOffset  eltolás értéke a céltartományon belül  SourceLength  a forrásváltozó hossza bájtban megadva  Error  hibajelzés  Leírás: A Serialize funkcióblokk egy tetszőleges típusú változót másol át egy adott céltartományba. Az adott céltartományt a Buffer és a BufferOffset változókkal lehet meghatározni. Az átmásolt akár egymástól is különböző típusú adatok, mint tömb más PLC-be átküldhető, és ott a Deserialize funkcióblokkal ismét kicsomagolható. A SourceLength kimeneti változó a forrásadatok hosszát adja meg bájtos méretben. A Buffer tetszőleges méretű tömb
lehet, típusa ANY BIT és ANY INT értékű lehet, kivéve a BOOL típust. Az Error kimenet az alábbi értékeket veheti fel: 5  nincs hiba  6  puffer túllépés  7  az Offset a Bufferen kívül helyezkedik el  8  a Source a Bufferen belül helyezkedik el  9  A SourceLength értéke 0 A BOOL adattípus, mint forrásváltozó típus nem támogatott, és a fordítás során (Compiler) megfeleő hibajelzés jelentkezik!  A különböző memóriafoglalási technikák miatt a Serialize funkcióblokk minden PLC-típusnál egymástól eltérő eredményeket ad(pl. a struktúrák esete) Ha PLC-k között különböző típusú adatokat kíván cserélni, akkor csak az elemi ANY BIT (kivéve a BOOL) és ANY INT adattípusokat és tömböket másolja át, hiszen a STRING, ARRAY OF BOOL, mint származtatott adattípusok az egyes  125     Serialize PLC-ben különbözőképpen kerülnek ábrázolásra. A fenti korlátozások azonos típusú PLC-k közti adatcserére nem vonatkoznak. A
következő példa 20bájtot másol át egy 30bájtos tömbbe! Példaprogram: PROGRAM sendstruct VAR serie fb : Serialize; struct buffer AT %SDB1.100 : ARRAY [130] OF BYTE; CheckSumOffset : UINT := 0; CheckSum : UINT; DTOffset : UINT := 2; TransDatum : DT; (* adási dátum ) DataOffset: UINT := 10; TransmitData : Array [1.20] OF BYTE; (* felhasználói adatok ) SerializedLength : UINT; Error : USINT; END VAR (* adatok előkészítése küldésre ) CAL serie fb(Source := CheckSum, Buffer := struct buffer, BufferOffset := CheckSumOffset, | SerializedLength := SourceLength) LD serie fb.Error USINT TO BOOL JMPC  Fail  (* volt-e hiba? ) (* hibakezelési rutin )  CAL serie fb(Source := TransDatum, Buffer := struct buffer, BufferOffset := DTOffset, | SerializedLength := SourceLength) LD serie fb.Error USINT TO BOOL JMPC  Fail  (* volt-e hiba? ) (* hibakezelési rutin )  CAL serie fb(Source := TransmitData, Buffer := struct buffer, BufferOffset := DataOffset, | SerializedLength :=
SourceLength)  126     Serialize LD serie fb.Error USINT TO BOOL JMPC  Fail  (* volt-e hiba? )) (* hibakezelési rutin )  (* az adatstruktúra összeállt, el lehet küldeni )  Fail:  (*hibakezelési rutin )  127     SetRealTimeClock SetRealTimeClock  Valós idejű óra állítás SetRealTimeClock  BOOL ADDRESS  Set DataAddress  Error  USINT  DataAddress  Az operandusok jelentése: Set  engedélyező jel (felfutó él) az adatcímek  DataAddress  a memóriaterület kezdőcíme, ahol a dátum és időértékek találhatók  Error  hibajelzés  Leírás: A Set bemeneten 0  1 felfutó éllel lehet a valóidejű óra értékét átírni. Az új értékek átírása közvetett módon történik. A DataAddress által meghatározott memória kezdőcímtől kezdve hét egymást követő adatbájt tartalmazza a beírandó új valóidejű dátum és idő értékeket. A bájtok sorrendje év, hónap, nap, hétnap sorszáma, óra, perc, másodperc. A felfutó él hatására a teljes érték
átíródik, azaz a teljes memóriaterületnek a helyes információt kell tartalmazni. Részinformációk külön- külön nem kezelhetők A deklarált adattípusok bájt szélességűnek kell lenni, tehát BYTE, SIINT, vagy USINT. Célszerű az USINT alkalmazása Hibaüzenetek Az ERR kimenet tartalmazza a lehetséges hibák kódját 1:  Helytelen DataAddress paraméter  2:  Helytelen év paraméter ( 0  99 )  3:  Helytelen hónap paraméter ( 1  12 )  4:  Helytelen nap paraméter ( 1  31 )  5:  Helytelen hétnap paraméter ( 0  6, 0 = vasárnap )  6:  Helytelen óra paraméter ( 0  23 )  7:  Helytelen perc paraméter ( 0  59 )  8:  Helytelen másodperc paraméter ( 0  59 )  Új fejlesztések esetén az óra állítására használja inkább az RTC funkcióblokkot!  128     SetRealTimeClock Példaprogram: PROGRAM Clock VAR Year AT %MB0.000 : USINT := 97; Month AT %MB0.001 : USINT := 1; Day AT %MB0.002 : USINT := 1; Weekday AT %MB0.003 : USINT := 2; (*2 = kedd) Hour AT %MB0.004 :
USINT:= 12; Minute AT %MB0.005 : USINT ; Second AT %MB0.006 : USINT ; (* Default érték kedd, 1.11997 1200h *) Set time : SetRealTimeClock; (* FB deklaráció) Set AT %I0.0000 : BOOL ; END VAR LD 98 ST Year LD 9 ST Month LD 12 ST Day LD 6 ST Weekday  (* év beállítás: 1998 ) (* hónap beállítás: szeptember ) (* nap beállítás: 12. *) (* hétnap sorszám beállítás: szombat )  (* A valósidejű óra az FB-hívással teljesen átíródik ) (* FIGYELEM: 12.00, mint alapérték ( default) kerül felhasználásra! *) CAL Set time(Set := Set, DataAddress := &Year) LD Set time.Error NE 0 JMPC Hiba kiertekeles . . . .END PROGRAM  (* hiba figyelés )  129     SR x SR x  bites léptető regiszter * BOOL  ForwardPulse  Output 1  BOOL  BOOL  BackwardPulse  Output 2  BOOL  BOOL  ReSet  .  BOOL  BOOL  ForwardData  .  BOOL  BOOL  BackwardData  Output n  BOOL  Az operandusok jelentése: ForwardPulse  léptető impulzus előre, felfutó él  BackwardPulse  léptetó impulzus vissza,
felfutó él  ReSet  visszaállítás, törlés  ForwardData  adatbemenet, előre  BackwardData  adatbemenet, vissza  Output   adatkimenet 1  Output n  utolsó adatkimenet  Leírás: A * helyén az adott prototípus funkcióblokk neve írandó be. A lehetséges nevek a következők: SR 1, SR 2, SR 128, ahol az egyes számok az 1-bites regisztermező hosszát adják meg. A ForwardData bemeneten levő érték a ForwardPulse bemeneten megjelenő felfutó él hatására belép az első regiszter helyre. A regiszter eredeti tartalma egy lépéssel előre lép. BackwardPulse BackwardData x  ForwardPulse Outout 8  Output 1 ForwardData  8  7  6  5  4  3  2  1  1  1  0  0  1  1  0  1  BackwardPulse  1  ForwardPulse léptetés iránya  BackwardData x  Outout 8  Output 1 ForwardData  8  7  6  5  4  3  2  1  1  0  0  1  1  0  1  1  8 bit hosszú léptető regiszter a ForwardData bemenet figyelembevételével egyet előre lép.  130     SR x A BackwardData bemeneten levő érték a BackwardPulse
bemeneten megjelenő felfutó él hatására belép az utolsó regiszter helyre. A regiszter eredeti tartalma egy lépéssel vissza lép. BackwardPulse BackwardData 0  ForwardPulse Outout 8  Output 1 ForwardData  8  7  6  5  4  3  2  1  1  0  0  1  1  0  0  1  BackwardPulse  x  ForwardPulse léptetés iránya  BackwardData  Outout 8  Output 1 ForwardData  8  7  6  5  4  3  2  1  0  1  0  0  1  1  0  0  x  8 bit hosszú léptető regiszter a BackwardData bemenet figyelembevételével egyet visszalép.  Az Output 1Output n kimenetek a regiszter aktuális tartalmát jeleníthetik meg. HA a ReSet törlő bemenet logikai 1-t kap, akkor a regiszter tartalma, azaz az összes kimenet törlődik. A regisztermező hossza 128 lépésben van korlátozva. Több léptetőregiszter egymáshoz fűzhető, és így 128 lépésnél hosszabb regiszter is kialakítható. Példaprogram: PROGRAM sh reg1 VAR Shiftregister 4 bit : SR 4; Pulse1 : BOOL; Pulse2 : BOOL; Reset : BOOL; Data bit1 : BOOL; Data bit2 :
BOOL; Output1 : BOOL; Output2 : BOOL; Output3 : BOOL; Output4 : BOOL; END VAR  131     SR x CAL Shiftregister 4 bit(ForwardPulse := Pulse1, BackwardPulse := Pulse2, ReSet := Reset, ForwardData := Data bit1, BackwardData := Data bit2) LD Shiftregister 4 bit.Output 1 ST Output1 LD Shiftregister 4 bit.Output 2 ST Output2 LD Shiftregister 4 bit.Output 3 ST Output3 LD Shiftregister 4 bit.Output 4 ST Output4 END PROGRAM  132     SRB x SRB x  bájtos lépető regiszter * BOOL  ForwardPulse  Output 1  USINT  BOOL  BackwardPulse  Output 2  USINT  BOOL  ReSet  .  USINT  USINT  ForwardData  .  USINT  USINT  BackwardData  Output n  USINT  Az operandusok jelentése: ForwardPulse  léptető impulzus előre, felfutó él  BackwardPulse  léptető impulzus vissza, felfutó él  ReSet  visszaállítás, törlés  ForwardData  adatbemenet, előre  BackwardData  adatbemenet, vissza  Output   adatkimenet 1  Output n  utolsó adatkimenet  Leírás: A * helyén az adott prototípus funkcióblokk neve
írandó be. A lehetséges nevek a következők: SRB 1, SRB 2, SRB 128, ahol az egyes számok a 8-bites regisztermező hosszát adják meg. A ForwardData bemeneten levő érték a ForwardPulse bemeneten megjelenő felfutó él hatására belép az első regiszter helyre. A regiszter eredeti tartalma egy lépéssel előre lép. BackwardPulse BackwardData x  ForwardPulse Outout 8  Output 1 ForwardData  8  7  6  5  4  3  2  1  019  255  035  095  122  023  082  003  BackwardPulse  102  ForwardPulse léptetés iránya  BackwardData x  Outout 8  Output 1 ForwardData  8  7  6  5  4  3  2  1  255  035  095  122  023  082  003  102  8 bit hosszú léptető regiszter a ForwardData bemenet figyelembevételével egyet előre lép.  133     SRB x A BackwardData bemeneten levő érték a BackwardPulse bemeneten megjelenő felfutó él hatására belép az utolsó regiszter helyre. A regiszter eredeti tartalma egy lépéssel vissza lép. BackwardPulse BackwardData 007  ForwardPulse Outout 8  Output
1 ForwardData  8  7  6  5  4  3  2  1  019  255  035  095  122  023  082  003  BackwardPulse  x  ForwardPulse léptetés iránya  BackwardData  Outout 8  Output 1 ForwardData  8  7  6  5  4  3  2  1  007  019  255  035  095  122  023  082  x  8 bit hosszú léptető regiszter a BackwardData bemenet figyelembevételével egyet vissza lép.  Az Output 1Output n kimenetek a regiszter aktuális tartalmát jeleníthetik meg. HA a ReSet törlő bemenet logikai 1-t kap, akkor a regiszter tartalma, azaz az összes kimenet törlődik. A regiszterhossz 128 lépésben van korlátozva. Több léptetőregiszter egymáshoz fűzhető, és így 128 lépésnél hosszabb regiszter is kialakítható. Példaprogram: PROGRAM sch reg8 VAR Shiftregister 2 byte : SRB 2; Pulse1 : BOOL; Pulse2 : BOOL; Reset : BOOL; Data1 : USINT; Data2 : USINT; Output1 : USINT; Output2 : USINT; END VAR  134     SRB x CAL Shiftregister 2 byte(ForwardPulse := Pulse1, BackwardPulse := Pulse2, ReSet := Reset, ForwardData := Data1,
BackwardData := Data2) LD Shiftregister 2 byte.Output 1 ST Output1 LD Shiftregister 2 byte.Output 2 ST Output2 END PROGRAM  135     SRW x SRW x  szavas lépető regiszter * BOOL  ForwardPulse  Output 1  UINT  BOOL  BackwardPulse  Output 2  UINT  BOOL  ReSet  .  UINT  UINT  ForwardData  .  UINT  UINT  BackwardData  Output n  UINT  Az operandusok jelentése: ForwardPulse  léptető impulzus előre, felfutó él  BackwardPulse  léptető impulzus vissza, felfutó él  ReSet  visszaállítás, törlés  ForwardData  adatbemenet, előre  BackwardData  adatbemenet, vissza  Output   adatkimenet 1  Output n  utolsó adatkimenet  Leírás: A * helyén az adott prototípus funkcióblokk neve írandó be. A lehetséges nevek a következők: SRB 1, SRB 2, SRB 128, ahol az egyes számok a 16-bites regisztermező hosszát adják meg. A ForwardData bemeneten levő érték a ForwardPulse bemeneten megjelenő felfutó él hatására belép az első regiszter helyre. A regiszter eredeti tartalma egy
lépéssel előre lép. BackwardPulse BackwardData  ForwardPulse Outout 8 8  x  Output 1 ForwardData 7  6  5  4  3  2  1  00197 02555 18637 00023 12987 00292 09688 00023  BackwardPulse  13657  ForwardPulse léptetés iránya  BackwardData  Outout 8 8  x  Output 1 ForwardData 7  6  5  4  3  2  1  02555 18637 00023 12987 00292 09688 00023 13657  8 bit hosszú léptető regiszter a ForwardData bemenet figyelembevételével egyet előre lép.  136     SRW x A BackwardData bemeneten levő érték a BackwardPulse bemeneten megjelenő felfutó él hatására belép az utolsó regiszter helyre. A regiszter eredeti tartalma egy lépéssel vissza lép. BackwardPulse BackwardData  ForwardPulse Outout 8 8  00984  Output 1 ForwardData 7  6  5  4  3  2  1  00197 02555 18637 00023 12987 00292 09688 00023  BackwardPulse  x  ForwardPulse léptetés iránya  BackwardData  Outout 8 8  Output 1 ForwardData 7  6  5  4  3  2  1  00984 00197 02555 18637 00023 12987 00292 09688  x  8 bit hosszú léptető
regiszter a BackwardData bemenet figyelembevételével egyet vissza lép.  Az Output 1Output n kimenetek a regiszter aktuális tartalmát jeleníthetik meg. HA a ReSet törlő bemenet logikai 1-t kap, akkor a regiszter tartalma, azaz az összes kimenet törlődik. A regiszterhossz 128 lépésben van korlátozva. Több léptetőregiszter egymáshoz fűzhető, és így 128 lépésnél hosszabb regiszter is kialakítható. Példaprogram: PROGRAM s reg16 VAR Shiftregister 2 wort : SRW 2; Pulse1 : BOOL; Pulse2 : BOOL; Reset : BOOL; Data1 : UINT; Data2 : UINT; Output1 : UINT; Output2 : UINT; END VAR  137     SRW x CAL Shiftregister 2 wort(ForwardPulse := Pulse1, BackwardPulse := Pulse2, ReSet := Reset, ForwardData := Data1, BackwardData := Data2) LD Shiftregister 2 wort.Output 1 ST Output1 LD Shiftregister 2 wort.Output 2 ST Output2 END PROGRAM  138     STRtoADR STRtoADR  STRING típusú változó adott címterületre másolása STRtoADR TextSring  ANY STRING  TextSring  TransmitVariable 
ADDRESS  Enable  BOOL  StrLen  UINT  Az operandusok jelentése: TextSring  Karakterlánc, melyet a memóriaterületre kell bemásolni.  TransmitVariable  A memóriaterület kezdőcíme, ahová az adatok bemásolódnak  Enable  Az átalakítási folyamat engedélyezése  StrLen  Az átalakított jelek száma  Leírás: A soros vonalra küldendő adatokat előzetesen a soros vonali funkcióblokk (pl.SCO) adási területére kell bemásolni. Az STRtoADR blokk erre a célra használható Az Enable bemenetre adott 1-es szinttel indítható az átalakítási művelet. Az StrLen kimeneten az átmásolt adatok száma olvasható le. Amennyiben a STRING változó karakterhossza hosszabb a letárolási hely méreténél, akkor a STRING változó vége értelemszerűen lemarad, azaz nem kerül bemásolásra. Példaprogram: PROGRAM Textcopy VAR String to Marker : STRtoADR; SendText : STRING := 'Small Example'; StartAddress AT %MB0.00100 : BYTE; SendLength : UINT; END VAR CAL String to
Marker (Enable := 1, TextString := SendText, TransmitVariable := &StartAddress) (* A karakterlánc a %MB0.00100-tól kezdődően kerül bemásolásra *) LD String to Marker.StrLen ST SendLength END PROGRAM  139     STRtoCOM STRtoCOM  STRING típusú változó adott címterületre másolása STRtoCOM TextString  ANY StTRING  TransmitVariaable  ANY ARRAY  TextString TransmitVariaable  Enable  BOOL  Az operandusok jelentése: TextSring  Karakterlánc, melyet a tömb adataiba kell bemásolni.  TransmitVariable  A tömb, ahová a karakterláncot be kell másolni  Enable  Az átalakítási folyamat engedélyezése  StrLen  Az átalakítandó jelek száma  Leírás: A soros vonalra küldendő adatokat előzetesen a soros vonali funkcióblokk (pl.SCO) adási területére kell bemásolni. Az STRtoCOM blokk erre a célra használható Az Enable bemenetre adott 1-es szinttel indítható az átalakítási művelet. Az StrLen kimeneten az átmásolt adatok száma olvasható le. Amennyiben a
STRING változó karakterhossza hosszabb a letárolási hely méreténél, akkor a STRING változó vége értelemszerűen lemarad, azaz nem kerül bemásolásra. Példaprogram: PROGRAM Textsend VAR String to Array : STRtoCOM; SendText : STRING := 'Small Example'; SendArray : ARRAY [1.100] OF BYTE; SendLength : UINT; END VAR CAL String to  Array(Enable := 1, TextString := SendText, TransmitVariable := SendArray | SendLength :=.StrLen) END PROGRAM  140     TimeConcat TimeConcat  idő (TIME) típusú változó összeállítása egyedi UINT típusú adatokból TimeConcat UINT  MilliSeconds  UINT  Seconds  UINT  Minutes  UINT  Hours  UINT  Days  UINT  Sign  OutputTime  TIME  Overflow  BOOL  Az operandusok jelentése: MilliSeconds  időtartam változó milliszekundum része  Seconds  időtartam változó szekundum része  Minutes  időtartam változó perc része  Hours  időtartam változó óra része  Days  időtartam változó nap része  Sign  az időtartam előjele 
OutputTime  az eredményül kapott idő változó  Overflow  Túlcsordulás  Leírás: A bemenetként UINT formátumban megadott egyedi időtartam értékeket a funkcióblokk a TIME formátumú változóvá alakítja. A funkcióblokk az egyes értékeket átszámítja az időtartam változó megfelelő részeivé, és szükség esetén túlcsordulást képez. A bemeneti változók minden megengedett UINT típusú értéket felvehetnek, amíg az összérték túl nem lépi a T#63d23h59m59s999ms értéket. Amennyiben megtörténik a túllépés, akkor az Overflow kimeneten túlcsordulás jelzés ( = 1) jelentkezik. A bemeneti értékek előjelbitje az eredményértékben is megjelenik. A Sign = 0 pozitív, a Sign = 1 érték negatív kimeneti operandust eredményez.  141     TimeConcat Példaprogram: PROGRAM time gen VAR TimeConcaten : TimeConcat; Milliseconds : UINT; Seconds : UINT; Minutes : UINT; Hours : UINT; Days : UINT; Sign: BOOL := 0; TimeStructure : TIME; Overflow : BOOL; END
VAR CAL TimeConcaten (MilliSeconds := Milliseconds, Seconds := Seconds, Minutes := Minutes, Hours := Hours, Days := Days, Sign := Sign | TimeStructure := OutputTime, Overflow := Overflow) END PROGRAM  142     TimeGenerator TimeGenerator  ütemadó impulzusgenerátor TimeGenerator  BOOL  Set  UINT  Period  PulseOutput  BOOL  Az operandusok jelentése: Set  indítási feltétel, pozitív éllel  Period  Periódusidő milliszekundumban  PulseOutput  impulzus kimenete  Idődiagramok:  Set  PulseOutput T Leírás Ha a Set bemenet magasba vált a PulseOutput kimeneten (a Period bemeneten, milliszekundumban definiált periódusidővel) 1:1 kitöltési tényezőjű pulzussorozat generálódik mindaddig, amíg az Set bemenet magas. A periódusidőnek mindig nagyobbnak kell lennie a ciklusidő kétszeresénél, hogy az impulzus alacsony, és magas szintje tisztán elkülönüljenek. Ha a periódusidőt meghatározó Period bemenetre tett érték változik, ez csak akkor módosítja a
periódusidőt, ha a Set bemenetre egy felfutó él jut. A megadott periódusidő pontosságát az alkalmazói program ciklusideje és az operációs rendszer futási ideje befolyásolhatja. A funkcióblokk programcikluson belüli többszöri hívása (különösen a periódusidő és a program ciklusidő azonos nagyságrendbe esése esetén) a pontatlanságot csökkenti. A periódusidő páratlan értékét a belső szoftver a következő páros értékre lefelé kerekíti.  143     TimeGenerator Példaprogram: PROGRAM frequency VAR ClockGenerator : PulseGenerator; Start AT %I0.0036 : BOOL; PeriodTime: UINT := 320; Clock : BOOL; END VAR CAL ClockGenerator(Set := Start, Period := PeriodTime) LD ClockGenerator.PulseOutput ST Clock END PROGRAM  144  (* A periódusidő milliszekundumban )     TimePulse TimePulse  impulzusképző TimePulse BOOL  Set  PulseOutput  BOOL  BOOL  ReSet  ElapsedTime  UINT  UINT  PresetTime  Az operandusok jelentése: Set  indítási feltétel, pozitív éllel 
ReSet  visszaállítás, törlés  PreSetTime  impulzus időérték milliszekundumban  PulseOutput  impulzus kimenete  ElapsedTime  ténylegesen eltelt impulzus idő milliszekundumban  Idődiagramok:  Set ReSet PulseOutput T  T  T  <T  Leírás A Set bemenet felfutó élével indítva PulseOutput kimenet a PresetTime bemeneten (milliszekundumban ) definiált időtartamra magas értéket vesz fel. A Set állapotától függetlenül az adott hosszúságú impulzus a PulseOutput kimeneten fennmarad, és csak a pulzusidő letelte után lesz ismét alacsony a P kimenet értéke. Az ElapsedTime kimenet milliszekundumban kijelzi a időszámláló aktuális értékét. A ReSet bemenet magas szintje, alaphelyzetbe állítja az időtagot. Alaphelyzetben a kimenetek értéke nulla.  145     TimePulse Példaprogram: PROGRAM pulse VAR Timer1 : TP; Start AT %I0.0026 : BOOL; PulseDuration: TIME := T#125ms; OutputPulse : BOOL; ActualTime : TIME; END VAR CAL Timer1 (IN := Start, PT := PulseDuration)
LD Timer1.Q ST OutputPulse LD Timer1.ET ST ActualTime END PROGRAM  146     TimerAlarm TimerAlarm  időzítéses megszakításkezelés  TimerAlarm BOOL  EnableDisable  USINT  Mode  UINT  Predivide  UINT  SetpointValue  ANY FUNCTION BLOCK  SubRoutine  Error  USINT  CallUpValue  UINT  Az operandusok jelentése: EnableDisable  Megszakításkérő funkcióblokk engedélyezése / tiltása, felfutó élvez. (engedély=1, tiltás=0)  Number  üzemmód (1 = timer funkció, 2 = impulzusgenerátor funkció)  RisingEdge  előosztó  SetpointValue  Impulzusszám alapjel  SubRoutine  megszakításkérést kiszolgáló funkcióblokk neve  Error  hibajelzés  CallUpValue  megszakításkérő hívások száma  Leírás: A funkcióblokk a PS4-201-MM1 alapkészülék %I0.0001 bemenetéhez van hozzárendelve. A PS4-141-MM1 és PS4-151-MM1 esetén a hozzárendelés a %I0.0010 bemenethez történik A PS4-341-MM1 két élvezérelt bemenettel (%I0.0010, és %I00011) rendelkezik Az EnableDisable bemenet
engedélyezi a funkcióblokk működését. Ha a bemeneten pozitív élváltás (0  1) következik be, a funkcióblokk indul, valamint átveszi aSubRoutine bemenetre adott megszakításkérő funkcióblokk nevet, a Predivide és a SetpointValue bemenetekre adott értékeket és közbensőleg letárolja azokat. A CallUpNumber kimenet egyidejűleg törlődik. A bemenet 1 -> 0 átmenete esetén a funkcióblokk leáll, és egyúttal törlődik is. A funkcióblokk az 1. üzemmódban egy időzítőt valósít meg Az időalap = (a Predivide bemeneten levő érték) µs-ban, a megengedett legrövidebb időalap 512µs. Az alapérték = (a SetpointValue bemeneten levő érték). Ha az alapértéknek megfelelő számú, egyenként az időalap hosszúságú idő teljesen letelt, akkor a  147     TimerAlarm CallUpNumber tartalma eggyel nő, és ha a SubRoutine bemenet nem üres, akkor behívja a bemeneten feltüntetett megszakítást kiszolgáló funkcióblokkot. A funkcióblokk a 2. üzemmód
állásban egy jelgenerátor valósít meg A jelgenerátor az alapkészülék (PS4-150/-200-/300-MM1) %Q0.0000 kimenetéhez csatlakozik A generátor periódus ideje = (a Predivide bemeneten levő érték) µs-ban. A SetpointValue bemeneten a %Q0.0000 kimeneten megjelenő összes le- és felfutó él összegét kell megadni. Ha a SetpointValue alapérték felének megfelelő számú, egyenként az időalap hosszú impulzus teljesen letelt, akkor a CallUpNumber tartalma eggyel növekszik. Az ERR kimenet tartalmazza a hibák kódjait: 0 = nincs hiba 1 = alapérték (SetpointValue) bemeneten 0 van 2 = előosztó (Predivide) bemeneten az érték < 512. 3 = a Mode bemeneten nincs megfelelő érték (nem 1, vagy 2) A SubRoutie bemenet lehetővé teszi egy eseményvezérelt program beillesztését. Ennek érdekében ezen a bemeneten a kiszolgáló funkcióblokk címét kell megadni. Mikor az esemény bekövetkezik (a CallUpValue számláló eggyel nő) a funkcióblokk meghívásra kerül.
Ha ezen a bemeneten nincs cím, akkor csak a CallUpValue számláló tartalma nő. A megszakításkérést kiszolgáló funkcióblokk nem tartalmazhat sem bemenő, sem kimenő paramétereket. Egy ilyen funkcióblokk csak lokális változókat, vagy csak a főprogramban deklarált globális változókat, mint külső változókat (VAR EXTERNAL) tartalmazhat. Eseményvezérelt program alkalmazásakor az alábbi szempontokat kell figyelembe venni: • Az esemény bekövetkezte a ciklikus felhasználói program végrehajtását megszakítja, a regiszterek állapotát elmenti, és a SubRoutine bemeneten megadott címre ugorva végrehajtja a kiszolgáló funkcióblokkot. A megszakításkérő funkcióblokk nem szakítható meg egy másik megszakításkérő funkcióblokkal (az összes megszakításkérő funkcióblokknak azonos a prioritása). • A felhasználói program 5ms időtartamra (kb. 1000 utasítássor végrehajtása) korlátozza a megszakításkérő funkcióblokk végrehajtási
idejét, mivel a megszakításkérő funkcióblokk működését a rendszerprogram sem tudja (még tápkimaradáskor sem) megszakítani. Ha a végrehajtási idő túllépi ezt a korlátot, akkor a táp kikapcsolásakor EDC hiba keletkezhet. • A megszakításkérő funkcióblokk végrehajtási ideje hozzáadódik a felhasználói program végrehajtási idejéhez, így a ciklusidő ellenőrzésbe is bekerül! • Mivel az eseményvezérelt program futtatásakor korlátozás nélkül elérhetők a globális változók is, a ciklikus felhasználói program és az eseményvezérelt program által közösen irható /olvasható adatokat reteszelés nélkül nem szabad felhasználni. Például a ciklikus felhasználói programban és a megszakításkérő funkcióblokkban ugyanabban a bájtban használt bithozzáférést csak a Disable Interrupt és a Enable Interrupt utasításokkal való szinkronizálással  148     TimerAlarm szabad korrekten végrehajtani. • A lehető leggyorsabb
reagálás érdekében a megszakításkérő funkcióblokkban célszerű a közvetlen periféria hozzáférést használni, melyek az alapkészüléken állnak rendelkezésre (%QP0.000x, %QPB0000) • A megszakításkérő funkcióblokkok az alkalmazói programban elvileg többször is használhatók, de ezt általában kerülni érdemes, mivel a megszakításkérő funkcióblokk típusok ugyanazzal az eseményforrással, és így a programban csak az utoljára érvényesülő funkcióblokk határozza meg feldolgozást. A többszöri felhasználás azt jelenti, hogy az egyedi funkcióblokk-típus minden egyes alkalmazásához külön-külön adatterületet foglal le. A következő példában aTimerAlarm, mint impulzusgenerátor (mode = 2) működik. Az időalap 1ms,( Predivide = 1000). Mivel a SetpointValue = 100, a %Q00000 kimeneten 50db impulzus jelenik meg 1:1 kitöltéssel. A megszakításkérő funkcióblokkok bemeneteinek értékadása csak a híváskor történő zárójeles
értékadással történhet. Közvetlen paraméter hozzárendelés a zárójelen kívül, vagy a hívást követően nem megengedett! min. 512  1024  0  2  Predivide=512 Mode=1 SetpointValue=1 CallUpNumber  1  t [µs]  3  4  5  6  7  8  9  -  -  65534  0  Ugrás a funkcióblokkra 512 Predivide =512 Mode =1 SetpointValue=3 CallUpNumber 0  1024  0  0  1  1 1 2 2 Ugrás a funkcióblokkra  2  3  3  3  4  4  0  1 1 1 1 Ugrás a funkcióblokkra  2  2  2  2  3  3  kimenet 512 Predivide =512 Mode =2 SetpointValue=4 CallUpNumber 0  1024  0  0  149     TimeSplit TimeSplit  idő (TIME) típusú változó szétválasztása egyedi UINT típusú adatokra TimeSplit InputTime  TIME  MilliSeconds  UINT  Seconds  UINT  Minutes  UINT  Hours  UINT  Days  UINT  Sign  BOOL  Az operandusok jelentése: InputTime  a bemeneti TIME időtartam változó  MilliSeconds  időtartam változó milliszekundum része  Seconds  időtartam változó szekundum része  Minutes  időtartam változó perc része  Hours 
időtartam változó óra része  Days  időtartam változó nap része  Sign  az időtartam előjele  Leírás: A bemenetként TIME formátumban megadott változót a funkcióblokk UINT formátumú egyedi változókká alakítja át. A Sign kimenet adja meg az időtartam változó előjelét. 0 a pozitív időtartamot, 1 a negatív időtartamot jelképezi. Példaprogram: PROGRAM zt split VAR TimeElements : TimeSplit; Duration : TIME := T#20d22h13m12s800ms; Milliseconds : UINT; Seconds : UINT; Minutes : UINT; Hours : UINT; Days : UINT; Sign : BOOL; END VAR  150     TimeSplit CAL TimeElements(InputTime := Duration | Milliseconds := MilliSeconds, Seconds := Seconds, Minutes := Minutes, Hours := Hours, Days := Days, Sign := Sign) END PROGRAM  151     TODsplit TODconcat  napi idő (TOD) típusú változó összeállítása egyedi UINT típusú adatokból TODconcat UINT  Millisecond  UINT  Second  UINT  Minute  UINT  Hour  OutputTOD Error  TIME OF DAY BOOL  Az operandusok jelentése:
Millisecond  idő változó nap része  Second  idő változó hónap része  Minute  idő változó év része  Hour  idő változó óra része  OutputTOD  az eredményül kapott dátum változó  Error  Hibajelzés  Leírás: A bemenetként UINT formátumban megadott egyedi értékeket a funkcióblokk a idő (TIME OF DAY) formátumú változóvá alakítja. Az egyes bemeneti értékek a nekik megfelelő értéktartományt nem léphetik át. Amennyiben a megengedett értékeket túllépik, akkor az Error kimeneten hibajelzés lép fel (= 1). Példaprogram: PROGRAM time2 VAR TimeOfDay : TODconcat; Millisecond : UINT; Second : UINT; Minute : UINT; Hour : UINT; TODStructure : TIME OF DAY; Error : BOOL; END VAR CAL TimeOfDay(MilliSecond := Millisecond, Second := Second, Minute := Minute, Hour := Hour | TODStructure:= OutputTOD, Error:= Error) END PROGRAM  152     TODsplit TODsplit  idő (TIME OF DAY) típusú változó szétválasztása egyedi UINT típusú adatokra TODsplit InputTOD  DT
 MilliSecond  UINT  Second,  UINT  Minute  UINT  Hour  UINT  Az operandusok jelentése: InputTOD  a bemeneti TIME idő változó  MilliSecond  idő változó milliszekundum része  Second  idő változó szekundum része  Minute  idő változó perc része  Hour  idő változó óra része  Leírás: A bemenetként TIME OF DAY formátumban megadott változót a funkcióblokk UINT formátumú egyedi változókká alakítja át. Példaprogram: PROGRAM time1 VAR Split time : TODsplit; TimeOfDay : TOD := TOD#12h13m12s800ms; Milliseconds : UINT; Seconds : UINT; Minutes : UINT; Hours : UINT; END VAR CAL Split time (InputTOD := TimeOfDay | Milliseconds := MilliSecond, Seconds := Second, Minutes := Minute, Hours := Hour) END PROGRAM  153     TransferArray TransferArray  adatblokk másolása, inicializálása TransferArray Source  ANY ARRAY  Destination  ANY ARRAY BOOL  Source Destination  Mode  UINT  SourceOffset  UINT  DestinationOffset  UINT  ElementNumber  Error  USINT  Az operandusok
jelentése: Source  a forrástömb  Destination  céltartomány  Mode  üzemmód: (0 = inicializálás, 1 = másolás)  SourceOffset  a forrástömbön belüli eltolás értéke  DestinationOffset  a céltömbön belüli eltolás értéke  ElementNumber  másolandó bájtok száma  Error  hibajelzés  Leírás: A funkcióblokknak kétféle üzemmódja van (adatok inicializálása, és adatterület másolása). Az üzemmód választás a Mode bemenetre adott értékkel történhet. A forrás és a cél-tömb tetszőleges nagyságú tömb lehet. A tömb típusa ANY INT vagy ANY BIT lehet, kivéve a BOOL (bites) tömböket. Az Error kimeneten az esetleges hibakód jelenik meg:  154  0  nincs hiba,  1  az elemek száma (ElementNumber) nulla.  2  A SourceOffset értéke nagyobb, mint a Source tartomány értéke  3  Az elemek száma túllépi a a forrástartomány értékét  4  A DestinationOffset értéke nagyobb, mint a Destination tartomány értéke  5  Az elemek száma túllépi a
céltartomány értékét  6  forráscím és a célcím azonos     TransferArray Inicializálási üzemmód Az inicializálási üzemmódban a Source és a SourcsOffset által meghatározott tömbelemet másol a Destination és a DestinationOffset által meghatározott tömbterületre. A forrás és a cél egy tömbön belül is lehet A felülírt tömbelemek számát az ElementNumber adja meg. Másolási üzemmód A másolási üzemmódban egy tömb, vagy annak egy része (Source + SourceOffset) kerül átmásolásra a (Destination + DestinationOffset) által meghatározott területre. A másolandó bájtok számát az ElementNumber határozza meg.A forrás és a cél egy tömbben is elhelyezkedhetnek, azaz blokkeltolás is lehetséges. A TransferArray-re vonatkozó példa a BlockTransfer funkcióblokk alatt található, mivel a két funkcióblokk egymással azonos, csupán a deklarációs eljárás különbözik. (A cél- és forráscímeket a cél- és forrástömb deklarációkkal
kell helyettesíteni.)  155     WriteMC WriteMC  adatok írása a flash-memóriába WriteMC  ANY ARRAY  SourceAddress  BOOL  Strobe  UINT  SegmentNumber  USINT  DataLength  SourceAddress Active  BOOL  MaxSegmentNumber  UINT  Error  USINT  Az operandusok jelentése: SourceAddress  a forrástömb, mely tartalmazza a mentendő adatokat  Strobe  letárolási folyamat indítása  SegmentNumber  a szegmens száma (megengedett: 0n)  DataLength  a tárolandó adatbájtok száma  MaxSegmentNumber a fájl utolsó lehetséges szegmensszáma Error  hibajelzés  Leírás: A WriteMC funkcióblokk segítségével a memóriamodulba lehet adatokat a CPU memóriaterületéről letárolni. Ez a funkcióblokk a ReadMC blokkal együtt fontos alkalmazási területe a remanens adattárolásnak, receptura-kezelésnek, illetve változók letárolásának egy program aktualizálást megelőzően. A memóriamodult a PLC-be betenni, illetve kivenni csak a PLC feszültségmentes állapotában szabad!  A
memóriamodulban az adatok egyenként 128bájt hosszúságú szegmensre vannak felosztva. A szabad adatterület meghatározásához a funkcióblokkot DataLength = 0 értékkel kell meghívni, melynek hatására nem indul be az írási folyamat, ugyanakkor a MaxSegmentLength visszaadja az utolsó még használható szegmens értékét. A funkcióblokk a programfutással aszinkron módon kerül végrehajtásra, és több programcikluson keresztül is eltarthat. Ezalatt az idő alatt az Active kimenet 1-t ad A hibátlan végrehajtást jelzi az Active kimenet 0-ba történő visszaváltása, miközben az Error kimenet is 0-t ad. Egyszerre több funkcióblokk is lehet egyidejűleg aktív. az operációs rendszer a hívások sorrendjében egymás után hajtja végre az írási műveleteket.  156     WriteMC Az Error kimenet a következő állapotokat veheti fel: 0  nincs hiba  1  nincs memóriamodul beépítve  2  online kapcsolat miatt nem lehetséges a hozzáférés (csak PS4-200 esetén) 
3  nem lehetséges a hozzáférés egyidejű WriteMC hívás miatt (csak PS4-200 esetén)  4  érvénytelen SegmentNumber (PS4-200 esetén a megengedett: 0.511; PS4300 esetén a modultól fűggően: 01023)  5  érvénytelen adathossz (megengedett DataLength érték: 1.128)  6  -  7  nem lehetséges a hozzáférés, mert a memóriamodul , mint forráskód háttér van felhasználva (csak PS4-200 esetén)  8  a memóriamodul formázása nem engedi meg az adattárolási tartomány használatát (csak PS4-300 esetén)  Csak a PS4-200 esetén: Az Active kimenet a PS4-150/-200 esetén mindig 0. A funkcióblokk aktuális állapota csak egy ismételt hívás mellett az Error kimenet lekérdezésével oldható meg. Ha az Error 0-t ad, akkor a művelet hiba nélkül végrehajtódott. Ha a kimenet értéke 3, akkor a funkcióblokk még dolgozik Az Error kimenet aktualizálásához a Strobe bemeneten egy újabb pozitív élet kell generálni. A ReadData funkcióblokk segítségével lehet a
letárolt adatokat a memóriamodulból visszaolvasni! Példaprogram: PROGRAM SAVE VAR StrobeSave AT %I0.0000 : BOOL; ActiveSave AT %Q0.0000 : BOOL; ErrorSave : USINT; FBSaveData : WriteMC; SegmentNumber : UINT; DataLength : USINT; LastSegmentNumber : UINT; DataArea : ARRAY[0.31] of USINT; END VAR LD ActiveSave JMPCN CONTINUE (* adatok előkészítése a tárolásra )  157     WriteMC CONTINUE: LD 47 ST SegmentNumber LD 32 ST DataLength (* A DataArea tömbből 32 bájt írása a memóriamodul 47-es szegmensébe ) CAL FBSaveData(Strobe := StrobeSave, SegmentNumber := SegmentNumber, DataLength := DataLength, SourceAddress := DataArea | ActiveSave := Active, LastSegmentNumber := MaxSegmentNumber, ErrorSave := Error) LD ErrorSave EQ 0 JMPC NO ERROR (* hiba kezelési rutin ) NO ERROR: (* további programrészek END PROGRAM  158  *)     Sucosoft határértékek 7.  Sucosoft határértékek PS4-200  PS4-300  PS416  a POU-k max. száma egy projektben  256  256  256  a projektnév max. hossza a
neveknek az első 8 karakterben különbözőknek kell lenni!  32 karakter  32 karakter  32 karakter  65 535  65 535  65 535  a változónevek max. hossza  64 karakter  64 karakter  64 karakter  a POU név max. hossza  32 karakter  32 karakter  32 karakter  -  -  A Project Manager határértékei  A program szerkesztő (Editor) korlátai a sorok max. szám egy POU-ban  Állapotkijelzés (Status Display) határértékei egyszerre kijelezhető változók száma  ca. 50  1)  A konfigurátor (Topology Configurator) határértékei konfigurációban a max. komponensek száma 2)  175  630  753  az I/O monitorban a kiválasztható komponensek max. száma  10  10  10  Korlátok a CPU és a fordító (compiler) függvényében max. programméret beleértve az összes FB-t max. programméret beleértve az összes FB-t (adat + programkód együttesen)  63 kbájt  512 kbájt  CPU200: 256kB CPU300: 512kB CPU400:1MB  egy POU max. programkód mérete  56 kbájt  64 kbájt  64 kbájt  32000 global
32000/POUloc.  16000 global 16kB/POUloc.  16000 global 16kB/POUloc.  a fastruktúra max. mérete (összekapcsolt funkcióblokkok száma)  8  16  16  a funkcióblokkok hívásának max. mélysége  16  16  16  programonkénti instancálások száma 2)  4000  4000  4000  az AT deklarálások max száma 2)  16 kbájt  16 kbájt  5450  egy tömb max. mérete  8 kbájt  16 kbájt  16 kbájt  3  4  4  az összes változó max mérete (főprogram + összes FB)  egy tömb max dimenziója index tartomány megengedett értéke  0.255  felsorolás típusú változók max. elemszáma  255  -2147483648 -2147483648 .+2147483647 +2147483647 65000  65000  159     Sucosoft határértékek PS4-200  PS4-300  PS416  egy STRING változó max. mérete  253 karakter  1024 karakter  1024 karakter  globális típus definíciók max. száma  1100  1100  1100  TIME adattípus megengedett tartománya  +63/-64 nap, 23 h, 59perc, 59sec., 999ms  +127/-128nap 23 h, 59perc, 59sec., 999ms  +127/-128nap 23 h, 59perc,
59sec., 999ms  DATE adattípus megengedett tartománya  1900-1-1 2154-12-31  1900-1-1 2154-12-31  1900-1-1 2154-12-31  maximálisan konfigurálható ciklusidő  255 ms  1000 ms  1000 ms  importált S30 programok max. mérete  54 kByte  nincs korlát  nincs korlát  online feldolgozás miatti ajánlott max. POU méret  < 2 kByte  < 8 kByte  < 8 kByte  1)  Az adattípustól függ. Ha a korlátértéket meghaladja, akkor az adott érétkek helyén kérdőjel jelenik meg.  2)  A korlátozás függ természetesen a rendelkezésre álló PLC memóriaterülettől is.  160