15. CNDE

15.1. Configurare il Feedback di Stato CNDE del Robot

Prototipo

SetRobotRealtimeStateConfig(states: List[RobotState], period: int = 500) -> int:

Descrizione

Imposta la configurazione predefinita CNDE (da chiamare prima della connessione RPC)

Parametri Obbligatori

  • states: Lista di enum RobotState

  • period: Periodo dati (ms), intervallo 8-1000, default 8ms

Parametri Predefiniti

Nessuno

Valore di Ritorno

  • Codice di errore Successo-0 Fallimento-errcode

15.2. Aggiungere uno Stato del Robot alla Configurazione di Stato CNDE

Prototipo

AddRobotRealtimeState(states: List[RobotState], ip: str = None) -> int:

Descrizione

Aggiunge la lista stati CNDE basata sulla configurazione esistente (supporta manutenzione dinamica e isolamento IP)

Parametri Obbligatori

  • states: Lista di enum RobotState, stati da aggiungere

  • ip: Opzionale, specifica l’IP del robot (per configurazione isolata multi-robot; se non fornito, modifica la configurazione globale)

Parametri Predefiniti

Nessuno

Valore di Ritorno

  • Codice di errore Successo-0 Fallimento-errcode

15.3. Eliminare uno Stato del Robot dalla Configurazione di Stato CNDE

Prototipo

DeleteRobotRealtimeState(states: List[RobotState], ip: str = None) -> int:

Descrizione

Elimina la lista stati CNDE basata sulla configurazione esistente (supporta manutenzione dinamica e isolamento IP)

Parametri Obbligatori

  • states: Lista di enum RobotState, stati da eliminare

  • ip: Opzionale, specifica l’IP del robot (per configurazione isolata multi-robot; se non fornito, modifica la configurazione globale)

Parametri Predefiniti

Nessuno

Valore di Ritorno

  • Codice di errore Successo-0 Fallimento-errcode

15.4. Impostare il Periodo di Feedback di Stato CNDE

Prototipo

SetRobotRealtimeStatePeriod(period: int, ip: str = None) -> int:

Descrizione

Imposta il periodo di feedback di stato CNDE (supporta configurazione globale o isolata per IP)

Parametri Obbligatori

  • period: Periodo dati (ms), intervallo 8-1000

  • ip: Opzionale, specifica l’IP del robot (se non fornito, modifica la configurazione globale)

Parametri Predefiniti

Nessuno

Valore di Ritorno

  • Codice di errore Successo-0 Fallimento-errcode

15.5. Ottenere l’Insieme Completo di Stati dell’Attuale Feedback di Stato CNDE

Prototipo

CNDEGetConfig(self) -> tuple:

Descrizione

Ottiene tutti gli insiemi di stati correnti

Parametri Obbligatori

Nessuno

Parametri Predefiniti

Nessuno

Valore di Ritorno

  • Codice di errore Successo-0 Fallimento-errcode Struttura risultato configurazione contenente lista stati

