3. Operazioni Funzionali CNDE
3.1. Configurazione Input e Dati di Input
Il client invia frame di dati al robot tramite CNDE per controllare uscite DO, AO, registri di input, ecc. Prima di inviare dati di input, è necessario configurare il contenuto funzionale da controllare. La Tabella 2-1 mostra il formato del contenuto della configurazione di input CNDE, che include il numero di ricetta e una serie di nomi di funzioni di configurazione di input (Tabella 1-2); la corrispondente Tabella 3-2 mostra il formato del contenuto dei dati di input, che include il numero di ricetta e il gruppo di byte dei dati di input.
CNDE supporta un massimo di 8 ricette per l’input dei dati. Quando vengono inviati dati di input, il robot abbina il numero di ricetta nei dati ricevuti al corrispondente gruppo di nomi di funzioni configurato per quella ricetta, analizza i dati per ottenere il valore di input per ciascun nome di funzione e quindi esegue operazioni di controllo del robot in base ai dati di input.
Tabella 3-1 Formato contenuto configurazione input
Nome |
Numero Ricetta |
Stringa Nomi Funzione |
Lunghezza(byte) |
1 |
– |
Contenuto |
0 ~ 7 |
Serie di nomi funzioni dati input |
Tabella 3-2 Formato contenuto dati input
Nome |
Numero Ricetta |
Gruppo Byte Dati |
Lunghezza(byte) |
1 |
– |
Contenuto |
0 ~ 7 |
Contenuto dati input |
Durante la configurazione dell’input, dopo aver ricevuto il gruppo di nomi di configurazione, il controller del robot verifica ciascun nome. Se i nomi delle funzioni configurati sono corretti, il robot restituisce i nomi dei tipi di dati di tutte le funzioni configurate, separati da «,»; se ci sono errori nei nomi delle funzioni configurate, il robot restituisce il contenuto di errore corrispondente. Un esempio di frame di dati di configurazione input (esadecimale) è il seguente:
La lunghezza totale del gruppo di nomi delle funzioni di input configurate è di 54 byte, più 1 byte per il numero di ricetta input, per un totale di 55 byte. Convertito in esadecimale è 0x0037. In modalità little-endian, la lunghezza dei dati corrispondente nel frame di dati di input è «37 00».
In questo caso, il robot restituirà un frame di dati di tipo messaggio di testo (messaggio di testo nella Sezione 3.3.1 di questo documento):
Il tipo di messaggio «00» indica che si tratta di un messaggio di feedback di esecuzione riuscita. Il client può estrarre il «Tipo configurazione dati input» e confrontarlo con la Tabella 1-3 per ottenere la lunghezza in byte della configurazione input. In questo esempio, la lunghezza totale dei dati è 1*5 + 4*30 + 8*30 = 365 byte.
Se il nome della configurazione input è errato:
Il feedback corrispondente è:
I dati di input possono essere inviati ciclicamente a un certo periodo, o solo quando necessario. Durante l’input ciclico, il periodo minimo gestibile dal robot è 1ms, ma un periodo di input troppo rapido comporta un certo carico sulle risorse di sistema del robot. Si consiglia di impostare ragionevolmente il periodo di input dei dati in base alla situazione effettiva.
Inoltre, quando si invia un frame di dati al robot, il robot non invierà feedback a meno che la lunghezza del frame di dati o i dati non siano anomali. Un esempio di frame di dati di input è il seguente. Il numero di ricetta dei dati di input e la lunghezza del gruppo di byte dei dati di input devono corrispondere alla configurazione di input:
3.2. Configurazione Output e Dati di Output
Il client può personalizzare il contenuto e il periodo del feedback di stato quando ottiene il feedback di stato del robot tramite CNDE. L’utilizzo del feedback di stato CNDE del robot richiede i seguenti tre passaggi: ① Configurazione output; ② Avvio output; ③ Ricezione dati output.
3.2.1. Configurazione Output
Il contenuto del frame di configurazione output include il periodo di output e il gruppo di nomi delle funzioni di output (tutti i nomi configurabili sono nella Tabella 1-1). L’intervallo di configurazione del periodo di output è 1 ~ 200 ms. Il numero massimo di byte dei dati di output supportato è 4096 byte. Il gruppo di nomi delle funzioni di output è una serie di stringhe di nomi di funzioni di output separate da «,». Dopo che il client invia il frame di configurazione output, il robot verifica i nomi delle funzioni configurati. Se tutti i nomi delle funzioni configurati sono supportati dal CNDE del robot corrente, il robot restituisce una serie di combinazioni di tipi di dati separate da «,»; altrimenti, se la verifica dei nomi di configurazione output fallisce, restituisce le informazioni di errore corrispondenti.
Tabella 3-3 Contenuto configurazione output
Nome |
Periodo Output(ms) |
Stringa Nomi Funzione |
Lunghezza(byte) |
2 |
– |
Contenuto |
1-200 |
Gruppo nomi funzioni output |
Ad esempio, il frame di configurazione output è il seguente:
La lunghezza totale del gruppo di nomi delle funzioni di output configurate è di 48 byte, più 2 byte per il periodo di output, per un totale di 50 byte. Convertito in esadecimale è 0x0032. In modalità little-endian, la lunghezza dei dati corrispondente nel frame di dati di input è «32 00».
In questo caso, il robot restituirà un frame di dati di tipo messaggio di testo (messaggio di testo nella Sezione 3.3.1 di questo documento):
Il tipo di messaggio «00» indica che si tratta di un messaggio di feedback di esecuzione riuscita. Il client può estrarre il «Tipo configurazione dati output» e confrontarlo con la Tabella 1-3 per ottenere la lunghezza in byte della configurazione output. In questo esempio, la lunghezza totale dei dati è 1 + 8*10 + 4 = 85 byte.
Se il nome della configurazione input è errato, ad esempio «queue» scritto erroneamente come «quene»:
Il feedback corrispondente è:
3.2.2. Avvio e Arresto Output
Dopo aver completato la configurazione output CNDE del robot, inviando il comando di avvio output CNDE, il robot inizierà a fornire feedback di stato in base al periodo e al contenuto di output configurati. Allo stesso modo, inviando il comando di arresto output CNDE, il robot interromperà il feedback di stato. I comandi di avvio e arresto CNDE non hanno contenuto, quindi la lunghezza dei dati corrispondente è 0.
Tabella 3-4 Contenuto Avvio/Arresto Output CNDE
Nome |
Gruppo Byte Dati |
Lunghezza(byte) |
0 |
Contenuto |
Nessuno |
Un esempio di frame di dati per avviare l’output CNDE del robot è il seguente:
3.2.3. Ricezione Dati Output da Parte del Client
Dopo aver avviato l’output dati CNDE del robot, il client deve impostare un ciclo per ricevere le informazioni di dati restituite dal robot. La frequenza di ricezione ciclica del client deve essere superiore alla frequenza di output dati configurata, altrimenti potrebbero verificarsi perdite di pacchetti. Il contenuto dei dati di output del robot è mostrato nella Tabella 3-5; la lunghezza del gruppo di byte dei dati di output del robot è la somma delle lunghezze in byte di tutti i dati delle funzioni configurate per l’output. L’array di byte è una combinazione di tutti i dati di stato in ordine di funzione configurata, allineato a 1 byte.
Tabella 3-5 Contenuto dati output CNDE
Nome |
Gruppo Byte Dati |
Lunghezza(byte) |
– |
Contenuto |
Gruppo byte dati output |
Un esempio di frame di dati di output del robot è il seguente:
3.3. Funzioni Ausiliarie CNDE
3.3.1. Messaggio di Testo
Il client e il robot possono scambiarsi messaggi di testo tramite CNDE. Il contenuto del messaggio include il tipo di messaggio e la stringa del messaggio (Tabella 3-6), dove il tipo di messaggio è definito nella Tabella 3-7. Quando il client CNDE invia comandi al robot come configurazione input, configurazione output, avvio output, arresto output, ecc., il robot risponde sempre con un messaggio di testo.
Se i comandi sopra menzionati vengono eseguiti con successo, il robot restituisce un tipo di messaggio «Successo», corrispondente al valore 0x00; al contrario, se l’esecuzione fallisce, il robot restituisce un tipo di messaggio «Errore», corrispondente al valore 0x03. Il client può determinare il risultato dell’esecuzione del comando in base al tipo di messaggio restituito. Se il tipo di messaggio è «Errore», è possibile estrarre le informazioni di errore per analizzarne la causa.
Tabella 3-6 Contenuto messaggio di testo
Nome |
Tipo Messaggio |
Stringa Messaggio |
Lunghezza(byte) |
1 |
– |
Contenuto |
0 ~ 4 |
Stringa messaggio |
Tabella 3-7 Tipi messaggio di testo CNDE robot
Tipo |
Valore |
Successo |
0x00 |
Informazione |
0x01 |
Avviso |
0x02 |
Errore |
0x03 |
Guasto |
0x04 |
3.3.2. Cambiare Numero Versione Protocollo CNDE Robot
Attualmente, il CNDE del robot ha solo una versione, il numero di versione è «FR-CNDE-V0001». Pertanto, questa funzione è riservata e non è ancora disponibile per l’uso.
3.3.3. Ottenere Informazioni Versione Software/Firmware Robot
Il client invia un comando al robot tramite CNDE per richiedere informazioni sulla versione software/firmware. Il contenuto del comando è vuoto. Dopo aver ricevuto la richiesta, il robot risponderà con un messaggio di testo che include informazioni come il modello del robot, la versione del software del robot, la versione del firmware del robot, la versione hardware del robot, ecc.
3.4. Acquisizione Dati Periodici della Funzione di Trasmissione Trasparente dell’End-Effector (CNDE)
3.4.1. Descrizione della Configurazione CNDE
Dopo aver abilitato la funzione di trasmissione trasparente dell’end-effector, è possibile configurare l’opzione «axle_gen_com_data» e il periodo in CNDE per ottenere i dati periodici della periferica letti dall’end-effector. Il frame di dati di feedback è definito come segue.
Tabella 3-8 Definizione del protocollo di feedback CNDE per i dati periodici della funzione di trasmissione trasparente dell’end-effector
Byte 1 |
Byte 2 |
Byte 3-130 |
ErrorCode |
Len |
Data |
0 - Comunicazione normale |
Lunghezza dei dati periodici |
Buffer del frame dati |
1 - Anomalia di comunicazione tra end-effector e robot |
Lunghezza azzerata quando il codice di errore è diverso da zero |
Buffer azzerato quando il codice di errore è diverso da zero |
2 - Anomalia di comunicazione 485 dell’end-effector |
Prendendo come esempio la configurazione dei dati periodici della periferica DIO Health Care Moxibustion Head, il codice mostra la configurazione per ottenere i dati di trasmissione trasparente periodici dell’end-effector con un periodo di acquisizione di 50 ms.
Esempio di codice di configurazione CNDE per la trasmissione trasparente dell’end-effector:
1tring outputCfg = "axle_gen_com_data"; //Ottiene i dati periodici di trasmissione trasparente dell'end-effector
2byte[] sendBuffer = new byte[] { };
3byte[] cfgBuffer = Encoding.UTF8.GetBytes(outputCfg);
4CNDEPkg pkg = new CNDEPkg();
5pkg.type = 1; //Configurazione di uscita
6pkg.len = (ushort)(2 + outputCfg.Length);
7pkg.data.Clear();
8UInt16 period = 50; //50ms update
9byte[] periodBt = new byte[2] {0, 0};
10Int16ToByte(period, ref periodBt);
11pkg.data.AddRange(periodBt); //Periodo di comunicazione
12pkg.data.AddRange(cfgBuffer);
13pkg.ToBytes(ref sendBuffer);
Esempio di codice di unpacking dei dati periodici del DIO Health Care Moxibustion Head basato su CNDE:
1if (pkg.type == 4)
2{
3 int size = Marshal.SizeOf(putDate);
4 IntPtr structPtr = Marshal.AllocHGlobal(size);
5 Marshal.Copy(pkg.data.ToArray(), 0, structPtr, size);
6 putDate = (OUTPKG)Marshal.PtrToStructure(structPtr, typeof(OUTPKG));
7
8 int errorcode = putDate.axle_gen_com_data[0];
9 int datalen = putDate.axle_gen_com_data[1];
10 // Filtra i pacchetti anomali
11 if ((errorcode != 0) || (datalen == 0) ||
12 (putDate.axle_gen_com_data[2] != 0xAB) ||
13 (putDate.axle_gen_com_data[3] != 0xBA))
14 {
15 Console.WriteLine($"rcv data is error");
16 continue;
17 }
18 // Pacchettizzazione secondo il protocollo del DIO Health Care Moxibustion Head
19 int curTem = putDate.axle_gen_com_data[6];
20 int targetTem = putDate.axle_gen_com_data[7];
21 int genData1 = putDate.axle_gen_com_data[8] << 8 | putDate.axle_gen_com_data[9];
22 int genData2 = putDate.axle_gen_com_data[10] << 8 | putDate.axle_gen_com_data[11];
23 int genData3 = putDate.axle_gen_com_data[12] << 8 | putDate.axle_gen_com_data[13];
24 int genData4 = putDate.axle_gen_com_data[14] << 8 | putDate.axle_gen_com_data[15];
25 int genData5 = putDate.axle_gen_com_data[16] << 8 | putDate.axle_gen_com_data[17];
26 int genData6 = putDate.axle_gen_com_data[18] << 8 | putDate.axle_gen_com_data[19];
27
28 Console.WriteLine($"the data is errorcode {errorcode}; datalen {datalen} curTem {curTem}; targetTem {targetTem} genData1 {genData1} genData2 {genData2} genData3 {genData3} genData4 {genData4} genData5 {genData5} genData6 {genData6} ");
29 udpClient.Client.ReceiveTimeout = 100;
30 Marshal.FreeHGlobal(structPtr);
31}
Esempio di codice di comunicazione dati non periodici del DIO Health Care Moxibustion Head basato sulla funzione di trasmissione trasparente dell’end-effector:
1void testAxleGenCom()
2{
3 int[] led_on = new int[6] { 0xAB, 0xBA, 0x12, 0x01, 0x01, 0x79 };
4 int[] led_off = new int[6] { 0xAB, 0xBA, 0x12, 0x01, 0x00, 0x78 };
5 int[] version = new int[5]{ 0xAB, 0xBA, 0x11, 0x00, 0x76 };
6 int[] state = new int[6] { 0xAB, 0xBA, 0x1B,0x01, 0xAA, 0x2B };
7 int[] cycleState = new int[6] { 0xAB, 0xBA, 0x12, 0x01, 0x00, 0x78 };
8
9 int[] rcvdata = new int[16];
10 int ret = 0;
11 int cnt = 1;
12
13 JointPos p1Joint = new JointPos(88.708, -86.178, 140.989, -141.825, -89.162, -49.879);
14 DescPose p1Desc = new DescPose(188.007, -377.850, 260.207, 178.715, 2.823, -131.466);
15
16 JointPos p2Joint = new JointPos(112.131, -75.554, 126.989, -139.027, -88.044, -26.477);
17 DescPose p2Desc = new DescPose(368.003, -377.848, 260.211, 178.715, 2.823, -131.465);
18
19 ExaxisPos exaxisPos = new ExaxisPos(0, 0, 0, 0);
20 DescPose offdese = new DescPose(0, 0, 0, 0, 0, 0);
21
22 //Abilita la funzione di trasmissione trasparente dell'end-effector
23 robot.SetAxleGenComEnable(1);
24 robot.SetAxleLuaEnable(1);
25
26 while(cnt<=10)
27 {
28 //Legge il numero di versione
29 ret = robot.SndRcvAxleGenComCmdData(5, version, 10, ref rcvdata);
30 Console.WriteLine($" hard version : {rcvdata[4]},hard code:{rcvdata[5]}, soft version:{rcvdata[6]} {rcvdata[7]}, soft code:{rcvdata[8]}");
31 if (ret != 0)
32 {
33 break;
34 }
35 Thread.Sleep(1000);
36 //Legge lo stato di presenza della testa di moxibustione
37 ret = robot.SndRcvAxleGenComCmdData(6, state, 6, ref rcvdata);
38 Console.WriteLine($" state : {rcvdata[4]}");
39 Thread.Sleep(1000);
40 //Accende il laser della testa di moxibustione
41 ret = robot.SndRcvAxleGenComCmdData(6, led_on, 6, ref rcvdata);
42 Console.WriteLine($"led on rcv data is: {rcvdata[0]},{rcvdata[1]}, {rcvdata[2]}, {rcvdata[3]}, {rcvdata[4]}, {rcvdata[5]}");
43 robot.MoveJ(p1Joint, p1Desc, 0, 0, 100, 100, 100, exaxisPos, -1, 0, offdese);
44 Thread.Sleep(4000);
45 //Spegne il laser della testa di moxibustione
46 ret = robot.SndRcvAxleGenComCmdData(6, led_off, 6, ref rcvdata);
47 Console.WriteLine($"led off rcv data is: {rcvdata[0]},{rcvdata[1]}, {rcvdata[2]}, {rcvdata[3]}, {rcvdata[4]}, {rcvdata[5]}");
48 robot.MoveJ(p2Joint, p2Desc, 0, 0, 100, 100, 100, exaxisPos, -1, 0, offdese);
49 Thread.Sleep(1000);
50 Console.WriteLine($"***********************complate No. {cnt} SDK test*****************************");
51 cnt++;
52 }
53
54}