Sunteți pe pagina 1din 21

Laborator 8

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.

In multe aplicat, ii ale posturilor de lucru robotizate, apare problema alimentarii


acestor posturi cu piesele pe care robot, ii le vor monta. Aceasta munca, de a
lua piesele din vrac s, i a le pune n depozitul robotului, s-a dovedit curand ca
fiind repetitiva s, i plictisitoare. Astfel au aparut feederele automatizate de
piese.
Primul produs de acest fel de la Adept s-a numit FlexFeeder s, i acesta se baza
pe un sistem de benzi conveioare s, i lifturi pentru a prelua o cantitate mare
de piese n vrac s, i a prezenta robotului un numar mic de piese pe o suprafat, a
iluminata n diascopie s, i inspectata de catre o camera fixa.
Urmatorul pas a fost AnyFeeder, rolul ndeplinit a fost acelas, i, nsa sistemul
de lifturi s, i conveioare a fost nlocuit cu doua suprafet, e vibrante:
1

LABORATOR 8. ADEPT ANYFEEDER

Bulk Container depozitul de piese n vrac


Feed Surface suprafat, a de pe care se preiau piesele (vezi Fig. 8.1)

Stationary down-looking
camera

Robot arm,
Gripper

Retainer gate

Bulk parts supply

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

Robot work envelope;


Camera inspected area;
Backlit surface

Feed Drive
Mobile Gate Solenoid

Flip
Flip Clutch

Flip Drive

Figura 8.1: Principiu de funct, ionare AnyFeeder

Principiu de funct, ionare


Feed Drive este conectat permanent la Feed Surface, acesta realizeaza
mis, carile de deplasare nainte s, i napoi ale pieselor;
Flip Drive este conectat prin intermediul Flip Clutch la Feed Surface,
acesta realizeaza ntoarcerea pieselor pe partea cealalta;
Dispense Clutch conecteaza Bulk Container la Feed Surface, astfel
realizandu-se mis, carile de aducere a unui numar mic de piese din Bulk
Container pe Feed Surface;
Mobile Gate coboara n momentul mis, carii de aducere a pieselor pe
Feed Surface realizand o dozare mai exacta a numarului de piese aduse.

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

LABORATOR 8. ADEPT ANYFEEDER

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:

Baud rate : 9600


Data bits : 8
Stop bits : 1
Parity : none
Flow control : none
Local echo : disabled

Toate mesajele se termina cu simbolul <cr>.


ATENT, IE : AnyFeeder nu va executa nicio comanda s, i nu va raspunde cu
niciun mesaj daca nu se respecta parametrii comunicat, iei.

Comenzile spre AnyFeeder


Executarea mis, carilor se face cu mesaje de forma x=[cod] cu confirmare.
Sunt disponibile urmatoarele coduri:
1 Feed Forward
muta piesele nainte;
2 Feed Backward
muta piesele napoi;
3 Flip + Feed Forward
muta piesele nainte s, i le ntoarce pe cealalta parte;
4 Flip + Feed Backward
muta piesele napoi s, i le ntoarce pe cealalta parte;
5 Flip
ntoarce piesele pe cealalta parte;
6 Dispense

LABORATOR 8. ADEPT ANYFEEDER

aduce piese din Bulk Container pe Feed Surface;


7 Purge
elimina piesele de pe Feed Surface (s, i Bulk Container daca Retainer
Gate este deschisa);
8 Heavy Dispense
aduce n mod agresiv piese din Bulk Container pe Feed Surface;
15 Stop
opres, te mis, carea curenta s, i aduce Feed Surface s, i Bulk Container
n Home Position;
16 Initialize
init, ializeaza AnyFeeder;
30 - Reset Error
reseteaza starea de eroare.
Toate mis, carile executate de AnyFeeder au doi parametrii: viteza s, i numarul
de repetari. Pentru modificarea acestora se folosesc urmatoarele comenzi:
Setarea numarului de repetari:
mesaj fara confirmare de forma:
"ab[cod]=[repetari]"
Setarea numarului de repetari s, i executarea comenzii de mis, care corespunzatoare:
mesaj cu confirmare de forma:
"ab[cod1]=[repetari] x=[cod2]"
Setarea vitezei de executare:
mesaj cu confirmare de forma:
"ab[cod2]=[viteza] x=[cod3]"
Cei interesat, i pot studia n amanunt programul init feeder() s, i manualul
AnyFeeder.

