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:

../_images/00117.png

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

../_images/00216.png

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:

../_images/00317.png

Il feedback corrispondente è:

../_images/00418.png

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:

../_images/00517.png

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:

../_images/00618.png

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

../_images/00717.png

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»:

../_images/00816.png

Il feedback corrispondente è:

../_images/00914.png

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:

../_images/01015.png

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:

../_images/01114.png

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}