11. Urządzenia peryferyjne robota
11.1. Konfiguracja chwytaka
1/**
2* @brief Konfiguruje chwytak
3* @param [in] company Producent chwytaka, do ustalenia
4* @param [in] device Numer urządzenia, tymczasowo nieużywany, domyślnie 0
5* @param [in] softvesion Numer wersji oprogramowania, tymczasowo nieużywany, domyślnie 0
6* @param [in] bus Pozycja magistrali końcowej, na której zamontowane jest urządzenie, tymczasowo nieużywane, domyślnie 0
7* @return Kod błędu
8*/
9errno_t SetGripperConfig(int company, int device, int softvesion, int bus);
11.2. Pobieranie konfiguracji chwytaka
1/**
2* @brief Pobiera konfigurację chwytaka
3* @param [in] company Producent chwytaka, do ustalenia
4* @param [in] device Numer urządzenia, tymczasowo nieużywany, domyślnie 0
5* @param [in] softvesion Numer wersji oprogramowania, tymczasowo nieużywany, domyślnie 0
6* @param [in] bus Pozycja magistrali końcowej, na której zamontowane jest urządzenie, tymczasowo nieużywane, domyślnie 0
7* @return Kod błędu
8*/
9errno_t GetGripperConfig(int *company, int *device, int *softvesion, int *bus);
11.3. Aktywacja chwytaka
1/**
2* @brief Aktywuje chwytak
3* @param [in] index Numer chwytaka
4* @param [in] act 0-reset, 1-aktywacja
5* @return Kod błędu
6*/
7errno_t ActGripper(int index, uint8_t act);
11.4. Sterowanie chwytakiem
Zmienione w wersji C++SDK-v2.1.5.0.
1/**
2 * @brief Steruje chwytakiem
3 * @param [in] index Numer chwytaka
4 * @param [in] pos Procent pozycji, zakres [0~100]
5 * @param [in] vel Procent prędkości, zakres [0~100]
6 * @param [in] force Procent momentu, zakres [0~100]
7 * @param [in] max_time Maksymalny czas oczekiwania, zakres [0~30000], jednostka ms
8 * @param [in] block 0-blokujące, 1-nieblokujące
9 * @param [in] type Typ chwytaka, 0-chwytak równoległy; 1-chwytak obrotowy
10 * @param [in] rotNum Liczba obrotów
11 * @param [in] rotVel Procent prędkości obrotowej [0-100]
12 * @param [in] rotTorque Procent momentu obrotowego [0-100]
13 * @return Kod błędu
14 */
15errno_t MoveGripper(int index, int pos, int vel, int force, int max_time, uint8_t block, int type, double rotNum, int rotVel, int rotTorque);
11.5. Pobieranie stanu ruchu chwytaka
1/**
2 * @brief Pobiera stan ruchu chwytaka
3 * @param [out] fault 0-brak błędu, 1-jest błąd
4 * @param [out] staus 0-ruch niezakończony, 1-ruch zakończony
5 * @return Kod błędu
6 */
7errno_t GetGripperMotionDone(uint16_t *fault, uint8_t *status);
11.6. Pobieranie stanu aktywacji chwytaka
1/**
2 * @brief Pobiera stan aktywacji chwytaka
3 * @param [out] fault 0-brak błędu, 1-jest błąd
4 * @param [out] status bit0~bit15 odpowiadają numerom chwytaka 0~15, bit=0 oznacza nieaktywny, bit=1 oznacza aktywny
5 * @return Kod błędu
6 */
7errno_t GetGripperActivateStatus(uint16_t *fault, uint16_t *status);
11.7. Pobieranie pozycji chwytaka
1/**
2 * @brief Pobiera pozycję chwytaka
3 * @param [out] fault 0-brak błędu, 1-jest błąd
4 * @param [out] position Procent pozycji, zakres 0~100%
5 * @return Kod błędu
6 */
7errno_t GetGripperCurPosition(uint16_t *fault, uint8_t *position);
11.8. Pobieranie prędkości chwytaka
1/**
2 * @brief Pobiera prędkość chwytaka
3 * @param [out] fault 0-brak błędu, 1-jest błąd
4 * @param [out] speed Procent prędkości, zakres 0~100%
5 * @return Kod błędu
6 */
7errno_t GetGripperCurSpeed(uint16_t *fault, int8_t *speed);
11.9. Pobieranie prądu chwytaka
1/**
2 * @brief Pobiera prąd chwytaka
3 * @param [out] fault 0-brak błędu, 1-jest błąd
4 * @param [out] current Procent prądu, zakres 0~100%
5 * @return Kod błędu
6 */
7errno_t GetGripperCurCurrent(uint16_t *fault, int8_t *current);
11.10. Pobieranie napięcia chwytaka
1/**
2 * @brief Pobiera napięcie chwytaka
3 * @param [out] fault 0-brak błędu, 1-jest błąd
4 * @param [out] voltage Napięcie, jednostka 0.1V
5 * @return Kod błędu
6 */
7errno_t GetGripperVoltage(uint16_t *fault, int *voltage);
11.11. Pobieranie temperatury chwytaka
1/**
2 * @brief Pobiera temperaturę chwytaka
3 * @param [out] fault 0-brak błędu, 1-jest błąd
4 * @param [out] temp Temperatura, jednostka ℃
5 * @return Kod błędu
6 */
7errno_t GetGripperTemp(uint16_t *fault, int *temp);
11.12. Obliczanie punktu przedchwytania - wizja
1/**
2 * @brief Oblicza punkt przedchwytania - wizja
3 * @param [in] desc_pos Pozy i orientacja kartezjańska punktu chwytania
4 * @param [in] zlength Przesunięcie w osi Z
5 * @param [in] zangle Przesunięcie obrotu wokół osi Z
6 * @return Kod błędu
7 */
8errno_t ComputePrePick(DescPose *desc_pos, double zlength, double zangle, DescPose *pre_pos);
11.13. Obliczanie punktu wycofania - wizja
1/**
2 * @brief Oblicza punkt wycofania - wizja
3 * @param [in] desc_pos Pozy i orientacja kartezjańska punktu chwytania
4 * @param [in] zlength Przesunięcie w osi Z
5 * @param [in] zangle Przesunięcie obrotu wokół osi Z
6 * @return Kod błędu
7 */
8errno_t ComputePostPick(DescPose *desc_pos, double zlength, double zangle, DescPose *post_pos);
11.14. Przykład kodu operacji chwytakiem robota
1int TestGripper(void)
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 robot.LoggerInit();
6 robot.SetLoggerLevel(1);
7 int rtn = robot.RPC("192.168.58.2");
8 if (rtn != 0)
9 {
10 return -1;
11 }
12 robot.SetReConnectParam(true, 30000, 500);
13 int company = 4;
14 int device = 0;
15 int softversion = 0;
16 int bus = 2;
17 int index = 2;
18 int act = 0;
19 int max_time = 30000;
20 uint8_t block = 0;
21 uint8_t status;
22 uint16_t fault;
23 uint16_t active_status = 0;
24 uint8_t current_pos = 0;
25 int8_t current = 0;
26 int voltage = 0;
27 int temp = 0;
28 int8_t speed = 0;
29 robot.SetGripperConfig(company, device, softversion, bus);
30 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
31 robot.GetGripperConfig(&company, &device, &softversion, &bus);
32 printf("gripper config:%d,%d,%d,%d\n", company, device, softversion, bus);
33 robot.ActGripper(index, act);
34 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
35 act = 1;
36 robot.ActGripper(index, act);
37 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
38 robot.MoveGripper(index, 100, 50, 50, max_time, block, 0, 0, 0, 0);
39 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
40 robot.MoveGripper(index, 0, 50, 0, max_time, block, 0, 0, 0, 0);
41 robot.GetGripperMotionDone(&fault, &status);
42 printf("motion status:%u,%u\n", fault, status);
43 robot.GetGripperActivateStatus(&fault, &active_status);
44 printf("gripper active fault is: %u, status is: %u\n", fault, active_status);
45 robot.GetGripperCurPosition(&fault, ¤t_pos);
46 printf("fault is:%u, current position is: %u\n", fault, current_pos);
47 robot.GetGripperCurCurrent(&fault, ¤t);
48 printf("fault is:%u, current current is: %d\n", fault, current);
49 robot.GetGripperVoltage(&fault, &voltage);
50 printf("fault is:%u, current voltage is: %d \n", fault, voltage);
51 robot.GetGripperTemp(&fault, &temp);
52 printf("fault is:%u, current temperature is: %d\n", fault, temp);
53 robot.GetGripperCurSpeed(&fault, &speed);
54 printf("fault is:%u, current speed is: %d\n", fault, speed);
55 int retval = 0;
56 DescPose prepick_pose = {};
57 DescPose postpick_pose = {};
58 DescPose p1Desc(-419.524, -13.000, 351.569, -178.118, 0.314, 3.833);
59 DescPose p2Desc(-321.222, 185.189, 335.520, -179.030, -1.284, -29.869);
60 retval = robot.ComputePrePick(&p1Desc, 10, 0, &prepick_pose);
61 printf("ComputePrePick retval is: %d\n", retval);
62 printf("xyz is: %f, %f, %f; rpy is: %f, %f, %f\n", prepick_pose.tran.x, prepick_pose.tran.y, prepick_pose.tran.z, prepick_pose.rpy.rx, prepick_pose.rpy.ry, prepick_pose.rpy.rz);
63 retval = robot.ComputePostPick(&p2Desc, -10, 0, &postpick_pose);
64 printf("ComputePostPick retval is: %d\n", retval);
65 printf("xyz is: %f, %f, %f; rpy is: %f, %f, %f\n", postpick_pose.tran.x, postpick_pose.tran.y, postpick_pose.tran.z, postpick_pose.rpy.rx, postpick_pose.rpy.ry, postpick_pose.rpy.rz);
66 robot.CloseRPC();
67 return 0;
68}
11.15. Pobieranie liczby obrotów chwytaka obrotowego
Nowe w wersji 3.7.6.
1/**
2 * @brief Pobiera liczbę obrotów chwytaka obrotowego
3 * @param [out] fault 0-brak błędu, 1-jest błąd
4 * @param [out] num Liczba obrotów
5 * @return Kod błędu
6 */
7errno_t GetGripperRotNum(uint16_t* fault, double* num);
11.16. Pobieranie prędkości obrotowej chwytaka obrotowego
Nowe w wersji V3.7.6.
1/**
2 * @brief Pobiera prędkość obrotową chwytaka obrotowego
3 * @param [out] fault 0-brak błędu, 1-jest błąd
4 * @param [out] speed Procent prędkości obrotowej
5 * @return Kod błędu
6 */
7errno_t GetGripperRotSpeed(uint16_t* fault, int* speed);
11.17. Pobieranie momentu obrotowego chwytaka obrotowego
Nowe w wersji V3.7.6.
1/**
2 * @brief Pobiera moment obrotowy chwytaka obrotowego
3 * @param [out] fault 0-brak błędu, 1-jest błąd
4 * @param [out] torque Procent momentu obrotowego
5 * @return Kod błędu
6 */
7errno_t GetGripperRotTorque(uint16_t* fault, int* torque);
11.18. Przykład kodu pobierania stanu chwytaka obrotowego
1int TestRotGripperState(void)
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 robot.LoggerInit();
6 robot.SetLoggerLevel(1);
7 int rtn = robot.RPC("192.168.58.2");
8 if (rtn != 0)
9 {
10 return -1;
11 }
12 robot.SetReConnectParam(true, 30000, 500);
13 uint16_t fault = 0;
14 double rotNum = 0.0;
15 int rotSpeed = 0;
16 int rotTorque = 0;
17 robot.GetGripperRotNum(&fault, &rotNum);
18 robot.GetGripperRotSpeed(&fault, &rotSpeed);
19 robot.GetGripperRotTorque(&fault, &rotTorque);
20 printf("gripper rot num : %lf, gripper rotSpeed : %d, gripper rotTorque : %d\n", rotNum, rotSpeed, rotTorque);
21 robot.CloseRPC();
22 return 0;
23}
11.19. Uruchamianie, zatrzymywanie przenośnika
1/**
2* @brief Uruchamia, zatrzymuje przenośnik
3* @param [in] status Stan, 1-uruchom, 0-zatrzymaj
4* @return Kod błędu
5*/
6errno_t ConveyorStartEnd(uint8_t status);
11.20. Rejestracja punktu detekcji IO
1/**
2* @brief Rejestruje punkt detekcji IO
3* @return Kod błędu
4*/
5errno_t ConveyorPointIORecord();
11.21. Rejestracja punktu A
1/**
2* @brief Rejestruje punkt A
3* @return Kod błędu
4*/
5errno_t ConveyorPointARecord();
11.22. Rejestracja punktu odniesienia
1/**
2* @brief Rejestruje punkt odniesienia
3* @return Kod błędu
4*/
5errno_t ConveyorRefPointRecord();
11.23. Rejestracja punktu B
1/**
2* @brief Rejestruje punkt B
3* @return Kod błędu
4*/
5errno_t ConveyorPointBRecord();
11.24. Detekcja IO przedmiotu na przenośniku
1/**
2* @brief Detekcja IO przedmiotu na przenośniku
3* @param [in] max_t Maksymalny czas detekcji, jednostka ms
4* @return Kod błędu
5*/
6errno_t ConveyorIODetect(int max_t);
11.25. Pobieranie bieżącej pozycji przedmiotu
1/**
2* @brief Pobiera bieżącą pozycję przedmiotu
3* @param [in] mode
4* @return Kod błędu
5*/
6errno_t ConveyorGetTrackData(int mode);
11.26. Rozpoczęcie śledzenia przenośnika
1/**
2* @brief Rozpoczęcie śledzenia przenośnika
3* @param [in] status Stan, 1-uruchom, 0-zatrzymaj
4* @return Kod błędu
5*/
6errno_t ConveyorTrackStart(uint8_t status);
11.27. Zatrzymanie śledzenia przenośnika
1/**
2* @brief Zatrzymanie śledzenia przenośnika
3* @return Kod błędu
4*/
5errno_t ConveyorTrackEnd();
11.28. Konfiguracja parametrów przenośnika
Zmienione w wersji C++SDK-v2.2.1-3.8.1.
1/**
2* @brief Konfiguruje parametry przenośnika
3* @param [in] para[0] Kanał enkodera 1~2
4* @param [in] para[1] Liczba impulsów enkodera na obrót
5* @param [in] para[2] Odległość przesunięcia przenośnika na jeden obrót enkodera
6* @param [in] para[3] Numer układu współrzędnych obiektu dla funkcji śledzenia ruchu, dla śledzenia chwytania i śledzenia TPD ustaw na 0
7* @param [in] para[4] Czy z wizją 0-bez 1-z
8* @param [in] para[5] Współczynnik prędkości dla opcji śledzenia chwytania przenośnika (1-100), dla innych opcji domyślnie 1
9* @param [in] followType Typ śledzenia ruchu, 0-śledzenie ruchu; 1-śledzenie doganiające
10* @param [in] startDis Dla śledzenia doganiającego, odległość początkowa śledzenia, -1: automatyczne obliczenie (po dojechaniu przedmiotu pod robota), jednostka mm, wartość domyślna 0
11* @param [in] endDis Dla śledzenia doganiającego, odległość końcowa śledzenia, jednostka mm, wartość domyślna 100
12* @return Kod błędu
13*/
14errno_t ConveyorSetParam(float para[6], int followType = 0, int startDis = 0, int endDis = 100);
11.29. Kompensacja punktu chwytania przenośnika
Zmienione w wersji C++SDK-v2.1.2.0.
1/**
2 * @brief Kompensacja punktu chwytania przenośnika
3 * @param [in] cmp Pozycja kompensacji double[3]{x, y, z}
4 * @return Kod błędu
5 */
6errno_t ConveyorCatchPointComp(double cmp[3]);
11.30. Ruch liniowy przenośnika
1/**
2* @brief Ruch liniowy przenośnika
3* @param [in] status Stan, 1-uruchom, 0-zatrzymaj
4* @return Kod błędu
5*/
6errno_t TrackMoveL(char name[32], int tool, int wobj, float vel, float acc, float ovl, float blendR, uint8_t flag, uint8_t type);
11.31. Detekcja wejścia komunikacyjnego przenośnika
Nowe w wersji C++SDK-v2.2.1-3.8.1.
1/**
2* @brief Detekcja wejścia komunikacyjnego przenośnika
3* @param [in] timeout Czas oczekiwania na timeout w ms
4* @return Kod błędu
5*/
6errno_t ConveyorComDetect(int timeout);
11.32. Wyzwolenie detekcji wejścia komunikacyjnego przenośnika
Nowe w wersji C++SDK-v2.2.1-3.8.1.
1/**
2* @brief Wyzwolenie detekcji wejścia komunikacyjnego przenośnika
3* @return Kod błędu
4*/
5errno_t ConveyorComDetectTrigger();
11.33. Przykładowy program operacji przenośnikiem robota
1int TestConveyor(void)
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 robot.LoggerInit();
6 robot.SetLoggerLevel(1);
7 int rtn = robot.RPC("192.168.58.2");
8 if (rtn != 0)
9 {
10 return -1;
11 }
12 robot.SetReConnectParam(true, 30000, 500);
13 int retval = 0;
14 retval = robot.ConveyorStartEnd(1);
15 printf("ConveyorStartEnd retval is: %d\n", retval);
16 retval = robot.ConveyorPointIORecord();
17 printf("ConveyorPointIORecord retval is: %d\n", retval);
18 retval = robot.ConveyorPointARecord();
19 printf("ConveyorPointARecord retval is: %d\n", retval);
20 retval = robot.ConveyorRefPointRecord();
21 printf("ConveyorRefPointRecord retval is: %d\n", retval);
22 retval = robot.ConveyorPointBRecord();
23 printf("ConveyorPointBRecord retval is: %d\n", retval);
24 retval = robot.ConveyorStartEnd(0);
25 printf("ConveyorStartEnd retval is: %d\n", retval);
26 retval = 0;
27 float param[6] = { 1,10000,200,0,0,20 };
28 retval = robot.ConveyorSetParam(param);
29 printf("ConveyorSetParam retval is: %d\n", retval);
30 double cmp[3] = { 0.0, 0.0, 0.0 };
31 retval = robot.ConveyorCatchPointComp(cmp);
32 printf("ConveyorCatchPointComp retval is: %d\n", retval);
33 int index = 1;
34 int max_time = 30000;
35 uint8_t block = 0;
36 retval = 0;
37 DescPose p1Desc(-419.524, -13.000, 351.569, -178.118, 0.314, 3.833);
38 DescPose p2Desc(-321.222, 185.189, 335.520, -179.030, -1.284, -29.869);
39 retval = robot.MoveCart(&p1Desc, 1, 0, 100.0, 100.0, 100.0, -1.0, -1);
40 printf("MoveCart retval is: %d\n", retval);
41 retval = robot.WaitMs(1);
42 printf("WaitMs retval is: %d\n", retval);
43 retval = robot.ConveyorIODetect(10000);
44 printf("ConveyorIODetect retval is: %d\n", retval);
45 retval = robot.ConveyorGetTrackData(1);
46 printf("ConveyorGetTrackData retval is: %d\n", retval);
47 retval = robot.ConveyorTrackStart(1);
48 printf("ConveyorTrackStart retval is: %d\n", retval);
49 retval = robot.TrackMoveL("cvrCatchPoint", 1, 0, 100, 100, 100, -1.0, 0, 0);
50 printf("TrackMoveL retval is: %d\n", retval);
51 retval = robot.MoveGripper(index, 51, 40, 30, max_time, block, 0, 0, 0, 0);
52 printf("MoveGripper retval is: %d\n", retval);
53 retval = robot.TrackMoveL("cvrRaisePoint", 1, 0, 100, 100, 100, -1.0, 0, 0);
54 printf("TrackMoveL retval is: %d\n", retval);
55 retval = robot.ConveyorTrackEnd();
56 printf("ConveyorTrackEnd retval is: %d\n", retval);
57 robot.MoveCart(&p2Desc, 1, 0, 100.0, 100.0, 100.0, -1.0, -1);
58 retval = robot.MoveGripper(index, 100, 40, 10, max_time, block, 0, 0, 0, 0);
59 printf("MoveGripper retval is: %d\n", retval);
60 rtn = robot->ConveyorComDetect(1000 * 10);
61 printf("ConveyorComDetect rtn is: %d\n", rtn);
62 robot.Sleep(2000);
63 rtn = robot->ConveyorComDetectTrigger();
64 printf("ConveyorComDetectTrigger rtn is: %d\n", rtn);
65 robot.CloseRPC();
66 return 0;
67}
11.34. Konfiguracja czujnika końcówki
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Konfiguruje czujnik końcówki
3* @param [in] idCompany Producent, 18-JUNKONG; 25-HUIDE
4* @param [in] idDevice Typ, 0-JUNKONG/RYR6T.V1.0
5* @param [in] idSoftware Wersja oprogramowania, 0-J1.0/HuiDe1.0 (tymczasowo niedostępne)
6* @param [in] idBus Pozycja montażu, 1-port końcówki 1; 2-port końcówki 2...8-port końcówki 8 (tymczasowo niedostępne)
7* @return Kod błędu
8*/
9errno_t AxleSensorConfig(int idCompany, int idDevice, int idSoftware, int idBus);
11.35. Pobieranie konfiguracji czujnika końcówki
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2 * @brief Pobiera konfigurację czujnika końcówki
3 * @param [out] idCompany Producent, 18-JUNKONG; 25-HUIDE
4 * @param [out] idDevice Typ, 0-JUNKONG/RYR6T.V1.0
5 * @return Kod błędu
6 */
7errno_t AxleSensorConfigGet(int& idCompany, int& idDevice);
11.36. Aktywacja czujnika końcówki
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2 * @brief Aktywuje czujnik końcówki
3 * @param [in] actFlag 0-reset; 1-aktywacja
4 * @return Kod błędu
5 */
6errno_t AxleSensorActivate(int actFlag);
11.37. Zapis do rejestru czujnika końcówki
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2 * @brief Zapis do rejestru czujnika końcówki
3 * @param [in] devAddr Numer adresu urządzenia 0-255
4 * @param [in] regHAddr Wysoki bajt adresu rejestru
5 * @param [in] regLAddr Niski bajt adresu rejestru
6 * @param [in] regNum Liczba rejestrów 0-255
7 * @param [in] data1 Wartość do zapisu w rejestrze 1
8 * @param [in] data2 Wartość do zapisu w rejestrze 2
9 * @param [in] isNoBlock 0-blokujące; 1-nieblokujące
10 * @return Kod błędu
11 */
12errno_t AxleSensorRegWrite(int devAddr, int regHAddr, int regLAddr, int regNum, int data1, int data2, int isNoBlock);
11.38. Przykład kodu czujnika końcówki
1int TestAxleSensor(void)
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 robot.LoggerInit();
6 robot.SetLoggerLevel(1);
7 int rtn = robot.RPC("192.168.58.2");
8 if (rtn != 0)
9 {
10 return -1;
11 }
12 robot.SetReConnectParam(true, 30000, 500);
13 robot.AxleSensorConfig(18, 0, 0, 1);
14 int company = -1;
15 int type = -1;
16 robot.AxleSensorConfigGet(company, type);
17 printf("company is %d, type is %d\n", company, type);
18 rtn = robot.AxleSensorActivate(1);
19 printf("AxleSensorActivate rtn is %d\n", rtn);
20 robot.Sleep(1000);
21 rtn = robot.AxleSensorRegWrite(1, 4, 6, 1, 0, 0, 0);
22 printf("AxleSensorRegWrite rtn is %d\n", rtn);
23 robot.CloseRPC();
24 return 0;
25}
11.39. Pobieranie protokołu urządzeń peryferyjnych robota
Nowe w wersji C++SDK-v2.1.3.0.
1/**
2* @brief Pobiera protokół urządzeń peryferyjnych robota
3* @param [out] protocol Numer protokołu urządzeń peryferyjnych robota 4096-karta sterowania osią rozszerzoną; 4097-ModbusSlave; 4098-ModbusMaster
4* @return Kod błędu
5*/
6errno_t GetExDevProtocol(int *protocol);
11.40. Ustawianie protokołu urządzeń peryferyjnych robota
Nowe w wersji C++SDK-v2.1.3.0.
1/**
2* @brief Ustawia protokół urządzeń peryferyjnych robota
3* @param [in] protocol Numer protokołu urządzeń peryferyjnych robota 4096-karta sterowania osią rozszerzoną; 4097-ModbusSlave; 4098-ModbusMaster
4* @return Kod błędu
5*/
6errno_t SetExDevProtocol(int protocol);
11.41. Przykładowy program ustawiania protokołu urządzeń peryferyjnych robota
Nowe w wersji C++SDK-v2.1.3.0.
1int TestExDevProtocol(void)
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 robot.LoggerInit();
6 robot.SetLoggerLevel(1);
7 int rtn = robot.RPC("192.168.58.2");
8 if (rtn != 0)
9 {
10 return -1;
11 }
12 robot.SetReConnectParam(true, 30000, 500);
13 int protocol = 4096;
14 rtn = robot.SetExDevProtocol(protocol);
15 std::cout << "SetExDevProtocol rtn " << rtn << std::endl;
16 rtn = robot.GetExDevProtocol(&protocol);
17 std::cout << "GetExDevProtocol rtn " << rtn << " protocol is: " << protocol << std::endl;
18 robot.CloseRPC();
19 return 0;
20}
11.42. Pobieranie parametrów komunikacji końcówki
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Pobiera parametry komunikacji końcówki
3* @param param Parametry komunikacji końcówki
4* @return Kod błędu
5*/
6errno_t GetAxleCommunicationParam(AxleComParam* param);
11.43. Ustawianie parametrów komunikacji końcówki
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Ustawia parametry komunikacji końcówki
3* @param param Parametry komunikacji końcówki
4* @return Kod błędu
5*/
6errno_t SetAxleCommunicationParam(AxleComParam param);
11.44. Ustawianie typu transferu plików na końcówce
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Ustawia typ transferu plików na końcówce
3* @param type 1-plik aktualizacyjny MCU; 2-plik LUA
4* @return Kod błędu
5*/
6errno_t SetAxleFileType(int type);
11.45. Ustawianie włączenia wykonania LUA na końcówce
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Ustawia włączenie wykonania LUA na końcówce
3* @param enable 0-nie włączaj; 1-włączaj
4* @return Kod błędu
5*/
6errno_t SetAxleLuaEnable(int enable);
11.46. Przywracanie po błędzie pliku LUA na końcówce
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Przywracanie po błędzie pliku LUA na końcówce
3* @param status 0-nie przywracaj; 1-przywróć
4* @return Kod błędu
5*/
6errno_t SetRecoverAxleLuaErr(int status);
11.47. Pobieranie stanu włączenia wykonania LUA na końcówce
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Pobiera stan włączenia wykonania LUA na końcówce
3* @param status status[0]: 0-niewłączone; 1-włączone
4* @return Kod błędu
5*/
6errno_t GetAxleLuaEnableStatus(int status[]);
11.48. Ustawianie włączonych typów urządzeń końcówki dla LUA
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Ustawia włączone typy urządzeń końcówki dla LUA
3* @param forceSensorEnable Stan włączenia czujnika siły, 0-wyłączony; 1-włączony
4* @param gripperEnable Stan włączenia chwytaka, 0-wyłączony; 1-włączony
5* @param IOEnable Stan włączenia urządzenia IO, 0-wyłączony; 1-włączony
6* @param dexhandEnable Stan włączenia dłoni, 0-wyłączony; 1-włączony
7* @return Kod błędu
8*/
9errno_t SetAxleLuaEnableDeviceType(int forceSensorEnable, int gripperEnable, int IOEnable, int dexhandEnable);
11.49. Pobieranie włączonych typów urządzeń końcówki dla LUA
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Pobiera włączone typy urządzeń końcówki dla LUA
3* @param enable enable[0]:forceSensorEnable Stan włączenia czujnika siły, 0-wyłączony; 1-włączony
4* @param enable enable[1]:gripperEnable Stan włączenia chwytaka, 0-wyłączony; 1-włączony
5* @param enable enable[2]:IOEnable Stan włączenia urządzenia IO, 0-wyłączony; 1-włączony
6* @param enable enable[3]:dexhandEnable Stan włączenia dłoni, 0-wyłączony; 1-włączony
7* @return Kod błędu
8*/
9errno_t GetAxleLuaEnableDeviceType(int* forceSensorEnable, int* gripperEnable, int* IOEnable, int* dexhandEnable);
11.50. Pobieranie aktualnie skonfigurowanych urządzeń końcówki
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Pobiera aktualnie skonfigurowane urządzenia końcówki
3* @param [out] forceSensorEnable Numer włączonego urządzenia czujnika siły, 0-wyłączony; 1-włączony
4* @param [out] gripperEnable Numer włączonego urządzenia chwytaka, 0-wyłączony; 1-włączony
5* @param [out] IODeviceEnable Numer włączonego urządzenia IO, 0-wyłączony; 1-włączony
6* @param [out] decHandEnable Numer włączonego urządzenia dłoni, 0-wyłączony; 1-włączony
7* @return Kod błędu
8*/
9errno_t GetAxleLuaEnableDevice(int forceSensorEnable[], int gripperEnable[], int IODeviceEnable[], int decHandEnable[]);
11.51. Ustawianie włączonych funkcji sterowania ruchem chwytaka
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Ustawia włączone funkcje sterowania ruchem chwytaka
3* @param id Numer urządzenia chwytaka
4* @param func func[0]-włączenie chwytaka; func[1]-inicjalizacja chwytaka; func[2]-ustawienie pozycji; func[3]-ustawienie prędkości; func[4]-ustawienie momentu obrotowego; func[6]-odczyt stanu chwytaka;
5 func[7]-odczyt stanu inicjalizacji; func[8]-odczyt kodu błędu; func[9]-odczyt pozycji; func[10]-odczyt prędkości; func[11]-odczyt momentu obrotowego; func[12]-ustawienie liczby obrotów dla chwytaka obrotowego;
6 func[13]-ustawienie prędkości obrotowej dla chwytaka obrotowego; func[14]-ustawienie momentu obrotowego dla chwytaka obrotowego; func[15]-odczyt stanu chwytaka obrotowego; func[16]-odczyt stanu inicjalizacji chwytaka obrotowego;
7 func[17]-odczyt liczby obrotów chwytaka obrotowego; func[18]-odczyt prędkości chwytaka obrotowego; func[19]-odczyt momentu obrotowego chwytaka obrotowego; func[20]-ustawienie ruchu synchronicznego wieloosiowego; func[21]-komenda kasowania błędów;
8 func[22]-stan pracy pojedynczej osi; func[23]-stan pracy wszystkich osi;
9* @return Kod błędu
10*/
11errno_t SetAxleLuaGripperFunc(int id, int func[32]);
11.52. Pobieranie włączonych funkcji sterowania ruchem chwytaka
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Pobiera włączone funkcje sterowania ruchem chwytaka
3* @param id Numer urządzenia chwytaka
4* @param func func[0]-włączenie chwytaka; func[1]-inicjalizacja chwytaka; func[2]-ustawienie pozycji; func[3]-ustawienie prędkości; func[4]-ustawienie momentu obrotowego; func[6]-odczyt stanu chwytaka;
5 func[7]-odczyt stanu inicjalizacji; func[8]-odczyt kodu błędu; func[9]-odczyt pozycji; func[10]-odczyt prędkości; func[11]-odczyt momentu obrotowego; func[12]-ustawienie liczby obrotów dla chwytaka obrotowego;
6 func[13]-ustawienie prędkości obrotowej dla chwytaka obrotowego; func[14]-ustawienie momentu obrotowego dla chwytaka obrotowego; func[15]-odczyt stanu chwytaka obrotowego; func[16]-odczyt stanu inicjalizacji chwytaka obrotowego;
7 func[17]-odczyt liczby obrotów chwytaka obrotowego; func[18]-odczyt prędkości chwytaka obrotowego; func[19]-odczyt momentu obrotowego chwytaka obrotowego; func[20]-ustawienie ruchu synchronicznego wieloosiowego; func[21]-komenda kasowania błędów;
8 func[22]-stan pracy pojedynczej osi; func[23]-stan pracy wszystkich osi;
9* @return Kod błędu
10*/
11errno_t GetAxleLuaGripperFunc(int id, int func[32]);
11.53. Zapis pliku stacji podrzędnej Ethercat robota
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Zapis pliku stacji podrzędnej Ethercat robota
3* @param type Typ pliku stacji podrzędnej, 1-aktualizacja pliku stacji podrzędnej; 2-aktualizacja pliku konfiguracji stacji podrzędnej
4* @param slaveID Numer stacji podrzędnej
5* @param fileName Nazwa przesyłanego pliku
6* @return Kod błędu
7*/
8errno_t SlaveFileWrite(int type, int slaveID, std::string fileName);
11.54. Przesyłanie pliku otwartego protokołu Lua końcówki
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Przesyła plik otwartego protokołu Lua końcówki
3* @param filePath Ścieżka lokalnego pliku lua ".../AXLE_LUA_End_DaHuan.lua"
4* @return Kod błędu
5*/
6errno_t AxleLuaUpload(std::string filePath);
11.55. Wejście stacji podrzędnej Ethercat robota w tryb boot
Nowe w wersji C++SDK-v2.1.5.0.
1/**
2* @brief Wejście stacji podrzędnej Ethercat robota w tryb boot
3* @return Kod błędu
4*/
5errno_t SetSysServoBootMode();
11.56. Przykład kodu operacji na pliku LUA końcówki robota
1int TestAxleLua(void)
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 robot.LoggerInit();
6 robot.SetLoggerLevel(1);
7 int rtn = robot.RPC("192.168.58.2");
8 if (rtn != 0)
9 {
10 return -1;
11 }
12 robot.SetReConnectParam(true, 30000, 500);
13 robot.AxleLuaUpload("D://zUP/AXLE_LUA_End_DaHuan.lua");
14 AxleComParam param(7, 8, 1, 0, 5, 3, 1);
15 robot.SetAxleCommunicationParam(param);
16 AxleComParam getParam;
17 robot.GetAxleCommunicationParam(&getParam);
18 printf("GetAxleCommunicationParam param is %d %d %d %d %d %d %d\n", getParam.baudRate, getParam.dataBit, getParam.stopBit, getParam.verify, getParam.timeout, getParam.timeoutTimes, getParam.period);
19 robot.SetAxleLuaEnable(1);
20 int luaEnableStatus = 0;
21 robot.GetAxleLuaEnableStatus(&luaEnableStatus);
22 robot.SetAxleLuaEnableDeviceType(0, 1, 0, 0);
23 int forceEnable = 0;
24 int gripperEnable = 0;
25 int ioEnable = 0;
26 int dexhandEnable = 0;
27 robot.GetAxleLuaEnableDeviceType(&forceEnable, &gripperEnable, &ioEnable, &dexhandEnable);
28 printf("GetAxleLuaEnableDeviceType param is %d %d %d %d\n", forceEnable, gripperEnable, ioEnable, dexhandEnable);
29 int func[32] = { 0,1,1,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
30 rtn = robot.SetAxleLuaGripperFunc(2, func);
31 printf("SetAxleLuaGripperFunc rtn is %d\n", rtn);
32 int getFunc[32] = { 0 };
33 rtn = robot.GetAxleLuaGripperFunc(2, getFunc);
34 printf("GetAxleLuaGripperFunc rtn is %d\n", rtn);
35 int getforceEnable[16] = { 0 };
36 int getgripperEnable[16] = { 0 };
37 int getioEnable[16] = { 0 };
38 int dexhandEnable1[16] = { 0 };
39 robot.GetAxleLuaEnableDevice(getforceEnable, getgripperEnable, getioEnable, dexhandEnable1);
40 printf("\ngetforceEnable status : ");
41 for (int i = 0; i < 16; i++)
42 {
43 printf("%d,", getforceEnable[i]);
44 }
45 printf("\ngetgripperEnable status : ");
46 for (int i = 0; i < 16; i++)
47 {
48 printf("%d,", getgripperEnable[i]);
49 }
50 printf("\ngetioEnable status : ");
51 for (int i = 0; i < 16; i++)
52 {
53 printf("%d,", getioEnable[i]);
54 }
55 printf("\n");
56 robot.ActGripper(2, 0);
57 robot.Sleep(2000);
58 robot.ActGripper(2, 1);
59 robot.Sleep(2000);
60 robot.MoveGripper(2, 1, 10, 100, 50000, 0, 0, 0, 0, 0);
61 int pos = 0;
62 while (true)
63 {
64 robot.GetRobotRealTimeState(&pkg);
65 printf("gripper pos is %u\n", pkg.gripper_position);
66 robot.Sleep(100);
67 }
68 robot.CloseRPC();
69 return 0;
70}
11.57. Pobieranie stanu przycisków SmartTool
1/**
2* @brief Pobiera stan przycisków SmartTool
3* @param [out] state Stan przycisków uchwytu SmartTool; (bit0:0-komunikacja normalna; 1-komunikacja rozłączona; bit1-cofnij operację; bit2-wyczyść program;
4bit3-przycisk A; bit4-przycisk B; bit5-przycisk C; bit6-przycisk D; bit7-przycisk E; bit8-przycisk IO; bit9-ręczny/automatyczny; bit10-start)
5* @return Kod błędu
6*/
7errno_t GetSmarttoolBtnState(int& state);
11.58. Przykład kodu dla przycisków SmartTool
1int main(void)
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5
6 robot.LoggerInit();
7 robot.SetLoggerLevel(1);
8 int rtn = robot.RPC("192.168.58.2");
9 robot.SetReConnectParam(true, 30000, 500);
10
11 while (true)
12 {
13 int btn = 0;
14 robot.GetSmarttoolBtnState(btn);
15 cout << "smarttool " << std::bitset<sizeof(btn) * 8>(btn) << endl;
16
17 Sleep(100);
18 }
19}
11.59. Sterowanie macierzą przyssawek
1/**
2* @brief Steruje macierzą przyssawek
3* @param [in] slaveID Numer stacji podrzędnej
4* @param [in] len Długość
5* @param [in] ctrlValue Wartość sterująca
6* @return Kod błędu
7*/
8errno_t FRRobot::SetSuckerCtrl(uint8_t slaveID, uint8_t len, uint8_t ctrlValue[20]);
11.60. Pobieranie stanu macierzy przyssawek
1/**
2* @brief Pobiera stan macierzy przyssawek
3* @param [in] slaveID Numer stacji podrzędnej
4* @param [out] state Stan przyssania 0-zwolniony obiekt 1-wykryto przedmiot, przyssanie udane 2-brak przyssania do przedmiotu 3-przedmiot oderwany
5* @param [out] pressValue Bieżący poziom próżni, jednostka kPa
6* @param [out] error Bieżący kod błędu przyssawki
7* @return Kod błędu
8*/
9errno_t FRRobot::GetSuckerState(uint8_t slaveID, uint8_t* state, int* pressValue, int* error);
11.61. Oczekiwanie na stan przyssawki
1/**
2* @brief Oczekuje na stan przyssawki
3* @param [in] slaveID Numer stacji podrzędnej
4* @param [in] state Stan przyssania 0-zwolniony obiekt 1-wykryto przedmiot, przyssanie udane 2-brak przyssania do przedmiotu 3-przedmiot oderwany
5* @param [in] ms Maksymalny czas oczekiwania
6* @return Kod błędu
7*/
8errno_t FRRobot::WaitSuckerState(uint8_t slaveID, uint8_t state, int ms);
11.62. Przykład kodu instrukcji sterowania macierzą przyssawek
1void testSucker()
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 uint8_t ctrl[20];
6 uint8_t state;
7 int pressVlaue;
8 int error;
9
10 robot.LoggerInit();
11 robot.SetLoggerLevel(1);
12 int rtn = robot.RPC("192.168.58.2");
13 if (rtn != 0)
14 {
15 return;
16 }
17 robot.SetReConnectParam(true, 30000, 500);
18 // Przesyłanie i ładowanie pliku otwartego protokołu
19 robot.OpenLuaUpload("E://Projekt/SDK urządzeń peryferyjnych/CtrlDev_sucker.lua");
20 robot.Sleep(2000);
21 robot.SetCtrlOpenLUAName(1, "CtrlDev_sucker.lua");
22 robot.UnloadCtrlOpenLUA(1);
23 robot.LoadCtrlOpenLUA(1);
24 robot.Sleep(1000);
25
26 // Sterowanie przyssawką w trybie broadcast, przyssanie z maksymalną siłą
27 ctrl[0] = 1;
28 robot.SetSuckerCtrl(0, 1, ctrl);
29
30 // Cykliczne monitorowanie stanu przyssawki 1 i 12
31 for (int i = 0; i < 100; i++)
32 {
33 robot.GetSuckerState(1, &state, &pressVlaue, &error);
34 printf("sucker1 state is %d, pressVlaue is %d, error num is %d\n", state, pressVlaue, error);
35 robot.GetSuckerState(12, &state, &pressVlaue, &error);
36 printf("sucker12 state is %d, pressVlaue is %d, error num is %d\n", state, pressVlaue, error);
37 robot.Sleep(100);
38 }
39
40 // Oczekiwanie, czy przyssawka 1 jest w stanie przyssania do przedmiotu, czas oczekiwania 100 ms
41 int ret = robot.WaitSuckerState(1, 1, 100);
42 printf("WaitSuckerState result is %d\n", ret);
43
44 // Wyłączenie przyssawek 1 i 12 w trybie unicast
45 ctrl[0] = 3;
46 robot.SetSuckerCtrl(1, 1, ctrl);
47 robot.SetSuckerCtrl(12, 1, ctrl);
48
49 robot.CloseRPC();
50}
11.63. Przesyłanie pliku LUA otwartego protokołu urządzeń peryferyjnych
1/**
2 * @brief Przesyła plik Lua
3 * @param [in] filePath Ścieżka lokalnego pliku lua
4 * @return Kod błędu
5 */
6errno_t OpenLuaUpload(std::string filePath);
11.64. Pobieranie parametrów płyty stacji podrzędnej
1/**
2* @brief Pobiera parametry płyty stacji podrzędnej
3* @param [out] type 0-Ethercat, 1-CClink, 3-Ethercat, 4-EIP
4* @param [out] version Wersja protokołu
5* @param [out] connState 0-niepołączony 1-połączony
6* @return Kod błędu
7*/
8errno_t GetFieldBusConfig(uint8_t* type, uint8_t* version, uint8_t* connState);
11.65. Zapis DO stacji podrzędnej
1/**
2* @brief Zapisuje DO stacji podrzędnej
3* @param [in] DOIndex Numer DO
4* @param [in] writeNum Liczba do zapisu
5* @param [in] status[8] Wartości do zapisu, maksymalnie 8
6* @return Kod błędu
7*/
8errno_t FieldBusSlaveWriteDO(uint8_t DOIndex, uint8_t writeNum, uint8_t status[8]);
11.66. Zapis AO stacji podrzędnej
1/**
2* @brief Zapisuje AO stacji podrzędnej
3* @param [in] AOIndex Numer AO
4* @param [in] writeNum Liczba do zapisu
5* @param [in] status[8] Wartości do zapisu, maksymalnie 8
6* @return Kod błędu
7*/
8errno_t FieldBusSlaveWriteAO(uint8_t AOIndex, uint8_t writeNum, double status[8]);
11.67. Odczyt DI stacji podrzędnej
1/**
2* @brief Odczytuje DI stacji podrzędnej
3* @param [in] DOIndex Numer DI
4* @param [in] readNum Liczba do odczytu
5* @param [out] status[8] Odczytane wartości, maksymalnie 8
6* @return Kod błędu
7*/
8errno_t FieldBusSlaveReadDI(uint8_t DOIndex, uint8_t readNum, uint8_t status[8]);
11.68. Odczyt AI stacji podrzędnej
1/**
2* @brief Odczytuje AI stacji podrzędnej
3* @param [in] AOIndex Numer AI
4* @param [in] readNum Liczba do odczytu
5* @param [out] status[8] Odczytane wartości, maksymalnie 8
6* @return Kod błędu
7*/
8errno_t FieldBusSlaveReadAI(uint8_t AIIndex, uint8_t readNum, double status[8]);
11.69. Oczekiwanie na wejście rozszerzone DI
1/**
2* @brief Oczekuje na wejście rozszerzone DI
3* @param [in] DIIndex Numer DI
4* @param [in] status 0-niski poziom; 1-wysoki poziom
5* @param [in] waitMs Maksymalny czas oczekiwania (ms)
6* @return Kod błędu
7*/
8errno_t FRRobot::FieldBusSlaveWaitDI(uint8_t DIIndex, bool status, int waitMs);
11.70. Oczekiwanie na wejście rozszerzone AI
1/**
2* @brief Oczekuje na wejście rozszerzone AI
3* @param [in] AIIndex Numer AI
4* @param [in] waitType 0-większe niż; 1-mniejsze niż
5* @param [in] value Wartość AI
6* @param [in] waitMs Maksymalny czas oczekiwania (ms)
7* @return Kod błędu
8*/
9errno_t FRRobot::FieldBusSlaveWaitAI(uint8_t AIIndex, uint8_t waitType, double value, int waitMs);
11.71. Przykład kodu instrukcji interfejsu w trybie stacji podrzędnej
1void testFieldBusBoard()
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 uint8_t type = 0, version = 0, connState = 0;
6 uint8_t ctrl[8];
7 double ctrlAO[8];
8 static uint8_t DI[8];
9 static double AI[8];
10 robot.LoggerInit();
11 robot.SetLoggerLevel(1);
12 int rtn = robot.RPC("192.168.58.2");
13 if (rtn != 0)
14 {
15 return;
16 }
17 robot.SetReConnectParam(true, 30000, 500);
18 // Przesyłanie i ładowanie pliku otwartego protokołu
19 robot.OpenLuaUpload("E://Projekt/SDK urządzeń peryferyjnych/CtrlDev_field.lua");
20 robot.Sleep(2000);
21 robot.SetCtrlOpenLUAName(3, "CtrlDev_field.lua");
22 robot.UnloadCtrlOpenLUA(3);
23 robot.LoadCtrlOpenLUA(3);
24 robot.Sleep(8000);
25
26 // Pobranie typu protokołu, wersji oprogramowania i stanu połączenia z PLC płyty stacji podrzędnej
27 robot.GetFieldBusConfig(&type, &version, &connState);
28 printf("type is %d, version is %d,connState is %d\n", type, version, connState);
29
30 // Zapis DO0 = 1, DO1 = 0, DO2 = 1
31 ctrl[0] = 0;
32 ctrl[1] = 1;
33 ctrl[2] = 1;
34 robot.FieldBusSlaveWriteDO(0, 3, ctrl);
35
36 // Zapis AO2 = 0x1000
37 ctrlAO[0] = 0x1005;
38 robot.FieldBusSlaveWriteAO(2, 1, ctrlAO);
39
40 // Cykliczne monitorowanie DI0~DI3 AI0~AI2
41 for (int i = 0; i < 100; i++)
42 {
43 robot.FieldBusSlaveReadDI(0, 4, DI);
44 printf("DI0 is %d, DI1 is %d,DI2 is %d,DI3 is %d\n", DI[0], DI[1], DI[2], DI[3]);
45 robot.FieldBusSlaveReadAI(0, 3, AI);
46 printf("AI0 is %d, AI1 is %d,AI2 is %d\n", AI[0], AI[1], AI[2]);
47 robot.Sleep(10);
48 }
49
50 // Oczekiwanie, czy DI0 ma wartość 1, czas oczekiwania 100 ms, wydruk wyniku
51 int ret = robot.FieldBusSlaveWaitDI(0, 1, 100);
52 printf("FieldBusSlaveWaitDI result is %d\n", ret);
53
54 // Oczekiwanie, czy AI0 jest większe niż 400, czas oczekiwania 100 ms, wydruk wyniku
55 ret = robot.FieldBusSlaveWaitAI(0,0,400.00,100);
56 printf("FieldBusSlaveWaitAI result is %d\n", ret);
57
58 robot.CloseRPC();
59}
11.72. Włączanie/wyłączanie urządzenia peryferyjnego lasera
Nowe w wersji C++SDK-v3.8.6.
1/**
2 * @brief Funkcja włączania/wyłączania urządzenia peryferyjnego lasera
3 * @param [in] OnOff 0-wyłącz 1-włącz
4 * @param [in] weldId ID spoiny, domyślnie 0
5 * @return Kod błędu
6 */
7errno_t LaserTrackingLaserOnOff(int OnOff,int weldId);
11.73. Rozpoczynanie/zatrzymywanie śledzenia laserowego
Nowe w wersji C++SDK-v3.8.6.
1/**
2 * @brief Funkcja rozpoczynania/zatrzymywania śledzenia laserowego
3 * @param [in] OnOff 0-zatrzymaj 1-rozpocznij
4 * @param [in] coordId Numer układu współrzędnych narzędzia urządzenia peryferyjnego lasera
5 * @return Kod błędu
6 */
7errno_t LaserTrackingTrackOnOff(int OnOff, int coordId);
11.74. Rozpoczynanie lokalizacji laserowej - stały kierunek
Nowe w wersji C++SDK-v3.8.6.
1/**
2* @brief Lokalizacja laserowa - stały kierunek
3* @param [in] direction 0-x+ 1-x- 2-y+ 3-y- 4-z+ 5-z-
4* @param [in] vel Prędkość, jednostka %
5* @param [in] distance Maksymalna odległość lokalizacji, jednostka mm
6* @param [in] timeout Czas timeoutu lokalizacji, jednostka ms
7* @param [in] posSensorNum Numer narzędzia skalibrowanego lasera
8* @return Kod błędu
9*/
10errno_t LaserTrackingSearchStart_xyz(int direction, int vel, int distance, int timeout, int posSensorNum);
11.75. Rozpoczynanie lokalizacji laserowej - kierunek dowolnego punktu
Nowe w wersji C++SDK-v3.8.6.
1/**
2 * @brief Lokalizacja laserowa - dowolny kierunek
3 * @param [in] directionPoint Współrzędne xyz punktu wejściowego lokalizacji
4 * @param [in] vel Prędkość, jednostka %
5 * @param [in] distance Maksymalna odległość lokalizacji, jednostka mm
6 * @param [in] timeout Czas timeoutu lokalizacji, jednostka ms
7 * @param [in] posSensorNum Numer narzędzia skalibrowanego lasera
8 * @return Kod błędu
9 */
10errno_t LaserTrackingSearchStart_point(DescTran directionPoint, int vel, int distance, int timeout, int posSensorNum);
11.76. Zakończenie lokalizacji laserowej
Nowe w wersji C++SDK-v3.8.6.
1/**
2 * @brief Zakończenie lokalizacji laserowej
3 * @return Kod błędu
4 */
5errno_t LaserTrackingSearchStop();
11.77. Konfiguracja parametrów sieciowych lasera
Nowe w wersji C++SDK-v3.8.6.
1/**
2 * @brief Konfiguruje parametry sieciowe lasera
3 * @param [in] ip Adres IP urządzenia peryferyjnego lasera
4 * @param [in] port Numer portu urządzenia peryferyjnego lasera
5 * @return Kod błędu
6 */
7errno_t LaserTrackingSensorConfig(std::string ip, int port);
11.78. Konfiguracja okresu próbkowania urządzenia peryferyjnego lasera
Nowe w wersji C++SDK-v3.8.6.
1/**
2* @brief Konfiguruje okres próbkowania urządzenia peryferyjnego lasera
3* @param [in] period Okres próbkowania urządzenia peryferyjnego lasera, jednostka ms
4* @return Kod błędu
5*/
6errno_t LaserTrackingSensorSamplePeriod(int period);
11.79. Ładowanie sterownika urządzenia peryferyjnego lasera
Nowe w wersji C++SDK-v3.8.6.
1/**
2 * @brief Ładowanie sterownika urządzenia peryferyjnego lasera
3 * @param [in] type Typ protokołu sterownika urządzenia peryferyjnego lasera 101-Rui niu 102-Chuang xiang 103-Quan shi 104-Tong zhou 105-Ao tai
4 * @return Kod błędu
5 */
6errno_t LoadPosSensorDriver(int type);
11.80. Zwalnianie sterownika urządzenia peryferyjnego lasera
Nowe w wersji C++SDK-v3.8.6.
1/**
2 * @brief Zwalnianie sterownika urządzenia peryferyjnego lasera
3 * @return Kod błędu
4 */
5errno_t UnLoadPosSensorDriver();
11.81. Rejestracja trajektorii spoiny laserowej
Nowe w wersji C++SDK-v3.8.6.
1/**
2* @brief Rejestracja trajektorii spoiny laserowej
3* @param [in] status 0-zatrzymaj rejestrację 1-śledzenie w czasie rzeczywistym 2-rozpocznij rejestrację
4* @param [in] delayTime Czas opóźnienia, jednostka ms
5* @return Kod błędu
6*/
7errno_t LaserSensorRecord1(int status, int delayTime);
11.82. Odtwarzanie trajektorii spoiny laserowej
Nowe w wersji C++SDK-v3.8.6.
1/**
2 * @brief Odtwarzanie trajektorii spoiny laserowej
3 * @param [in] delayTime Czas opóźnienia, jednostka ms
4 * @param [in] speed Prędkość, jednostka %
5 * @return Kod błędu
6 */
7errno_t LaserSensorReplay(int delayTime, double speed);
11.83. Odtwarzanie śledzenia laserowego
Nowe w wersji C++SDK-v3.8.6.
1/**
2 * @brief Odtwarzanie śledzenia laserowego
3 * @return Kod błędu
4 */
5errno_t MoveLTR();
11.84. Rejestracja i odtwarzanie trajektorii spoiny laserowej
Nowe w wersji C++SDK-v3.8.6.
1/**
2* @brief Rejestracja i odtwarzanie trajektorii spoiny laserowej
3* @param [in] delayMode Tryb 0-czas opóźnienia 1-odległość opóźnienia
4* @param [in] delayTime Czas opóźnienia, jednostka ms
5* @param [in] delayDisExAxisNum Numer osi rozszerzonej dla odległości opóźnienia
6* @param [in] delayDis Odległość opóźnienia, jednostka mm
7* @param [in] sensitivePara Współczynnik czułości kompensacji
8* @param [in] trackMode Typ śledzenia punktowego. 0-ruch asynchroniczny osi rozszerzonej; 1-robot
9* @param [in] triggerMode Sposób wyzwalania śledzenia punktowego. 0-czas śledzenia; 1-IO
10* @param [in] runTime Czas śledzenia punktowego robota (s)
11* @param [in] speed Prędkość, jednostka %
12* @return Kod błędu
13*/
14errno_t LaserSensorRecordandReplay(int delayMode, int delayTime, int delayDisExAxisNum, double delayDis, double sensitivePara, int trackMode, int triggerMode, double runTime, double speed);
11.85. Ruch do punktu początkowego zarejestrowanej spoiny
Nowe w wersji C++SDK-v3.8.6.
1/**
2* @brief Ruch do punktu początkowego zarejestrowanej spoiny
3* @param [in] moveType 0-moveJ 1-moveL
4* @param [in] ovl Prędkość, jednostka %
5* @return Kod błędu
6*/
7errno_t MoveToLaserRecordStart(int moveType, double ovl);
11.86. Ruch do punktu końcowego zarejestrowanej spoiny
Nowe w wersji C++SDK-v3.8.6.
1/**
2* @brief Ruch do punktu końcowego zarejestrowanej spoiny
3* @param [in] moveType 0-moveJ 1-moveL
4* @param [in] ovl Prędkość, jednostka %
5* @return Kod błędu
6*/
7errno_t MoveToLaserRecordEnd(int moveType, double ovl);
11.87. Ruch do punktu lokalizacji czujnika laserowego
Nowe w wersji C++SDK-v3.8.6.
1/**
2* @brief Ruch do punktu lokalizacji czujnika laserowego
3* @param [in] moveFlag Typ ruchu: 0-PTP; 1-LIN
4* @param [in] ovl Współczynnik skalowania prędkości, 0-100
5* @param [in] dataFlag Wybór danych bufora spoiny: 0-wykonaj dane planowania; 1-wykonaj dane rejestracji
6* @param [in] plateType Typ blachy: 0-falista; 1-trapezowa; 2-ogrodzeniowa; 3-beczka po oleju; 4-falista stal pancerna
7* @param [in] trackOffectType Typ przesunięcia czujnika laserowego: 0-bez przesunięcia; 1-przesunięcie w układzie bazowym; 2-przesunięcie w układzie narzędzia; 3-przesunięcie w surowych danych lasera
8* @param [in] offset Wartość przesunięcia
9* @return Kod błędu
10*/
11errno_t MoveToLaserSeamPos(int moveFlag, double ovl, int dataFlag, int plateType, int trackOffectType, DescPose offset);
11.88. Pobieranie współrzędnych punktu lokalizacji czujnika laserowego
Nowe w wersji C++SDK-v3.8.6.
1/**
2* @brief Pobiera informacje o współrzędnych punktu lokalizacji czujnika laserowego
3* @param [in] trackOffectType Typ przesunięcia czujnika laserowego: 0-bez przesunięcia; 1-przesunięcie w układzie bazowym; 2-przesunięcie w układzie narzędzia; 3-przesunięcie w surowych danych lasera
4* @param [in] offset Wartość przesunięcia
5* @param [out] jPos Pozycja stawów [°]
6* @param [out] descPos Pozycja kartezjańska [mm]
7* @param [out] tool Układ współrzędnych narzędzia
8* @param [out] user Układ współrzędnych obiektu
9* @param [out] exaxis Pozycja osi rozszerzonej [mm]
10* @return Kod błędu
11*/
12errno_t GetLaserSeamPos(int trackOffectType, DescPose offset, JointPos& jPos, DescPose& descPos, int& tool, int& user, ExaxisPos& exaxis);
11.89. Przykład kodu konfiguracji parametrów i debugowania urządzenia peryferyjnego lasera
Nowe w wersji C++SDK-v3.8.6.
1void testLaserConfig()
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 uint8_t ctrl[20];
6 uint8_t state;
7 int pressVlaue;
8 int error;
9 robot.CloseRPC();
10 robot.LoggerInit();
11 robot.SetLoggerLevel(1);
12 int rtn = robot.RPC("192.168.58.2");
13 if (rtn != 0)
14 {
15 return;
16 }
17 robot.SetReConnectParam(true, 30000, 500);
18 // Ustawienie adresu IP i numeru portu
19 robot.LaserTrackingSensorConfig("192.168.58.20", 5020);
20 // Ustawienie okresu próbkowania
21 robot.LaserTrackingSensorSamplePeriod(20);
22 // Załadowanie sterownika
23 robot.LoadPosSensorDriver(101);
24 // Wyłączenie urządzenia peryferyjnego lasera
25 robot.LaserTrackingLaserOnOff(0,0);
26 robot.Sleep(3000);
27 // Włączenie urządzenia peryferyjnego lasera
28 robot.LaserTrackingLaserOnOff(1, 0);
29 robot.CloseRPC();
30}
11.90. Przykład kodu skanowania trajektorii laserowej i odtwarzania trajektorii
Nowe w wersji C++SDK-v3.8.6.
1void testLaserRecordAndReplay()
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 uint8_t ctrl[20];
6 uint8_t state;
7 int pressVlaue;
8 int error;
9 robot.CloseRPC();
10 robot.LoggerInit();
11 robot.SetLoggerLevel(1);
12 int rtn = robot.RPC("192.168.58.2");
13 if (rtn != 0)
14 {
15 return;
16 }
17 robot.SetReConnectParam(true, 30000, 500);
18
19 // Przesyłanie i ładowanie pliku otwartego protokołu
20 robot.OpenLuaUpload("E://openlua/CtrlDev_laser_ruiniu-0117.lua");
21 robot.Sleep(2000);
22 robot.SetCtrlOpenLUAName(0, "CtrlDev_laser_ruiniu-0117.lua");
23 robot.UnloadCtrlOpenLUA(0);
24 robot.LoadCtrlOpenLUA(0);
25 robot.Sleep(8000);
26 int cnt = 1;
27 while(cnt<31)
28 {
29 // Ruch do punktu początkowego skanowania
30 JointPos startjointPos(56.205, -117.951, 141.872, -118.149, -94.217, -122.176);
31 DescPose startdescPose(-97.552, -282.855, 26.675, 174.182, -1.338, -91.707);
32 ExaxisPos exaxisPos(0, 0, 0, 0);
33 DescPose offdese(0, 0, 0, 0, 0, 0);
34 robot.MoveL(&startjointPos, &startdescPose, 1, 0, 100, 100, 100, -1, &exaxisPos, 0, 0, &offdese, 1, 1);
35 // Rozpoczęcie rejestracji trajektorii
36 robot.LaserSensorRecord1(2, 10);
37 // Ruch do punktu końcowego rejestracji
38 JointPos endjointPos(68.809, -87.100, 121.120, -127.233, -95.038, -109.555);
39 DescPose enddescPose(-103.555, -464.234, 13.076, 174.179, -1.344, -91.709);
40 robot.MoveL(&endjointPos, &enddescPose, 1, 0, 30, 100, 100, -1, &exaxisPos, 0, 0, &offdese, 1, 1);
41 // Zatrzymanie rejestracji
42 robot.LaserSensorRecord1(0, 10);
43 // Ruch do punktu początkowego zarejestrowanej spoiny
44 robot.MoveToLaserRecordStart(1, 30);
45 // Rozpoczęcie odtwarzania trajektorii
46 robot.LaserSensorReplay(10, 100);
47 robot.MoveLTR();
48 // Zatrzymanie odtwarzania trajektorii
49 robot.LaserSensorRecord1(0, 10);
50 printf("Laserowe skanowanie + test stabilności odtwarzania trajektorii, %d raz\n", cnt);
51 cnt++;
52 }
53 robot.CloseRPC();
54}
11.91. Przykład kodu lokalizacji laserowej i śledzenia w czasie rzeczywistym
Nowe w wersji C++SDK-v3.8.6.
1void testLasertrack()
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 uint8_t ctrl[20];
6 uint8_t state;
7 int pressVlaue;
8 int error;
9 robot.CloseRPC();
10 robot.LoggerInit();
11 robot.SetLoggerLevel(1);
12 int rtn = robot.RPC("192.168.58.2");
13
14 if (rtn != 0)
15 {
16 return;
17 }
18 robot.SetReConnectParam(true, 30000, 500);
19
20 // Przesyłanie i ładowanie pliku otwartego protokołu
21 robot.OpenLuaUpload("E://openlua/CtrlDev_laser_ruiniu-0117.lua");
22 robot.Sleep(2000);
23 robot.SetCtrlOpenLUAName(0, "CtrlDev_laser_ruiniu-0117.lua");
24 robot.UnloadCtrlOpenLUA(0);
25 robot.LoadCtrlOpenLUA(0);
26 robot.Sleep(8000);
27 int cnt = 1;
28 while (cnt < 2)
29 {
30 // Ruch do punktu początkowego lokalizacji
31 JointPos startjointPos(58.337, -119.628, 146.037, -116.358, -92.224, -117.654);
32 DescPose startdescPose(-53.375, -255.363, 0.919, 178.054, 1.077, -94.026);
33 ExaxisPos exaxisPos(0, 0, 0, 0);
34 DescPose offdese(0, 0, 0, 0, 0, 0);
35 DescTran directionPoint;
36 robot.MoveL(&startjointPos, &startdescPose, 1, 0, 100, 100, 100, -1, &exaxisPos, 0, 0, &offdese, 1, 1);
37
38 // Rozpoczęcie lokalizacji w kierunku -y
39 int ret = robot.LaserTrackingSearchStart_xyz(3, 100, 300, 1000, 2);
40 robot.LaserTrackingSearchStop();
41 // Jeśli lokalizacja się powiodła
42 if (ret == 0)
43 {
44 // Ruch do punktu lokalizacji
45 robot.MoveToLaserSeamPos(1, 30, 0, 0, 0, offdese);
46 // Rozpoczęcie śledzenia laserowego wzdłuż punktu lokalizacji
47 robot.LaserTrackingTrackOnOff(1, 2);
48 JointPos endjointPos(70.580, -90.918, 126.593, -125.154, -92.162, -105.403);
49 DescPose enddescPose(-53.375, -419.020, 0.920, 178.054, 1.076, -94.026);
50 robot.MoveL(&endjointPos, &enddescPose, 1, 0, 20, 100, 100, -1, &exaxisPos, 0, 0, &offdese, 1, 1);
51 // Zatrzymanie śledzenia
52 robot.LaserTrackingTrackOnOff(0, 2);
53
54 }
55 cnt++;
56 }
57 robot.CloseRPC();
58}
11.92. Przykład kodu synchronizacji śledzenia laserowego z osią rozszerzoną i robotem
Nowe w wersji C++SDK-v3.8.6.
1void testLasertrackandExitAxis()
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 uint8_t ctrl[20];
6 uint8_t state;
7 int pressVlaue;
8 int error;
9 robot.CloseRPC();
10 robot.LoggerInit();
11 robot.SetLoggerLevel(1);
12 int rtn = robot.RPC("192.168.58.2");
13
14 if (rtn != 0)
15 {
16 return;
17 }
18 robot.SetReConnectParam(true, 30000, 500);
19
20 ExaxisPos startexaxisPos = { 0,0,0,0 };
21 ExaxisPos seamexaxisPos = { -10,0,0,0 };
22 ExaxisPos endexaxisPos = { -30, 0, 0, 0 };
23 DescPose offdese = { 0, 0, 0, 0, 0, 0 };
24 JointPos seamjointPos(0, 0, 0, 0, 0, 0);
25 DescPose seamdescPose(0, 0, 0, 0, 0, 0);
26
27 int cnt = 1;
28 while (cnt < 31)
29 {
30 // Ruch do punktu początkowego lokalizacji
31 JointPos startjointPos(58.337, -119.628, 146.037, -116.358, -92.224, -117.654);
32 DescPose startdescPose(-53.375, -255.363, 0.919, 178.054, 1.077, -94.026);
33 robot.ExtAxisSyncMoveJ(startjointPos, startdescPose, 1, 0, 100, 100, 100, startexaxisPos, -1, 0, offdese);
34
35 // Rozpoczęcie lokalizacji w kierunku -y
36 int ret = robot.LaserTrackingSearchStart_xyz(3, 100, 300, 1000, 2);
37 robot.LaserTrackingSearchStop();
38 int tool = 0;
39 int user = 0;
40 robot.GetLaserSeamPos(0, offdese, seamjointPos, seamdescPose, tool, user, startexaxisPos);
41 printf("%f, %f, %f,%f, %f, %f,%f, %f, %f,%f, %f, %f\n", seamjointPos.jPos[0], seamjointPos.jPos[1], seamjointPos.jPos[2], seamjointPos.jPos[3], seamjointPos.jPos[4], seamjointPos.jPos[5], seamdescPose.tran.x, seamdescPose.tran.y, seamdescPose.tran.z, seamdescPose.rpy.rx, seamdescPose.rpy.ry, seamdescPose.rpy.rz);
42
43 // Jeśli lokalizacja się powiodła
44 if (ret == 0)
45 {
46 // Synchroniczny ruch robota i osi rozszerzonej do punktu lokalizacji
47 robot.ExtAxisSyncMoveJ(seamjointPos, seamdescPose, 1, 0, 100, 100, 100, seamexaxisPos, -1, 0, offdese);
48
49 // Rozpoczęcie śledzenia laserowego wzdłuż punktu lokalizacji z synchronizacją ruchu osi rozszerzonej
50 robot.LaserTrackingTrackOnOff(1, 2);
51 JointPos endjointPos(70.580, -90.918, 126.593, -125.154, -92.162, -105.403);
52 DescPose enddescPose(-53.375, -419.020, 0.920, 178.054, 1.076, -94.026);
53 robot.ExtAxisSyncMoveL(endjointPos, enddescPose, 1, 0, 20, 100, 100, -1, endexaxisPos, 0, offdese);;
54 // Zatrzymanie śledzenia
55 robot.LaserTrackingTrackOnOff(0, 2);
56 }
57 cnt++;
58 printf("Synchronizacja śledzenia laserowego z osią rozszerzoną i robotem, %d raz\n", cnt);
59 }
60 robot.CloseRPC();
61}
11.93. Włączanie/wyłączanie funkcji transmisji przez końcówkę
1/**
2* @brief Włączanie/wyłączanie funkcji transmisji przez końcówkę
3* @param [in] mode 0-wyłącz, 1-włącz
4* @return Kod błędu
5*/
6errno_t SetAxleGenComEnable(int mode);
11.94. Wysyłanie i odbieranie danych nieokresowych w funkcji transmisji przez końcówkę
1/**
2* @brief Wysyłanie i odbieranie danych nieokresowych w funkcji transmisji przez końcówkę
3* @param [in] lenSnd Długość wysyłanych danych
4* @param [in] sndBuff Dane do wysłania
5* @param [in] lenRcv Wybór długości odbieranych danych
6* @param [out] rcvBuff Odebrane dane odpowiedzi
7* @return Kod błędu
8*/
9errno_t SndRcvAxleGenComCmdData(int lenSnd, int sndBuff[130], int lenRcv, int rcvData[130]);
11.95. Przykład kodu komunikacji danych nieokresowych dla głowicy terapeutycznej Beiyikang opartej na funkcji transmisji przez końcówkę
1int testAxleGenCom()
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 robot.LoggerInit();
6 robot.SetLoggerLevel(1);
7 int rtn = robot.RPC("192.168.58.2");
8 if (rtn != 0)
9 {
10 return -1;
11 }
12 robot.SetReConnectParam(true, 30000, 500);
13 int led_on[6] = { 0xAB, 0xBA, 0x12, 0x01, 0x01, 0x79 };
14 int led_off[6] = { 0xAB, 0xBA, 0x12, 0x01, 0x00, 0x78 };
15 int version[5] = { 0xAB, 0xBA, 0x11, 0x00, 0x76 };
16 int state[6] = { 0xAB, 0xBA, 0x1B, 0x01, 0xAA, 0x2B };
17 int cycleState[6] = { 0xAB, 0xBA, 0x12, 0x01, 0x00, 0x78 };
18 int rcvdata[16] = {0};
19 int ret = 0;
20 int cnt = 1;
21 JointPos p1Joint(88.708, -86.178, 140.989, -141.825, -89.162, -49.879);
22 DescPose p1Desc(188.007, -377.850, 260.207, 178.715, 2.823, -131.466);
23 JointPos p2Joint(112.131, -75.554, 126.989, -139.027, -88.044, -26.477);
24 DescPose p2Desc(368.003, -377.848, 260.211, 178.715, 2.823, -131.465);
25 ExaxisPos exaxisPos(0, 0, 0, 0);
26 DescPose offdese(0, 0, 0, 0, 0, 0);
27 // Włączenie funkcji transmisji przez końcówkę
28 robot.SetAxleGenComEnable(1);
29 robot.SetAxleLuaEnable(1);
30 while (cnt <= 10000)
31 {
32 // Odczytanie numeru wersji
33 ret = robot.SndRcvAxleGenComCmdData(5, version, 10, rcvdata);
34 printf(" hard version : %d,hard code:%d, soft version:%d %d, soft code:%d \n", rcvdata[4], rcvdata[5], rcvdata[6] ,rcvdata[7], rcvdata[8]);
35 if (ret != 0)
36 {
37 break;
38 }
39 robot.Sleep(1000);
40 // Odczytanie stanu obecności głowicy terapeutycznej
41 ret = robot.SndRcvAxleGenComCmdData(6, state, 6, rcvdata);
42 printf(" state : %d \n", rcvdata[4]);
43 robot.Sleep(1000);
44 // Włączenie lasera głowicy terapeutycznej
45 ret = robot.SndRcvAxleGenComCmdData(6, led_on, 6, rcvdata);
46 printf("led on rcv data is: %d, %d, %d, %d, %d, %d \n", rcvdata[0], rcvdata[1], rcvdata[2], rcvdata[3], rcvdata[4], rcvdata[5]);
47 robot.MoveJ(&p1Joint, &p1Desc, 0, 0, 100, 100, 100, &exaxisPos, -1, 0, &offdese);
48 robot.Sleep(4000);
49 // Wyłączenie lasera głowicy terapeutycznej
50 ret = robot.SndRcvAxleGenComCmdData(6, led_off, 6, rcvdata);
51 printf("led off rcv data is: %d, %d, %d, %d, %d, %d \n", rcvdata[0], rcvdata[1], rcvdata[2], rcvdata[3], rcvdata[4], rcvdata[5]);
52 robot.MoveJ(&p2Joint, &p2Desc, 0, 0, 100, 100, 100, &exaxisPos, -1, 0, &offdese);
53 robot.Sleep(1000);
54 printf("***********************complate No. %d SDK test*****************************\n", cnt);
55 cnt++;
56 }
57 robot.CloseRPC();
58}
11.96. Pobieranie pliku Lua otwartego protokołu
1/**
2* @brief Pobiera plik Lua otwartego protokołu
3* @param [in] fileName Nazwa pliku otwartego protokołu "CtrlDev_XXX.lua"
4* @param [in] savePath Ścieżka zapisu pliku otwartego protokołu
5* @return Kod błędu
6*/
7errno_t OpenLuaDownload(std::string fileName, std::string savePath);
11.97. Usuwanie pliku Lua otwartego protokołu
1/**
2* @brief Usuwa plik Lua otwartego protokołu
3* @param [in] fileName Nazwa pliku otwartego protokołu Lua do usunięcia "CtrlDev_XXX.lua"
4* @return Kod błędu
5*/
6errno_t OpenLuaDelete(std::string fileName);
11.98. Usuwanie wszystkich plików Lua otwartego protokołu
1/**
2* @brief Usuwa wszystkie pliki Lua otwartego protokołu
3* @return Kod błędu
4*/
5errno_t AllOpenLuaDelete();
11.99. Przykład kodu przesyłania, pobierania i usuwania otwartego protokołu urządzeń peryferyjnych sterownika
1int TestCtrlOpenLuaOperate()
2{
3 ROBOT_STATE_PKG pkg = {};
4 FRRobot robot;
5 robot.LoggerInit();
6 robot.SetLoggerLevel(1);
7 int rtn = robot.RPC("192.168.58.2");
8 if (rtn != 0)
9 {
10 return 0;
11 }
12 robot.SetReConnectParam(true, 30000, 500);
13 rtn = robot.OpenLuaUpload("D://zUP/openlua/CtrlDev_WELDING_A.lua");
14 printf("OpenLuaUpload rtn is %d\n", rtn);
15 rtn = robot.OpenLuaUpload("D://zUP/openlua/CtrlDev_SWDPOLISH.lua");
16 printf("OpenLuaUpload rtn is %d\n", rtn);
17 rtn = robot.OpenLuaDownload("CtrlDev_WELDING_A.lua", "D://zDOWN/");
18 printf("OpenLuaDownload rtn is %d\n", rtn);
19 rtn = robot.OpenLuaDownload("CtrlDev_SWDPOLISH.lua", "D://zDOWN/");
20 printf("OpenLuaDownload rtn is %d\n", rtn);
21 rtn = robot.SetCtrlOpenLUAName(0, "CtrlDev_WELDING_A.lua");
22 printf("SetCtrlOpenLUAName rtn is %d\n", rtn);
23 rtn = robot.SetCtrlOpenLUAName(1, "CtrlDev_SWDPOLISH.lua");
24 printf("SetCtrlOpenLUAName rtn is %d\n", rtn);
25 std::string name[4] = {};
26 rtn = robot.GetCtrlOpenLUAName(name);
27 printf("ctrl open lua names : %s, %s, %s, %s\n", name[0].c_str(), name[1].c_str(), name[2].c_str(), name[3].c_str());
28 rtn = robot.LoadCtrlOpenLUA(1);
29 printf("LoadCtrlOpenLUA rtn is %d\n", rtn);
30 robot.Sleep(2000);
31 rtn = robot.UnloadCtrlOpenLUA(1);
32 printf("UnloadCtrlOpenLUA rtn is %d\n", rtn);
33 rtn = robot.OpenLuaDelete("CtrlDev_WELDING_A.lua");
34 printf("OpenLuaDelete rtn is %d\n", rtn);
35 rtn = robot.AllOpenLuaDelete();
36 printf("AllOpenLuaDelete rtn is %d\n", rtn);
37 robot.CloseRPC();
38 robot.Sleep(1000);
39 return 0;
40}
11.100. Sterowanie Ruchem Dłoni
1/**
2* @brief Sterowanie ruchem dłoni
3* @param [in] idstart Początkowy numer stacji podrzędnej
4* @param [in] slaveNum Liczba
5* @param [in] pos Tablica pozycji, długość 16, zakres (-360~360)
6* @param [in] speed Tablica procentów prędkości, długość 16, zakres [0~100]
7* @param [in] force Tablica procentów momentu obrotowego, długość 16, zakres [0~100]
8* @param [in] max_time Maksymalny czas oczekiwania, zakres [0~30000], jednostka ms
9* @return Kod błędu, 0 w przypadku sukcesu
10*/
11errno_t SetDexterousHandsMove(int idstart, int slaveNum, double pos[16], int speed[16], int force[16], int max_time);
11.101. Sterowanie Resetem i Aktywacją Dłoni
1/**
2* @brief Sterowanie resetem i aktywacją dłoni
3* @param [in] id Numer stacji podrzędnej
4* @param [in] act 0-reset 1-aktywacja
5* @return Kod błędu, 0 w przypadku sukcesu
6*/
7errno_t SetDexterousHandsAct(int id, int act);
11.102. Czyszczenie Błędu Dłoni
1/**
2* @brief Czyszczenie błędu dłoni
3* @return Kod błędu, 0 w przypadku sukcesu
4*/
5errno_t ClearDexterousHandsError();
11.103. Ustawianie Włączonych Funkcji Sterowania Ruchem Dłoni
1/**
2* @brief Ustawia włączone funkcje sterowania ruchem dłoni
3* @param [in] id Numer urządzenia dłoni
4* @param [in] func 0-wyzwolenie chwytu, 1-inicjalizacja chwytaka, 2-ustawienie pozycji, 3-ustawienie prędkości, 4-ustawienie momentu obrotowego, 6-odczyt stanu chwytaka, 7-odczyt stanu inicjalizacji, 8-odczyt kodu błędu, 9-odczyt pozycji, 10-odczyt prędkości, 11-odczyt momentu obrotowego, 12-ustawienie liczby obrotów, 13-ustawienie prędkości obrotowej, 14-ustawienie momentu obrotowego obrotu, 15-odczyt stanu chwytaka obrotowego, 16-odczyt stanu inicjalizacji obrotu, 17-odczyt liczby obrotów, 18-odczyt prędkości obrotowej, 19-odczyt momentu obrotowego obrotu, 20-ustawienie ruchu synchronicznego wieloosiowego, 21-komenda kasowania błędów, 22-stan pracy pojedynczej osi, 23-stan pracy wszystkich osi
5* @return Kod błędu
6*/
7errno_t SetDexterousHandsFunc(int id, int func[32]);
11.104. Pobieranie Włączonych Funkcji Sterowania Ruchem Dłoni
1/**
2* @brief Pobiera włączone funkcje sterowania ruchem dłoni
3* @param [in] id Numer urządzenia dłoni
4* @param [out] func 0-wyzwolenie chwytu, 1-inicjalizacja chwytaka, 2-ustawienie pozycji, 3-ustawienie prędkości, 4-ustawienie momentu obrotowego, 6-odczyt stanu chwytaka, 7-odczyt stanu inicjalizacji, 8-odczyt kodu błędu, 9-odczyt pozycji, 10-odczyt prędkości, 11-odczyt momentu obrotowego, 12-ustawienie liczby obrotów, 13-ustawienie prędkości obrotowej, 14-ustawienie momentu obrotowego obrotu, 15-odczyt stanu chwytaka obrotowego, 16-odczyt stanu inicjalizacji obrotu, 17-odczyt liczby obrotów, 18-odczyt prędkości obrotowej, 19-odczyt momentu obrotowego obrotu, 20-ustawienie ruchu synchronicznego wieloosiowego, 21-komenda kasowania błędów, 22-stan pracy pojedynczej osi, 23-stan pracy wszystkich osi
5* @return Kod błędu
6*/
7errno_t GetDexterousHandsFunc(int id, int func[32]);
11.105. Przykład Kodu Konfiguracji i Ruchu Dłoni na Końcówce Robota
1int TestDexterousHands()
2{
3ROBOT_STATE_PKG pkg = {};
4FRRobot robot;
5robot.LoggerInit();
6robot.SetLoggerLevel(1);
7int rtn = robot.RPC("192.168.58.2");
8if (rtn != 0)
9{
10 return -1;
11}
12robot.SetReConnectParam(true, 30000, 500);
13int id = 1; // Numer stacji podrzędnej
14int slaveNum = 4; // Steruje 4 palcami
15int max_time = 8000; // Maksymalny czas oczekiwania 8 sekund
16int speed[16] = {0}; // Tablica prędkości, wszystkie 0 oznacza użycie domyślnej prędkości
17int force[16] = {0}; // Tablica momentu obrotowego
18// Inicjalizacja tablicy momentu: pierwsze 4 palce ustawione na 50%, reszta 0 (wartości wysyłane przez komendę Move)
19for (int i = 0; i < 16; i++)
20{
21 force[i] = (i < 4) ? 50 : 0;
22}
23// Funkcja pomocnicza: ustawienie tablicy pozycji (tylko pierwsze 4 palce są skuteczne)
24double pos[16] = {0.0};
25JointPos j1(-91.876, -85.920, 109.279, -86.239, -96.664, -28.563);
26JointPos j2(-40.954, -85.920, 109.279, -86.239, -96.664, -28.563);
27ExaxisPos epos(0, 0, 0, 0);
28DescPose offset_pos(0, 0, 0, 0, 0, 0);
29printf("===== Rozpoczęto pełny test funkcji dłoni =====\n");
30// 1. Wyczyść błąd
31int ret = robot.ClearDexterousHandsError();
32printf("ClearDexterousHandsError rtn %d\n", ret);
33// ========== 2. Ustaw przełączniki funkcji ==========
34int setFunc[32] = {0};
35setFunc[2] = 1; // Włącz funkcję ustawiania pozycji
36setFunc[4] = 1; // Włącz funkcję ustawiania momentu obrotowego
37setFunc[9] = 1; // Odczyt pozycji
38setFunc[10] = 1; // Odczyt momentu obrotowego
39setFunc[11] = 1; // Odczyt statusu
40setFunc[22] = 1; // Status ruchu pojedynczej osi
41ret = robot.SetDexterousHandsFunc(id, setFunc);
42printf("SetDexterousHandsFunc(włączono init + funkcje pozycji/momentu) rtn %d\n", ret);
43// ========== 3. Odczyt statusu funkcji (weryfikacja, czy ustawienia zostały zastosowane) ==========
44int getFunc[32] = {0}; // GetDexterousHandsFunc zwraca 32 liczby całkowite
45ret = robot.GetDexterousHandsFunc(id, getFunc);
46printf("GetDexterousHandsFunc rtn %d\n", ret);
47if (ret == 0)
48{
49 // Wyświetl wszystkie 32 wartości
50 printf("Wszystkie 32 wartości zwrócone przez GetDexterousHandsFunc:");
51 for (int i = 0; i < 32; i++)
52 {
53 printf(" [%d]={%d}", i, getFunc[i]);
54 if ((i + 1) % 8 == 0)
55 {
56 printf("\n");
57 }
58 else if (i < 31)
59 {
60 printf(", ");
61 }
62 }
63}
64// ========== 4. Aktywuj dłoń ==========
65ret = robot.SetDexterousHandsAct(id, 1);
66printf("SetDexterousHandsAct(aktywacja) rtn %d\n", ret);
67if (ret != 0)
68{
69 printf("Aktywacja nie powiodła się, test przerwany");
70 return -1;
71}
72// ========== 5. Początkowy ruch do 20° (wysyłanie wartości pozycji i momentu przez komendę Move) ==========
73memset(pos, 0, sizeof(pos));
74pos[0] = 20;
75pos[1] = 20;
76pos[2] = 20;
77pos[3] = 20;
78ret = robot.SetDexterousHandsMove(id, slaveNum, pos, speed, force, max_time);
79printf("Początkowy ruch do 20° -> %d\n", ret);
80robot.Sleep(5000);
81// ========== 6. Ruch wahadłowy 10 razy (10° ↔ 50°) ==========
82printf("Rozpoczynanie 10 ruchów wahadłowych...");
83for (int iteration = 1; iteration <= 10; iteration++)
84{
85 robot.MoveJ(&j1, 0, 0, 100, 100, 100, &epos, -1, 0, &offset_pos);
86 memset(pos, 0, sizeof(pos));
87 pos[0] = 10;
88 pos[1] = 10;
89 pos[2] = 10;
90 pos[3] = 10;
91 ret = robot.SetDexterousHandsMove(id, slaveNum, pos, speed, force, max_time);
92 printf("Ruch do 10° -> %d\n", ret);
93 robot.Sleep(1000);
94 robot.MoveJ(&j2, 0, 0, 100, 100, 100, &epos, -1, 0, &offset_pos);
95 memset(pos, 0, sizeof(pos));
96 pos[0] = 50;
97 pos[1] = 50;
98 pos[2] = 50;
99 pos[3] = 50;
100 ret = robot.SetDexterousHandsMove(id, slaveNum, pos, speed, force, max_time);
101 printf("Ruch do 50° -> %d\n", ret);
102 robot.Sleep(1000);
103}
104printf("Test zakończony (ustawienie/odczyt przełączników funkcji + aktywacja + 10 ruchów wahadłowych).");
105return 0;
106}