Az S40 PLC-programozási nyelv (IEC1131-3 kompatibilis) elemkészletének ismertetése



Hasonló dokumentumok
Ütem Lámpafázisok A számláló értéke ütemmerker 1 P 0 M1 2 P 1 M2 3 P S 2 M3 4 Z 3 M4 5 Z 4 M5 6 Z 5 M6 7 Z 6 M7 8 S 7 M8

Készítette: Oláh István mestertanár

Irányítástechnika Elıadás. PLC-k programozása

1. eset: a háromból két motor 5 s-nál hosszabb ideig leáll. (Időkésleltetett jelzés). 2. eset: mindhárom motor leáll. (Azonnali jelzés).

Elemi adat típusok. Méret (Bit)

A BECKHOFF típusú PLC használata.

PLC programozás az IEC szabvány szerint. Jancskárné Anweiler Ildikó főiskolai docens PTE PMMFK Műszaki Informatika Tanszék

PLC programozás az IEC szabvány szerint. Jancskárné Anweiler Ildikó főiskolai adjunktus PTE PMMFK Műszaki Informatika Tanszék

A C programozási nyelv I. Bevezetés

Java II. I A Java programozási nyelv alapelemei

A C programozási nyelv I. Bevezetés

Aritmetikai utasítások I.

Irányítástechnika Elıadás. PLC-k programozása

5. KOMBINÁCIÓS HÁLÓZATOK LEÍRÁSÁNAK SZABÁLYAI

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

BASH script programozás II. Vezérlési szerkezetek

Digitális rendszerek. Utasításarchitektúra szintje

Occam 1. Készítette: Szabó Éva

Budapesti Műszaki és Gazdaságtudományi Egyetem Villamosmérnöki és Informatikai Kar Irányítástechnika és Informatika Tanszék. Önálló laboratórium

Programozás alapjai. 5. előadás

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

Digitális ki-bemenetek kezelése, bitszintű műveletek

Bevezetés a C++ programozási nyelvbe

Mintavételes szabályozás mikrovezérlő segítségével

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Algoritmizálás és adatmodellezés tanítása 1. előadás

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix

Java II. I A Java programozási nyelv alapelemei

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás

Verilog HDL ismertető 2. hét : 1. hét dia

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

az Excel for Windows programban

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Programozás alapjai. 10. előadás

Digitális technika (VIMIAA02) Laboratórium 1

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Digitális technika (VIMIAA02) Laboratórium 1

I0 I0.0 I1 I0.1 I2 I0.2. Kimenetek Q0 Q0.0 Q1 Q0.1 Q2 Q0.2 Q3 Q0.3. A be- és kimenetek közötti függvénykapcsolat

_INVHU000_WriteReadParameter.cxf Frekvenciaváltók

A C programozási nyelv III. Pointerek és tömbök.

4. Fejezet : Az egész számok (integer) ábrázolása

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Programozás II. 2. Dr. Iványi Péter

The modular mitmót system. DPY kijelző kártya C API

BASH SCRIPT SHELL JEGYZETEK

Forráskód formázási szabályok

A C programozási nyelv III. Pointerek és tömbök.

Labor gyakorlat Mikrovezérlők

Hardver leíró nyelvek (HDL)

Bevezetés az informatikába gyakorló feladatok Utoljára módosítva:

Informatika érettségi vizsga

1. Alapok. #!/bin/bash

Az IEC szabvány szoftvermodellje

LEGO robotok. XII. rész

1. előadás. Lineáris algebra numerikus módszerei. Hibaszámítás Számábrázolás Kerekítés, levágás Klasszikus hibaanalízis Abszolút hiba Relatív hiba

Szkriptnyelvek. 1. UNIX shell

Készítette: Nagy Tibor István

A SystemC programok adattípusai

Irányítástechnika Elıadás. PLC rendszerek konfigurálása

Assembly utasítások listája

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Pénzügyi algoritmusok

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

Labor gyakorlat Mikrovezérlők

Máté: Számítógép architektúrák

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 2. előadás

