15. CNDE
15.1. CNDE-Statusrückmeldung des Roboters konfigurieren
Prototyp |
|
|---|---|
Beschreibung |
CNDE-Standardkonfiguration setzen (vor der RPC-Verbindung aufrufen) |
Erforderliche Parameter |
|
Standardparameter |
Keine |
Rückgabewert |
|
15.2. Roboterstatus zur CNDE-Statuskonfiguration hinzufügen
Prototyp |
|
|---|---|
Beschreibung |
CNDE-Statusliste basierend auf bestehender Konfiguration hinzufügen (unterstützt dynamische Wartung und IP-Isolierung) |
Erforderliche Parameter |
|
Standardparameter |
Keine |
Rückgabewert |
|
15.3. Roboterstatus aus CNDE-Statuskonfiguration löschen
Prototyp |
|
|---|---|
Beschreibung |
CNDE-Statusliste basierend auf bestehender Konfiguration löschen (unterstützt dynamische Wartung und IP-Isolierung) |
Erforderliche Parameter |
|
Standardparameter |
Keine |
Rückgabewert |
|
15.4. CNDE-Statusrückmeldeperiode festlegen
Prototyp |
|
|---|---|
Beschreibung |
CNDE-Statusrückmeldeperiode festlegen (unterstützt globale oder IP-isolierte Konfiguration) |
Erforderliche Parameter |
|
Standardparameter |
Keine |
Rückgabewert |
|
15.5. Aktuelle CNDE-Statusrückmeldung alle Zustandssätze abrufen
Prototyp |
|
|---|---|
Beschreibung |
Alle aktuellen Zustandssätze abrufen |
Erforderliche Parameter |
Keine |
Standardparameter |
Keine |
Rückgabewert |
|
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()