15.6. Esempio di Codice per l’Utilizzo del Feedback di Stato CNDE

  1from fairino import Robot
  2from fairino.Robot import RobotState, SetRobotRealtimeStateConfig, DEFAULT_CNDE_STATES, AddRobotRealtimeState, DeleteRobotRealtimeState, SetRobotRealtimeStatePeriod
  3import time
  4
  5# ==================== Parametri di Configurazione Globali ====================
  6ROBOT_IP = '192.168.58.2'       # Indirizzo IP del robot
  7# ========== Test1: Test di Configurazione CNDE e Acquisizione Dati =============
  8# Passaggi del test:
  9# 1. Impostare configurazione CNDE (JointCurPos, ToolCurPos, periodo 20ms)
 10# 2. Stabilire connessione RPC
 11# 3. Stampare i dati delle posizioni dei giunti e della posa TCP del robot
 12# 4. Ottenere timestamp e verificare il periodo
 13# 5. Modificare configurazione (RobotMode, RbtEnableState, periodo 10ms)
 14# 6. Verificare che la nuova configurazione sia attiva
 15
 16def test1_cnde_config_and_data():
 17    """Test1: Test di configurazione CNDE e acquisizione dati - verifica delle impostazioni di configurazione e della tempestività dei dati"""
 18    print_separator("Test1: Test di configurazione CNDE e acquisizione dati")
 19
 20    # ===== Passo 1: Impostare configurazione CNDE (JointCurPos, ToolCurPos, 20ms) =====
 21    print("\n[Passo 1] Impostazione configurazione CNDE...")
 22    print("  Campi di configurazione: JointCurPos, ToolCurPos")
 23    print("  Periodo di feedback: 20ms")
 24
 25    custom_states = [
 26        RobotState.JointCurPos,   # Posizione corrente del giunto
 27        RobotState.ToolCurPos,    # Posizione corrente dell'utensile (TCP)
 28    ]
 29
 30    rtn = SetRobotRealtimeStateConfig(custom_states, 20)
 31    if rtn != 0:
 32        print(f"✗ Impostazione configurazione fallita, codice errore: {rtn}")
 33        return None
 34    print("✓ Configurazione CNDE impostata con successo")
 35
 36    # ===== Passo 2: Stabilire connessione RPC =====
 37    print(f"\n[Passo 2] Stabilizzazione connessione RPC ({ROBOT_IP})...")
 38    robot = Robot.RPC(ROBOT_IP)
 39    time.sleep(0.5)  # Attesa per connessione e ricezione dati
 40
 41    # Verifica configurazione
 42    config = robot.CNDEGetConfig()
 43    if config:
 44        states, period = config
 45        print(f"✓ Connessione riuscita, configurazione corrente: {len(states)} campi, periodo {period}ms")
 46    else:
 47        print("✗ Impossibile ottenere la configurazione CNDE")
 48        return robot
 49
 50    # ===== Passo 3: Stampare posizioni giunti e posa TCP del robot =====
 51    print("\n[Passo 3] Stampaggio posizioni giunti e posa TCP del robot...")
 52    print("  (Suggerimento: Trascinare il robot per osservare le variazioni dei dati)")
 53    print("  Premere Ctrl+C per interrompere la stampa dei dati")
 54    print("  (Utilizzare Wireshark per catturare pacchetti e verificare il periodo dati effettivo)\n")
 55
 56    sample_count = 0
 57    try:
 58        while sample_count < 100:  # Raccolta di 100 campioni
 59            pkg = robot.robot_state_pkg
 60
 61            # Stampa ogni 10 frame
 62            if sample_count % 10 == 0:
 63                print(f"--- Campione #{sample_count} ---")
 64                print(f"  Posizioni giunti (deg): [{', '.join([f'{x:.3f}' for x in pkg.jt_cur_pos])}]")
 65                print(f"  Posa TCP (mm/deg): [{', '.join([f'{x:.3f}' for x in pkg.tl_cur_pos])}]")
 66                print(f"  Conteggio frame corrente: {pkg.frame_cnt}")
 67                print()
 68
 69            sample_count += 1
 70            time.sleep(0.02)  # 20ms
 71
 72    except KeyboardInterrupt:
 73        print("\n  Stampa dati interrotta dall'utente")
 74
 75    # Chiudi connessione
 76    robot.CloseRPC()
 77    time.sleep(1)
 78
 79    # ===== Passo 4: Modificare configurazione e verificare =====
 80    print("\n[Passo 4] Modifica configurazione CNDE...")
 81    print("  Nuovi campi di configurazione: RobotMode, RbtEnableState")
 82    print("  Nuovo periodo di feedback: 10ms")
 83
 84    new_states = [
 85        RobotState.RobotMode,
 86        RobotState.RbtEnableState,
 87    ]
 88
 89    # Imposta nuova configurazione
 90    rtn = SetRobotRealtimeStateConfig(new_states, 10)
 91    if rtn != 0:
 92        print(f"✗ Impostazione nuova configurazione fallita, codice errore: {rtn}")
 93        return robot
 94    print("✓ Nuova configurazione impostata con successo")
 95
 96    # Riconnetti
 97    robot = Robot.RPC(ROBOT_IP)
 98    time.sleep(0.5)
 99