LABORATOR 8. ADEPT ANYFEEDER

R
aspunsul de la AnyFeeder
Daca operat, ia s-a ncheiat cu succes se vor primi urmatoarele mesaje:

m11<cr> : motorul 1 a nt, eles comanda s, i o executa;


m21<cr> : motorul 2 a nt, eles comanda s, i o executa;
m10<cr> : motorul 1 a ndeplinit cu succes comanda s, i e n regula;
m20<cr> : motorul 2 a ndeplinit cu succes comanda s, i e n regula;
Avand n vedere ca motoarele au sarcini diferite, mesajele de
confirmare pot veni s, i n ordine inversa.
Chiar daca unele comenzi presupun mis, carea unui singur motor,
celalalt motor va confirma s, i el ca a recept, ionat comanda s, i a
executat-o.
Daca a aparut o eroare (la motorul 1, analog pentru motorul 2)
m12<cr> : comanda inexistenta sau sintaxa gres, ita;
m13<cr> : suprasarcina, se verifica daca part, ile mobile nu sunt
blocate de obiecte straine s, i nu exista alte probleme, AnyFeeder
trebuie reinit, ializat;
m16<cr> : motorul 1 nu este init, ializat, AnyFeeder trebuie reinit, ializat;
m17<cr> : motorul 1 semnaleaza o eroare nedefinita, AnyFeeder
trebuie reinit, ializat;
La comanda de init, ializare, AnyFeeder va raspunde m10<cr> m20<cr>
pentru a semnala init, ializarea corecta a motoarelor.

Implementarea comunicat, iei seriale


Serial communication?... Oh, you mean
USB, just plug it in!

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

LABORATOR 8. ADEPT ANYFEEDER

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

cont, inutul acestui string nu este verificat de catre compilator,


scrierea incorecta generand un comportament eronat s, i nedocumentat al controllerului.
Din acestea rezulta ca apelul corect este:
ATTACH (lun1, 4) "SERIAL:1"

LABORATOR 8. ADEPT ANYFEEDER

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"

Verificarea interfet, ei de comunicat, ie


Avand n vedere capacitat, ile reduse ale compilatorului s, i evenimentele externe
ce pot aparea la folosirea interfet, ei de comunicat, ie, dupa fiecare operat, iune
executata asupra interfet, ei trebuie obt, inuta starea acesteia. Daca starea este
negativa atunci programul trebuie oprit s, i eroarea afis, ata. Obt, inerea starii
interfet, ei de comunicat, ie se face folosind comanda:
IOSTAT (lun, mode)
lun
pointer catre interfat, a dorita;
mode
informat, ia ceruta;

LABORATOR 8. ADEPT ANYFEEDER

starea interfet, ei se obt, ine pentru mode=0, daca parametrul este


nespecificat atunci se considera ca fiind 0.
Numele s, i descrierea erorii se obt, in cu funct, ia ERROR ce returneaza un string
ce cont, ine numele s, i descrierea erorii:
$ERROR (error code)
error code
codul erorii returnat de IOSTAT
Rezulta ca orice program ce foloses, te interfat, a trebuie sa implementeze o
structura de genul:
;comanda ce foloseste interfata seriala
IF (IOSTAT(lun)) < 0 THEN GOTO 100
;
;instructiuni
;
100 IF (IOSTAT(lun)) < 0 THEN
TYPE "Eroare de comunicatie", $ERROR(IOSTAT(lun))
ABORT
END
.END

