15. CNDE
15.1. Konfiguracja listy danych i okresu aktualizacji CNDE robota
1/**
2* @brief Konfiguruje listę danych i okres aktualizacji informacji zwrotnej o stanie robota w czasie rzeczywistym (nadpisuje poprzednią konfigurację)
3* @param [in] states Lista wyliczeń stanów do subskrybowania, kolejność określa porządek w pakiecie danych.
4* @param [in] period Okres aktualizacji danych, jednostka milisekundy, zakres [8, 1000]
5* @return Sukces zwraca 0; błąd zwraca ujemny kod błędu (np. ERR_STATE_INVALID, ERR_PARAM_VALUE itp.)
6*/
7public int SetRobotRealtimeStateConfig(List<RobotState> states, int period)
15.2. Dodanie elementu stanu do istniejącej listy informacji zwrotnej o stanie
1/**
2* @brief Dodaje element stanu do istniejącej listy informacji zwrotnej o stanie
3* @param [in] state Wartość wyliczenia stanu do dodania.
4* @return Sukces zwraca 0; błąd zwraca ujemny kod błędu (np. ERR_STATE_ALREADY_EXISTS, ERR_STATE_INVALID itp.)
5*/
6public int AddRobotRealtimeState(RobotState state)
15.3. Usunięcie elementu stanu z istniejącej listy informacji zwrotnej o stanie
1/**
2* @brief Usuwa element stanu z istniejącej listy informacji zwrotnej o stanie (pozostawia co najmniej jeden stan)
3* @param [in] state Wartość wyliczenia stanu do usunięcia
4* @return Sukces zwraca 0; błąd zwraca ujemny kod błędu (np. ERR_STATE_INVALID, ERR_NEED_AT_LEAST_ONE_STATE)
5*/
6public int DeleteRobotRealtimeState(RobotState state)
15.4. Modyfikacja wyłącznie okresu aktualizacji informacji zwrotnej o stanie
1 /**
2* @brief Modyfikuje wyłącznie okres aktualizacji informacji zwrotnej o stanie, nie zmieniając listy stanów
3* @param [in] period Nowy okres aktualizacji, jednostka milisekundy, zakres [8, 1000]
4* @return Sukces zwraca 0; błąd zwraca ujemny kod błędu (np. ERR_PARAM_VALUE)
5*/
6public int SetRobotRealtimeStatePeriod(int period)
15.5. Pobranie aktualnie skonfigurowanej listy informacji zwrotnej o stanie i okresu aktualizacji
1/**
2* @brief Pobiera aktualnie skonfigurowaną listę informacji zwrotnej o stanie i okres aktualizacji
3* @param [out] states Wyjściowa lista wyliczeń stanów subskrybowanych
4* @param [out] period Wyjściowy bieżący okres aktualizacji danych, jednostka milisekundy
5* @return Sukces zwraca 0; błąd zwraca ujemny kod błędu.
6*/
7public int GetRobotRealtimeStateConfig(out List<RobotState> states, out int period)
15.6. Przykład kodu SDK związany z konfiguracją CNDE
1private async void TestRobotRealtimeStates()
2{
3 // 1. Definicja pól stanu do subskrybowania
4 List<RobotState> requiredStates = new List<RobotState>
5 {
6 RobotState.JointCurPos,
7 RobotState.ToolCurPos,
8 RobotState.JointDriverTemperature,
9 RobotState.RobotTime,
10 };
11
12 // 2. Konfiguracja informacji zwrotnej o stanie (okres 8ms)
13 int periodMs = 8;
14 int ret = robot.SetRobotRealtimeStateConfig(requiredStates, periodMs);
15 if (ret != 0)
16 {
17 Console.WriteLine($"Konfiguracja stanu nie powiodła się, kod błędu: {ret}");
18 return;
19 }
20 Console.WriteLine($"Konfiguracja stanu powiodła się, {requiredStates.Count} pól, okres {periodMs} ms");
21
22 // Weryfikacja, czy konfiguracja jest aktywna
23 List<RobotState> actualStates;
24 int actualPeriod;
25 robot.GetRobotRealtimeStateConfig(out actualStates, out actualPeriod);
26 Console.WriteLine($"Rzeczywista liczba stanów: {actualStates.Count}, okres: {actualPeriod} ms");
27 Thread.Sleep(3000);
28 // 3. Nawiązanie połączenia RPC (wewnętrznie automatycznie wykonuje uzgadnianie CNDE)
29 robot.SetReconnectParam(true, 10, 1000);
30 ret = robot.RPC("192.168.58.2"); // Proszę zmienić zgodnie z rzeczywistym adresem IP robota
31 if (ret != 0)
32 {
33 Console.WriteLine($"Połączenie RPC nie powiodło się, kod błędu: {ret}");
34 return;
35 }
36 // 4. Cykliczne odczytywanie i drukowanie danych stanu
37 DateTime startTime = DateTime.Now;
38 const int durationSeconds = 500;
39
40 while ((DateTime.Now - startTime).TotalSeconds < durationSeconds)
41 {
42 ROBOT_STATE_PKG pkg = new ROBOT_STATE_PKG();
43 ret = robot.GetRobotRealTimeState(ref pkg);
44 Console.WriteLine($"GetRobotRealTimeState: {ret}");
45
46 // Pozycje stawów (stopnie)
47 if (pkg.jt_cur_pos != null && pkg.jt_cur_pos.Length >= 6)
48 Console.WriteLine($"Pozycje stawów(°): J1={pkg.jt_cur_pos[0]:F2}, J2={pkg.jt_cur_pos[1]:F2}, J3={pkg.jt_cur_pos[2]:F2}, J4={pkg.jt_cur_pos[3]:F2}, J5={pkg.jt_cur_pos[4]:F2}, J6={pkg.jt_cur_pos[5]:F2}");
49
50 // Pozycja i orientacja TCP (mm /°)
51 if (pkg.tl_cur_pos != null && pkg.tl_cur_pos.Length >= 6)
52 Console.WriteLine($"Pozycja i orientacja TCP(mm/°): X={pkg.tl_cur_pos[0]:F2}, Y={pkg.tl_cur_pos[1]:F2}, Z={pkg.tl_cur_pos[2]:F2}, RX={pkg.tl_cur_pos[3]:F2}, RY={pkg.tl_cur_pos[4]:F2}, RZ={pkg.tl_cur_pos[5]:F2}");
53
54 // Temperatura stawów
55 if (pkg.jointDriverTemperature != null && pkg.jointDriverTemperature.Length >= 6)
56 Console.WriteLine($"Temperatura stawów(°C): J1={pkg.jointDriverTemperature[0]:F2}, J2={pkg.jointDriverTemperature[1]:F2}, J3={pkg.jointDriverTemperature[2]:F2}, J4={pkg.jointDriverTemperature[3]:F2}, J5={pkg.jointDriverTemperature[4]:F2}, J6={pkg.jointDriverTemperature[5]:F2}");
57
58 // Czas robota
59 Console.WriteLine($"Czas robota: {pkg.robotTime.year}-{pkg.robotTime.mouth:D2}-{pkg.robotTime.day:D2} {pkg.robotTime.hour:D2}:{pkg.robotTime.minute:D2}:{pkg.robotTime.second:D2}.{pkg.robotTime.millisecond:D3}");
60
61 await Task.Delay(100);
62 }
63
64 // 5. Zerwanie połączenia
65 robot.CloseRPC();
66}
15.7. Przykład kodu SDK dodawania/usuwania stanów konfiguracji CNDE i ustawiania okresu komunikacji
1private async void TestAddDeleteCNDE()
2{
3 List<RobotState> finalStates;
4 int finalPeriod;
5 // Konfiguracja początkowa: nie żądaj żadnych stanów (konfiguracja domyślna)
6 List<RobotState> emptyStates = new List<RobotState>();
7 int ret = robot.SetRobotRealtimeStateConfig(emptyStates, 20);
8
9 robot.SetRobotRealtimeStatePeriod(10);
10 // Usuń dwa stany
11 ret = robot.DeleteRobotRealtimeState(RobotState.JointCurPos);
12 Console.WriteLine($"Usunięcie JointCurPos wynik: {ret}");
13 ret = robot.DeleteRobotRealtimeState(RobotState.ToolCurPos);
14 Console.WriteLine($"Usunięcie ToolCurPos wynik: {ret}");
15 // Dodaj jeden stan
16 ret = robot.AddRobotRealtimeState(RobotState.CollisionLevel);
17 Console.WriteLine($"Dodanie CollisionLevel wynik: {ret}");
18
19 // Pobierz bieżącą listę konfiguracji i wyślij ponownie
20 List<RobotState> currentStates;
21 int currentPeriod;
22 robot.GetRobotRealtimeStateConfig(out currentStates, out currentPeriod);
23 Console.WriteLine($"Bieżąca liczba stanów w konfiguracji: {currentStates.Count}");
24 ret = robot.SetRobotRealtimeStateConfig(currentStates, currentPeriod);
25 Console.WriteLine($"Zastosowanie nowej konfiguracji wynik: {ret}"); Console.WriteLine($"Wynik konfiguracji początkowej: {ret}");
26 robot.GetRobotRealtimeStateConfig(out finalStates, out finalPeriod);
27 Console.WriteLine($"Liczba stanów w konfiguracji: {finalStates.Count}");
28 foreach (var s in finalStates) Console.WriteLine($" {s}");
29 Console.WriteLine($"Okres: {finalPeriod} ms");
30
31 Thread.Sleep(1000);
32 // Nawiązanie połączenia RPC (wewnętrznie automatycznie łączy CNDE)
33 robot.SetReconnectParam(true, 100, 1000);
34 ret = robot.RPC("192.168.58.2");
35 if (ret != 0)
36 {
37 Console.WriteLine($"Połączenie RPC nie powiodło się: {ret}");
38 return;
39 }
40
41 // Cykliczne drukowanie usuniętych i dodanych stanów, usunięte stany są drukowane jako 0, dodane stany mogą normalnie pobierać wartości w czasie rzeczywistym
42 DateTime lastTime = DateTime.Now;
43 int frameCount = 0;
44 DateTime startTime = DateTime.Now;
45 while ((DateTime.Now - startTime).TotalSeconds < 10)
46 {
47 ROBOT_STATE_PKG pkg = new ROBOT_STATE_PKG();
48 robot.GetRobotRealTimeState(ref pkg);
49 DateTime now = DateTime.Now;
50 double interval = (now - lastTime).TotalMilliseconds;
51 lastTime = now;
52 frameCount++;
53
54 if (pkg.jt_cur_pos != null && pkg.jt_cur_pos.Length >= 6)
55 {
56 Console.WriteLine($" Pozycje stawów(°): J1={pkg.jt_cur_pos[0]:F2}, J2={pkg.jt_cur_pos[1]:F2}, J3={pkg.jt_cur_pos[2]:F2}, J4={pkg.jt_cur_pos[3]:F2}, J5={pkg.jt_cur_pos[4]:F2}, J6={pkg.jt_cur_pos[5]:F2}");
57 }
58 if (pkg.tl_cur_pos != null && pkg.tl_cur_pos.Length >= 6)
59 {
60 Console.WriteLine($" Pozycja i orientacja TCP(mm/°): X={pkg.tl_cur_pos[0]:F2}, Y={pkg.tl_cur_pos[1]:F2}, Z={pkg.tl_cur_pos[2]:F2}, RX={pkg.tl_cur_pos[3]:F2}, RY={pkg.tl_cur_pos[4]:F2}, RZ={pkg.tl_cur_pos[5]:F2}");
61 }
62 // Poziom kolizji
63 if (pkg.collisionLevel != null && pkg.collisionLevel.Length >= 6)
64 Console.WriteLine($"Poziomy kolizji: J1={pkg.collisionLevel[0]}, J2={pkg.collisionLevel[1]}, J3={pkg.collisionLevel[2]}, J4={pkg.collisionLevel[3]}, J5={pkg.collisionLevel[4]}, J6={pkg.collisionLevel[5]}");
65
66 await Task.Delay(50);
67 }
68 //Zerwanie połączenia
69 robot.CloseRPC();
70 Console.WriteLine("Test zakończony.");
71}