15. CNDE
15.1. Konfiguracja sprzężenia zwrotnego stanu CNDE robota
Prototyp |
|
|---|---|
Opis |
Ustawia domyślną konfigurację CNDE (wywołaj przed połączeniem RPC) |
Parametry wymagane |
|
Parametry domyślne |
Brak |
Wartość zwracana |
|
15.2. Dodawanie stanu robota do konfiguracji stanu CNDE
Prototyp |
|
|---|---|
Opis |
Dodaje listę stanów CNDE do istniejącej konfiguracji (obsługuje dynamiczną konserwację i izolację IP) |
Parametry wymagane |
|
Parametry domyślne |
Brak |
Wartość zwracana |
|
15.3. Usuwanie stanu robota z konfiguracji stanu CNDE
Prototyp |
|
|---|---|
Opis |
Usuwa listę stanów CNDE z istniejącej konfiguracji (obsługuje dynamiczną konserwację i izolację IP) |
Parametry wymagane |
|
Parametry domyślne |
Brak |
Wartość zwracana |
|
15.4. Ustawianie okresu sprzężenia zwrotnego stanu CNDE
Prototyp |
|
|---|---|
Opis |
Ustawia okres sprzężenia zwrotnego stanu CNDE (obsługuje konfigurację globalną lub izolowaną IP) |
Parametry wymagane |
|
Parametry domyślne |
Brak |
Wartość zwracana |
|
15.5. Pobieranie wszystkich bieżących stanów sprzężenia zwrotnego stanu CNDE
Prototyp |
|
|---|---|
Opis |
Pobiera wszystkie bieżące stany |
Parametry wymagane |
Brak |
Parametry domyślne |
Brak |
Wartość zwracana |
|
15.6. Przykład kodu korzystania ze sprzężenia zwrotnego stanu CNDE
1from fairino import Robot
2from fairino.Robot import RobotState, SetRobotRealtimeStateConfig, DEFAULT_CNDE_STATES, AddRobotRealtimeState, DeleteRobotRealtimeState, SetRobotRealtimeStatePeriod
3import time
4
5# ==================== Parametry globalne ====================
6ROBOT_IP = '192.168.58.2' # Adres IP robota
7# ========== Test1: Test konfiguracji CNDE i pobierania danych =============
8# Kroki testu:
9# 1. Ustaw konfigurację CNDE (JointCurPos, ToolCurPos, okres 20 ms)
10# 2. Nawiąż połączenie RPC
11# 3. Wydrukuj dane pozycji przegubów i TCP robota
12# 4. Pobierz znacznik czasu i zweryfikuj okres
13# 5. Zmodyfikuj konfigurację (RobotMode, RbtEnableState, okres 10 ms)
14# 6. Zweryfikuj, czy nowa konfiguracja obowiązuje
15
16def test1_cnde_config_and_data():
17 """Test1: Test konfiguracji CNDE i pobierania danych - weryfikacja ustawień konfiguracji i aktualności danych"""
18 print_separator("Test1: Test konfiguracji CNDE i pobierania danych")
19
20 # ===== Krok 1: Ustaw konfigurację CNDE (JointCurPos, ToolCurPos, 20 ms) =====
21 print("\n【Krok 1】Ustawianie konfiguracji CNDE...")
22 print(" Pola konfiguracji: JointCurPos, ToolCurPos")
23 print(" Okres sprzężenia zwrotnego: 20 ms")
24
25 custom_states = [
26 RobotState.JointCurPos, # Bieżąca pozycja przegubów
27 RobotState.ToolCurPos, # Bieżąca pozycja narzędzia (TCP)
28 ]
29
30 rtn = SetRobotRealtimeStateConfig(custom_states, 20)
31 if rtn != 0:
32 print(f"✗ Ustawienie konfiguracji nie powiodło się, kod błędu: {rtn}")
33 return None
34 print("✓ Konfiguracja CNDE ustawiona pomyślnie")
35
36 # ===== Krok 2: Nawiąż połączenie RPC =====
37 print(f"\n【Krok 2】Nawiązywanie połączenia RPC ({ROBOT_IP})...")
38 robot = Robot.RPC(ROBOT_IP)
39 time.sleep(0.5) # Oczekiwanie na połączenie i odbiór danych
40
41 # Weryfikacja konfiguracji
42 config = robot.CNDEGetConfig()
43 if config:
44 states, period = config
45 print(f"✓ Połączenie udane, bieżąca konfiguracja: {len(states)} pól, okres {period} ms")
46 else:
47 print("✗ Nie można pobrać konfiguracji CNDE")
48 return robot
49
50 # ===== Krok 3: Wydrukuj dane pozycji przegubów i TCP robota =====
51 print("\n【Krok 3】Drukowanie danych pozycji przegubów i TCP robota...")
52 print(" (Wskazówka: Można przeciągnąć robota, aby zaobserwować zmiany danych)")
53 print(" Naciśnij Ctrl+C, aby zatrzymać drukowanie danych")
54 print(" (Użyj Wireshark do przechwycenia pakietów w celu weryfikacji rzeczywistego okresu danych)\n")
55
56 sample_count = 0
57 try:
58 while sample_count < 100: # Zbierz 100 próbek
59 pkg = robot.robot_state_pkg
60
61 # Drukuj co 10 klatek
62 if sample_count % 10 == 0:
63 print(f"--- Próbka #{sample_count} ---")
64 print(f" Pozycja przegubów (deg): [{', '.join([f'{x:.3f}' for x in pkg.jt_cur_pos])}]")
65 print(f" Pozycja TCP (mm/deg): [{', '.join([f'{x:.3f}' for x in pkg.tl_cur_pos])}]")
66 print(f" Licznik bieżącej klatki: {pkg.frame_cnt}")
67 print()
68
69 sample_count += 1
70 time.sleep(0.02) # 20 ms
71
72 except KeyboardInterrupt:
73 print("\n Drukowanie danych przerwane przez użytkownika")
74
75 # Zamknięcie połączenia
76 robot.CloseRPC()
77 time.sleep(1)
78
79 # ===== Krok 4: Zmodyfikuj konfigurację i zweryfikuj =====
80 print("\n【Krok 4】Modyfikacja konfiguracji CNDE...")
81 print(" Nowe pola konfiguracji: RobotMode, RbtEnableState")
82 print(" Nowy okres sprzężenia zwrotnego: 10 ms")
83
84 new_states = [
85 RobotState.RobotMode,
86 RobotState.RbtEnableState,
87 ]
88
89 # Ustaw nową konfigurację
90 rtn = SetRobotRealtimeStateConfig(new_states, 10)
91 if rtn != 0:
92 print(f"✗ Ustawienie nowej konfiguracji nie powiodło się, kod błędu: {rtn}")
93 return robot
94 print("✓ Nowa konfiguracja ustawiona pomyślnie")
95
96 # Ponowne połączenie
97 robot = Robot.RPC(ROBOT_IP)
98 time.sleep(0.5)
99
100 # Weryfikacja nowej konfiguracji
101 config = robot.CNDEGetConfig()
102 if config:
103 states, period = config
104 print(f"✓ Bieżąca konfiguracja: {[s.name for s in states]}")
105 print(f"✓ Bieżący okres: {period} ms")
106
107 if period == 10:
108 print("✓ Weryfikacja modyfikacji konfiguracji zakończona pomyślnie (okres zmienił się na 10 ms)")
109 else:
110 print(f"⚠ Okres nie obowiązuje (oczekiwano 10 ms, faktycznie {period} ms)")
111
112 # Wydrukuj nowe dane
113 pkg = robot.robot_state_pkg
114 print(f"\n【Dane nowej konfiguracji】")
115 print(f" robot_mode: {pkg.robot_mode}")
116 print(f" rbtEnableState: {pkg.rbtEnableState}")
117 else:
118 print("✗ Nie można pobrać nowej konfiguracji")
119
120 print("\n✓ Test1 zakończony")
121 return robot
122
123
124if __name__ == "__main__":
125 test1_cnde_config_and_data()
126
127
128# ======== Test2: Test pól stanu Add/Delete ====================
129# Funkcja: Testowanie AddRobotRealtimeState() i DeleteRobotRealtimeState()
130# Kroki testu:
131# 1. Użyj AddRobotRealtimeState(), aby dodać SpeedScaleManual i SpeedScaleAuto
132# 2. Połącz się z robotem, wydrukuj prędkość globalną w trybie ręcznym/automatycznym
133# 3. Zmodyfikuj prędkość globalną w WebApp, obserwuj zmiany danych w SDK
134# 4. Użyj DeleteRobotRealtimeState(), aby usunąć dodane pola
135# 5. Połącz się ponownie, sprawdź, czy wartość prędkości wynosi 0 (pola nie są już aktualizowane)
136
137
138def test2_add_delete_state():
139 """Test2: Test pól stanu Add/Delete - weryfikacja dynamicznego dodawania i usuwania stanów CNDE"""
140 print_separator("Test2: Test pól stanu Add/Delete")
141
142 # ===== Krok 1: Dodaj pola SpeedScaleManual i SpeedScaleAuto =====
143 print("\n【Krok 1】Używanie AddRobotRealtimeState() do dodania pól współczynnika prędkości...")
144 print(" Dodawane pola: SpeedScaleManual, SpeedScaleAuto")
145
146 rtn = AddRobotRealtimeState([
147 RobotState.SpeedScaleManual,
148 RobotState.SpeedScaleAuto,
149 ])
150
151 if rtn != 0:
152 print(f"✗ Dodanie pól nie powiodło się, kod błędu: {rtn}")
153 return None
154 print("✓ Pola dodane pomyślnie")
155
156 # ===== Krok 2: Nawiąż połączenie RPC i wydrukuj prędkość =====
157 print(f"\n【Krok 2】Nawiązywanie połączenia RPC ({ROBOT_IP})...")
158 robot = Robot.RPC(ROBOT_IP)
159 time.sleep(0.5) # Oczekiwanie na połączenie i odbiór danych
160
161 # Weryfikacja konfiguracji
162 config = robot.CNDEGetConfig()
163 if config:
164 states, period = config
165 print(f"✓ Połączenie udane, bieżąca konfiguracja: {len(states)} pól")
166 # Sprawdź, czy zawiera dodane pola
167 has_manual = RobotState.SpeedScaleManual in states
168 has_auto = RobotState.SpeedScaleAuto in states
169 if has_manual and has_auto:
170 print("✓ Weryfikacja konfiguracji zakończona pomyślnie: SpeedScaleManual i SpeedScaleAuto zostały dodane")
171 else:
172 print(f"⚠ Ostrzeżenie weryfikacji konfiguracji: Manual={has_manual}, Auto={has_auto}")
173 else:
174 print("✗ Nie można pobrać konfiguracji CNDE")
175
176 # Wydrukuj dane prędkości
177 print("\n【Bieżące dane prędkości】(proszę zmodyfikować prędkość globalną w WebApp i obserwować zmiany)")
178 print(" Wskazówka: Przeciągnij robota, włącz zasilanie i przełącz tryb ręczny/automatyczny, obserwuj wartości prędkości")
179 print(" Naciśnij Ctrl+C, aby zatrzymać drukowanie danych\n")
180
181 sample_count = 0
182 try:
183 while sample_count < 100: # Zbierz 100 próbek (około 10 sekund, co 100 ms)
184 pkg = robot.robot_state_pkg
185 print(f" [{sample_count:3d}] SpeedScaleManual: {pkg.speedScaleManual:.2f}, "
186 f"SpeedScaleAuto: {pkg.speedScaleAuto:.2f}, "
187 f"Tryb: {pkg.robot_mode}")
188 sample_count += 1
189 time.sleep(0.1) # Odstęp 100 ms
190 except KeyboardInterrupt:
191 print("\n Drukowanie danych przerwane przez użytkownika")
192
193 print(f"\n✓ Zbieranie danych zakończone, łącznie {sample_count} próbek")
194
195 # ===== Krok 3: Rozłącz połączenie =====
196 print("\n【Krok 3】Zrywanie bieżącego połączenia...")
197 robot.CloseRPC()
198 time.sleep(1.0) # Oczekiwanie na całkowite zamknięcie CNDE
199
200 # ===== Krok 4: Usuń dodane pola =====
201 print("\n【Krok 4】Używanie DeleteRobotRealtimeState() do usunięcia pól współczynnika prędkości...")
202 rtn = DeleteRobotRealtimeState([
203 RobotState.SpeedScaleManual,
204 RobotState.SpeedScaleAuto,
205 ])
206
207 if rtn != 0:
208 print(f"✗ Usunięcie pól nie powiodło się, kod błędu: {rtn}")
209 return robot
210 print("✓ Pola usunięte pomyślnie")
211
212 # ===== Krok 5: Połącz się ponownie i sprawdź, czy wartości pól wynoszą 0 =====
213 print(f"\n【Krok 5】Ponowne połączenie i weryfikacja wartości pól po usunięciu...")
214
215 robot = Robot.RPC(ROBOT_IP)
216 time.sleep(0.5)
217
218 # Odczytaj wartości prędkości
219 pkg = robot.robot_state_pkg
220 manual_speed = pkg.speedScaleManual
221 auto_speed = pkg.speedScaleAuto
222
223 print(f"\n SpeedScaleManual po usunięciu: {manual_speed:.2f}")
224 print(f" SpeedScaleAuto po usunięciu: {auto_speed:.2f}")
225
226 # Sprawdź, czy wynosi 0
227 if manual_speed == 0 and auto_speed == 0:
228 print("\n✓ Weryfikacja Test2 zakończona pomyślnie: wartości prędkości po usunięciu pól wynoszą 0")
229 else:
230 print(f"\n⚠ Ostrzeżenie Test2: wartości prędkości po usunięciu pól są niezerowe")
231
232 print("\n✓ Test2 zakończony")
233 return robot
234
235if __name__ == "__main__":
236 test2_add_delete_state()