Documente Academic
Documente Profesional
Documente Cultură
1
Lansarea simulatorului se face prin lansarea comenzii “robot-sandbox.cmd” din
directorul “robot-sandbox”. Pe ecran vor apărea două ferestre, prima cu consola programului
(unde se pot da comenzi), fig. 1, iar a doua cu reprezentarea grafică a mişcărilor robotului, fig.
2. Sintaxa pentru lansarea programelor demonstrative este: “demo nume_program.v2”. Se pot
folosi comenzi pentru listarea fisierelor din directorul curent, “ls”, iar pentru ieşirea din
program se foloseşte comanda “exit()”. Alte comenzi se pot afla prin comanda “mc”.
2
Pentru o parte dintre programe se poate interacţiona direct cu robotul din fereastra
OpenGL, folosind mouse-ul.
Pentru programele, altele decât cele demo, procedura de lansare în execuţie este
următoarea:
- cu ajutorul comenzi “cd” se accesează directorul care conţine programul de interes;
- în consola de comenzi se scriu succesiv comenzile: „env nume_fisier.env” pentru
încărcarea variabilelor (dacă este cazul, unele programe nu au variabile descrise în afara
programului); „load nume_fisier.v2” pentru încărcarea în memorie a programului; „exec
nume_fisier.v2” pentru lansarea în execuţie a programului.
În fereastra grafică OpenGL se află un buton în colţul dreapta-sus. De la acesta, prin
apăsări succesive se pot comuta modurile de control manual al robotului, similar cu cele de pe
modurile de comandă manuală (MCP). Astfel avem următoarele situaţii:
- COMP; doar în acest mod se pot rula programe robot şi instrucțiuni de mişcare.
- WORLD; efectorul terminal se deplasează pe axele World, indicate în fereastra de
simulare prin culorile roşu (X), verde (y) şi albastru (z).
- TOOL; efectorul terminal se deplasează pe axele proprii (pe sistemul TOOL).
- JOINT; robotul este controlat pe fiecare articulaţie.
În modurile manual (WORLD, TOOL şi JOINT), viteza se setează din slider-ul “MCP
speed”. În modul COMP, viteza de lucru este dată de viteza monitor, stabilită fie prin comanda
monitor “speed”, fie prin sliderul “Monitor speed”. “MCP speed” şi “Monitor speed” sunt în
partea de jos pe fereastra grafică OpenGL. Comanda “speed” se poate da în oricare din
modurile ferestrei OpenGL.
3
Etapa III.
Se vor acţiona butoanele existente în fereastra grafică OpenGL, urmărind acţiunea
fiecăruia. Se vor folosi toate modurile: COMP, WORLD, TOOL şi JOINT. Ce se poate spune despre
funcţionarea butonului „ALIGN”?
Etapa IV.
Se realizeaza primul program. Se recomanda folosirea editorului “notepad2”, activat cu
comanda “see” ( se poate introduce ca parametru numele programului). Alte editoare text pot
introduce coduri de formatare care pot genera erori.
.PROGRAM hello()
TYPE "Hello, World!"; determina apariția unui text pe ecran
.END ; este pus automat in cazul editorului implicit “Notepad2”
.load x.v2 ; atenție, se poate scrie numele complet, cu sau fără extensie
.exec x; se scrie numele fișierului fără extensie
4
ANEXA I
Comenzi (neverificate toate!) ce se pot executa în fereastra monitor
Comanda Explicaţii
abort Opreşte forţat un program robot
calibrate Nu are efect, dar pe anumite controlere (Adept) execută o calibrare
electromecanică a robotului
cd Schimbă directorul curent
directory Listează programele încărcate în memorie. Se poate folosi şi %dir
disable Dezactivează un switch. Se pote prescurta dis
do Execută o instrucţiune program la consolă
enable Activează un switch. Se poate prescurta en
execute Execută un program robot. Se poate prescurta exec. Acceptă parametrii
simpli (nu avansaţi)
fcopy Copiază un fişier. In Windows, copy, în Linux, cp
fdelete Sterge un fişier. În Windows, del, în Linux rm
fdirectory Afisează lista fişierelor din directorul curent. Se poate folosi ls
fdirectory /c Creează un director. Se poate folosi mkdir
fdirectory/d Şterge un director. Folositi rmdir
flist Afişează un director la consolă. Pentru Linux se foloseşte cat
here Învaţă un punct robot. Variabilele create sunt globale
listl Listează variabilele de tip transformare
listr Listează variabile de tip scalar (reale, întregi)
lists Listează variabile de tip şir de caractere
load Încarcă un program V+. din fişiere .v2, nu şi din variabile
ls Afişează lista fişierelor din directorul curent
parameter Setează valoarea unui parametru V+
reset Dezactivează toate semnalele de la ieşire. Pe simulare, semnalele de intrare
sunt de asemenea dezactivate şi scoase de pe interfaţa grafică
see Porneşte editorul de programe V+
signal Activează sau dezactivează unul sau mai multe semnale de ieşire sau din
program (signal 50 activează, iar signal -50 dezactivează ieşirea 50)
speed Ajustează viteza monitor între 0 şi 100
status Afişează informaţii despre programele în curs de execuţie
tool Stabileşte transformarea TOOL
zero Şterge toate programele şi variabilele din memorie
5
Lucrarea 2
Mediul de programare V+
1. Sistemul de operare V+
Pe controlerele existente pe roboţi, pe lângă alte programe, rulează sistemul de operare V+ .
Utilizatorul poate controla sistemul folosind o serie de aplicaţii. Dintre acestea se pot aminti:
• AdeptWindows PC
• AdeptDesktop
AdeptWindows PC oferă acces la consola sistemului, o interfaţă în mod text similară cu cea folosită de
Linux. În mediul V+ , consola se numeşte monitor. Utilizatorul poate interacţiona cu sistemul de operare
utilizând comenzi monitor. Informațiile prezentate sunt pentru un sistem de operare real care actionează
asupra unor roboți reali. Pentru simulator sunt valabile aceleași informații cu precizarea că sunt câteva mici
diferențe.
AdeptDesktop este un mediu de dezvoltare a programelor robot de tip IDE (Integrated Development
Environment). Lucrul cu V+ în AdeptDesktop se poate realiza fie prin interfaţa grafică, fie prin introducerea de
comenzi la consola monitor. Comenzile monitor nu sunt case-sensitive şi pot fi prescurtate.
În configuraţia standard, sistemul V+ poate rula până la 7 task-uri utilizator, numerotate de la 0 la 6.
La un moment dat, un robot poate fi controlat de un singur task. În mod implicit, task-ul 0 este programul care
controlează robotul (pe care se pot executa instrucţiuni de mişcare).
Sistemul V+ are o structură de fişiere organizate în directoare, similară cu cea folosită în sistemele de
operare uzuale. Programele V+ pot fi salvate în fişiere cu extensia .v2 sau .pg.
Dacă se doreşte lucrul offline, se poate utiliza un editor ASCII, sau editorul offline AdeptWindows
(nerecomandat).
Editorul SEE se activează folosind comanda monitor see:
.see numeprogram
Editorul SEE porneşte în modul “Command”; pentru a scrie cod, trebuie trecut în modul “Insert”.
Aşadar, apăsaţi tasta INSERT. Pentru simulator apare direct ferestra pentru programul existent sau nou.
Editorul suportă Copy/Paste la nivel de linii. Mai exact, o linie întreagă este copiată cu tasta F9.
Operaţia Paste se realizează cu F10. Pentru a copia mai multe linii în memoria tampon (copy buffer ), apăsaţi
de mai multe ori F9 si de mai multe ori F10.
Nu se poate realiza Copy/Paste dintr-un program în altul. Mai mult, dacă există linii în copy buffer, nu
puteţi închide editorul. Acesta va afişa mesajul “Cannot exit while lines attached”.
Pentru a ieşi va trebui să apăsaţi CTRL-K de mai multe ori, până se goleşte buffer-ul.
Pentru a ieşi din editorul SEE se va folosi tasta F4. Modificările vor fi salvate automat în memoria
RAM. Pentru salvarea programului pe disc folosiţi comenzile store*.
1.3. Gestionarea programelor
Programele V+ pot fi organizate în module. Comenzi monitor pentru gestionarea programelor:
.dir ; lista programelor încărcate în RAM (nu de pe disc)
.rename newprog = oldprog ; redenumire în memoria RAM
.copy newprog = oldprog ; copiere în memoria RAM
.deletep prog ; şterge programul prog din memorie
.testp prog
.status ; afişează starea task-urilor
AUTO n
AUTO e
AUTO DOUBLE ang
n=5
e = 2.718
ang = ATAN2(5, 100)
Caractere şi string-uri
Variabilele de tip string sunt prefixate cu caracterul ”$”. Variabilele character sunt tratate ca variabile
întregi, iar atribuirea se face cu ajutorul caracterului apostrof.
AUTO $msg
AUTO chr
$msg = "Variabila de tip string"
chr = ’X
Vectori (arrays)
Variabilele de tip vector pot conţine numere, locaţii sau stringuri. Vectorii GLOBAL şi LOCAL sunt
alocaţi dinamic (se extind automat cât e nevoie). Vectorii LOCAL au dimensiune fixă.
AUTO joints[6]
AUTO joints[]
LOCAL timestamps[]
LOCAL timestamps[1000]
GLOBAL path.to.follow[]
GLOBAL $user.messages[]
1.9. Structuri de control
Buclele se pot întrerupe forţat cu instrucţiunea EXIT (a nu se confunda cu BREAK, care este
instrucţiune de mişcare).
1.10. Subrutine
Orice program poate fi considerat o subrutină.
CALL subrutina()
CALL subrutina(param1, param2)
În mod implicit, parametrii sunt transmişi prin referinţă!. Din acest motiv, modificările efectuate în
subrutină asupra parametrilor sunt vizibile în programul care a apelat subrutina.
Avantaj: parametrii sunt atât de intrare, cât şi de ieşire.
Dezavantaj: programul poate deveni dificil de înţeles si depanat.
Transmiterea parametrilor prin valoare se realizează folosind un truc, mai exact, se construiesc
artificial expresii care nu modifică valoarea variabilelor:
CALL subrutina((a), loc:NULL, $msg+"")
Aici, a este o variabilă reală, loc este o variabilă de tip transformare, iar $msg este un şir de caractere.
Nu se pot defini funcţii utilizator (care întorc o valoare). Se pot folosi doar subrutine cu parametri de
ieşire.
1.11. Lucrul cu consola
• TYPE "Au fost recunoscute ", x, " piese."
→ afis,are mesaj la consol˘a
• PROMPT "Introduceti numele piesei: ", $nume.piesa
→ citirea unui sir de caractere
• PROMPT "Cate piese sunt? ", nr.piese
→ citirea unei variabile de tip numeric
1.16. Temporizare
Aşteptare de 5 secunde:
WAIT.EVENT , 5
Aşteptare până la îndeplinirea unei condiţii:
WAIT SIG(1001) OR TIMER(1) > 5
Multitasking
EXECUTE task.num prog.name(param1, param2)
TAS ; test and set
STATUS("prog.name")
ABORT task.num
CYCLE.END task.num
KILL task.num
Informaţii detaliate pot fi găsite în manualele V+ Language User’s Guide şi V+ Language Reference
Guide.
De reţinut
• Toate variabilele se declară la începutul programului!
• Parametrii subrutinelor sunt transmişi prin referinţă!
• Nu se foloseşte instrucţiunea GOTO!
2. Programe V+
2.1. Un program Hello World în V+ arată astfel:
.PROGRAM hello()
TYPE "Hello, World!"
.END
2.2. Un program puţin mai complex:
.PROGRAM numara(n) ; program cu parametru
LOCAL i
TYPE "Numar până la ", n ; afisare mesaj la consola
FOR i = 1 TO n
TYPE i
END
.END
2.3. Un program interactiv cu mediul grafic (fata de programele anterioare rezultatul se observa in
fereastra OpenGL):
.PROGRAM blink()
; Test pentru semnale şi timere
AUTO i, delay
FOR i = 1 TO 10
delay = 3/i
SIGNAL 49
TIMER 1 = 0
WAIT TIMER(1) > delay
SIGNAL -49
TIMER 1 = 0
WAIT TIMER(1) > delay
END
.END
Se pot observa: antetul .PROGRAM nume.program(lista parametri), declaraţiile de variabile (LOCAL i),
corpul programului (secvenţa de instrucţiuni), comentariile, precum şi sfârşitul programului marcat
prin .END .
Observaţie: Editorul SEE introduce automat .END, dar nu îl afişează explicit.
Terminatorul .END trebuie însă introdus în editoarele externe (AdeptWindows, Offline Editor,
Notepad etc).
MOVE #safe
pick place
CLOSEI OPENI
Figura 2.1: Secvența Pick and Place
Cinematică inversă
.HERE nume.locatie
.HERE #safe
.HERE pick
.HERE place
- deplasare deasupra (în sensul negativ al axei ZTOOL) locației dst la o distanța
egală cu z mm.
DEPART d și DEPARTS d
- deplasare deasupra locației curente pe o distanța egală cu d milimetri
.speed 5
.enable dry.run
Se executa programul:
.exec numeprogram
.disable dry.run
.speed 5
.exec numeprogram
1 .PROGRAM pick.place()
2 ; Laboratorul 2 - Pick and Place & Nume Student & Grupa
3
4 GLOBAL #safe, pick, place ; locatii robot
5 AUTO z.pick
6 AUTO z.place ; variabile locale
7 z.pick = 80
8 z.place = 100
9
10 PARAMETER HAND.TIME = 0.5
11 SPEED 100 ALWAYS
12
13 OPEN
14 MOVE #safe ; incepe miscarea din #safe
15 BREAK ; cu gripper-ul deschis
16
17 APPRO pick, z.pick ; deplasare deasupra
18 BREAK ; punctului ’pick’
19
20 SPEED 50
21 MOVES pick
22 CLOSEI ; prindere piesa
23
24 SPEED 30
25 DEPARTS z.pick
26 BREAK
27
28 APPRO place, z.place ; deplasare deasupra
29 BREAK ; punctului ’place’
30
31 SPEED 20
32 MOVES place
33 OPENI ; asezare piesa
34
35 SPEED 50
36 DEPARTS z.place
37 BREAK
38
39 MOVE #safe ; intoarcere in #safe
40 .END
3.7. Teme
Tema 1
+
Identificați instrucțiunile de mișcare ale limbajului V și grupați-le pe
categorii:
Instrucțiuni care operează cu transformări
Instrucțiuni care operează cu puncte de precizie
Instrucțiuni care operează atât cu transformări, cât și cu puncte de
precizie
Tema 2
Tema 3
13
ANEXA 1
Sursa programului Pick & Place
.PROGRAM pp()
; Laboratorul 2 - Pick and Place
OPEN
MOVE #safe ; incepe miscarea din #safe
BREAK ; cu gripper-ul deschis
SPEED 50
MOVES pick
CLOSEI ; prindere piesa
SPEED 30
DEPARTS z.pick
BREAK
SPEED 20
MOVES place
OPENI ; asezare piesa
SPEED 50
DEPARTS z.place
BREAK
.END
14
Lucrarea 3 Robotica
(stabilirea variabilelor de lucru prin fisierul .env)
Obiectivul lucrari este familiarizarea folosirii fisierului cu extensia .env, pentru stabilirea
variabilelor/mediului de lucru.
1. Pentru inceput se reia programul din lucrarea anterioara (2) si se creeaza fisierul .env.
Comanda folosita este:
.see nume_fisier.env
Pentru definirea variabilelor de miscare, care vor fi accesibile in programele robot, se pot
folosi:
TRANS – creeaza o variabila de tip transformare
PPOINT – creeaza un punct de precizie
Deci secventa anterioara se scrie (doar pentru simulator nu si pentru comanda reala a unui
robot):
pP_safe = PPOINT( 106, -86.4, 176, -90, 110, 110)
pick = TRANS(-27.8, 211, 351, -24.2, 78.4, -4.17)
place = TRANS( 672, -289, 351, -24.2, 78.4, -4.17)
Daca apar erori ( de exemplu la #safe) se tine cont de cele scrise mai sus.
Pentru coordonatele bratului de robot, se preiau informatiile ce apar in consola (“copy” ->
“paste”), pozitionand bratul de robot pentru cele trei pozitii si folosind comanda <.here>.
.here nume.locatie
1
. env nume_fisier.env
. load nume_fisier.v2
. exec nume_fisier
Se urmăreşte şi ca directorul curent să conţină programul dorit. Acest aspect se
stabileste cu ajutorul comenzilor “ls” şi “cd”.
Ieşirea din simulare se face în ferestra de comenzi, prin tasta „ENTER”.
Se urmaresc mesajele din consola si miscarile robotului din fereastra MCP (OpenGL).
Se poate observa executia programului pas cu pas activand switch-ul TRACE.
.enable trace
.exec nume_program
Fisierul .env:
#def setup_environment():
#setup_environment()
Frunza = Load("frunza.stl")[0]
Frunza.name = "Frunza"
2
link(Frunza, Frunza.box)
Frunza.box.manip.odebody.setAutoDisableFlag(0)
pick = TRANS(400,-45,95,0,180,0)
Frunza.box.visible = False
Frunza.box2.visible = False
Frunza.box3.visible = False
safe = PPOINT(0,-90,180,0,0,0)
.PROGRAM throw()
SPEED 50
MOVES SHIFT(HERE BY 0,-300,0)
BREAK
.END
In aceasta etapa se urmareste functionarea programului si se explica cat mai multe din
comenzile prezente in script.
Referatul laboratorului cuprinde capturi ale celor doua programe (inclusiv fisierele cu
variabilele folosite), explicatii la cateva din comenzile prezente in program si in fisierul de
configurare .env, dar si raspunsurile la intrebari.
Intrebari
1. Cu ce fisiere poate lucra simulatorul (.stl,, .jpg, .png, etc)?
2. Cu ce comanda se schimba culoarea obiectului “aruncat” de simulator?
3. Care este diferenta dintre comanda “MOVES” si “MOVES SHIFT”? Dar diferenta
intre “MOVE” si “MOVES”?
3
4
ANEXA I
1 .PROGRAM pick.place()
2 ; Laboratorul 2 - Pick and Place & Nume Student & Grupa
3
4 GLOBAL #safe, pick, place ; locatii robot
5 AUTO z.pick
6 AUTO z.place ; variabile locale
7 z.pick = 80
8 z.place = 100
9
10 PARAMETER HAND.TIME = 0.5
11 SPEED 100 ALWAYS
12
13 OPEN
14 MOVE #safe ; incepe miscarea din #safe
15 BREAK ; cu gripper-ul deschis
16
17 APPRO pick, z.pick ; deplasare deasupra
18 BREAK ; punctului ’pick’
19
20 SPEED 50
21 MOVES pick
22 CLOSEI ; prindere piesa
23
24 SPEED 30
25 DEPARTS z.pick
26 BREAK
27
28 APPRO place, z.place ; deplasare deasupra
29 BREAK ; punctului ’place’
30
31 SPEED 20
32 MOVES place
33 OPENI; asezare piesa
34
35 SPEED 50
36 DEPARTS z.place
37 BREAK
38
39 MOVE #safe ; intoarcere in #safe
40 .END
5
Laborator X. Semnale de I/O și temporizări
1. Noțiuni generale semnale
Semnalele digitale de intrare/ieșire reprezintă metoda cea mai simplă de comunicație
între robot și echipamentele externe (de exemplu alți roboți, mașini de prelucrare sau
automate programabile), dar și cea mai puțin robustă, deoarece nu se realizează nici o
verificare a datelor transmise.
Un semnal digital transmite un semnal binar, de tip ON sau OFF (TRUE sau FALSE).
Un semnal este FALSE dacă are valoare logică “0” și TRUE dacă are valoarea logică “-1” sau
orice altă valoare.
În V+, semnalele sunt grupate astfel:
Semnale de intrare: de la 1001 la 1012, de la 1033 la 1512.
Semnale de ieșire: de la 1 la 8, de la 33 la 512.
Semnale software interne (intrare/ieșire): de la 2001 la 2512.
Semnalele de ieșire transmit un mesaj de la controller-ul robotului spre un echipament
extern. Prin semnalele de intrare se obțin informații de la echipamentul extern, de aceea
valoarea lor poate fi doar citită. Semnalele software sunt interne (vizibile doar în programele
care rulează pe același controler) și servesc la comunicația dintre task-uri, fiind echivalente ca
funcționalitate cu variabilele globale booleene.
Înainte de utilizare se recomandă definirea adreselor semnalelor folosite, pentru a face
programul mai lizibil și mai ușor de modificat. De exemplu:
out.door_open = 5
out.door_close = 6
in.machine_busy = 1001
Semnalele de ieșire sau cele interne software pot fi setate cu instrucțiunea SIGNAL.
Pentru resetarea unui semnal se poate nega adresa acestuia.
SIGNAL out.door_open
SIGNAL -out.door_close
SIGNAL acceptă ca argument doar semnale de ieșire sau semnale software. Semnalele
de intrare nu pot fi scrise! SIGNAL este atât comandă monitor (în consolă) cât și instrucțiune
program.
Starea unui semnal se poate citi cu funcția SIG. Citirea unui semnal digital se poate
face cu funcția SIG, având ca argument adresa semnalului citit:
SIG(adresa_semnal)
SIG este o funcție, deci poate fi folosită doar în expresii (de obicei boolene):
IF SIG(in.machine_busy) THEN
TYPE “Machine is busy”
ELSE
TYPE “Machine is ready”
END
Testarea unui semnal în logică negativă se poate face fie cu SIG(-addr), fie cu NOT
SIG(addr), cele două expresii fiind echivalente.
Semnalul de intrare poate fi doar citit!
Se mai poate testa funcția în consolă:
Funcția SIG poate primi mai multe adrese de semnale ca argumente; în acest caz va
returna operația AND între valorile logice ale intrărilor testate:
Este echivalent cu
SIG acceptă ca argument orice semnal (intrare, ieșire, software). SIG este funcție și
poate fi folosită doar în expresii.
TIMER id = valoare
TIMER 1 = 5.5
Citirea unui timer (in secunde) se obține folosind funcția TIMER:
TIMER(id)
Funcția se poate utiliza doar în cadrul unei expresii V+:
TIMER 1 = 0
WAIT TIMER(1) > 5
DELAY 5
Este echivalent cu
DURATION 5
MOVE DEST ; echivalent cu MOVE HERE doar dacă robotul nu se
mișcă
Se poate genera o așteptare până la îndeplinirea unei condiții care depinde de starea
unui echipament extern. De exemplu:
TIMER 1 = -delay
WAIT TIMER(1) > 0
WAIT.EVENT , delay
3. Breviar/Exemple
Semnale
Semnale de intrare: de la 1001 la 1012, de la 1033 la 1512.
Semnale de ieșire: de la 1 la 8, de la 33 la 512.
Semnale software interne (intrare/ieșire): de la 2001 la 2512.
SIGNAL 5 ; activare semnal
SIGNAL -5 ; dezactivare semnal
SIGNAL -4,5,2010 ; activarea semnalelor 5 si 2010 si dezactivarea semnalului 4
SIG(1001) ; testare (citire) semnal 1001
SIG(-1002) ; citire semnal 1002 în logică negativă
WAIT SIG(1001) ; se așteaptă până când semnalul 1001 devine activ
Temporizare
Așteptare de 5 secunde:
WAIT.EVENT , 5
Așteptare până la îndeplinirea unei condiții:
WAIT SIG(1001) OR TIMER(1) > 5
Pentru “WAIT condiție”, aceasta pune programul în așteptare până când condiția devine
adevărată. Așteptarea este de tip busy waiting și poate bloca celelalte task-uri. Instrucțiunea
este echivalentă cu:
WHILE NOT (condiție) DO
END
Experimental se poate observa ca editorul rulează mai încet dacă avem activ un task care
execută o instrucțiune de tip “WAIT condiție”.
WHILE ….. DO
WAIT
END
Moduri de lucru:
Comp: robotul este controlat de programul utilizator
World: Efectorul terminal al robotului este deplasat în spațiul cartezian World (din
baza robotului) (X/Y /Z) sau rotit (RX/RY /RZ)
Tool : Deplasarea se realizează în sistemul de coordonate atașat efectorului terminal
(Tool)
Joint: Se controlează poziția individuala a fiecărei articulații
4. Desfășurarea lucrării
4.1.Pentru început se realizează un program care realizează aprinderea si stingerea unui
semnal de ieșire. Secvența de cod poate să conțină:
delay = 1
SIGNAL 49
TIMER 1 = 0
WAIT TIMER(1) > delay
SIGNAL -49
4.2.Al doilea program este derivat din primul dar cu temporizare ce ocupa mai puțin
procesorul si se urmărește ocuparea procesorului. Cele doua programe se lansează,
separat, si se urmărește daca simulatorul funcționează mai greu (de exemplu se
lansează editorul SEE).
5. Intrebări și exerciții
1. Este corectă instrucțiunea TIMER(1) = 0?
2. Să se realizeze un program care să genereze un joc de lumini de tip deplasare aprins
unu din 3. Cum se poate schimba sensul?
3
ANEXA 1
Exemplu de utilizare semnale și temporizatoare
.PROGRAM blink()
AUTO i, delay
FOR i = 1 TO 10
delay = 3/i
SIGNAL 49
TIMER 1 = 0
WAIT TIMER(1) > delay
SIGNAL -49
TIMER 1 = 0
WAIT TIMER(1) > delay
END
.END
Lucrarea 5. Stive verticale
(stive si paletizare)
1. Stive și paletizare
Operația “Pick and place” poate fi aplicată pentru a aranja mai multe piese identice
pe o stivă, o paletă, etc.
O abordare posibilă, dar ineficientă, ar fi învățarea fiecărui punct accesat de robot.
Este posibila învățarea unui singur punct (originea), si cunoscând dimensiunile si orientarea
depozitului, celelalte puncte pot fi calculate.
Pentru aceasta se poate folosi funcția V+ SHIFT, care modifică o locație în Spațiul
cartezian World, doar în translație (orientarea se păstrează).
Exemplu: Se dorește preluarea unor piese identice dintr-o stivă verticală pentru care
s-a învățat un singur punct numit baza stivei. Se cunoaște grosimea pieselor h.piesa si
numărul de piese din stiva nr.piese.
Poziția de prindere pentru piesa din vârful stivei este:
n = 5;
h = 15;
1
r=n-i+1
SET pick = SHIFT(st.a BY 0, 0, (r - 1) * h);
SET place = SHIFT(st.b BY 0, 0, (i - 1) * h);
2. Desfășurarea lucrării
2.1. Execuția unui program complet
Se rulează programul plc.v2, după ce se încarcă variabilele de mediu din plc.env
(sunt prezentate in anexele 1 si 2). Pentru pornirea programului trebuie apăsat butonul 1033.
Înainte de aceasta se stabilește din care stiva se preiau cărămizile (roșii sau galbene, funcție de
apăsarea sau nu a butonului 1034) si numărul acestora (in binar din combinația butoanelor
1035, 1036, 1037).
Dacă se execută repetat programul, se recomandă inițializarea variabilelor de lucru
de fiecare dată (prin comanda “env plc.env”). După execuție programul comandă ieșirile 49-
52. Se parcurge programul și se analizează fiecare comandă.
Fig. 1. Programul, după execuție (aici nu a fost selectat butonul 1034 si au fost luate piesele roșii)
2.2.Spirala
Sa se realizeze un program care sa formeze o spirala folosind 5 sau 7 piese
paralelipipedice (vezi anexa 3 pentru detalii).
2.3. Construcția unei case
Folosind sursa programului anterior, să se realizeze un program care sa aranjeze in
diferite moduri piesele paralelipipedice sub diferite forme: intâi de o culoare plasate sub
forma unui patrat și continuând cu cele de cealaltă culoare (se poate folosi anexa 4 pentru
inspiratie).
Un exemplu de sursa de program care construieste o casa (de fapt aranjeaza “caramizi”
după un program) este urmatorul (ATENȚIE, trebuie scrisa si procedura, deja clasică
pick.place() :
2
def setup_environment():
createBoxStack(7, pos=(0.3, 0.3, 0.02), material=matRedBox)
createBoxStack(7, pos=(0.3, -0.3, 0.02), material=matYellowBox)
createBoxStack(1, pos=(500E-3, 0, 1.5E-3), size=(100 * 1E-3,200 * 1E-3,3E-3),
material=matPallet, kinematic=True)
setup_environment()
h = 15
a = TRANS(300, 300, 190, 0, 180, 90)
b = TRANS(300,-300, 190, 0, 180, 90)
pP_safe = PPOINT(0,-90,180,0,0,0)
c = TRANS(500, 0, 120, 0, 180, 0)
.PROGRAM casuta_original()
GLOBAL a, b, c, #safe, h
AUTO sursa[4], desti[4]
AUTO i, j, d
d = 15
3
ANEXA 1
Sursa variabile de lucru plc.v2 (fisierul plc.env)
def setup_environment():
createBoxStack(7, pos=(0.3, 0.3, 0.02), material=matRedBox)
createBoxStack(7, pos=(0.3, -0.3, 0.02), material=matYellowBox)
createBoxStack(1, pos=(500E-3, 0, 1.5E-3), size=(100 * 1E-3,200 * 1E-3,3E-3), material=matPallet,
kinematic=True)
SIG(1033,1034,1035,1036, 1037)
SIGNAL(-49,-50,-51,-52)
setup_environment()
pP_safe = PPOINT(0,-90,180,0,0,0)
h = 15
l_storage = TRANS(300, 300, 100, 0, 180, 90)
nl_storage = TRANS(300,-300, 100, 0, 180, 90)
pal = TRANS(500, 0, 103, 0, 180, 0)
print
print """
Puncte robot:
=============
l_storage, nl_storage: la baza celor doua stive
pal: baza stivei de pe paleta
Semnale:
=======
PLC -> Robot:
* 1033 - comanda inceperea sarcinii pentru robot
- confirma validitatea semnalelor 1034 ... 1036
* 1034 - determina tipul de piese dorit (galbene sau rosii)
* 1035, 1036 - numaul de piese dorit, codificat pe 2 biti (1036 = LSB)
4
ANEXA 2
Programul plc.v2 ( include si subprogramul pick&place)
.PROGRAM plc()
; Comunicaţie cu automatul programabil cu ajutorul semnalelor
GLOBAL l_storage, nl_storage, pal, #safe
AUTO pick, place, storage
AUTO p, r, h, d, n, nr
h = 15
nr = 7
in.start_valid = 1033
in.part_type = 1034
in.nr_parts_b0 = 1035
in.nr_parts_b1 = 1036
in.nr_parts_b2 = 1037
out.done_valid = 49
out.time_b2 = 50
out.time_b1 = 51
out.time_b0 = 52
SIGNAL (-out.done_valid)
SIGNAL (-out.time_b2)
SIGNAL (-out.time_b1)
SIGNAL (-out.time_b0)
WHILE SIG(-in.start_valid) DO
WAIT
END
; citesc numărul de piese dorit de pe cei trei biti 1035, 1036, 1037:
n=0
IF SIG(in.nr_parts_b0) THEN
n = n+1
END
IF SIG(in.nr_parts_b1) THEN
n = n+2
END
IF SIG(in.nr_parts_b2) THEN
n = n+4
END
5
r = nr - p + 1
SET pick = SHIFT(storage BY 0, 0, h * (r-1))
SET place = SHIFT(pal BY 0, 0, h * (p-1))
CALL pick.place(pick, place)
END
MOVE #safe
BREAK
d = TIMER(1)
TYPE "Timpul necesar: ", d, " secunde."
IF d BAND 2 THEN
SIGNAL (out.time_b1)
END
IF d BAND 1 THEN
SIGNAL (out.time_b0)
END
.END
6
ANEXA 3
Spirala (atat fisierul variabilelor de lucru cat si programul propriu zis)
pP_safe = PPOINT(0,-90,180,0,0,0)
h = 15
stOa = TRANS(300, 300, 190, 0, 180, 90)
a = stOa
.PROGRAM spirala2()
GLOBAL a, b, c, #safe, h
AUTO p, i
total.ang = 360
n=7
SPEED 100 ALWAYS
PARAMETER HAND.TIME = 0.2
OPEN
MOVE #safe
BREAK
FOR p = 1 TO n
i = p-1
SET pick = SHIFT(a BY 0, 0, -h * INT(i))
SET place = SHIFT(c BY 0, 0, h*i):RZ(total.ang * i / n)
CALL pick.place(pick, place)
END
MOVE #safe
print "n=", n
.END
.PROGRAM pick.place(pick,place)
AUTO z.pick, z.place
z.pick = 100
z.place = 100
OPEN
APPRO pick, z.pick
BREAK
SPEED 30
MOVES pick
CLOSEI
SPEED 30
DEPARTS z.pick
BREAK
APPRO place, z.place
BREAK
SPEED 30
MOVES place
OPENI
SPEED 30
DEPARTS z.place
BREAK
.END
7
Anexa 4
(programe pentru realizarea unei casute sub diferite forme)
;Program original
.PROGRAM casuta_original()
GLOBAL a, b, c, #safe, h
AUTO sursa[4], desti[4]
AUTO i, j, d
d = 35
;Sa schimbe modul in care se face o casuta: intai piesele de o culoare, apoi cele de cealalta culoare.
.PROGRAM casuta1()
GLOBAL a, b, c, #safe, h
AUTO sursa[6], desti[6]
AUTO i, j, d
d = 35
8
SET sursa[j+2] = SHIFT (a BY 0, 0, - h * (j + 2))
SET desti[j+2] = SHIFT (c BY (1 - i) * d*SIGN(j-0.5), i * d * SIGN(j-0.5), h*(i*3+1)):RZ(90 * i)
END
FOR j = 0 TO 1
SET sursa[j+4] = SHIFT(a BY 0, 0, - h * (j +4))
SET desti[j+4] = SHIFT(c BY i * d * SIGN(j-0.5), (1 - i) * d*SIGN(j-0.5), h*(i*3+2)):RZ(90 * (1 - i))
END
FOR j = 0 TO 5
CALL pick.place(sursa[j], desti[j])
END
END
MOVET #safe, TRUE
.END
END
MOVET #safe, TRUE
.END
9
AUTO sursa[9], desti[9]
AUTO i, j, d, x, ok
d = 35
x=0
ok = 0
.PROGRAM pick.place(pick,place)
AUTO z.pick, z.place
z.pick = 100
z.place = 100
OPEN
APPRO pick, z.pick
BREAK
SPEED 30
MOVES pick
CLOSEI
SPEED 30
DEPARTS z.pick
BREAK
APPRO place, z.place
BREAK
SPEED 30
MOVES place
OPENI
SPEED 30
DEPARTS z.place
BREAK
.END
10