15. CNDE

15.1. Konfiguracja sprzężenia zwrotnego stanu CNDE robota

Prototyp

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

Opis

Ustawia domyślną konfigurację CNDE (wywołaj przed połączeniem RPC)

Parametry wymagane

  • states: Lista wyliczeniowa RobotState

  • period: Okres danych (ms), zakres 8-1000, domyślnie 8 ms

Parametry domyślne

Brak

Wartość zwracana

  • Kod błędu sukces-0 błąd-errcode

15.2. Dodawanie stanu robota do konfiguracji stanu CNDE

Prototyp

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

Opis

Dodaje listę stanów CNDE do istniejącej konfiguracji (obsługuje dynamiczną konserwację i izolację IP)

Parametry wymagane

  • states: Lista wyliczeniowa RobotState, stany do dodania

  • ip: Opcjonalny, określa IP robota (dla izolacji konfiguracji wielu robotów, jeśli nie podano, modyfikuje konfigurację globalną)

Parametry domyślne

Brak

Wartość zwracana

  • Kod błędu sukces-0 błąd-errcode

15.3. Usuwanie stanu robota z konfiguracji stanu CNDE

Prototyp

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

Opis

Usuwa listę stanów CNDE z istniejącej konfiguracji (obsługuje dynamiczną konserwację i izolację IP)

Parametry wymagane

  • states: Lista wyliczeniowa RobotState, stany do usunięcia

  • ip: Opcjonalny, określa IP robota (dla izolacji konfiguracji wielu robotów, jeśli nie podano, modyfikuje konfigurację globalną)

Parametry domyślne

Brak

Wartość zwracana

  • Kod błędu sukces-0 błąd-errcode

15.4. Ustawianie okresu sprzężenia zwrotnego stanu CNDE

Prototyp

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

Opis

Ustawia okres sprzężenia zwrotnego stanu CNDE (obsługuje konfigurację globalną lub izolowaną IP)

Parametry wymagane

  • period: Okres danych (ms), zakres 8-1000

  • ip: Opcjonalny, określa IP robota (jeśli nie podano, modyfikuje konfigurację globalną)

Parametry domyślne

Brak

Wartość zwracana

  • Kod błędu sukces-0 błąd-errcode

15.5. Pobieranie wszystkich bieżących stanów sprzężenia zwrotnego stanu CNDE

Prototyp

CNDEGetConfig(self) -> tuple:

Opis

Pobiera wszystkie bieżące stany

Parametry wymagane

Brak

Parametry domyślne

Brak

Wartość zwracana

  • Kod błędu sukces-0 błąd-errcode zawiera strukturę wynikową konfiguracji z listą stanów

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