GPU Lab. 4. fejezet. Fordítók felépítése. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

APB mini PLC és SH-300 univerzális kijelző Általános használati útmutató

SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1

Lekérdezések az SQL SELECT utasítással

The Architecture of Computer Hardware and Systems Software: An InformationTechnology Approach 3. kiadás, Irv Englander John Wiley and Sons 2003

Informatika 1 2. el adás: Absztrakt számítógépek

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

2. tartály tele S3 A tartály tele, ha: S3=1 I tartály tele S5 A tartály tele, ha: S5=1 I 0.4

Digitális technika VIMIAA01 9. hét

SZÁMÍTÓGÉPES PROBLÉMAMEGOLDÁS

1. Jelölje meg az összes igaz állítást a következők közül!

Programozási nyelvek 6. előadás

Bevezetés a programozásba. 8. Előadás: Függvények 2.

C programozási nyelv

2. Fejezet : Számrendszerek

Az operációs rendszer szerkezete, szolgáltatásai

Apple Swift kurzus 3. gyakorlat

5. Laborgyakorlat. Számláló funkciók, időzítő funkciók.

Adatok ábrázolása, adattípusok

A programozás alapjai

8. Mezőutasítások. Schulcz Róbert 8. Mezőutasítások. v

A programozás alapjai előadás. A C nyelv típusai. Egész típusok. C típusok. Előjeles egészek kettes komplemens kódú ábrázolása

Készítette: Nagy Tibor István

Programozott soros szinkron adatátvitel

Komputeralgebra rendszerek

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Követővezérlés időzítőkkel

Digitális technika VIMIAA01

Komputeralgebra rendszerek

8. gyakorlat Pointerek, dinamikus memóriakezelés

Átírás:

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. A kézikönyvről... 5 2. A Sucosoft programstruktúrája... 5 3. 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... 17 Függvények... 19 Funkcióblokkok... 20 5. 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 16-bit bináris kódolású szám -> decimálissá alakítása... 43 _16Bit_Compare... 45 _16BitCounter 16-bites előre- /hátraszámláló... 46 ADRtoSTR vett adatbájtok STRING típusú változóvá alakítása... 48 BCDTo16BitBinary Decimális kódolású szám -> 16-bit binárissá alakítása... 49 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 CompareArray adatblokkok összehasonlítása, adott adat keresése a blokkban... 58 COMtoSTR vett adatbájtok STRING típusú változóvá alakítása... 62 CounterAlarm számláló megszakításkezelés... 64 DATconcat dátum és idő (DATE_AND_TIME) típusú változó összeállítása egyedi típusú adatokból... 68 DateConcat dátum (DATE) típusú változó összeállítása egyedi típusú adatokból... 70 DateSplit dátum (DATE) típusú változó szétválasztása egyedi típusú adatokra... 71 3

