15. CNDE

15.1. CNDE-Statusrückmeldung des Roboters konfigurieren

Prototyp

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

Beschreibung

CNDE-Standardkonfiguration setzen (vor der RPC-Verbindung aufrufen)

Erforderliche Parameter

  • states: Liste von RobotState-Enums

  • period: Datenperiode (ms), Bereich 8-1000, Standard 8ms

Standardparameter

Keine

Rückgabewert

  • Fehlercode Erfolg-0 Fehler-errcode

15.2. Roboterstatus zur CNDE-Statuskonfiguration hinzufügen

Prototyp

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

Beschreibung

CNDE-Statusliste basierend auf bestehender Konfiguration hinzufügen (unterstützt dynamische Wartung und IP-Isolierung)

Erforderliche Parameter

  • states: Liste von RobotState-Enums, hinzuzufügende Zustände

  • ip: Optional, Roboter-IP angeben (für isolierte Konfiguration bei mehreren Robotern; wenn nicht angegeben, wird globale Konfiguration geändert)

Standardparameter

Keine

Rückgabewert

  • Fehlercode Erfolg-0 Fehler-errcode

15.3. Roboterstatus aus CNDE-Statuskonfiguration löschen

Prototyp

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

Beschreibung

CNDE-Statusliste basierend auf bestehender Konfiguration löschen (unterstützt dynamische Wartung und IP-Isolierung)

Erforderliche Parameter

  • states: Liste von RobotState-Enums, zu löschende Zustände

  • ip: Optional, Roboter-IP angeben (für isolierte Konfiguration bei mehreren Robotern; wenn nicht angegeben, wird globale Konfiguration geändert)

Standardparameter

Keine

Rückgabewert

  • Fehlercode Erfolg-0 Fehler-errcode

15.4. CNDE-Statusrückmeldeperiode festlegen

Prototyp

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

Beschreibung

CNDE-Statusrückmeldeperiode festlegen (unterstützt globale oder IP-isolierte Konfiguration)

Erforderliche Parameter

  • period: Datenperiode (ms), Bereich 8-1000

  • ip: Optional, Roboter-IP angeben (wenn nicht angegeben, wird globale Konfiguration geändert)

Standardparameter

Keine

Rückgabewert

  • Fehlercode Erfolg-0 Fehler-errcode

15.5. Aktuelle CNDE-Statusrückmeldung alle Zustandssätze abrufen

Prototyp

CNDEGetConfig(self) -> tuple:

Beschreibung

Alle aktuellen Zustandssätze abrufen

Erforderliche Parameter

Keine

Standardparameter

Keine

Rückgabewert

  • Fehlercode Erfolg-0 Fehler-errcode Konfigurationsergebnisstruktur mit Zustandsliste

