Documente Academic
Documente Profesional
Documente Cultură
Adept AnyFeeder
As. drd. ing. Alex Dumitrache
Drd. ing. Mihai Parlea
As. drd. ing. Raluca Tudorie
www.scr.cimr.pub.ro
Adept AnyFeeder
If you dont understand our minimalist
manual, you can always pay for
assistance.
Stationary down-looking
camera
Robot arm,
Gripper
Retainer gate
Mobile Gate,
drops only on Dipsnense
movements
Bulk Container
Rejects,
foreign objects
Dispense
Touching, overlapping
or too close toghether
parts
Graspeble parts
Feed Surface
Feed Bacward
Dispense Clutch
Feed Forward
Feed Drive
Mobile Gate Solenoid
Flip
Flip Clutch
Flip Drive
Comunicat, ia cu AnyFeeder
Comunicat, ia se realizeaza n regim Master Slave, adica robotul da o comanda, AnyFeeder o executa s, i transmite confirmarea, dupa care ciclul se reia.
Sunt oferite doua posibilitat, i de comunicat, ie: paralela s, i seriala. Comunicat, ia
paralela presupune 12 intrari s, i 8 ies, iri digitale iar cea seriala foloses, te interfat, a
standard RS232. Deoarece liniile digitale sunt destul de scumpe iar SmartControllerul robotului ofera 4 porturi seriale, s-a ales varianta comunicat, iei
pe interfat, a seriala.
AnyFeeder nu funct, ioneaza decat cu urmatorii parametrii de comunicat, ie
seriala:
R
aspunsul de la AnyFeeder
Daca operat, ia s-a ncheiat cu succes se vor primi urmatoarele mesaje:
Atas, area
Dupa cum am vazut n laboratorul cu CNC-ul, folosirea unei interfet, e de
comunicare presupune ntai atas, area ei pe un pointer (de obicei denumit lun,
de la Logical UNit). Pentru aceasta se foloses, te comanda ATTACH, avand
urmatoarea sintaxa:
ATTACH (lun, mode) $device
lun
pointer spre interfat, a de comunicat, ie
mode
cuvant de 3 bit, i ce descrie modul de atas, are:
bitul 0 (LSB)
0 - daca interfat, a este deja atas, ata atunci as, teapta sa
devina libera, dupa care o atas, eaza;
1 - daca interfat, a este deja atas, ata atunci returneaza o
eroare;
bitul 1
0 - as, teapta confirmare dupa fiecare comanda;
1 - nu as, teapta confirmare dupa fiecare comanda;
bitul 2 (MSB)
0 - se specifica pointerul pe care sa se atas, eze interfat, a;
1 - se specifica interfat, a s, i pointerul este generat de catre
sistem;
pentru interfat, a seriala, Adept recomanda folosirea modurilor 4
sau 5;
$device
string cu numele interfet, ei de comunicat, ie
SmartControllerul are la dispozit, ie 4 interfet, e seriale denumite:
LOCAL.SERIAL:1
LOCAL.SERIAL:2
SERIAL:1
SERIAL:2
Setarea parametrilor
Dupa ce a fost atas, ata, interfat, a de comunicat, ie trebuie setata cu parametrii
de comunicat, ie specificat, i n documentat, ia AnyFeeder. Acest lucru se face
folosind comanda FSET ce are urmatoarea sintaxa:
FSET (lun) $attribute list
lun
pointer catre interfat, a dorita;
$ attribute list
string cu numele parametrilor s, i valorile lor;
cont, inutul acestui string nu este verificat de catre compilator,
scrierea lui incorecta generand un comportament eronat s, i nedocumentat al controllerului.
Din acestea rezulta ca apelul corect este:
FSET (lun1) "/SPEED 9600 /BYTE_LENGTH 8 /STOP_BITS 1
/PARITY NONE /FLOW NONE"
= ""
0
0
0
0
10
1 a inteles comanda
2 a inteles comanda
1 a indeplinit cu
2 a indeplinit cu
11
12
ELSE
WAIT
END
100 IF IOSTAT(lun1) < 0 THEN
TYPE "EROARE de comunicatie pe seriala 1",
$ERROR(IOSTAT(lun1))
ABORT
END
110 ;TYPE "Comanda executata cu succes"
.END
13
Preluarea automat
a a pieselor din AnyFeeder
If programmers cant understand
something that works, then theyll say
its unaesthetic, harmful or wrong.
Luckily, were engineers.
programul;
daca Purge se executa de prea multe ori, atunci se afis, eaza eroarea
Prea multe rebuturi s, i se parases, te programul.
14
15
Init
Inspect Feed
Surface
No parts on
Feed Surface
Dispense executed
Feed Surface
contains parts
Maximum number of
Dispense repetitions
was reached without
resulting in parts on
Feed Surface
Pick / place
recognized
graspeble parts
Reached desired
number of picked parts
Only unrecognized /
ungraspeble
parts on Feed Surface
Flip executed
Flip parts
Feed Surface
is empty
Maximum number of
Flip repetitions was
reached without
recognizing detected
parts
Maximum number of
consecutive Purge
operations reached
Purge rejects
Feed Surface
is not empty
Errors
End
16
Pentru scrierea programului, observam ca avem de-a face cu mai multe blocuri
de cod care sar din unul n altul ntr-un mod destul de neintuitiv, deci mai
greu de implementat cu metode simple. Pentru a scrie un asemenea program
avem mai multe variante:
cate un program pentru fiecare pas, greu de scris s, i urmarit din cauza
limitarilor editorului;
tot, i pas, ii se implementeza ntr-o bucla s, i o variabila indica pasul curent
ce trebuie executat, trebuie implementata bucla s, i urmarite valorile
variabilei;
se pune o eticheta la nceputul fiecarui pas s, i apoi se sare cu GOTO;
trebuie urmarite valorile etichetei.
Vom implementa ultima varianta, pe de-o parte pentru ca are codul cel mai
simplu s, i pentru a demonstra ca, contrar propagandei Borland de la lansarea
Pascalului s, i a repulsiei programatorilor fat, a de instruct, iuni low-level, aceasta
s, i funct, ioneaza perfect s, i este cel mai potrivit mod de a rezolva problema. (In
plus, noi suntem ingineri automatis, ti s, i sigur ne vom lovi de microcontrolere,
controlere industriale s, i PLC-uri ale caror limbaje de programare nu ne vor
oferi toate facilitat, ile programarii de nivel nalt cu care suntem obis, nuit, i n
C#, Java, Matlab, etc.) Cum am spus, trebuie sa organizam etichetele astfel
ncat programul sa fie us, or de scris s, i de urmarit. Rezulta:
etichetele 10, 20, etc reprezinta Pasul 1, 2, etc;
etichetele 110, 120, etc reprezinta tratarea erorilor ce pot aparea;
eticheta 200 reprezinta sfas, itul programului.
Deoarece aceasta aplicat, ie foloses, te intensiv vederea, vom folosi urmatoarele
instruct, iuni de vedere
$ip = 172.16.200.41 string cu ip-ul calculatorului pe care ruleaza
softul de vedere;
PARAMETER VTIMEOUT = 5 durata maxima de executare a
secvent, ei de vedere 5s (n mod normal, executarea secvent, ei noastre
dureaza aprox. 150ms);
17
18
max_repetari_di = 10
max_repetari_fl = 10
max_repetari_pu = 20
nr_detectate = 0
nr_recunoscute = 0
blocate = FALSE
preluate = 0
preluate_ciclu = 0
dist = 40
$ip = "172.16.200.41"
PARAMETER VTIMEOUT = 5
PARAMETER HAND.TIME = 0.2
SPEED 100 ALWAYS
RIGHTY
OPEN
APPRO place_i, dist
CALL init.serial()
CALL init_feeder()
BREAK
;Pas 1
;rularea secventei de vedere, detectarea numarului de piese prezente
10 VRUN $ip, 1
blocate = FALSE
nr_detectate = 0
nr_recunoscute = 0
preluate_ciclu = 0
nr_detectate = VRESULT($ip, 1, 5, 1, 1610, 1, 1)
IF (nr_detectate == 0) THEN
GOTO 20
ELSE
repetari_dispen = 0
GOTO 30
END
;Pas 2
19
20
THEN
GOTO 20
END
;altfel inseamna ca am doar piese nerecunoscute si / sau piese
;recunoscute dar blocate
GOTO 40
; Pas 4
;Feed Surface contine piese nerecunsocute si / sau recunoscute
;dar blocate, execut Flip
40 repetari_flip = repetari_flip+1
IF (repetari_flip < max_repetari_fl) THEN
CALL feeder("x=5", 1)
CALL feeder("x=15", 1)
GOTO 10
ELSE
GOTO 50
END
;Pas 5
;daca s-a facut flip de prea multe ori, atunci se face purge
50 repetari_purge = repetari_purge+1
IF (repetari_purge == max_repetari_pu) THEN
GOTO 120
END
FOR i = 1 TO 3
CALL feeder("x=7", 1)
END
repetari_flip = 0
VRUN $ip, 1
nr_detectate = VRESULT($ip, 1, 5, 1, 1610, 1, 1)
IF (nr_detectate > 0) THEN
GOTO 110
ELSE
FOR i = 1 TO 10
CALL feeder("x=6", 1)
END
GOTO 20
END
;erori
100 TYPE "EROARE - lipsa rezerva piese in Bulk Container"
GOTO 200
110 TYPE "EROARE - rebuturi blocate pe Feed Surface"
GOTO 200
120 TYPE "EROARE - prea multe rebuturi"
GOTO 200
;sfarsit program
200 CALL close.serial()
TYPE "Sfarsit program."
.END
Procedura pick place
.PROGRAM pick_place(pick, place, dist)
APPRO pick, dist
BREAK
SPEED 20
APPRO pick, 7
BREAK
SPEED 2
MOVES pick
BREAK
CLOSEI
DEPARTS dist
BREAK
APPRO place, dist
BREAK
SPEED 20
MOVES place
BREAK
OPENI
DEPARTS dist
BREAK
.END
21