DATsplit dátum és idő (DATE_AND_TIME) típusú változó szétválasztása egyedi típusú adatokra... 72 DE4netK DF4 frekvenciaváltók kommunikációs modulja... 74 Deserialize tömbből tetszőleges formátumú adatok kiválasztása... 77 EdgeAlarm változásfigyelés megszakításkezelés... 79 FifoBx 8-bites csőtár regiszter... 83 FifoWx 16-bites csőtár regiszter... 86 GetRealTimeClock Valós idejű óra kiolvasása... 89 LifoBx 8-bites veremtár regiszter... 90 LifoWx 16-bites veremtár regiszter... 92 MI4netK MI4 kijelzők kommunikációs modulja... 94 MS_TimeFalling Elejtésre késleltetett időzítő (milliszekundumos megadással)... 95 MS_TimeRising Meghúzásra késleltetett időzítő (milliszekundum megadással)... 97 ReadMC adatok olvasása a flash-memóriából... 99 ReloadData adatok olvasása a flash-memóriából (címváltozók RealTimeClock alkalmazásával)... 102 valós idejű óra összehasonlítása egyedi bemeneti adatokkal... 104 RTC valós idejű óra állítása... 108 S_TimeFalling Elejtésre késleltetett időzítő (szekundumos megadással)... 109 S_TimeRising Meghúzásra késleltetett időzítő (szekundum megadással)... 111 SaveData adatok írása a flash-memóriába (címváltozók alkalmazásával)... 113 SCO transzparens soros vonali kommunikáció... 115 Serialize tetszőleges adatstruktúra bájtos tömbbe való másolása... 125 SetRealTimeClock Valós idejű óra állítás... 128 SR_x bites léptető regiszter... 130 SRB_x bájtos lépető regiszter... 133 SRW_x szavas lépető regiszter... 136 STRtoADR STRING típusú változó adott címterületre másolása... 139 STRtoCOM STRING típusú változó adott címterületre másolása... 140 TimeConcat idő (TIME) típusú változó összeállítása egyedi típusú adatokból... 141 TimeGenerator ütemadó impulzusgenerátor... 143 TimePulse impulzusképző... 145 TimerAlarm időzítéses megszakításkezelés... 147 TimeSplit TODconcat TODsplit idő (TIME) típusú változó szétválasztása egyedi típusú adatokra... 150 napi idő (TOD) típusú változó összeállítása egyedi típusú adatokból... 152 idő (TIME_OF_DAY) típusú változó szétválasztása egyedi típusú adatokra... 153 TransferArray adatblokk másolása, inicializálása... 154 WriteMC adatok írása a flash-memóriába... 156 7. Sucosoft határértékek... 159 4

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_BLOCK END_ 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. SINT INT DINT 1) USINT UDINT 1) Kulcsszó adattípus bitfoglalás default érték kétértékű bináris szám, értéke: 1(igaz) vagy 0,(hamis) short integer; rövid egész szám értéke: -128.+127 integer; egész szám értéke: -32 768.+32 767 double integer; dupla egész szám értéke:-2 147 483 648..+2 147 483 647 unsigned short integer; előjel nélküli rövid egész szám, értéke: 0 255 unsigned integer; előjel nélküli egész szám, értéke 0 65 535 unsigned double integer; előjel nélküli dupla egész szám, értéke: 0 4 294 967 295 1 0 8 0 16 0 32 0 8 0 16 0 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:0..64d-1ms T#0s DATE dátum formátum; YYYY-MM-TT D#1900-01-01 TIME_OF_DAY időpont formátum: HH:MM:SS TOD#00:00:00 DATE_AND_TIME dátum és idő DT 1900-01-01-00: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) csak a PS4-300 és Ps416 esetén 6

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 R_EDGE és F_EDGE adattípusok (csak PS4-200 és PS4-300 esetén) A R_EDGE (felfutó él) és a 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 (_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. FUNCTION_ BLOCK ADDRESS# ANY_REAL ANY_INT REAL REAL* SINT DATE DATE INT BYTE BYTE TIME_OF_DAY TIME_OF_DATE (TOD) (TOD) TIME DINT* WORD DATE_AND_TIME (DAT) (DAT) USINT DWORD* 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 TYPE END_TYPE kulcsszavakkal történik. A származtatott adattípusok definiálásával a kulcsszavak közé egyedi adattípusú változókat tud bevezetni. példa: TYPE Analogertek : INT ; END_TYPE Ertek1 : Analogertek ; 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 TYPE END_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 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! Meresi_Ertek1 : analogertek_1 ; Meresi_Ertek2 : feszultseg ; Kazan_Temp : temperatur ; 8

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 K_Lampa1 : Kozl_lampa ; K_Lampa2 : Kozl_lampa ; K_Lampa3 : Kozl_lampa ; Auto_Allj : ; A program utasításrészében az egyes definiált értékek közvetlenül is felhasználhatók. LD EQ St K_Lampa1 piros 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,1..3,1..4] 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 tomb1 : tomb_5_int ; tomb2 :tomb_24_int ;.. 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: := 1 ; meres2: INT := -15 ; meres3: := 100; meres4: REAL := 10.2; END_STRUCT END_TYPE allomas1 : Berendezes_Adatok ; allomas2 : Berendezes_Adatok ; LD. allomas1. meres3 10