15.6. CNDE-Statusrückmeldung Anwendungscodebeispiel

  1from fairino import Robot
  2from fairino.Robot import RobotState, SetRobotRealtimeStateConfig, DEFAULT_CNDE_STATES, AddRobotRealtimeState, DeleteRobotRealtimeState, SetRobotRealtimeStatePeriod
  3import time
  4
  5# ==================== Globale Konfigurationsparameter ====================
  6ROBOT_IP = '192.168.58.2'       # Roboter-IP-Adresse
  7# ========== Test1: CNDE-Konfigurations- und Datenabruftest =============
  8# Tests
  9# 1. CNDE-Konfiguration setzen (JointCurPos, ToolCurPos, 20ms Periode)
 10# 2. RPC-Verbindung herstellen
 11# 3. Roboter-Gelenk- und TCP-Posendaten ausgeben
 12# 4. Zeitstempel abrufen und Periode validieren
 13# 5. Konfiguration ändern (RobotMode, RbtEnableState, 10ms Periode)
 14# 6. Überprüfen, ob neue Konfiguration wirksam ist
 15
 16def test1_cnde_config_and_data():
 17    """Test1: CNDE-Konfigurations- und Datenabruftest - Konfigurationseinstellungen und Echtzeitdaten validieren"""
 18    print_separator("Test1: CNDE-Konfigurations- und Datenabruftest")
 19
 20    # ===== Schritt 1: CNDE-Konfiguration setzen (JointCurPos, ToolCurPos, 20ms) =====
 21    print("\n[Schritt 1] CNDE-Konfiguration wird gesetzt...")
 22    print("  Konfigurationsfelder: JointCurPos, ToolCurPos")
 23    print("  Rückmeldeperiode: 20ms")
 24
 25    custom_states = [
 26        RobotState.JointCurPos,   # Aktuelle Gelenkposition
 27        RobotState.ToolCurPos,    # Aktuelle Werkzeugposition (TCP)
 28    ]
 29
 30    rtn = SetRobotRealtimeStateConfig(custom_states, 20)
 31    if rtn != 0:
 32        print(f"✗ Konfigurationseinstellung fehlgeschlagen, Fehlercode: {rtn}")
 33        return None
 34    print("✓ CNDE-Konfiguration erfolgreich gesetzt")
 35
 36    # ===== Schritt 2: RPC-Verbindung herstellen =====
 37    print(f"\n[Schritt 2] RPC-Verbindung wird hergestellt ({ROBOT_IP})...")
 38    robot = Robot.RPC(ROBOT_IP)
 39    time.sleep(0.5)  # Auf Verbindung und Datenempfang warten
 40
 41    # Konfiguration validieren
 42    config = robot.CNDEGetConfig()
 43    if config:
 44        states, period = config
 45        print(f"✓ Verbindung erfolgreich, aktuelle Konfiguration: {len(states)} Felder, Periode {period}ms")
 46    else:
 47        print("✗ CNDE-Konfiguration kann nicht abgerufen werden")
 48        return robot
 49
 50    # ===== Schritt 3: Roboter-Gelenk- und TCP-Posen ausgeben =====
 51    print("\n[Schritt 3] Roboter-Gelenk- und TCP-Posen werden ausgegeben...")
 52    print("  (Hinweis: Roboter ziehen, um Datenänderungen zu beobachten)")
 53    print("  Drücken Sie Ctrl+C, um die Datenausgabe zu stoppen")
 54    print("  (Verwenden Sie Wireshark zur Paketerfassung, um die tatsächliche Datenperiode zu validieren)\n")
 55
 56    sample_count = 0
 57    try:
 58        while sample_count < 100:  # 100 Proben sammeln
 59            pkg = robot.robot_state_pkg
 60
 61            # Alle 10 Frames ausgeben
 62            if sample_count % 10 == 0:
 63                print(f"--- Probe #{sample_count} ---")
 64                print(f"  Gelenkpositionen (deg): [{', '.join([f'{x:.3f}' for x in pkg.jt_cur_pos])}]")
 65                print(f"  TCP-Pose (mm/deg): [{', '.join([f'{x:.3f}' for x in pkg.tl_cur_pos])}]")
 66                print(f"  Aktuelle Frame-Zählung: {pkg.frame_cnt}")
 67                print()
 68
 69            sample_count += 1
 70            time.sleep(0.02)  # 20ms
 71
 72    except KeyboardInterrupt:
 73        print("\n  Datenausgabe durch Benutzer unterbrochen")
 74
 75    # Verbindung schließen
 76    robot.CloseRPC()
 77    time.sleep(1)
 78
 79    # ===== Schritt 4: Konfiguration ändern und validieren =====
 80    print("\n[Schritt 4] CNDE-Konfiguration wird geändert...")
 81    print("  Neue Konfigurationsfelder: RobotMode, RbtEnableState")
 82    print("  Neue Rückmeldeperiode: 10ms")
 83
 84    new_states = [
 85        RobotState.RobotMode,
 86        RobotState.RbtEnableState,
 87    ]
 88
 89    # Neue Konfiguration setzen
 90    rtn = SetRobotRealtimeStateConfig(new_states, 10)
 91    if rtn != 0:
 92        print(f"✗ Neue Konfigurationseinstellung fehlgeschlagen, Fehlercode: {rtn}")
 93        return robot
 94    print("✓ Neue Konfiguration erfolgreich gesetzt")
 95
 96    # Erneut verbinden
 97    robot = Robot.RPC(ROBOT_IP)
 98    time.sleep(0.5)
 99
