Documente Academic
Documente Profesional
Documente Cultură
Silvia ANTON
x' = x cos( )
x
y ' = x sin( )
(1)
x' = y sin( )
y
y ' = y cos( )
(2)
sunt
L Py S = Py Si + l x1 cos( L )
=
4S
4 Si
L
(3)
Unde PxSi , PYSi i 4 Si este poziia iniial a robotului server i rotaia segmentului
4.
OL .
l x1
l x2
unde
x S y S
=
xC y C
(4)
x S = PxS PxSi
y S = PyS PySi
i
(5)
xC = PxC PxCi
y C = PyC PyCi
Din (4) i (5) rezult:
PxC =
l x1
L
l x1 PyCi + ( PyS PySi )l x2
P =
yC
l x1
(6
)
Dar PxC i PYC sunt exprimate n sistemul de coordonate al robotului server, pentru
a calcula coordonatele corecte se inlocuiete (5) i (4) n (1) i (2) rezultnd:
(7)
4 = 4 L
C
(8)
Ci
8.4 COMUNICAIA
8.4.1 INTERACIUNE PRIN MEDIU
Cel mai simplu i mai limitat tip de interaciune apare atunci cnd mediul
nsui devine mediu de comunicaie, i nu apare o comunicaie explicit sau
interaciune ntre roboi. Aceast modalitate de interaciune se mai numete i
cooperare fr comunicaie.
Acest tip de comunicaie se preteaz pentru roboii cu senzori de for ce
sunt conectai prin segmente virtuale utiliznd obiectele manipulate. n cazul
manipulrii cooperative datorit problemelor prezentate mai sus (alunecarea
gripper-ului, manipulare obiectelor ce nu sunt rigide) o conexiune de comunicaie
Serial/Ethernet este de asemenea necesar.
8.4.2 INTERACIUNE PRIN COMUNICAIE
Aceast form de interaciune implic o comunicaie explicit. Abordarea
utilizat este de a folosi doar comunicaia Ethernet i I/E pentru a sincroniza
micrile roboilor.
n acest caz n care un obiect este manipulat de doi roboi, primul robot
calculeaz offline un set de puncte pe care al doilea robot le urmrete, aici, nainte
ca micarea s nceap, roboii realizeaz o cumunicaie TCP/IP pentru a
trimite/recepiona setul de puncte, n etapa online micrile sunt sincronizate prin
activarea/dezactivarea unei linii de I/E pentru a semnala nceperea/terminarea
fiecrei micri.
8.4.2.1 BAZELE COMUNICAIEI PE LINII DE I/E
Uniti logice
Toate operaiile de comunicaie au ca referin o valoare ntreag numit
Numr de Unitate Logica sau LUN. LUN ofer o cale scurt pentru a identifica ce
dispozitiv sau fiier este referit de o operaie de I/E.
Verificarea execuiei instruciunilor de I/E
Spre deosebire de majoritatea instruciunilor V+, operaiile de I/E pot s nu
se execute corect n anumite cazuri. De exemplu, cnd se citete un fiier, un status
este returnat programului pentru a indica dac s-a ajuns la sfritul fiierului.
Programul trebuie s trateze acest status i s continue execuia. n mod similar, o
linie serial poate returna un status de eroare pentru o eroare de paritate ce ar trebui
s determine programul s reia secvena de transmisie a datelor.
Din acest motiv, instruciunile V+ de I/E nu opresc execuia programului
cnd apare o eroare. n schimb, starea execuiei instruciunii este salvat intern
pentru a putea fi accesat de funcia IOSTAT. De exemplu execuia funciei
IOSTAT(5) va returna o valoare indicnd starea ultimei operaii de I/E asupra LUN
5. Valorile returnate de IOSTAT se ncadreaza ntr-una din categoriile:
Valoare
1
0
<0
Descriere
Operaia de I/E s-a efectuat cu succes
Operaia de I/E nc nu s-a terminat, acest cod
apare de obicei n cazul n care se realizeaza o
operatie de I/E fr ateptare
Operaia de I/E s-a terminat cu o eroare, codul
indic tipul de eroare ce a aparut
Tabelul 1. Valorile returnate de IOSTAT.
n cazul n care valoarea returnat de IOSTAT este mai mic dect 0, atunci
funcia $ERROR poate fi folosit pentru a genera mesajul de eroare asociat cu
majoritatea erorilor de I/E.
Pentru o bun practic este bine ca IOSTAT s fie folosit dup fiecare
operaie de I/E. n cazul n care se folosete funcia GETC nu mai este necesar
folosirea funciei IOSTAT deoarece erorile sunt returnate direct de catre GETC.
Ataarea/Detaarea Unitilor Logice
n general, un dispozitiv de I/E trebuie s fie ataat folosind instruciunea
ATTACH nainte ca acesta s poat fi accesat de program. Odat ce un dispozitiv a
fost ataat de un program, dispozitivul respectiv nu mai poate fi folosit de un alt
program. Majoritatea operaiilor de I/E vor genera erori dac dispozitivul asociat cu
LUN-ul referit nu este ataat.
Fiecare task program are propriul set de uniti logice. Astfel c mai multe
programe pot ataa acelai numr de unitate logic n acelai timp fr s apar
interferene.
Un tip de dispozitiv fizic poate fi specificat cnd unitatea logic este ataat.
Dac un tip de dispozitiv este specificat, suprascrie dispozitivul predefinit, ns
doar pentru unitatea logic ataat. Tipul de dispozitiv specificat rmne selectat
pn cnd unitatea logic este detaat.
O cerere de ataare poate specifica opional modul imediat. n mod normal, o
cerere de ataare este plasat ntr-o coad, iar programul apelant este suspendat
dac un alt program are dispozitivul ataat. Cnd dispozitivul este detaat,
urmtoarea cerere din coad va fi procesat. n modul imediat, instruciunea
ATTACH se execut imediat, i se termin cu o eroare dac dispozitivul este deja
ataat de un alt program.
n V+, cererile de ataare pot s specifice de asemenea modul no-wait. Acest
mod permite ca o cerere de ataare s fie introdus n coad fr a fora programul
s atepte ca aceasta s fie tratat. n acest caz trebuie folosit funcia IOSTAT
pentru a determina cnd s-a realizat ataarea.
Dac un task este deja ataat la o unitate logic, va primi o eroare dac va
ncerca s ataeze din nou fr ca n prealabil s detaeze un dispozitiv fr a se
ine cont de tipul de ateptare specificat.
Cnd un program a ncetat a folosi un dispozitiv, trebuie s detaeze acel
dispozitiv folosind instruciunea DETACH ceea ce va permite celorlalte programe
s proceseze operaiile de I/E cu acel dispozitiv.
Exerciiu
Folosind scheletul de program de mai sus i funciile (INRANGE, POS,
$MID, VAL), realizai un program ce ateapt pe linia serial o nregistrare de tipul
x,y,z, i va deplasa robotul ntr-o poziie ce se gsete la distana x, y, z, pe axele
X, Y, Z (sistem de coordonate World) fa de poziia precedent.
.PROGRAM move.serial()
AUTO slun ;Unitate Logica pentru comunicatia pe portul
;serial
Clientul
Pentru a stabili o conexiune, clientul trebuie s tie adresa IP i numrul
portului deschis de server. Clientul poate alege portul local pe care va realiza
comunicaia n mod arbitrar, dar n general acesta este ales de ctre driverul TCP.
Cu ajutorul acestor informaii, clientul poate ncerca o stabilire a conexiunii
transmind o cerere ctre server.
Atunci cnd serverul TCP primete aceast cerere, verific dac portul
clientului se potrivete cu cel de pe server. n momentul in care s+au terminat
verificrile, se retransmite un mesaj ctre client. Odat ce conexiunea client-server
a fost stabilit, att serverul ct i clientul pot ncepe o transmitere bidirecional de
date.
Exemplu de aplicaie de comunicatie pe TCP: Echo Server
Urmtorul program implementeaz un server echo. Mesajele primite de la
clieni sunt trimise napoi. Un astfel de program poate fi folosit pentru testarea
conexiunilor de reea.
.PROGRAM server.echo()
;-----------------------------------------------------------;Serever ECHO
;Programul poate fi oprit prin trimiterea mesajului "quit"
;-----------------------------------------------------------AUTO handle, lun, do_wait, status
AUTO $in.str, $out.str, repeat_loop
;Constante de initializare
do_wait = 0
lun = 7
;se ataseaza dispozitivul TCP, mode=4 inseamna ca se
;aloca
;urmatorul LUN disponibil
ATTACH (lun, 4) "TCP"
status = IOSTAT(lun) ; Se verifica executia
;instructiunii ATTACH
IF status < 0 THEN
TYPE "Eroare la ATTACH:", $ERROR(status)
GOTO 110
END
;Se deschide un socket pe portul 1234, ce accepta 5
;clienti, avand un buffer de 1024 de bytes
FOPEN (lun, 16) "/LOCAL_PORT 1234 /CLIENTS 5
/BUFFER_SIZE 1024"
status = IOSTAT(lun) ;Se verifica executia
;instructiunii FOPEN
IF status < 0 THEN
TYPE "Eroare la FOPEN:", $ERROR(status)
GOTO 100
END
repeat_loop = TRUE
WHILE repeat_loop DO
WAIT
READ (lun, handle, do_wait) $in.str
status = IOSTAT(lun)
CASE status OF
VALUE 1: ;Succes - se trimite sirul de caractere
;inapoi
IF $in.str == "quit" GOTO 100
$out.str = $in.str
TYPE "S-a primit sirul: ", $out.str
WRITE (lun, handle) $out.str, /N
VALUE 100: ;S-a deschis o noua conexiune
TYPE "S-a deschis o noua conexiune. Handle=",
handle
VALUE 101: ;Conexiune inchisa
TYPE "Conexiune inchisa. Handle=", handle
FCMND (lun, 600) $INTB(handle) ; Eliberare handle
status = IOSTAT(lun) ; Se verifica executia
;instructiunii FCMND
IF status < 0 THEN
TYPE "Eroare la FCMND:", $ERROR(status)
GOTO 100
END
WAIT
VALUE -526: ;Nu s-au receptionat date
ANY ;Alte erori
TYPE "Eroare la citire: ", $ERROR(status)
GOTO 100
END
END
;Se inchid toate conexiunile, si se elibereaza unitatea
;logica
100
FCLOSE (lun)
DETACH (lun)
110
;Iesire din program
.END
Exerciiu
Realizai un program de tip Client/Server pentru schimbul de mesaje ntre
cei doi roboi SCARA. Mesajele vor fi scrise de la terminalul fiecarui robot.
ROBOTUL COBRA S600
.PROGRAM s600.com()
;-----------------------------------------------------------;Program Comunicatie TCP s600
;Programul poate fi oprit prin trimiterea mesajului "quit"
;------------------------------------------------------------
repeat_loop = TRUE
WHILE repeat_loop DO
WAIT
IF $mesaj == "quit" GOTO 100
IF $mesaj <> "" THEN
WRITE (lun, handle) $mesaj, /N
IF IOSTAT(lun)<0 THEN
TYPE
"Eroare
de
comunicatie:
",
$ERROR(IOSTAT(lun))
GOTO 100
END
$mesaj = ""
END
READ (lun, handle, wait) $in.str
status = IOSTAT(lun)
CASE status OF
VALUE 1: ;Succes - se afiseaza sirul de caractere
TYPE "S-a primit de la 600TT sirul: ", $in.str
VALUE 100: ;S-a deschis o noua conexiune
TYPE "S-a deschis o noua conexiune. Handle=",
handle
VALUE 101: ;Conexiune inchisa
TYPE "Conexiune inchisa. Handle=", handle
GOTO 110
END
FOPEN
(lun,
0)
"s600
/REMOTE_PORT
1234
/BUFFER_SIZE
1024"
status = IOSTAT(lun) ;Se verifica executia
;instructiunii FOPEN
IF status < 0 THEN
TYPE "Eroare la FOPEN:", $ERROR(status)
GOTO 100
END
;mlun=4
;ATTACH(mlun)
;FOPEN(mlun)
repeat_loop = TRUE
WHILE repeat_loop DO
WAIT
IF $mesaj == "quit" GOTO 100
IF $mesaj <> "" THEN
WRITE (lun) $mesaj
IF IOSTAT(lun)<0 THEN
TYPE
"Eroare
de
comunicatie:
$ERROR(IOSTAT(lun))
GOTO 100
END
$mesaj = ""
END
READ (lun, wait) $read_str
IF IOSTAT(lun)<0 THEN
TYPE
"Eroare
de
comunicatie:
$ERROR(IOSTAT(lun))
GOTO 100
END
TYPE "Mesaj de la s600: ", $read_str
END
",
",
pentru
END
OPENI
DEPARTS 80
GOTO 110
;Se inchid toate conexiunile, si se elibereaza unitatea
;logica
100
FCLOSE (lun)
DETACH (lun)
110
;Iesire din program
.END
;Constante de initializare
do_wait = 0
semnal1 = 57
semnal2 = 1048
PARAMETER HAND.TIME = 0.5
SPEED 100 ALWAYS
LEFTY
MOVET safe, 1
APPRO p1, 80
BREAK
MOVES p1
CLOSEI
(lun,
0)
"s600
/REMOTE_PORT
1234
/BUFFER_SIZE