Adattípusok END_PROGRAM példa: kezdeti értékadás a deklarálás után PROGRAM struktur TYPE Berendezes_Adatok : STRUCT meres1: ; meres2: INT ; meres3: ; meres4: REAL ; END_STRUCT := (meres1 :=1, END_TYPE meres2 := -15, meres3 := 100, meres4 : =10.2) ; allomas1 : Berendezes_Adatok ; allomas2 : Berendezes_Adatok ; 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, INT, é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. 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 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. AT AT %I0.0.0.0.0 : ; Bemenet1 AT %I0.0.0.0.1 : ; Eredmeny : ; LD AND ST Bemenet1 %I0.0.0.0.0 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 (, 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

lehet összefogni. Változók 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 _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: digitális bemenet Q: digitális kimenet M: memóriaterület IA: analóg bemenet QA: analóg kimenet IC: számláló bemenet IS: status információs bemenet (diagnosztika) SD: intelligens Suconet K résztvevőnek küldendő adat RD: 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.0.0.0.0 B bájt 8 bit %IB0.0.0.0 W szó 16bit %IW0.0.0.0 D duppla szó 32bit %ID0.0.0.4 A direkt című változók memóriabeli szervezése a következő kimeneti változón (Q) látható: QD0.0.0.0 QD0.0.0.4 QW0.0.0.0 QW0.0.0.2 QW0.0.0.4 QW0.0.0.6 QB0.0.0.0 QB0.0.0.1 QB0.0.0.2 QB0.0.0.2 QB0.0.0.4 QB0.0.0.5 QB0.0.0.6 QB0.0.0.7 Q0.0.0.0.0 Q0.0.0.1.0 Q0.0.0.2.0 Q0.0.0.2.0 Q0.0.0.4.0 Q0.0.0.5.0 Q0.0.0.6.0 Q0.0.0.7.0 Q0.0.0.0.7 Q0.0.0.1.7 Q0.0.0.2.7 Q0.0.0.2.7 Q0.0.0.4.7 Q0.0.0.5.7 Q0.0.0.6.7 Q0.0.0.7.7 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ó _GLOBAL _EXTERNAL _INPUT _OUTPUT _IN_OUT TYPE Felhasználás lokális változók; érvényességi körük csak az adott POU-ra, ahol definiálásra kerültek, vonatkozik. 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 _EXTERNAL típusként kell deklarálni. Ha egy FB-ben egy globálisan deklarált változó kerül felhasználásra, akkor az azonos névvel és _EXTERNAL típusként kell deklarálni. 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. 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. 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 FB.n belül értékadás történhet, írásvédett változót (pl. CONSTANT) a _IN_OUT-ként nem lehet használni. A TYPE kulcsszó a származtatott adattípusok jelölésére szolgál. Minden egyes adatblokkot az, vagy END_TYPE kulcsszavakkal kell lezárni. A _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 _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 _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 _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 _GLOBAL word_array : array[0..200] of word ; my_function_block : demo ; cal my_function_block(w_array :=word_array) END_PROGRAM FUCTION_BLOCK demo _IN_OUT w_array : array[0..200] of word ; seged1 : word ; seged2 : word ; 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ó RETAIN CONSTANT AT Felhasználás 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 vagy a _GLOBAL után szóközzel írandó. Amennyiben egy adatelem konstansként, azaz értéke állandóként definiálandó, akkor a CONSTANT attribútum használható. A CONSTANT kulcsszó a vagy a _GLOBAL után szóközzel írandó. 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 FU FB PRG _INPUT _OUTPUT _IN_OUT _GLOBAL _EXTERNAL TYPE * * * Funkcióblokkok helyfoglalása 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! 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 _IN_OUT típusú változók, melyeket minden híváskor paraméterezni kell, különben szintaktikai hiba lép fel a fordítás során. 16

Utasításkészlet 4. POU-k programutasítási része Utasításkészlet Operátor Operandus Jelentés LD ANY az operandus bemásolása a z akkumulátorba LDN ANY_BIT a negált operandus bemásolása a z akkumulátorba ST ANY az akkumulátor tárolása az operandusba STN ANY_BIT az akku negált értékének tárolása az operandusba S az operandus = 1, ha az akku értéke 1 R 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 MUL 1) ANY_INT szorzás DIV 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 REAL 1) 13.12 123.45 0.123 1.23E-3 egész szám; -13 egész szám; 45 165 egész szám; 125 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 DATE TIME_OF_DAY T#12.3ms vagy TIME#12.3ms DATE#1995-12-24 vagy D#1995-12-24 TOD#12:05:14.56 vagy TIME_of_DAY#12:05:14.56 DATE_AND_TIME DT#1995-12-24-12:05:14.56 v. DATE_AND_TIME#1995-12-24212:05:14.56 1) csak a PS4-300 és Ps416 esetén 12,3ms időtartam dátum: 1995 12. 24. időpont: 12óra 5perc, 14,56másodp. dárum és idő együtt: 1995 12. 24 12óra 5perc, 14,56másodperc 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 _INPUT A : INT ; (* deklarációs rész *) B : INT ; C : INT ; LD A (* utasításrész *) ADD B ADD C ST szumma PROGRAM pr_sum tenyezo1 : INT := 1 ; tenyezo2 : INT := 2 ; tenyezo3 : INT := 3 ; eredmeny : INT ; 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.0.0.2 bemenet írása nem megengedett! LD Start ST FBx.IN1 CAL FBx kimenet olvasása LD OUT1 AND IN2 ST OUT1 kimenet írása LD 100 ST OUT1 CAL LD ST FBx(IN1 := Be, ) FBx.OUT1 %QW0.0.0.2 nem megengedett! Ha a bemeneti operandust, mint él figyelést kell alkalmazni, akkor a változót ennek megfelelően (pl. start : _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