Programul ce deschide s, i seteaza n mod corect interfat, a seriala este listat


mai jos.
ATENT, IE : Pentru a putea controla taskul care are dreptul de a folosi o
interfat, a de comunicat, ie, variabila ce cont, ine pointerul lun este de tip LOCAL,
deci poate fi folosita doar de programul ce o atas, eaza s, i programele parinte s, i
fii ai acestuia.
.PROGRAM init.serial()
ATTACH (lun1, 4) "SERIAL:1"
IF IOSTAT(lun1) < 0 GOTO 100

LABORATOR 8. ADEPT ANYFEEDER

FSET (lun1) "/SPEED 9600 /BYTE_LENGTH 8 /STOP_BITS 1


/PARITY NONE /FLOW NONE"
IF IOSTAT(lun1) < 0 GOTO 100
TYPE "Seriala 1 deschisa"
100 IF IOSTAT(lun1) < 0 THEN
TYPE "EROARE de comunicatie pe seriala 1",
$ERROR(IOSTAT(lun1))
ABORT
END
.END

Implementarea protocolului de comunicat, ie


Pentru comunicarea cu AnyFeederul avem nevoie de un program cu doi
parametri, comanda ce trebuie trimisa s, i as, teptarea sau nu a confirmarii.
De asemenea, trebuie implementat un mecanism de tip WatchDog Timer,
astfel ncat sa se paraseasca programul daca AnyFeederul nu raspunde, dar
sa se ment, ina n execut, ie daca timpul necesar pentru executarea comenzilor
de mis, care este mai lung.
De asemenea, s-a dorit urmarirea aparit, iei mesajelor de confirmare s, i parasirea
programului atunci cand AnyFeederul a executat cu succes comanda. Sunt
detectate mesajele de eroare, se anunt, a tipul erorii s, i motorul care a raportat-o.
Programul folosit este listat mai jos:
.PROGRAM feeder($str, conf)
$temp
m11 =
m21 =
m10 =
m20 =

= ""
0
0
0
0

WRITE (lun1) $str, /S, $ENCODE($CHR(13))

LABORATOR 8. ADEPT ANYFEEDER

10

IF IOSTAT(lun1) < 0 GOTO 100


;TYPE "Seriala 1, am trimis: ", $str
IF conf THEN
;TYPE "Raspuns AnyFeeder :"
TIMER (1) = 0
WHILE TIMER(1) < 20 DO
x = GETC(lun1,1)
IF x > 0 THEN
TIMER (1) = 0
IF x <> 13 THEN
;TYPE "s-a primit un caracter valid pe seriala"
$temp = $ENCODE($temp,$CHR(x))
ELSE
;TYPE "s-a primit un mesaj complet pe seriala"
IF $temp == $str THEN
;TYPE "AnyFeeder : echo"
END
IF $temp == "m11" THEN
;TYPE "AnyFeeder : motorul
si o executa"
m11 = 1
END
IF $temp == "m21" THEN
;TYPE "AnyFeeder : motorul
si o executa"
m21 = 1
END
IF $temp == "m10" THEN
;TYPE "AnyFeeder : motorul
succes comanda"
m10 = 1
END
IF $temp == "m20" THEN
;TYPE "AnyFeeder : motorul
succes comanda"
m20 = 1
END

1 a inteles comanda

2 a inteles comanda

1 a indeplinit cu

2 a indeplinit cu

LABORATOR 8. ADEPT ANYFEEDER


IF m11 AND m21 THEN
;TYPE "AnyFeeder
comanda si
END
IF m10 AND m20 THEN
;TYPE "AnyFeeder
cu succes
GOTO 110
END

11

: ambele motoare au inteles


o executa"

: ambele motoare au indeplinit


comanda"

IF ($temp == "m12") OR ($temp == "m22") THEN


