Two countries, one goal, joint success!
E- Laboratórium 3 Az ABB robotok alkalmazásai Elméleti leírás Egy RAPID program bizonyos számú parancsból áll, amik leírják a robot működését. A különböző parancsoknak konkrét utasítások felelnek meg, mint például a robot mozgatása, a kimenet beállítása, stb. Az utasításokhoz argumentumok tartoznak, amik meghatározzák mi fog bekövetkezni egy utasítás során. Például egy kimenet alaphelyzetbe állítására vonatkozó utasítás egy olyan argumentumot tartalmaz, amely meghatározza a használt kimenetet. 1. A program logikája A program szekvenciálisan hajtódnak végre, vagyis utasításonként. Esetenként szükség van utasításokra, amelyik megszakítják a szekvenciális végrehajtást és meghívnak egy másik utasítást az esetlegesen fellépő helyzetek kezelése érdekében. Komplexebb programok esetén érdemes szabályozni, hogy melyik kód legyen végrehajtva, milyen sorrendben, és hányszor. A program menetét a következő elvek alapján lehet irányítani: Egy másik rutin meghívása által, és a rutin végrehajtása után, folytatva a végrehajtást a rutin meghívást követő utasítással. Különböző utasítások végrehajtása által, attól függően, hogy teljesül-e egy adott kondíció. Egy utasítási szekvencia bizonyos számú ismétlése által, vagy egy adott feltétel teljesüléséig. Ugyanazon rutinon belül egy címkéhez történő mozgással. A program végrehajtásának leállításával. 1.1. Egy másik rutin meghívása Instruction
Used to: Meghív (ugrik) egy másik rutint (-hoz) Konkrét nevű meghívási folyamatok Visszalép az eredeti rutinhoz
ProcCall CallByVar RETURN 1.2. Program irányítás a rutinon belül Utasítás
Felhasználás: Egy utasítás végrehajtása csak ha teljesül a feltétel Egy sor különböző utasítás végrehajtása, ha teljesül a feltétel. Egy programszakasz ismétlése bizonyos alkalommal Egy sor különböző utasítás ismétlése amíg az adott feltétel teljesül Különböző utasítások végrehajtása a kifejezés értékétől függően Ugrás egy címkéhez Egy címke megadása (sor név)
Compact IF IF FOR WHILE TEST GOTO Label
30
www.huro-cbc.eu
Two countries, one goal, joint success!
IF Ha a logikai feltétel az IF állításban igaz, akkor a THEN és ENDIF kulcsszavak közti kódszakasz végrehajtódik. Ha az utasítás hamis, nem hajtódik verge a kód, és a végrehajtás az ENDIF után folytatódik. Példa: Ebben a példában a string1 karakterlánc a FlexPendantra íródik ha az nem egy üres karakterlánc. Ha a string1 üres, vagyis nem tartalmaz karaktereket, nem történik semmi. VAR string string1 := "Hello"; IF string1 <> "" THEN TPWrite string1; ENDIF ELSE Egy IF állítás akkor is tartalmazhat végrehajtandó programkódot, ha a feltétel hamis. Ha az IF állításban található logikai feltétel igaz, akkor végrehajtódik a THEN és ELSE kulcsszavak közötti kód. Viszont ha a feltétel hamis, az ELSE és ENDIF közötti kód hajtódik végre. Példa: A string1 karakterlánc a FlexPendantra íródik, ha a string1 nem üres. Ha üres, akkor “A string üres” szöveg lesz kiírva. VAR string string1 := "Hello"; IF string1 <> "" THEN TPWrite string1; ELSE TPWrite "The string is empty"; ENDIF ELSEIF Esetenként több mint két különböző programsorunk van. Ekkor az ELSEIF-et használhatjuk több alternative felállítására. Példa: Különböző szövegeket íratunk ki a változó idő értékétől függően. VAR numtime := 38.7; IF time < 40 THEN TPWrite "Part produced at fast rate"; ELSEIF time < 60 THEN TPWrite "Part produced at average rate"; ELSE TPWrite "Part produced at slow rate"; ENDIF FOR hurok A program menetének egy másfajta irányítására szolgál egy kódsor ismétlése. Példa: A következő kód ötször fogja kiírni azt, hogy “Hello”: FOR i FROM 1 TO 5 DO TPWrite "Hello"; ENDFOR WHILE hurok Egy kódsor ismétlését kombinálni lehet a kódsor feltételes végrehajtásával. A WHILE hurok segítségével a program addig ismétli a kódsor amíg igaz a feltétel. Példa: A következő programkód számokat fog összeadni (1+2+3+...) amíg az eredmény el nem éri a 100-at. 31
www.huro-cbc.eu
Two countries, one goal, joint success!
VAR numsum := 0; VAR numi := 0; WHILE sum <= 100 DO i := i + 1; sum := sum + i; ENDWHILE 1.3. Program végrehajtásának megállítása Utasítás Stop EXIT
Felhasználás: Program végrehajtásának megállítása Program végrehajtásának megállítása amikor nem megengedett a program újraindítása Program végrehajtásának ideiglenes megállítása hibajavítási céllal Program végrehajtásának megállítása és robot mozgatása
Break SystemStopAction
1.4. Jelenlegi ciklus megállítása Utasítás
Felhasználás: A jelenlegi ciklus megállítása, és a program mutatójának a fő rutin első utasításához való mozdítása. Ha a CONT végrehajtási módot kiválasztjuk, a végrehajtás a következő program ciklussal folytatódik.
ExitCycle
2. A szintaxis elemei Az utasítások és alprogramok leírása egyszerűsített és formális szintaxis segítségével történik. Ha a FlexPendant-ot programozásra használjuk, általában csak az egyszerűsített szintaxisra less szükség, mivel a robot automatikusan megbizonyosodik arról, hogy a helyes szintaxis legyen használva. Példa: TPWrite [String’:=’] <expression (IN) of string> [’\’Num’:=’ <expression (IN) of num> ] | [’\’Bool’:=’ <expression (IN) of bool> ] | [’\’Pos’:=’ <expression (IN) of pos> ] | [’\’Orient’:=’ <expression (IN) of orient> ]’;’
A [] szögletes zárójelek közti szöveg elhagyható. Az egymás kölcsönösen kizáró argumemntumokat, vagyis nem szerepelhetnek egyszerre az utasításban, | függőleges vonal választja el. Azok az argumentumok melyek akárhányszor ismétlődhetnek, kapcsos zárójelbe kerülnek { }. A szimbólumok amelyek a helyes szintaxist szolgálják, egyszerű idézjőjelbe tesszük ’ ’. Az argumentum adattípusa és más jellemzők < > jelek közé kerülnek. Részletesebb információt a rutin paraméterek leírásánál találhatunk. 32
www.huro-cbc.eu
Two countries, one goal, joint success!
A !-el kezdődő sorokat a robot controller nem értelmez. A kóddal kapcsolatos megjegyzések írására szolgál. 3. Utasítások Egy RAPID utasítás egy előre elkészített folyamatként működik. Egy utasítás meghívása olyan mint egy eljárás meghívás, amit argumentum értékek követnek. Az utasítások sorban hajtódnak verge, kivéve ha egy program folyamat utasítás, egy megszakítás, vagy egy hiba következtében a végrehajtás máshol folytatódik. A legtöbb utasítást egy pontosvessző zárja “;”. A címkék kettősponttal végződnek “:”. Az utasítások egy része tartalmazhat más utasításokat, és specifikus kulcsszavak zárják őket.. 4. Kifejezések Egy kifejezés meghatározza egy érték kiértékelését. Például a következő esetekben használható: egy hozzárendelési utasításban pl. a:=3*b/c; feltételkémt egy IF utasításban pl. IF a>=3 THEN ... argumentumként egy utasításban pl. WaitTimetime; argumentunként egy függvény meghívásnál pl. a:=Abs(3*b); 4.1. Aritmetikai kifejezések Egy számadat kiértékelésére szolgál.
1) Az eredmény ugyanazt a típust kapja mint az operandus. Ha az operandusnak van egy alias adat típusa, az eredmény kap egy alias “alap” típust (num vagy pos). 2) Integer műveletek, pl. 14 DIV 4=3, 14 MOD 4=2. (A nem-integer operandusok nem megengedettek.) 3) Megtartja az integer képviseletet amíg az operandusok és az eredmények az integer a num típus integer aldomain-jén belül maradnak.
33
www.huro-cbc.eu
Two countries, one goal, joint success!
4.2. Logikai kifejezések A logikai kifejezéseket logikai értékek kiértékelésére használjuk. (IGAZ/HAMIS).
1) Csak érték adattípusok. Az operandusoknak azonos típusaik kell legyenek. 4.3. String kifejezések Stringeken végzett műveleteknél alkalmazhatóak.
4.4. Adatok felhasználása kifejezésekben Egy teljes változó, perszisztens, vagy konstans része lehet egy kifejezésnek. Tömbök Egy tömbként deklarált változót, perszisztenst, vagy konstanst hozzá lehet rendelni a teljes tömbhöz vagy egy eleméhez. Példa:
VAR num row{3}; VAR num column{3}; VAR num value; . value := column{3}; row := column;
csak egy tömb-elem a tömb összes eleme
Rekordok Egy tömbként deklarált változót, perszisztenst, vagy konstanst hozzá lehet rendelni a teljes rekordhoz, vagy egy eleméhez. Egy rekord komponensre a komponens neve által lehet utalni. Példa: VAR pos home; VAR pos pos1; VAR num yvalue; 34
www.huro-cbc.eu
Two countries, one goal, joint success!
.. yvalue := home.y; pos1 := home;
the Y component only the whole position
4.5. Aggregátumok használata kifejezésekben Az aggregátumokat rekord vagy tömb értékeknél használjuk. Példa:
pos := [x, y, 2*x]; posarr := [[0, 0, 100], [0,0,z]];
rekord aggregátum helyzet tömb aggregátum helyzet
Meg kell lehessen határozni egy aggregátum adattípusát a környezetből. Példa:
VAR pospl; p1 :=[1, -100, 12];
aggregátum típus helyzet – p1 által meghatározott
IF [1, -100, 12] = [a,b,b,] THEN
nem megengedett, mivel egyik aggregátum adattípusát sem lehet meghatározni a környezetből.
4.6. Függvények meghívása kifejezésekben Egy függvény meghívása elindítja egy meghatározott függvény kiértékelését, és megkapja a függvény által visszaadott értéket. Példa: sin(szög) Egy függvénymeghívás argumentumai a meghívott függvény irányába (vagy irányából) történő adatátvitelre vannak felhasználva. Egy argumentum adattípusa meg kell egyezzen a megfelelő függvény parameter típusával. A kötelező argumentumokat vessző választ el az előző argumentumtől. A hivatalos parameter neveket nem kötelező leírni. Példa:
Polar(3.937, 0.785398) Polar(Dist:=3.937, Angle:=0.785398)
két kötelező argumentum ... a nevek leírásácal
5. Függvények A RAPID függvények hasonlítanak az utasításokra, azzak a különbséggel, hogy visszaadnak egy értéket, amit hozzá lehet rendelni egy változóhoz. 6. Változó típusok Három adattípus létezik: változók, persistent-ek és konstansok. Egy változó új értéket kaphat a program végrehajtás során. A persistentre tekinthetünk perszisztens változóként. Ez úgy valósul meg, hogy a persistent értékének frissítése a persistent deklarálási értékének frissítését okozza. A konstans statikus érték, amihez nem lehet új értéket rendelni. 6.1. Változók A változókat a VAR kulcsszóval deklaráljuk, a következő szintaxist követve: 35
www.huro-cbc.eu
Two countries, one goal, joint success!
VAR datatype identifier; Példa:
VAR num length; VAR string name; VAR bool finished; 6.2. Persistentek
A persistent változók alapjában véve megfelelnek a hagyományos változóknak, azzal a különbséggel, hogy emlékeznek a legutóbbi értékükre, akkor is ha a program újraindul. A persistenteket nem lehet a rutinon belül deklarálni, csak a modul szintjén. Persistenteket rendszer globálisként, taszk globálisként, vagy lokálisként lehet deklarálni. Példa:
PERS numglobalpers := 123; TASK PERS numtaskpers := 456; LOCAL PERS numlocalpers := 789; 6.3. Konstansok
A konstans, a változóhoz hasonlóan egy értéket tartalmaz, viszont ezt az értéket mindig a deklarációnál adjuk meg, és később nem lehet változtatni. Példa: CONST numpi := 3.141592654; CONST numgravity := 9.81; CONST string greating := "Hello" 7. Adatstruktúrák Sokfajta adattípust tartalmaz a RAPID program. Ezek közül három általános adattípusra fogunk koncentrálni: Adattípus
Leírás Numerikus adat, amely lehet integer, vagy decimális szám. Pl. 10 or 3.14159. Karakterlánc. Pl. "Ez egy string". Maximum 80 karaktert tartalmazhat. Logikai változó. Csak az IGAZ vagy HAMIS értékeket veheti fel.
Num String Bool
7.1. Adat hatásköre Leírja, milyen területen látható az adat. Egy adatdeklarálás opcionális helyi irányelve az adatot lokálisként (modulon belüli) osztályozza, ellenkező esetben az adat globális. A helyi irányelvet nem lehet a rutinon belül használni, csak a modul szintjén. Példa:
LOCAL VAR numlocal_variable; VAR numglobal_variable;
A rutinon kívül deklarált adatot program adatnak nevezzük. A következő hatáskör szabályok érvényesel a program adatokra:
36
www.huro-cbc.eu
Two countries, one goal, joint success!
Az előre meghatározott vagy globális program adatok hatásköre magában foglalhatja bármelyik modult. A lokális program adatok hatásköre tartalmazza a modult amiben elhelyezkedik. A hatáskörén belül a lokális program adatok elrejtik a velük azonos nevű globális adatot, vagy rutint (utasításokat és predefiniált rutinokat és adatokat is). A rutinon belül deklarált adatot rutin adatnak nevezzük. Megjegyezzük, hogy a rutin paramétereit is rutin adatként kezeljük. A következő hatásköri szabályok érvényesek a rutin adatokra: A rutin adatok hatásköre magában foglalja a rutint amelyben elhelyezkedik. A hatáskörén belül, a rutin adat elrejti az összes többi azonos nevű rutint vagy adatot. 7.2. Adat inicializálás Egy konstans vagy változó inicializációs értéke egy állandó kifejezés lehet. Egy persistent inicializációs értéke csak egy konkrét érték lehet Example: CONST numa := 2; CONST numb := 3; ! Helyes szintaxis CONST numab := a + b; VAR numa_b := a + b; PERS numa__b := 5; ! Hibás szintaxis PERS numa__b := a + b; 8. Program modulok Egy RAPID program egy vagy több modulból állhat. Mindegyik modul egy vagy több eljárást tartalmazhat. Egy program modul többfajta adatból és rutinból állhat. Az egyik modul tartalmazza a a bevezető eljárást, egy globális eljárást ami a main (fő) nevet viseli. A program végrehajtása nem más mint a main eljárás végrehajtása. A program számos modult tartalmazhat, de ezek közül csak egynek lesz main eljárása. 8.1 A modul felépítése A program rendszer és program modulokra bontható:
37
www.huro-cbc.eu
Two countries, one goal, joint success!
A modul deklaráció meghatározza a modul nevét és tulajdonságait. Ezeket a tulajdonságokat csak üzemen kívül lehet beállítani, nem a FlexPendant használatával. Néhány példa modul tulajdonságokra: Tulajdonság SYSMODULE
A modul, ha meg van adva: rendszer modul, máskülönben program modul nem lehet megadni a lépésenkénti végrehajtás közben nem lehet megváltoztatni nem lehet megváltoztatni, viszont a tulajdonságokat lehet törölni Nem lehet megtekinteni, csak végrehajtani. A grobális rutinok elérhetőek más modulokból, és mindig NOSTEPIN-ként hajtódnak verge. A globális adatokra vonatkozó jelenlegi értékek más modulokból, vagy a FlexPendant adat ablakból érhetők el. A NOVIEW csak üzemen kívül definiálható egy PC-ről.
NOSTEPIN VIEWONLY READONLY NOVIEW
Példa: MODULE module_name (SYSMODULE, VIEWONLY) !data type definition !data declarations !routine declarations ENDMODULE Egy modulnak nem feltétlenül ugyanaz a neve mint egy másik modulnak vagy globális rutinnak/adatnak.
38
www.huro-cbc.eu
Two countries, one goal, joint success!
8.2. Rendszer modulok A rendszer modulokat általános, rendszer-specifikus adatok és rutinok (pl. eszközök) definiálására használjuk. Nem szerepelnek a program mentésénél, ami azt jelenti, hogy bármilyen frissítése a rendszer modulnak befolyásolni fog minden, a jelenleg, vagy később a memóriába töltött programot. 8.3. Struktúra alrutinok Három fajta rutin (alprogram) létezik: eljárások (procedures), függvények (functions) és csapdák (traps). Az eljárások nem adnak vissza értéket, és az utasítások keretében használjuk őket. A függvények visszadnak egy bizonyos típusú értéket, és a kifejezések keretében használjuk őket. A csapda rutinok egy eszközt biztosít a megszakítások kezelésére. Egy csapda rutint hozzá lehet rendelni egy bizonyos megszakításhoz, és amikor bekövetkezik ez a megszakítás, automatikusan végrehajtódik. Trap routines provide a means of dealing with interrupts. A trap routine can be associated with a specific interrupt and then, if that particular interrupt occurs at a later stage, will automatically be executed. Egy csapda rutint nem lehet explicit módon meghívni a programból. 8.3.1. A rutin hatásköre Leírja, milyen területen látható a rutin. Egy rutindeklarálás opcionális helyi irányelve a rutin lokálisként (modulon belüli) osztályozza, ellenkező esetben a rutin globális. Példa:
LOCAL PROC local_routine (... PROC global_routine (...
A következő hatásköri szabályok érvényesek a rutinokra: Egy globális rutin hatásköréhez tartozhat bármilyen modul a taszkon belül Egy lokális rutin hatásköréhez tartozik a modul amiben elhelyezkedik. A hatáskörén belül, egy lokális rutin elrejt bármilyen azonos nevű. A hatásköréne belül, egy rutin elrejti az azonos nevű utasításokat, előre meghatározott rutinokat és adatokat. 8.3.2. Paraméterek Egy rutin deklaráció parameter listája meghatározza az argumentumokat (valós paramétereket) amelyek meg kell legyenek adva a rutin meghívásánal.. Négy típusú paraméter létezik (a hozzáférési módban): Alapesetben a parameter csak inputként van használva, és rutin változóként van kezelve. A változó megváltoztatása nem változtatja a megfelelő argumentumot. Az INOUT paraméter meghatározza, hogy egy megfelelő argumentum változó kell legyen (teljes, elem vagy komponens) vagy egy teljes persistent amelyet a rutin megváltoztathat. A VAR paraméter leszögezi, hogy egy megfelelő argumentum változó kell legyen (teljes, elem vagy komponens) amelyet a rutin megváltoztathat. 39
www.huro-cbc.eu
Two countries, one goal, joint success!
A PERS paraméter leszögezi, hogy egy megfelelő argumentum egy teljes persistent kell legyen amelyet a rutin megváltoztathat. Ha egy INOUT, VAR vagy PERS paraméter új értéket kap, azt jelenti, hogy az argumentum is új értéket kap, vagyis lehetővé teszi argumentumok használatát értékek visszaadására a meghívó rutinnak. Példa:
PROC routine1 (num in_par, INOUT num inout_par, VAR num var_par, PERS num pers_par)
A switch típust csak opcionális paraméterekhez lehet rendelni, és lehetővé teszi a switch argumentumok használatát (amelyek csak nevek, nem értékek határoznak meg). Egy switch paraméter nem kaphat értéket. Csak a jelenléte ellenőrzésével lehet használni a switch parameter, a present funkció segítségével. Példa:
PROC routine4 (\switch on | switch off) ... IF Present (off ) THEN ... ENDPROC 8.3.3. Rutin lezárása
Egy eljárás végrehajtása vagy explicit módon, a RETURN utasítás segítségével, vagy implicit módon ér véget, amikor eléri az eljárás végét (ENDPROC, BACKWARD, ERROR vagy UNDO). Egy függvény végrehaktásának a RETURN utasítással lehet véget vetni. 8.3.4. Rutin deklarálás Egy rutin tartalmazhatja a következőket: deklarálás (beleértve a paramétereket), adatok, törzs, visszafelé irányuló kezelő (csak eljárások), és hibakezelő. A rutin deklarációk nem lehetnek beágyazva, vagyis van lehetőség rutin deklarálására egy rutinon belül. Eljárás deklarálása Példa: Egy számtömb elemeinek szorzása egy számmal. PROC arrmul( VAR num array{*}, num factor) FOR index FROM 1 TO dim( array, 1 ) DO array{index} := array{index} * factor; ENDFOR ENDPROC Függvény deklarálás Példa: Egy vektor hosszának kiszámítása. FUNC num veclen (pos vector) RETURN Sqrt(Pow(vector.x,2)+Pow(vector.y,2)+Pow(vector.z,2)); ENDFUNC
40
www.huro-cbc.eu
Two countries, one goal, joint success!
Csapda deklarálása Példa: “Feeder empty” megszakításra való válasz. TRAP feeder_empty wait_feeder; RETURN; ENDTRAP 8.3.5. Eljárás meghívása Egy eljárás meghívásánál, az eljárás paramétereinek megfelelő argumentumokat használjuk: - Meg kell adni a kötelező paramétereket a helyes sorrendbenr. - Az opcionális paramétereket el lehet hagyni. - A feltételes argumentumokat fel lehet használni a paraméterek átviteléhez egyik rutinból a másikba.
41
www.huro-cbc.eu