15. CNDE
15.1. Configurare il Feedback di Stato CNDE del Robot
Prototipo |
|
|---|---|
Descrizione |
Imposta la configurazione predefinita CNDE (da chiamare prima della connessione RPC) |
Parametri Obbligatori |
|
Parametri Predefiniti |
Nessuno |
Valore di Ritorno |
|
15.2. Aggiungere uno Stato del Robot alla Configurazione di Stato CNDE
Prototipo |
|
|---|---|
Descrizione |
Aggiunge la lista stati CNDE basata sulla configurazione esistente (supporta manutenzione dinamica e isolamento IP) |
Parametri Obbligatori |
|
Parametri Predefiniti |
Nessuno |
Valore di Ritorno |
|
15.3. Eliminare uno Stato del Robot dalla Configurazione di Stato CNDE
Prototipo |
|
|---|---|
Descrizione |
Elimina la lista stati CNDE basata sulla configurazione esistente (supporta manutenzione dinamica e isolamento IP) |
Parametri Obbligatori |
|
Parametri Predefiniti |
Nessuno |
Valore di Ritorno |
|
15.4. Impostare il Periodo di Feedback di Stato CNDE
Prototipo |
|
|---|---|
Descrizione |
Imposta il periodo di feedback di stato CNDE (supporta configurazione globale o isolata per IP) |
Parametri Obbligatori |
|
Parametri Predefiniti |
Nessuno |
Valore di Ritorno |
|
15.5. Ottenere l’Insieme Completo di Stati dell’Attuale Feedback di Stato CNDE
Prototipo |
|
|---|---|
Descrizione |
Ottiene tutti gli insiemi di stati correnti |
Parametri Obbligatori |
Nessuno |
Parametri Predefiniti |
Nessuno |
Valore di Ritorno |
|
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()