TYPE "AnyFeeder : EROARE - comanda inexistenta, motor",
$CHR(ASC($temp,2))
ABORT
END
IF ($temp == "m13") OR ($temp == "m23") THEN
TYPE "AnyFeeder : EROARE - suprasarcina, motor",
$CHR(ASC($temp,2))
ABORT
END
IF ($temp == "m16") OR ($temp == "m26") THEN
TYPE "AnyFeeder : EROARE - AnyFeeder neinitializat,
motor", $CHR(ASC($temp,2))
ABORT
END
IF ($temp == "m17") OR ($temp == "m27") THEN
TYPE "AnyFeeder : EROARE - eroare nespecificata,
motor", $CHR(ASC($temp,2))
ABORT
END
$temp = ""
END
END
END
TYPE "EROARE - perioada TimeOut expirata fara raspuns
complet de la AnyFeeder"
ABORT

LABORATOR 8. ADEPT ANYFEEDER

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

Inchiderea interfet, ei seriale


Odata ce am terminat lucrul cu interfat, a seriala, pentru a o putea folosi s, i
n alt program trebuie sa o detas, am. Acest lucru se face folosind comanda
DETACH cu sintaxa:
DETACH(lun)
lun
pointer spre interfat, a dorita
Astfel, aplicat, ia noastra trebuie sa se termine cu un apel spre urmatorul
program:
.PROGRAM close.serial()
DETACH (lun1)
TYPE "Seriala 1, inchisa"
.END

LABORATOR 8. ADEPT ANYFEEDER

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.

Presupunem ca avem la dispozit, ie un AnyFeeder plasat convenabil n spat, iul


de lucru al unui robot iar Feed Surface este inspectata de o camera fixa. In
Bulk Container sunt ncarcate piese de tip I (pe care robotul le poate prinde).
Sa se scrie aplicat, ia robot care preia n mod eficient piesele.
Pentru ca preluarea pieselor sa se faca ntr-un mod eficient, strategia de
prindere trebuie sa implementeze urmatoarele idei:
robotul preia doar piesele recunoscute s, i abordabile;
programul se parases, te la atingerea numarului dorit de piese;
daca Feed Surface nu cont, ine piese, atunci se aduc piese din Bulk
Container (Dispense);
daca Feed Surface cont, ine piese nerecunoscute, atunci piesele se ntorc
pe partea cealalta (Flip);
daca Feed Surface cont, ine piese s, i s-au preluat piese, atunci Feed Surface
se reinspecteaza pentru a detecta posibile piese deblocate;
daca Flip se repeta de prea multe ori fara ca piesele detectate sa
devina recunoscute, atunci piesele sunt considerate rebuturi s, i se elimina
(Purge);
daca Dispense se repeta de prea multe ori fara a rezulta piese pe
Feed Surface, atunci se afis, eaza eroarea Lipsa rezerva piese n Bulk
Container s, i se parases, te programul;
daca nca exista piese pe Feed Surface dupa executarea Purge atunci
se afis, eaza eroarea Rebuturi blocate pe Feed Surface s, i se parases, te

programul;
daca Purge se executa de prea multe ori, atunci se afis, eaza eroarea
Prea multe rebuturi s, i se parases, te programul.

LABORATOR 8. ADEPT ANYFEEDER

14

Dupa implementarea tuturor ideilor de mai sus, rezulta urmatorul algoritm