100    # Verifica nuova configurazione
101    config = robot.CNDEGetConfig()
102    if config:
103        states, period = config
104        print(f"✓ Configurazione corrente: {[s.name for s in states]}")
105        print(f"✓ Periodo corrente: {period}ms")
106
107        if period == 10:
108            print("✓ Verifica modifica configurazione superata (periodo cambiato a 10ms)")
109        else:
110            print(f"⚠ Periodo non attivo (previsto 10ms, effettivo {period}ms)")
111
112        # Stampa nuovi dati
113        pkg = robot.robot_state_pkg
114        print(f"\n[Nuovi Dati di Configurazione]")
115        print(f"  robot_mode: {pkg.robot_mode}")
116        print(f"  rbtEnableState: {pkg.rbtEnableState}")
117    else:
118        print("✗ Impossibile ottenere la nuova configurazione")
119
120    print("\n✓ Test1 completato")
121    return robot
122
123
124if __name__ == "__main__":
125    test1_cnde_config_and_data()
126
127
128# ======== Test2: Test Aggiunta/Eliminazione Campi di Stato ====================
129# Funzione: Testare AddRobotRealtimeState() e DeleteRobotRealtimeState()
130# Passaggi del test:
131#   1. Utilizzare AddRobotRealtimeState() per aggiungere SpeedScaleManual e SpeedScaleAuto
132#   2. Connettersi al robot, stampare la velocità globale in modalità manuale/automatica
133#   3. Modificare la velocità globale in WebApp e osservare le variazioni dei dati SDK
134#   4. Utilizzare DeleteRobotRealtimeState() per eliminare i campi aggiunti
135#   5. Riconnettersi e verificare che i valori di velocità siano 0 (campi non più aggiornati)
136
137
138def test2_add_delete_state():
139    """Test2: Test aggiunta/eliminazione campi di stato - verifica dell'aggiunta e dell'eliminazione dinamica degli stati CNDE"""
140    print_separator("Test2: Test aggiunta/eliminazione campi di stato")
141
142    # ===== Passo 1: Aggiungere i campi SpeedScaleManual e SpeedScaleAuto =====
143    print("\n[Passo 1] Utilizzo di AddRobotRealtimeState() per aggiungere i campi scala velocità...")
144    print("  Campi aggiunti: SpeedScaleManual, SpeedScaleAuto")
145
146    rtn = AddRobotRealtimeState([
147        RobotState.SpeedScaleManual,
148        RobotState.SpeedScaleAuto,
149    ])
150
151    if rtn != 0:
152        print(f"✗ Aggiunta campi fallita, codice errore: {rtn}")
153        return None
154    print("✓ Campi aggiunti con successo")
155
156    # ===== Passo 2: Stabilire connessione RPC e stampare velocità =====
157    print(f"\n[Passo 2] Stabilizzazione connessione RPC ({ROBOT_IP})...")
158    robot = Robot.RPC(ROBOT_IP)
159    time.sleep(0.5)  # Attesa per connessione e ricezione dati
160
161    # Verifica configurazione
162    config = robot.CNDEGetConfig()
163    if config:
164        states, period = config
165        print(f"✓ Connessione riuscita, configurazione corrente: {len(states)} campi")
166        # Controlla se i campi aggiunti sono inclusi
167        has_manual = RobotState.SpeedScaleManual in states
168        has_auto = RobotState.SpeedScaleAuto in states
169        if has_manual and has_auto:
170            print("✓ Verifica configurazione superata: SpeedScaleManual e SpeedScaleAuto sono stati aggiunti")
171        else:
172            print(f"⚠ Avviso verifica configurazione: Manual={has_manual}, Auto={has_auto}")
173    else:
174        print("✗ Impossibile ottenere la configurazione CNDE")
175
176    # Stampa dati velocità
177    print("\n[Dati Velocità Correnti] (Modificare la velocità globale in WebApp per osservare le variazioni)")
178    print("  Suggerimento: Abilitare il robot trascinandolo e commutare tra modalità manuale/automatica per osservare i valori di velocità")
179    print("  Premere Ctrl+C per interrompere la stampa dati\n")
180
181    sample_count = 0
182    try:
183        while sample_count < 100:  # Raccolta di 100 campioni (circa 10 secondi a intervallo di 100ms)
184            pkg = robot.robot_state_pkg
185            print(f"  [{sample_count:3d}] SpeedScaleManual: {pkg.speedScaleManual:.2f}, "
186                f"SpeedScaleAuto: {pkg.speedScaleAuto:.2f}, "
187                f"Mode: {pkg.robot_mode}")
188            sample_count += 1
189            time.sleep(0.1)  # Intervallo 100ms
190    except KeyboardInterrupt:
191        print("\n  Stampa dati interrotta dall'utente")
192
193    print(f"\n✓ Raccolta dati completata, totale {sample_count} campioni")
194
195    # ===== Passo 3: Disconnettere =====
196    print("\n[Passo 3] Disconnessione della connessione corrente...")
197    robot.CloseRPC()
198    time.sleep(1.0)  # Attesa che CNDE si chiuda completamente
199
200    # ===== Passo 4: Eliminare i campi aggiunti =====
201    print("\n[Passo 4] Utilizzo di DeleteRobotRealtimeState() per eliminare i campi scala velocità...")
202    rtn = DeleteRobotRealtimeState([
203        RobotState.SpeedScaleManual,
204        RobotState.SpeedScaleAuto,
205    ])
206
207    if rtn != 0:
208        print(f"✗ Eliminazione campi fallita, codice errore: {rtn}")
209        return robot
210    print("✓ Campi eliminati con successo")
211
212    # ===== Passo 5: Riconnettersi e verificare che i valori dei campi siano 0 =====
213    print(f"\n[Passo 5] Riconnessione e verifica dei valori dei campi dopo l'eliminazione...")
214
215    robot = Robot.RPC(ROBOT_IP)
216    time.sleep(0.5)
217
218    # Leggi i valori di velocità
219    pkg = robot.robot_state_pkg
220    manual_speed = pkg.speedScaleManual
221    auto_speed = pkg.speedScaleAuto
222
223    print(f"\n  SpeedScaleManual dopo eliminazione: {manual_speed:.2f}")
224    print(f"  SpeedScaleAuto dopo eliminazione: {auto_speed:.2f}")
225
226    # Verifica se sono 0
227    if manual_speed == 0 and auto_speed == 0:
228        print("\n✓ Test2 verifica superata: i valori di velocità sono 0 dopo l'eliminazione dei campi")
229    else:
230        print(f"\n⚠ Test2 avviso: i valori di velocità non sono zero dopo l'eliminazione dei campi")
231
232    print("\n✓ Test2 completato")
233    return robot
234
235if __name__ == "__main__":
236    test2_add_delete_state()