Vai al contenuto
PLC Forum


Comau C5G: Linguaggio di programmazione


lupusimprobus

Messaggi consigliati

lupusimprobus

Buongiorno a tutti.
Ho un problema di programmazione con un Robot Comau G5C

 

Ho una pinza tipo cambio utensile che deve:

  1.   Aprire la pinza;
  2.    Svincolare il robot;
  3.   Controllare che l'utensile sia correttamente posizionato nel magazzino (tramite un segnale dal PLC via profinet);
  4.   Proseguire con il movimento successivo solo se il bit di controllo è ON.


Il codice del programma è il seguente:

 

01 -- $DOUT[74] = Comando apri pinza
02 $DOUT[74] := ON
03 -- Controllo che la pinza sia aperta
04 -- $DIN[75] = Pinza aperta
05 WAIT FOR $DIN[75] = ON
06 DELAY 500
07 -- Svincolo la pinza dall'utensile, salita in lenta
08 MOVEFLY LINEAR NEAR posDep BY off_S ADVANCE WITH $PROG_SPD_OVR = velRid
09 -- Prima di terminare lo svincolo in velocita rapida...
10 -- Controllo che il PX di presenza utensile sia libero
11 -- Reset del numero utensile in carico
12 -- $FMO[89] = Numero utensile presente sul robot
13 $FMO[89] := 0
14 -- $DOUT[79] = Scrittura utensile necessaria
15 PULSE $DOUT[79] FOR 500
16
17 -- Acquisizione stato utensili in magazzino
18 SELECT posizione OF -- "posizione" è una INT che indica in quale posizione [1..8] del magazzino sto lavorando
19   -- Depositato in posto 1
20   CASE(1):
21     -- $DIN[57] = Deposito eseguibile in posto 1
22     depOK := $DIN[57] -- depOK è un BOOL che identifica lo stato del PX che controlla il corretto posizionamento dell'utensile all'interno del magazzino.
23   -- Depositato in posto 2
24   CASE(2):
25     -- $DIN[58] = Deposito eseguibile in posto 2
26     depOK := $DIN[58]
27   -- Depositato in posto 3
28   CASE(3):
29     -- $DIN[59] = Deposito eseguibile in posto 3
30     depOK := $DIN[59]
31   -- Depositato in posto 4
32   CASE(4):
33     -- $DIN[60] = Deposito eseguibile in posto 4
34     depOK := $DIN[60]
35   -- Depositato in posto 5
36   CASE(5):
37     -- $DIN[61] = Deposito eseguibile in posto 5
38     depOK := $DIN[61]
39   -- Depositato in posto 6
40   CASE(6):
41     -- $DIN[62] = Deposito eseguibile in posto 6
42     depOK := $DIN[62]
43   -- Depositato in posto 7
44   CASE(7):
45     -- $DIN[63] = Deposito eseguibile in posto 7
46     depOK := $DIN[63]
47   -- Depositato in posto 8
48   CASE(8):
49     -- $DIN[64] = Deposito eseguibile in posto 8
50     depOK := $DIN[64]
51   ELSE:
52     -- Non dovrebbe mai accadere in quanto il programma principale
53     -- passa valori compresi tra 1 e 8
54     -- Comunque segnalo l'anomalia
55     alarmDeposito(5)
56     RETURN (5)
57 ENDSELECT
58
59 -- Verifica ce il deposito non sia piu disponibile
60 IF depOK = ON THEN
61   -- Posso depositare
62   -- Significa che il deposito non si e concluso correttamente
63   -- Posiziono la pinza in alto fuori ingombro
64   MOVEFLY LINEAR NEAR posDep BY off_L ADVANCE WITH $PROG_SPD_OVR = velRid
65   -- Segnalo l'errore
66   alarmDeposito(6)
67   RETURN (6)
68 ENDIF -- depOK = ON

Riga:

08    : Svincolo la pinza dal magazzino
09..16: Segnali che mando al PLC
17..57: In base alla variabile "posizione" leggo lo stato del sensore del posto magazzino corrispondente.
59..67: Controllo lo stato della variabile "depOK" (ON/OFF)

A quanto ho capito, il controllo dello stato del sensore viene fatto durante il movimento della riga 08 e non alla sua conclusione, ciò fa si ce se il sensore viene impegnato durante il movimento il robot considera il controllo positivo e prosegue comunque con i movimenti.

Come posso modificare il programma per essere sicuro che il robot controlli lo stato del sensore solo dopo aver concluso il movimento?

 

Grazie a tutti per l'attenzione.
Valerio Gallo

Link al commento
Condividi su altri siti


lupusimprobus

Risposta da COMAU:

Per non far elaborare il codice del controllo presenza utansile prima che il movimento di svincolo (riga 08) sia concluso, occorresostituire la riga

07 -- Svincolo la pinza dall'utensile, salita in lenta
08 MOVEFLY LINEAR NEAR posDep BY off_S ADVANCE WITH $PROG_SPD_OVR = velRid

con...

07 -- Svincolo la pinza dall'utensile, salita in lenta
08 MOVE LINEAR NEAR posDep BY off_S WITH $PROG_SPD_OVR = velRid

In pratica basta togliere il MOVEFLY-ADVANCE

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...