A középértékképzést végző funkcióblokk prototípusa a következő: FUNCTION_BLOCK kozepertek _INPUT Reset : ; Bem1 : USINT ; Bem2 : USINT ; _OUTPUT atlag : USINT ; LD Bem1 ADD Bem2 DIV 2 St atlag END_FUNCTION_BLOCK Utasításkészlet 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 Instanz1_nev : kozepertek ; Instanz2_nev : kozepertek ; ertek1 AT %IB0.0.0.0 : USINT ; ertek2 AT %IB0.0.0.1 : USINT ; eredmeny1 AT %QB0.0.0.0 : USINT ; eredmeny2 AT %QB0.0.0.1 : USINT ; torles AT %I0.0.0.2.0 : ; (* FU hívás - 1. eljárás *) Cal Instanz1_nev (Reset := torles, Bem1 := ertek1, Bem2 := ertek2) LD Instanz1_nev.atlag St eredmeny1 (* FU hívás - 2. eljárás *) LD torles St torles LD ertek1 ST Instanz2_nev.bem1 LD ertek2 ST Instanz2_nev.bem2 Cal Instanz2_nev LD Instanz2_nev.atlag St eredmeny2 END_PROGRAM A csak egyszer kialakított FB szükség szerint többször is (más-más nevekkel) meghívható. 21

Utasításkészlet A neveket a fölérendelt hívó POU-ban kell deklarálni. A deklarálás során az egyedi neveket (itt: Instanz1_nev, Instanz2_nev) és a funkcióblokk prototípusát (itt: kozepertek) is meg kell adni. A Sucosoft a szükséges memóriaterületet az instancált FB-hez hozzárendeli, azaz a funkcióblokk minden egyes alkalmazásánál a belső adatok is letárolásra kerülnek. A funkcióblokk hívásakor (Cal Instanz1_nev) a történik meg a tulajdonképpeni paraméterezés, azaz ekkor rendelődnek hozzá a funkcióblokk bemeneti paramétereihez az adott specifikus változók. Az egyes operandusokat kerek zárójelben egymástól vesszővel elválasztva kell megadni. A funkcióblokk kimeneti paramétereit direkt hozzárendeléssel lehet átadni más változóknak: LD Instanz1_nev.atlag ST eredmeny1 A második eljárás esetén a funkcióblokk hívása előtt az egyes instanz-specifikus változókat, az akkumulátor segítségével, átadjuk a funkcióblokk bemeneti paramétereinek. Maga a funkcióblokk hívás nem tartalmaz semmilyen paraméter átadást. A funkcióblokk eredmények hasonló módon letárolódnak, és az LD utasítással megszólíthatók. Továbbá úgynevezett Moeller-specifikus funkcióblokk hívás is realizálható. Ekkor a be- /kimeneti paraméterátadás egymástól elválasztva a -jellel egyszerre történik. Példa: Cal Instanz3_nev (Reset := torles, Bem1 := ertek1, Bem2 := ertek2 eredmeny := atlag) Természetesen a három eljárás egymással keverve is használható, azaz lehet egyes értékeket akkumulátoron át paraméterezni, és a többi szükségeset pedig a CAL hívással együtt! 22