100    # Neue Konfiguration validieren
101    config = robot.CNDEGetConfig()
102    if config:
103        states, period = config
104        print(f"✓ Aktuelle Konfiguration: {[s.name for s in states]}")
105        print(f"✓ Aktuelle Periode: {period}ms")
106
107        if period == 10:
108            print("✓ Konfigurationsänderungsvalidierung bestanden (Periode auf 10ms geändert)")
109        else:
110            print(f"⚠ Periode nicht wirksam (erwartet 10ms, tatsächlich {period}ms)")
111
112        # Neue Daten ausgeben
113        pkg = robot.robot_state_pkg
114        print(f"\n[Neue Konfigurationsdaten]")
115        print(f"  robot_mode: {pkg.robot_mode}")
116        print(f"  rbtEnableState: {pkg.rbtEnableState}")
117    else:
118        print("✗ Neue Konfiguration kann nicht abgerufen werden")
119
120    print("\n✓ Test1 abgeschlossen")
121    return robot
122
123
124if __name__ == "__main__":
125    test1_cnde_config_and_data()
126
127
128# ======== Test2: Add/Delete Zustandsfeld-Test ====================
129# Funktion: Testet AddRobotRealtimeState() und DeleteRobotRealtimeState()
130# Tests:
131#   1. Verwenden Sie AddRobotRealtimeState(), um SpeedScaleManual und SpeedScaleAuto hinzuzufügen
132#   2. Verbinden Sie sich mit dem Roboter, geben Sie die globale Geschwindigkeit im Hand-/Automatikmodus aus
133#   3. Ändern Sie die globale Geschwindigkeit in der WebApp und beobachten Sie die SDK-Datenänderungen
134#   4. Verwenden Sie DeleteRobotRealtimeState(), um die hinzugefügten Felder zu löschen
135#   5. Verbinden Sie sich erneut und validieren Sie, ob die Geschwindigkeitswerte 0 sind (Felder werden nicht mehr aktualisiert)
136
137
138def test2_add_delete_state():
139    """Test2: Add/Delete Zustandsfeld-Test - Dynamisches Hinzufügen und Löschen von CNDE-Zuständen validieren"""
140    print_separator("Test2: Add/Delete Zustandsfeld-Test")
141
142    # ===== Schritt 1: SpeedScaleManual- und SpeedScaleAuto-Felder hinzufügen =====
143    print("\n[Schritt 1] Verwenden von AddRobotRealtimeState() zum Hinzufügen von Geschwindigkeitsskalenfeldern...")
144    print("  Hinzugefügte Felder: SpeedScaleManual, SpeedScaleAuto")
145
146    rtn = AddRobotRealtimeState([
147        RobotState.SpeedScaleManual,
148        RobotState.SpeedScaleAuto,
149    ])
150
151    if rtn != 0:
152        print(f"✗ Feld hinzufügen fehlgeschlagen, Fehlercode: {rtn}")
153        return None
154    print("✓ Felder erfolgreich hinzugefügt")
155
156    # ===== Schritt 2: RPC-Verbindung herstellen und Geschwindigkeit ausgeben =====
157    print(f"\n[Schritt 2] RPC-Verbindung wird hergestellt ({ROBOT_IP})...")
158    robot = Robot.RPC(ROBOT_IP)
159    time.sleep(0.5)  # Auf Verbindung und Datenempfang warten
160
161    # Konfiguration validieren
162    config = robot.CNDEGetConfig()
163    if config:
164        states, period = config
165        print(f"✓ Verbindung erfolgreich, aktuelle Konfiguration: {len(states)} Felder")
166        # Prüfen, ob die hinzugefügten Felder enthalten sind
167        has_manual = RobotState.SpeedScaleManual in states
168        has_auto = RobotState.SpeedScaleAuto in states
169        if has_manual and has_auto:
170            print("✓ Konfigurationsvalidierung bestanden: SpeedScaleManual und SpeedScaleAuto wurden hinzugefügt")
171        else:
172            print(f"⚠ Konfigurationsvalidierungswarnung: Manual={has_manual}, Auto={has_auto}")
173    else:
174        print("✗ CNDE-Konfiguration kann nicht abgerufen werden")
175
176    # Geschwindigkeitsdaten ausgeben
177    print("\n[Aktuelle Geschwindigkeitsdaten] (Ändern Sie die globale Geschwindigkeit in der WebApp, um Änderungen zu beobachten)")
178    print("  Hinweis: Roboter durch Ziehen aktivieren und zwischen Hand-/Automatikmodus wechseln, um Geschwindigkeitswerte zu beobachten")
179    print("  Drücken Sie Ctrl+C, um die Datenausgabe zu stoppen\n")
180
181    sample_count = 0
182    try:
183        while sample_count < 100:  # 100 Proben sammeln (ca. 10 Sekunden bei 100ms Intervall)
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)  # 100ms Intervall
190    except KeyboardInterrupt:
191        print("\n  Datenausgabe durch Benutzer unterbrochen")
192
193    print(f"\n✓ Datenerfassung abgeschlossen, insgesamt {sample_count} Proben")
194
195    # ===== Schritt 3: Verbindung trennen =====
196    print("\n[Schritt 3] Aktuelle Verbindung wird getrennt...")
197    robot.CloseRPC()
198    time.sleep(1.0)  # Auf vollständiges Schließen von CNDE warten
199
200    # ===== Schritt 4: Hinzugefügte Felder löschen =====
201    print("\n[Schritt 4] Verwenden von DeleteRobotRealtimeState() zum Löschen der Geschwindigkeitsskalenfelder...")
202    rtn = DeleteRobotRealtimeState([
203        RobotState.SpeedScaleManual,
204        RobotState.SpeedScaleAuto,
205    ])
206
207    if rtn != 0:
208        print(f"✗ Feld löschen fehlgeschlagen, Fehlercode: {rtn}")
209        return robot
210    print("✓ Felder erfolgreich gelöscht")
211
212    # ===== Schritt 5: Erneut verbinden und validieren, dass die Feldwerte 0 sind =====
213    print(f"\n[Schritt 5] Erneutes Verbinden und Validieren der gelöschten Feldwerte...")
214
215    robot = Robot.RPC(ROBOT_IP)
216    time.sleep(0.5)
217
218    # Geschwindigkeitswerte lesen
219    pkg = robot.robot_state_pkg
220    manual_speed = pkg.speedScaleManual
221    auto_speed = pkg.speedScaleAuto
222
223    print(f"\n  SpeedScaleManual nach Löschung: {manual_speed:.2f}")
224    print(f"  SpeedScaleAuto nach Löschung: {auto_speed:.2f}")
225
226    # Prüfen, ob sie 0 sind
227    if manual_speed == 0 and auto_speed == 0:
228        print("\n✓ Test2-Validierung bestanden: Geschwindigkeitswerte sind 0 nach Feldlöschung")
229    else:
230        print(f"\n⚠ Test2-Warnung: Geschwindigkeitswerte sind nicht Null nach Feldlöschung")
231
232    print("\n✓ Test2 abgeschlossen")
233    return robot
234
235if __name__ == "__main__":
236    test2_add_delete_state()