(vezi Fig. 8.2):
Init: init, ializeaza variabile interne, deschide comunicat, ia cu AnyFeederul,
init, ializeaza AnyFeederul;
Pas 1 : inspecteaza Feed Surface, daca cont, ine piese atunci mergi la
Pasul 3, altfel mergi la Pasul 2;
Pas 2 : adu piese din Bulk Container (Dispense), daca se depas, es, te
numarul maxim de repetari Dispense atunci mergi la Erori, altfel mergi
la Pasul 1;
Pas 3 : preia piesele recunoscute s, i abordabile, cand se atinge numarul
dorit de piese se merge la End, daca s-au preluat piese iar Feed Surface
nca cont, ine piese atunci mergi la Pasul 1, daca Feed Surface cont, ine
doar piese nerecunoscute/neabordabile atunci mergi la Pasul 4, daca
Feed Surface este goala atunci mergi la Pasul 2;
Pas 4 : ntoarce piesele pe partea cealalta (Flip), daca s-a atins numarul
maxim de repetari Flip atunci mergi la Pasul 5, altfel mergi la Pasul 1;
Pas 5 : elimina rebuturile (Purge), daca Feed Surface nca cont, ine piese
sau s-a depas, it numarul maxim de operat, ii Purge atunci mergi la Erori,
altfel mergi la Pasul 1;
Erori : semnaleaza eroarea Lipsa rezerva piese n Bulk Container,
Rebuturi blocate pe Feed Surface sau Prea multe rebuturi
End : nchide comunicat, ia seriala, sfars, itul programului.

LABORATOR 8. ADEPT ANYFEEDER

15

Init

Inspect Feed
Surface
No parts on
Feed Surface

Dispense executed

Bring parts from


Bulk Container

Feed Surface
contains parts

Maximum number of
Dispense repetitions
was reached without
resulting in parts on
Feed Surface

If parts were picked,


reinspect to detect
possible freed parts

If all parts were picked,


bring new parts

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

Report "No parts in Bulk Container",


"Rejects blocked on Feed Surface" or
"Too many rejects" error

End

Figura 8.2: Algoritmul de preluare al pieselor

LABORATOR 8. ADEPT ANYFEEDER

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);

LABORATOR 8. ADEPT ANYFEEDER

17

VRUN $ip, 1 executa secvent, a de vedere;


VRESULT($ip, 1, 5, 1, 1610, 1, 1) numarul de obiecte detectate;
VRESULT($ip, 1, 2, 1, 1310, 1, 1) numarul de obiecte recunoscute ca
fiind piese de tip I;
VRESULT($ip, 1, 3, i, 1506, 1, i) nivelul minim de gri al unei amprente
a gripperului, pentru piesa recunoscuta numarul i, amprenta e declarata
ocupata s, i piesa este inabordabila daca valoarea este mai mica decat
255;
VRESULT($ip, 1, 4, i, 1506, 1, i) analog pentru cealalta amprenta;
VLOCATION($ip, 1, 2, i, 1311, 1, 1) locat, ia robot pentru prinderea
piesei cu numarul i.
Cele de mai sus nu trebuie sa va descurajeze, vor fi prezentate pe larg n
cadrul laboratoarelor de vedere ce vor urma.
De asemenea trebuie sa admitem:
s-a nvat, at punctul place i ca fiind originea stivei n care se vor plasa
piesele preluate;
aplicat, ia pornes, te cu robotul departat la 40mm fat, a de punctul place i;
deoarece corpul robotului poate optura imaginea preluata de camera,
secvent, a video se va lansa n execut, ie atunci cand robotul se afla n
pozit, ia de la punctul precedent (nu conteaza distant, a de departare);
pentru a se elimina erorile de pozit, ionare ale robotului pentru prinderea
peisei, se va cobor cu viteza foarte scazuta pe ultimii 7mm.
Astfel, rezulta urmatorul program:
.PROGRAM any(cerute)
;variabile globale, sunt prea multe ca sa le mai declaram,
le consideram implicit GLOBAL pe toate
repetari_dispen = 0
repetari_flip = 0
repetari_purge = 0

LABORATOR 8. ADEPT ANYFEEDER

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

LABORATOR 8. ADEPT ANYFEEDER

19

;Feed Surface este goala, se aduc piese (dispense si feed forward)