Függvények 5. Függvények A Sucosoft S40 a függvények nagy választékát nyújtja a programozás részfeladatainak megkönnyítésére. Az IEC 1131-3 által definiált függvényeken kívül a Moeller Electric a PLC-khez további gyártó specifikus függvényeket is készített, melyek kihasználják a PLC egyedi adottságait. Ezek használata tovább könnyítheti az egyes felhasználói alkalmazások elkészítését. Az alábbiakban csoportosítva felsoroljuk a fontosabb függvényeket: Függvények Jelentésük Adattípusokat konvertáló függvények... 25 *_TO_** TRUNC típuskonverziók elemi adattípusok között REAL szám egészét adja ANY_INT adattípusban Numerikus függvények... 27 ABS NEG abszolút értékképzés 2-es komplemens képzés Aritmetikai függvények... 27 ADD MUL SUB DIV MOD összeadás szorzás kivonás egész számú osztás 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 SHR ShiftLeftCarry ShiftRightCarry ROL ROR bitmintát adott értékkel balra tolni bitmintát adott értékkel jobbra tolni bitmintát - carry biten - át adott értékkel balra tolni bitmintát - carry biten - át adott értékkel jobbra tolni bitmintát adott értékkel balra forgatni 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 bemenet kimenet SINT INT DINT 1) USINT UDINT 1) SINT X X X X X X X X X X X INT X X X X X X X X X X X DINT 1) X X X X X X X X X X X USINT X X X X X X X X X X X X X X X X X X X X X X X UDINT 1) X X X X X X X X X X X REAL 1) X X X X X X X X X X X X X X X BYTE X X X X X X X X X WORD X X X X X X X X X DWORD 1) X X X X X X X X X DATE_AND_TIME X X TIME X X BCD X X X X X X STRING 1) ADDRESS 2) 1) csak a PS4-300 és PS416 esetén 2) csak a PS4-200 és PS4-300 esetén X X REAL 1) BYTE WORD DWORD 1) TOD DATE STRING 1) BCD 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. 1010_0101 1111_1111 0010_0101 SINT átalakítása WORD típussá 2. A BYTE típusú adat legfelsőbb bitje nincs kiértékelve, ha az /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 típussá, illetve pl. 1010_0101 0000_0000 1010_0101 BYTE átalakítása típussá 3. 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.: 1.4 1 1.4-1 1.6 2 1.6-2 1.5 2 2.5 2 0.5 0 3.5 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_ és a TIME_TO_USINT függvények esetén a 65535, illetve 255- nél nagyobb eredmények érvénytelenek. Az eredmény helyessége az IsOverflow függvénnyel kérdezhető le. 5. A STRING_TO_ 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 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 ADD SUB MUL DIV ADD SUB 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_TIME 1) 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 DATE 1) DATE TIME TIME_OF_DAY TIME TIME_OF_DAY TIME_OF_DAY TIME_OF_DAY TIME DATE_AND_TIME 1) TIME DATE_AND_TIME DATE_AND_TIME 1) 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 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 Edge : R_TRIG; (* felfutó vizsgálatát végző FB *) Signal : AT %I0.0.0.0.0 : ; Pulse : ; Number1 : SINT := 127; 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. PROGRAM carrybit Edge : R_TRIG; Signal : AT %I0.0.0.0.0 : ; Pulse : ; Byte1 : BYTE := 2#11110000; 28

