Tartalmi kivonat
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 DATE dátum formátum; YYYY-MM-TT TIME OF DAY időpont formátum: HH:MM:SS T#0s D#1900-01-01 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 LD Operandus ANY LDN ANY BIT ST ANY STN ANY BIT Jelentés az operandus bemásolása a z akkumulátorba 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 S BOOL az operandus = 1, ha az akku értéke 1 R BOOL az operandus = 0, ha az akku értéke 1 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 ANY INT szorzás MUL DIV 1) 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 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 St LD ST LD ST Cal torles torles ertek1 Instanz2 nev.bem1 ertek2 Instanz2 nev.bem2 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 DINT 1) X X 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 USINT 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 Maximum, (minimum) kiválasztás MAX (MIN) *) IN1 *) IN2 . . INn *) *) IN1 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 *) IN0 *) IN1 . *) *) 38 K *) . 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 BOOL Backward BOOL Set BOOL ReSet UINT Zero OutputValue BOOL 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 Signed BOOL BinaryValue INT DecimalValue UINT 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 BOOL Mode ADDRESS SourceAddress ADDRESS DestinationAddress USINT Greater BOOL Equal BOOL Less BOOL Output USINT Error USINT ElementNumber 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 Greater BOOL DestinationOffset Equal BOOL ElementNumber Less BOOL UINT SourceOffset UINT UINT Output Error UINT 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 Number CountValue UINT UINT Predivide CallUpValue UINT UINT SetpointValue ANY FUNCTION BLOCK Error USINT 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 ARRAY [0.11] OF BYTE ARRAY [0.11] OF BYTE SendData SendData ReadData ReadData BOOL Enable BOOL Start BOOL Quickstop BOOL DCBrake BOOL TripReset BOOL ParameterSet BOOL MotorPotUp BOOL MotorPotDown BOOL FixedFrequency1 BOOL FixedFrequency2 BOOL FixedFrequency3 BOOL Reversal BOOL FreezeRamp INT StatusWord ReferenceFrequency BYTE Command UINT ParameterNumber ActualFrequency INT EchoCommand BYTE EchoParameterNumber UINT Busy UINT TransmitValue UINT TransmitValueOffset BOOL ReceiveValue UINT ReceiveValueOffset UINT ErrorCode 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 USINT 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 Error UINT 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 CallUpValue USINT 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 Full BOOL Empty BOOL DataOutput UINT DataInput 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 Full BOOL Empty BOOL DataOutput UINT DataInput 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 BOOL ReSet BOOL Hold UINT OutputControl BOOL ElapsedTime 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 OutputControl T T+TH T+TH 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 BOOL ReSet BOOL Hold UINT OutputControl BOOL ElapsedTime 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 BOOL UINT USINT DestinationAddress DestinationAddress Strobe SegmentNumber Active MaxSegmentNumber DataLength 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 UINT USINT Strobe DestinationAddress SegmentNumber Active MaxSegmentNumber DataLength Error BOOL UINT 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 BOOL Greater BOOL TIME OF DAY RealTime Equal BOOL DAY OF WEEK WeekDay Less BOOL DATE RealDate Error BOOL UINT VariableDate UINT VariableTime 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 DATE AND TIME EN PDT Q 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 BOOL
ReSet BOOL Hold OutputControl BOOL ElapsedTime UINT PresetTime UINT 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 OutputControl T T+TH T+TH 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 BOOL ReSet BOOL Hold OutputControl BOOL ElapsedTime UINT PresetTime UINT 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 UINT USINT Strobe SourceAddress SegmentNumber Active MaxSegmentNumber DataLength Error BOOL UINT 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 Error UINT 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 Set BOOL PulseOutput BOOL Period UINT 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 BOOL ReSet PulseOutput BOOL ElapsedTime UINT PresetTime UINT 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 CallUpValue USINT 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 Predivide=512 Mode=1 SetpointValue=1 CallUpNumber 0 1024 1 2 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 BOOL UINT USINT SourceAddress SourceAddress Strobe SegmentNumber Active MaxSegmentNumber DataLength Error BOOL UINT 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 256 256 256 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 POU-k max. száma egy projektben a projektnév max. hossza a neveknek az első 8 karakterben különbözőknek kell lenni! 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 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) programonkénti instancálások száma 2) egy tömb max
dimenziója index tartomány megengedett értéke felsorolás típusú változók max. elemszáma 0.255 255 -2147483648 -2147483648 .+2147483647 +2147483647 65000 65000 159 Sucosoft határértékek PS4-200 PS4-300 PS416 253 karakter 1024 karakter 1024 karakter 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 egy STRING változó max. mérete globális típus definíciók max. száma 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