20 CALL feeder("x=6", 1)
CALL feeder("x=1", 1)
CALL feeder("x=15", 1)
repetari_dispen = repetari_dispen+1
IF (repetari_dispen > max_repetari_di) THEN
GOTO 100
ELSE
GOTO 10
END
;Pas 3
;Feed Surface contine piese, se preiau piesele abordabile
30 nr_recunoscute = VRESULT($ip, 1, 2, 1, 1310, 1, 1)
FOR i = 1 TO nr_recunoscute
amprenta1 = VRESULT($ip, 1, 3, i, 1506, 1, i)
amprenta2 = VRESULT($ip, 1, 4, i, 1506, 1, i)
IF ((amprenta1 < 255) OR (amprenta2 < 255)) THEN
blocate = TRUE
ELSE
SET sursa = VLOCATION($ip, 1, 2, i, 1311, 1, 1)
SET place = SHIFT(place_i BY 0,0,4.3*preluate)
CALL pick_place(sursa, place, dist)
preluate = preluate+1
preluate_ciclu = preluate_ciclu+1
repetari_flip = 0
IF (preluate == cerute) THEN
TYPE "program executat cu succes"
GOTO 200
END
END
END
;daca au existat si piese preluate si piese blocate, e posibil ca
;unele din piesele blocate sa se fi deblocat,
;asa ca se reanalizeaza scena
IF ((blocate == TRUE) AND (preluate_ciclu > 0)) THEN
GOTO 10
END
;daca am preluat absolut toate piesele comand aducerea de piese
IF ((nr_detectate == nr_recunoscute) AND (blocate == FALSE))

LABORATOR 8. ADEPT ANYFEEDER

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

LABORATOR 8. ADEPT ANYFEEDER

;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

S-ar putea să vă placă și

  • Proc Ese
    Proc Ese
    Document7 pagini
    Proc Ese
    briuliana
    Încă nu există evaluări
  • Metodologie Reinginerie Prin TQM Procese
    Metodologie Reinginerie Prin TQM Procese
    Document2 pagini
    Metodologie Reinginerie Prin TQM Procese
    briuliana
    Încă nu există evaluări
  • Auditul Calitatii - Curs
    Auditul Calitatii - Curs
    Document140 pagini
    Auditul Calitatii - Curs
    Adrian Pugna
    0% (1)
  • ''Metodologii SI CPS
    ''Metodologii SI CPS
    Document16 pagini
    ''Metodologii SI CPS
    briuliana
    Încă nu există evaluări
  • Modelarea Proceselor de Afaceri
    Modelarea Proceselor de Afaceri
    Document12 pagini
    Modelarea Proceselor de Afaceri
    Marius Marius
    Încă nu există evaluări
  • Lab11 Ppsight
    Lab11 Ppsight
    Document11 pagini
    Lab11 Ppsight
    MariusAlexandruCristea
    Încă nu există evaluări
  • Baze de Date - CPS
    Baze de Date - CPS
    Document9 pagini
    Baze de Date - CPS
    Teodora Radu
    Încă nu există evaluări
  • Robot 8b
    Robot 8b
    Document21 pagini
    Robot 8b
    briuliana
    Încă nu există evaluări
  • Laborator 7
    Laborator 7
    Document22 pagini
    Laborator 7
    irinuca12
    Încă nu există evaluări
  • Rob 5
    Rob 5
    Document15 pagini
    Rob 5
    briuliana
    Încă nu există evaluări
  • Rob 6
    Rob 6
    Document22 pagini
    Rob 6
    briuliana
    Încă nu există evaluări
  • Rob 2
    Rob 2
    Document8 pagini
    Rob 2
    briuliana
    Încă nu există evaluări
  • Rob 4
    Rob 4
    Document21 pagini
    Rob 4
    briuliana
    Încă nu există evaluări
  • Rob 3
    Rob 3
    Document18 pagini
    Rob 3
    briuliana
    Încă nu există evaluări
  • Rob 1
    Rob 1
    Document27 pagini
    Rob 1
    briuliana
    Încă nu există evaluări