LD Byte1 SHL 3 BYTE_TO_USINT IsCarry (* Carry regiszter = 1 *) CALC Edge (CLK := Signal) LD Edge.Q ST Pulse END_PROGRAM Függvények IsBitTrue: az akkumulátorba elhelyezett bitminta (ANY_BIT) tetszőleges bitjének vizsgálatára alkalmas. PROGRAM bittest BitPattern : BYTE := 2#11010011 Position : := 4; BitValue : ; LD BitPattern IsBitTrue Position ST BitValue (* bit értéke: 1 *).. END_PROGRAM 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 Number: INT := 127; Result_integ : INT; ResultRemainder : INT; LD Number DIV 4 ST Result_integ (* osztás eredménye : 31, egész *) GetCarryRegister ST ResultRemainder (* maradék : 3 *).. END_PROGRAM 29

Függvények Bit mozgatások SHL a Az akkumulátorban levő ANY_BIT típusú bitmintát a függvény SHR 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 BitPattern : BYTE := 2#01110001; Places : INT := 3; NewBitPattern: BYTE; LD BitPattern ROL Places ST NewBitPattern (* új bitminta: 2#10001011 *) END_PROGRAM 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: ShiftLeftCarry: új átviteli bit bitminta régi átviteli bit C 7 0 C ShiftRightCarry: C 7 0 C PROGRAM shi_jobb BitPattern : BYTE := 2#01011100; NewBitPattern : BYTE; LD BitPattern ShiftRightCarry ST NewBitPattern (* új bitminta: x0101110 ahol "x" *) (* a 7. bitpozicíóban az átvitelbit régi értéke *).. END_PROGRAM ROL ROR A függvények az akkumulátor tartalmát (ANY_BIT) a függvény paramétereként 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 BitPattern : BYTE := 2#01110001; Places : INT := 3; NewBitPattern: BYTE; 30

Függvények LD BitPattern ROL Places ST NewBitPattern (* az új bitminta: 2#10001011 *) END_PROGRAM 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 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 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 (ISA, (* start utáni első programciklus *) 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 Hours : USINT ; 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

PS4-300 esetén: TYPE ALARM_CHANNEL (CounterAlarm_Channel, (* 0 *) 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 Függvények 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 _GLOBAL Intermediate_storage: INT ; Edgealarm : EdgeAlarm ; I_Routine : AlarmFB ; LD ICS (*start figyelés, mert a megszakításkérést PLC_Message (*FB-t csak egyszer kell hívni *) CALC Edgealarm (EnableDisable := 1, Number := 0, RisingEdge := 0, SetPointValue := 1, Subroutine := I_Routine) LD EdgeAlarm_Channel Disable_Interrupt (* EdgeAlarm megszakításk. tiltás *) LD 500 ST Intermediate_storage LD EdgeAlarm_Channel Enable_Interrupt (* megszakításkérés engedélyezés *) END_PROGRAM 33

Függvények FUNCTION_BLOCK AlarmFB _EXTERNAL Intermediate_storage: INT ; 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 Text: STRING := 'Term'; TextLength : INT; LD Text LEN ST TextLength (* szöveg hossza: 7 *) END_PROGRAM CONCAT Több karakterláncot fűz egy újabb karakterláncba. PROGRAM n_texts Text1 : String := 'ab'; Text2 : STRING := 'cd'; Text3 : STRING := 'ef'; Texts_1_2_3 : STRING; LD Text1 CONCAT Text2, Text3 ST Texts_1_2_3 (* Texts_1_2_3: 'abcdef' *) END_PROGRAM Másik alkalmazási lehetőség, dátum és idő egy változóba való összefűzése. PROGRAM deadline Date : DATE := D#1997-05-10; Time : TIME_OF_DAY := T0D#6:35:00.00; Date_and_Time : DATE_AND_TIME; 34