Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: ROBO2_CONT.cpp
- Revision:
- 2:71b3736a1bd7
diff -r 4f6bcf445501 -r 71b3736a1bd7 ROBO2_CONT.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ROBO2_CONT.cpp Fri Oct 21 10:54:03 2022 +0000 @@ -0,0 +1,754 @@ +#include "mbed.h" +#include "main.h" +#include "nextion_lcd.h" +#include "APP.h" +#include "ROBO2_CONT.h" +#include "SAVE_CONT.h" +/////////////////////// +#include "WIZnetInterface.h" +#define USE_DHCP 0 +#define LOOPBACKPORT 7 +Ticker RB2_RX_TIME_OUT; + +extern const char * IP_Subnet; +extern const char * IP_Gateway; +extern unsigned char MAC_Addr[6]; + +const char *RB2_SV_Addr = "192.168.2.8"; +const int RB2_SV_port =30003; +//const int SV_port =30005; +extern SPI spi; +WIZnetInterface RB2_ethernet(&spi,PB_1, PB_2);//CONT BOARD MINIは、PA_15,PB_2 +TCPSocketConnection RB2_server; + +/////////////////////// +char RB2_rob_tx_buffer[128]; +char RB2_rob_rx_buffer[128]; + + +double RB2_Q1SET=0.0; +double RB2_Q2SET=0.0; +double RB2_Q3SET=0.0; +double RB2_Q4SET=0.0; +double RB2_Q5SET=0.0; +double RB2_Q6SET=0.0; + + +double RB2_X_SET=0.0; +double RB2_Y_SET=0.0; +double RB2_Z_SET=0.0; +double RB2_A_SET=0.0; +double RB2_B_SET=0.0; +double RB2_C_SET=0.0; + +extern double RB2_POINT_RD[32][4]; + + +unsigned char RB2_SPEED_ADJ=100; +unsigned char RB2_ACC_ADJ=80; + +unsigned char RB2_PSEL_BAK=0xFF; + + +unsigned char RB2_RX_TIME_OUT_F=0; + +unsigned char RB2_HAND_ST=RB2_HAND_OPEN; + +char RB2_J1_DAT[32]; +char RB2_J2_DAT[32]; +char RB2_J3_DAT[32]; +char RB2_J4_DAT[32]; +char RB2_XDAT[32]; +char RB2_YDAT[32]; +char RB2_ZDAT[32]; +char RB2_RDAT[32]; + +double RB2_J1_GET=0.0; +double RB2_J2_GET=0.0; +double RB2_J3_GET=0.0; +double RB2_J4_GET=0.0; + +double RB2_X_GET=0.0; +double RB2_Y_GET=0.0; +double RB2_Z_GET=0.0; +double RB2_R_GET=0.0; + + +unsigned char R2_WAIT_MASK=0;//1でマスク 現在位置への移動指定時WAITをマスクする + +void RB2_RX_TIME_OUT_IRQ(){ + RB2_RX_TIME_OUT_F=1; + RB2_RX_TIME_OUT.detach();//シリアル受信タイムアウトカウンタ停止 + RB2_eth_buf_clr(); + +} + +void RB2_eth_buf_clr(){ + + for(unsigned long clcnt=0; clcnt<sizeof(RB2_rob_tx_buffer); clcnt++){ + RB2_rob_tx_buffer[clcnt]=0; + } + for(unsigned long clcnt=0; clcnt<sizeof(RB2_rob_rx_buffer); clcnt++){ + RB2_rob_rx_buffer[clcnt]=0; + } +} +void RB2_POS_CLR(){ + RB2_Q1SET=0.0; + RB2_Q2SET=0.0; + RB2_Q3SET=0.0; + RB2_Q4SET=0.0; + RB2_Q5SET=0.0; + RB2_Q6SET=0.0; + + + RB2_X_SET=0.0; + RB2_Y_SET=0.0; + RB2_Z_SET=0.0; + RB2_A_SET=0.0; + RB2_B_SET=0.0; + RB2_C_SET=0.0; +} +char RB2_ETH_CONECT_CHK(){ + + if(RB2_server.is_connected()==true){ + return 0; + }else{ + lcd_print("t0","LAN切断中です。再接続してください。"); + return -1; + } + +} + + + +char RB2_CONNECT(){ + unsigned long timeout=0; + sprintf(lcd_print_buf,"ロボット2(%s) 接続開始...",RB2_SV_Addr); + lcd_print("t1",lcd_print_buf); + + int ret =RB2_server.connect(RB2_SV_Addr,RB2_SV_port); + + if(ret !=0){ + sprintf(lcd_print_buf,"ロボット2(%s) 接続待機中...",RB2_SV_Addr); + lcd_print("t1",lcd_print_buf); + } + while(ret !=0 && timeout<100){ + ret =RB2_server.connect(RB2_SV_Addr,RB2_SV_port); + wait_ms(100); + } + if(timeout<100){ + printf("connect end\r\n"); + sprintf(lcd_print_buf,"ロボット2(%s) 接続完了",RB2_SV_Addr); + lcd_print("t1",lcd_print_buf); + return 0; + }else{ + sprintf(lcd_print_buf,"ロボット2(%s) 接続異常",RB2_SV_Addr); + lcd_print("t1",lcd_print_buf); + return -1; + } + +} + +char RB2_DISCONNECT(){ + lcd_print("t0","R2 Disconnect"); + int ret =RB2_ethernet.disconnect(); + wait_ms(2000); + if(ret==0){ + lcd_print("t0","R2 Disconnect End"); + return 0; + }else{ + lcd_print("t0","R2 Disconnect ERR"); + return -1; + } + + +} +/* +ロボットのタイムアウト検出は割り込みを使用して行う。 +通常のwaitをカウントする方法では、時間が大きくずれる為 +*Etherの受信処理にもタイムアウト設定がある為 +WIZnet_Socket.hの以下の設定 下記だと一度ETHER受信しタイムアウトまで300msかかる +set_blocking(bool blocking, unsigned int timeout=300);//1500 + +*/ +void RB2_GETANG(unsigned long tout_ms){ + char *cmp1_txt="GetAngle();"; + unsigned char DAT_GET_F=0; + + RB2_SEND_CMD("GetAngle()"); + RB2_RX_TIME_OUT_F=0; + RB2_RX_TIME_OUT.attach_us(&RB2_RX_TIME_OUT_IRQ,tout_ms*1000); + while(RB2_RX_TIME_OUT_F==0 && DAT_GET_F==0){ + if(RB2_RX_DATA()>0){ + //移動開始確認/// + if(strstr(RB2_rob_rx_buffer,cmp1_txt) !=NULL){ + DAT_GET_F=1; + }else{ + RB2_SEND_CMD("GetAngle()"); + } + } + wait_us(10*1000); + } + unsigned char DAT_CNT=0; + unsigned char DAT_CNT_T=3; + if(RB2_RX_TIME_OUT_F==1){ + lcd_print("t0","RB2 GetAngle TIMEOUT"); + + }else{ + RB2_RX_TIME_OUT.detach();//タイムアウトカウンタ停止 + while(RB2_rob_rx_buffer[DAT_CNT_T] !=0x2c && DAT_CNT<sizeof(RB2_J1_DAT)){ + RB2_J1_DAT[DAT_CNT++]=RB2_rob_rx_buffer[DAT_CNT_T++]; + } + DAT_CNT_T++;//カンマを飛ばす + DAT_CNT=0; + while(RB2_rob_rx_buffer[DAT_CNT_T] !=0x2c && DAT_CNT<sizeof(RB2_J2_DAT)){ + RB2_J2_DAT[DAT_CNT++]=RB2_rob_rx_buffer[DAT_CNT_T++]; + } + DAT_CNT_T++;//カンマを飛ばす + DAT_CNT=0; + while(RB2_rob_rx_buffer[DAT_CNT_T] !=0x2c && DAT_CNT<sizeof(RB2_J3_DAT)){ + RB2_J3_DAT[DAT_CNT++]=RB2_rob_rx_buffer[DAT_CNT_T++]; + } + DAT_CNT_T++;//カンマを飛ばす + DAT_CNT=0; + while(RB2_rob_rx_buffer[DAT_CNT_T] !=0x2c && DAT_CNT<sizeof(RB2_J4_DAT)){ + RB2_J4_DAT[DAT_CNT++]=RB2_rob_rx_buffer[DAT_CNT_T++]; + } + RB2_J1_GET=atof(RB2_J1_DAT); + RB2_J2_GET=atof(RB2_J2_DAT); + RB2_J3_GET=atof(RB2_J3_DAT); + RB2_J4_GET=atof(RB2_J4_DAT); + + } + + + RB2_eth_buf_clr(); +} +void RB2_GETPOS(unsigned long tout_ms){ + char *cmp1_txt="GetPose();"; + unsigned char DAT_GET_F=0; + RB2_SEND_CMD("GetPose()"); + RB2_RX_TIME_OUT_F=0; + RB2_RX_TIME_OUT.attach_us(&RB2_RX_TIME_OUT_IRQ,tout_ms*1000); + while(RB2_RX_TIME_OUT_F==0 && DAT_GET_F==0){ + if(RB2_RX_DATA()>0){ + //移動開始確認/// + if(strstr(RB2_rob_rx_buffer,cmp1_txt) !=NULL){ + DAT_GET_F=1; + }else{ + RB2_SEND_CMD("GetPose()"); + } + } + wait_us(10*1000); + } + unsigned char DAT_CNT=0; + unsigned char DAT_CNT_T=3; + if(RB2_RX_TIME_OUT_F==1){ + lcd_print("t0","RB2 GetPose TIMEOUT"); + }else{ + RB2_RX_TIME_OUT.detach();//タイムアウトカウンタ停止 + while(RB2_rob_rx_buffer[DAT_CNT_T] !=0x2c && DAT_CNT<sizeof(RB2_XDAT)){ + RB2_XDAT[DAT_CNT++]=RB2_rob_rx_buffer[DAT_CNT_T++]; + } + DAT_CNT_T++;//カンマを飛ばす + DAT_CNT=0; + while(RB2_rob_rx_buffer[DAT_CNT_T] !=0x2c && DAT_CNT<sizeof(RB2_YDAT)){ + RB2_YDAT[DAT_CNT++]=RB2_rob_rx_buffer[DAT_CNT_T++]; + } + DAT_CNT_T++;//カンマを飛ばす + DAT_CNT=0; + while(RB2_rob_rx_buffer[DAT_CNT_T] !=0x2c && DAT_CNT<sizeof(RB2_ZDAT)){ + RB2_ZDAT[DAT_CNT++]=RB2_rob_rx_buffer[DAT_CNT_T++]; + } + DAT_CNT_T++;//カンマを飛ばす + DAT_CNT=0; + while(RB2_rob_rx_buffer[DAT_CNT_T] !=0x2c && DAT_CNT<sizeof(RB2_RDAT)){ + RB2_RDAT[DAT_CNT++]=RB2_rob_rx_buffer[DAT_CNT_T++]; + } + RB2_X_GET=atof(RB2_XDAT); + RB2_Y_GET=atof(RB2_YDAT); + RB2_Z_GET=atof(RB2_ZDAT); + RB2_R_GET=atof(RB2_RDAT); + + } + + + RB2_eth_buf_clr(); +} + + +/* +RobotMode()コマンドを使用してロボットの移動完了(Mode 5 idle)を確認する + Mode | Description | NOTE | +| ---- | --------------------- | -------------------------------- | +| 1 | ROBOT_MODE_INIT | initialization | +| 2 | ROBOT_MODE_BRAKE_OPEN | The brake release | +| 3 | | Reserved | +| 4 | ROBOT_MODE_DISABLED | Disabled (brake is not released) | +| 5 | ROBOT_MODE_ENABLE | Enable (idle) | +| 6 | ROBOT_MODE_BACKDRIVE | Dragging state | +| 7 | ROBOT_MODE_RUNNING | Running state | +| 8 | ROBOT_MODE_RECORDING | Dragging recording | +| 9 | ROBOT_MODE_ERROR | Alarm state | +| 10 | ROBOT_MODE_PAUSE | pause state | +| 11 | ROBOT_MODE_JOG | jogging state | + + +*/ +void RB2_MOVE_WAIT(unsigned long tout_ms){//移動開始待ち + char *cmp1_txt="0,{7},RobotMode()"; + char *cmp2_txt="0,{5},RobotMode()"; + char *cmp3_txt="0,{9},RobotMode()"; + + unsigned char MOVE_START_F=0; + unsigned char MOVE_END_F=0; + unsigned char MOVE_ERR_F=0; + if(R2_WAIT_MASK==0){//1でマスク 現在位置への移動指定時WAITをマスクする + RB2_SEND_CMD("RobotMode()"); + RB2_RX_TIME_OUT_F=0; + RB2_RX_TIME_OUT.attach_us(&RB2_RX_TIME_OUT_IRQ,tout_ms*1000); + while(RB2_RX_TIME_OUT_F==0 && MOVE_START_F==0 && MOVE_ERR_F==0){ + if(RB2_RX_DATA()>0){ + if(strstr(RB2_rob_rx_buffer,cmp3_txt) ==NULL){//err状態でないことを確認 + //移動開始確認/// + if(strstr(RB2_rob_rx_buffer,cmp1_txt) !=NULL){ + MOVE_START_F=1; + }else{ + RB2_SEND_CMD("RobotMode()"); + } + }else{ + MOVE_ERR_F=1; + ALM_ST=ALM_DOBOT2; + ALM_HOLD_SET(); + } + } + wait_us(10*1000); + } + if(RB2_RX_TIME_OUT_F==1){ + //printf("MOVE START TIMEOUT!! TX=%s Rx=%s\r\n",RB2_rob_tx_buffer,RB2_rob_rx_buffer); + ALM_ST=ALM_DOBOT2_ST; + ALM_HOLD_SET(); + }else{ + RB2_RX_TIME_OUT.detach();//タイムアウトカウンタ停止 + } + if(ALM_ST==ALM_NONE){ + ///移動完了チェック/// + RB2_RX_TIME_OUT_F=0; + RB2_RX_TIME_OUT.attach_us(&RB2_RX_TIME_OUT_IRQ,tout_ms*1000); + RB2_SEND_CMD("RobotMode()"); + while(RB2_RX_TIME_OUT_F==0 && MOVE_END_F==0 && MOVE_ERR_F==0){ + if(RB2_RX_DATA()>0){ + if(strstr(RB2_rob_rx_buffer,cmp3_txt) ==NULL){//err状態でないことを確認 + //移動完了確認/// + if(strstr(RB2_rob_rx_buffer,cmp2_txt) !=NULL){ + MOVE_END_F=1; + }else{ + RB2_SEND_CMD("RobotMode()"); + } + }else{ + MOVE_ERR_F=1; + ALM_ST=ALM_DOBOT2; + ALM_HOLD_SET(); + } + } + wait_us(10*1000); //10ms + } + if(RB2_RX_TIME_OUT_F==1){ + ALM_ST=ALM_DOBOT2_ED; + ALM_HOLD_SET(); + }else{ + RB2_RX_TIME_OUT.detach();//タイムアウトカウンタ停止 + } + } + + RB2_eth_buf_clr(); + } + + +} +void RB2_MOVE_SWAIT(unsigned long tout_ms){//移動開始待ち + char *cmp1_txt="0,{7},RobotMode()"; + char *cmp2_txt="0,{5},RobotMode()"; + char *cmp3_txt="0,{9},RobotMode()"; + unsigned char MOVE_START_F=0; + unsigned char MOVE_ERR_F=0; + + if(R2_WAIT_MASK==0){//1でマスク 現在位置への移動指定時WAITをマスクする + RB2_SEND_CMD("RobotMode()"); + RB2_RX_TIME_OUT_F=0; + RB2_RX_TIME_OUT.attach_us(&RB2_RX_TIME_OUT_IRQ,tout_ms*1000); + while(RB2_RX_TIME_OUT_F==0 && MOVE_START_F==0 && MOVE_ERR_F==0){ + if(RB2_RX_DATA()>0){ + if(strstr(RB2_rob_rx_buffer,cmp3_txt) ==NULL){//err状態でないことを確認 + //移動開始確認/// + if(strstr(RB2_rob_rx_buffer,cmp1_txt) !=NULL){ + MOVE_START_F=1; + }else{ + RB2_SEND_CMD("RobotMode()"); + } + }else{ + MOVE_ERR_F=1; + ALM_ST=ALM_DOBOT2; + ALM_HOLD_SET(); + } + } + wait_us(10*1000); //10ms + } + if(RB2_RX_TIME_OUT_F==1){ + //printf("MOVE START TIMEOUT!! TX=%s Rx=%s\r\n",RB2_rob_tx_buffer,RB2_rob_rx_buffer); + ALM_ST=ALM_DOBOT2_ST; + ALM_HOLD_SET(); + + }else{ + RB2_RX_TIME_OUT.detach();//タイムアウトカウンタ停止 + } + } +} +void RB2_MOVE_EWAIT(unsigned long tout_ms){ + + char *cmp1_txt="0,{7},RobotMode()"; + char *cmp2_txt="0,{5},RobotMode()"; + char *cmp3_txt="0,{9},RobotMode()"; + unsigned char MOVE_END_F=0; + unsigned char MOVE_ERR_F=0; + if(R2_WAIT_MASK==0){//1でマスク 現在位置への移動指定時WAITをマスクする + ///移動完了チェック/// + RB2_SEND_CMD("RobotMode()"); + RB2_RX_TIME_OUT_F=0; + RB2_RX_TIME_OUT.attach_us(&RB2_RX_TIME_OUT_IRQ,tout_ms*1000); + while(RB2_RX_TIME_OUT_F==0 && MOVE_END_F==0 && MOVE_ERR_F==0){ + if(RB2_RX_DATA()>0){ + if(strstr(RB2_rob_rx_buffer,cmp3_txt) ==NULL){//err状態でないことを確認 + //移動完了確認/// + if(strstr(RB2_rob_rx_buffer,cmp2_txt) !=NULL){ + MOVE_END_F=1; + }else{ + RB2_SEND_CMD("RobotMode()"); + } + }else{ + MOVE_ERR_F=1; + ALM_ST=ALM_DOBOT2; + ALM_HOLD_SET(); + } + } + wait_us(10*1000); //10ms + + } + if(RB2_RX_TIME_OUT_F==1){ + // printf("MOVE END TIMEOUT!! TX=%s Rx=%s\r\n",RB2_rob_tx_buffer,RB2_rob_rx_buffer); + ALM_ST=ALM_DOBOT2_ED; + ALM_HOLD_SET(); + }else{ + RB2_RX_TIME_OUT.detach();//タイムアウトカウンタ停止 + } + RB2_eth_buf_clr(); + } +} +void RB2_JOG_WAIT(unsigned long tout_ms){ + char *cmp1_txt="0,{7},RobotMode()"; + char *cmp2_txt="0,{5},RobotMode()"; + char *cmp3_txt="0,{9},RobotMode()"; + unsigned char MOVE_END_F=0; + unsigned char MOVE_ERR_F=0; + ///移動完了チェック/// + RB2_SEND_CMD("RobotMode()"); + RB2_RX_TIME_OUT_F=0; + RB2_RX_TIME_OUT.attach_us(&RB2_RX_TIME_OUT_IRQ,tout_ms*1000); + while(RB2_RX_TIME_OUT_F==0 && MOVE_END_F==0 && MOVE_ERR_F==0){ + if(RB2_RX_DATA()>0){ + if(strstr(RB2_rob_rx_buffer,cmp3_txt) ==NULL){//err状態でないことを確認 + //移動完了確認/// + if(strstr(RB2_rob_rx_buffer,cmp2_txt) !=NULL){ + MOVE_END_F=1; + }else{ + RB2_SEND_CMD("RobotMode()"); + } + }else{ + MOVE_ERR_F=1; + ALM_ST=ALM_DOBOT2; + ALM_HOLD_SET(); + } + } + wait_us(10*1000); //10ms + } + if(RB2_RX_TIME_OUT_F==1){ + //printf("JOG MOVE END TIMEOUT!! TX=%s Rx=%s\r\n",RB2_rob_tx_buffer,RB2_rob_rx_buffer); + ALM_ST=ALM_DOBOT2_ED; + ALM_HOLD_SET(); + }else{ + RB2_RX_TIME_OUT.detach();//タイムアウトカウンタ停止 + } + RB2_eth_buf_clr(); +} + + +void RB2_STATUS_READ(unsigned long tout_ms){ + RB2_SEND_CMD("RobotMode()"); + RB2_RX_TIME_OUT_F=0; + RB2_RX_DATA(); + RB2_RX_TIME_OUT_F=0; + RB2_RX_TIME_OUT.attach_us(&RB2_RX_TIME_OUT_IRQ,tout_ms*1000); + + while(RB2_RX_TIME_OUT_F==0 && strstr(RB2_rob_rx_buffer,RB2_rob_tx_buffer) ==NULL){ + RB2_RX_DATA(); + wait_us(10*1000); //10ms + } + + if(RB2_RX_TIME_OUT_F==1){ + //printf("CMD ACK TIMEOUT!!\r\n"); + ALM_ST=ALM_DOBOT2; + ALM_HOLD_SET(); + }else{ + RB2_RX_TIME_OUT.detach();//タイムアウトカウンタ停止 + } + + sprintf(lcd_print_buf,"STATUS=%s",RB2_rob_rx_buffer); + lcd_print("t0",lcd_print_buf); + RB2_eth_buf_clr(); +} +////データ受信処理///////// +unsigned long RB2_RX_DATA(){//WIZnet_Socket.hのset_blocking(bool blocking, unsigned int timeout=1500);の設定で空読みしたときのタイムアウト時間がかわる + int n= RB2_server.receive(RB2_rob_rx_buffer, sizeof(RB2_rob_rx_buffer)); + if(n > 0){//def 0 + return n; + }else{ + return 0; + } +} +////データ受信処理テスト///////// +unsigned long RB2_RX_DATA_TEST(){ + int n= RB2_server.receive(RB2_rob_rx_buffer, sizeof(RB2_rob_rx_buffer)); + if(n > 0){//def 0 + //printf("ROBO1_DATA=%s\r\n",RB2_rob_rx_buffer); + RB2_eth_buf_clr(); + return n; + }else{ + return 0; + } +} +void RB2_CMD_WAIT(unsigned long tout_ms){ + + RB2_RX_DATA(); + RB2_RX_TIME_OUT_F=0; + RB2_RX_TIME_OUT.attach_us(&RB2_RX_TIME_OUT_IRQ,tout_ms*1000); + + while(RB2_RX_TIME_OUT_F==0 && strstr(RB2_rob_rx_buffer,RB2_rob_tx_buffer) ==NULL){ + RB2_RX_DATA(); + wait_us(10*1000); //10ms + } + + if(RB2_RX_TIME_OUT_F==1){ + //printf("CMD ACK TIMEOUT!!\r\n"); + ALM_ST=ALM_DOBOT2; + ALM_HOLD_SET(); + }else{ + RB2_RX_TIME_OUT.detach();//タイムアウトカウンタ停止 + } + RB2_eth_buf_clr(); +} + +char RB2_SEND_CMD(char *txt){ + unsigned char len = strlen(txt);//文字列の長さを確認 + unsigned char SEND_RET=0; + sprintf(RB2_rob_tx_buffer,"%s\0",txt); + SEND_RET=RB2_server.send_all(RB2_rob_tx_buffer,len+1); + if(SEND_RET !=len+1){ + sprintf(lcd_print_buf,"コマンド送信失敗!! 送信指定数 : %02d 送信完了数 : %02d",len+1,SEND_RET); + lcd_print("t0",RB2_rob_tx_buffer); + return -1; + }else{ + + return 0; + } + +} + + + + + +void RB2_MovJ(double x,double y,double z,double a,double b,double c,unsigned int speed,unsigned int acc){ + char RB2_BUF[128]; + // printf("MovJ(%f,%f,%f,%f,%f,%f,SpeedJ=%d)",x,y,z,a,b,c,speed); + if(x==RB2_X_SET && y==RB2_Y_SET && z==RB2_Z_SET && a==RB2_A_SET && b==RB2_B_SET && c==RB2_C_SET){ + lcd_print("t0","現在位置です"); + R2_WAIT_MASK=1;//1でマスク 現在位置への移動指定時WAITをマスクする + }else{ + sprintf(RB2_BUF,"MovJ(%f,%f,%f,%f,%f,%f,SpeedJ=%d,AccJ=%d)",x,y,z,a,b,c,speed,acc); + R2_WAIT_MASK=0;//1でマスク 現在位置への移動指定時WAITをマスクする + if(RB2_SEND_CMD(RB2_BUF)==0){ + RB2_X_SET=x; + RB2_Y_SET=y; + RB2_Z_SET=z; + RB2_A_SET=a; + RB2_B_SET=b; + RB2_C_SET=c; + }else{//コマンド送信失敗 + ALM_ST=ALM_DOBOT2_CM; + ALM_HOLD_SET(); + } + } + +} + +void RB2_JointMovJ(double Q1,double Q2,double Q3,double Q4,double Q5,double Q6,unsigned int speed,unsigned int acc){ + char RB2_BUF[128]; + if(Q1==RB2_Q1SET && Q2==RB2_Q2SET && Q3==RB2_Q3SET && Q4==RB2_Q4SET &&Q5==RB2_Q5SET && Q6==RB2_Q6SET){ + lcd_print("t0","現在位置です"); + R2_WAIT_MASK=1;//1でマスク 現在位置への移動指定時WAITをマスクする + }else{ + sprintf(RB2_rob_tx_buffer,"JointMovJ(%f,%f,%f,%f,%f,%f,SpeedJ=%d,AccJ=%d)",Q1,Q2,Q3,Q4,Q5,Q6,speed,acc); + R2_WAIT_MASK=0;//1でマスク 現在位置への移動指定時WAITをマスクする + if(RB2_SEND_CMD(RB2_rob_tx_buffer)==0){ + RB2_Q1SET=Q1; + RB2_Q2SET=Q2; + RB2_Q3SET=Q3; + RB2_Q4SET=Q4; + RB2_Q5SET=Q5; + RB2_Q6SET=Q6; + }else{//コマンド送信失敗 + ALM_ST=ALM_DOBOT2_CM; + ALM_HOLD_SET(); + } + } + +} +void RB2_MovL(double x,double y,double z,double a,double b,double c,unsigned int speed,unsigned int acc){ + char RB2_BUF[128]; + if(x==RB2_X_SET && y==RB2_Y_SET && z==RB2_Z_SET && a==RB2_A_SET && b==RB2_B_SET && c==RB2_C_SET){ + lcd_print("t0","現在位置です"); + R2_WAIT_MASK=1;//1でマスク 現在位置への移動指定時WAITをマスクする + }else{ + sprintf(RB2_BUF,"MovL(%f,%f,%f,%f,%f,%f,SpeedL=%d,AccL=%d)",x,y,z,a,b,c,speed,acc); + R2_WAIT_MASK=0;//1でマスク 現在位置への移動指定時WAITをマスクする + if(RB2_SEND_CMD(RB2_BUF)==0){ + RB2_X_SET=x; + RB2_Y_SET=y; + RB2_Z_SET=z; + RB2_A_SET=a; + RB2_B_SET=b; + RB2_C_SET=c; + }else{//コマンド送信失敗 + ALM_ST=ALM_DOBOT2_CM; + ALM_HOLD_SET(); + } + } +} + + +void RB2_HOME_MOVE(){ + ///現在位置を確認/// + RB2_GETPOS(RB_EWAIT); + ///Zが-40以下の場合は、Zを上げてから原点復帰/// + + if(RB2_Z_GET<100){ + RB2_MovJ(RB2_X_GET,RB2_Y_GET,100.0,RB2_R_GET,0,0,RB2_SPEED_ADJ,RB2_ACC_ADJ); + RB2_MOVE_WAIT(5000); + } + + RB2_MovJ(178.0,124.0,100.0,0,0,0,RB2_SPEED_ADJ,RB2_ACC_ADJ); + RB2_MOVE_WAIT(10000); + RB2_MovJ(220.0,0.0,80.0,0,0,0,RB2_SPEED_ADJ,RB2_ACC_ADJ); + RB2_MOVE_WAIT(10000); + + RB2_PSEL_BAK=0xFE; + + ///ハンドの制御ポートを開側にする/// + RB2_DO_CONT(1,0); + RB2_HAND_ST=RB2_HAND_OPEN; + +} + +void RB2_SEL_MOVE(unsigned char SEL,unsigned int speed,unsigned int acc){ + RB2_MovJ(RB2_POINT_RD[SEL][PX],RB2_POINT_RD[SEL][PY],RB2_POINT_RD[SEL][PZ],RB2_POINT_RD[SEL][PR],0,0,speed,acc); +} + +void RB2_SEL_MOVE_OLG(unsigned char SEL,unsigned int speed,unsigned int acc){//現在値と差分があるときだけ移動 + unsigned char POS_CHK_F=0; + + RB2_GETPOS(RB_EWAIT); + ////現在位置と指定座標に差分があるか確認/// + if(RB2_X_GET > RB2_POINT_RD[SEL][PX]+0.1 || RB2_X_GET < RB2_POINT_RD[SEL][PX]-0.1){ + POS_CHK_F=1; + } + if(RB2_Y_GET > RB2_POINT_RD[SEL][PY]+0.1 || RB2_Y_GET < RB2_POINT_RD[SEL][PY]-0.1){ + POS_CHK_F=1; + } + if(RB2_Z_GET > RB2_POINT_RD[SEL][PZ]+0.1 || RB2_Z_GET < RB2_POINT_RD[SEL][PZ]-0.1){ + POS_CHK_F=1; + } + if(RB2_R_GET > RB2_POINT_RD[SEL][PR]+0.1 || RB2_R_GET < RB2_POINT_RD[SEL][PR]-0.1){ + POS_CHK_F=1; + } + + if(POS_CHK_F==1){ + RB2_MovJ(RB2_POINT_RD[SEL][PX],RB2_POINT_RD[SEL][PY],RB2_POINT_RD[SEL][PZ],RB2_POINT_RD[SEL][PR],0,0,speed,acc); + }else{ + lcd_print("t0","現在位置です。"); + } + + +} +void RB2_SEL_MOVE_SQ(unsigned char SEL,unsigned char MOV_MOD,unsigned int speed,unsigned int acc){ + + if(SEL !=RB2_PSEL_BAK){ + if(MOV_MOD==0){ + RB2_MovL(RB2_POINT_RD[SEL][PX],RB2_POINT_RD[SEL][PY],RB2_POINT_RD[SEL][PZ],RB2_POINT_RD[SEL][PR],0,0,speed,acc); + }else{ + RB2_MovJ(RB2_POINT_RD[SEL][PX],RB2_POINT_RD[SEL][PY],RB2_POINT_RD[SEL][PZ],RB2_POINT_RD[SEL][PR],0,0,speed,acc); + } + R2_WAIT_MASK=0;//1でマスク 現在位置への移動指定時WAITをマスクする + RB2_PSEL_BAK=SEL; + }else{ + lcd_print("t0","現在位置です。"); + R2_WAIT_MASK=1;//1でマスク 現在位置への移動指定時WAITをマスクする + } + + +} +void RB2_DO_CONT(unsigned char INDEX,unsigned char STATUS){//例:DO(11,1) でDO11がON DO(11,0) でDO11がOFF + char RB2_BUF[64]; + sprintf(RB2_BUF,"DO(%d,%d)",INDEX, STATUS); + RB2_SEND_CMD(RB2_BUF); + RB2_CMD_WAIT(RB_SWAIT); + } + + +void RB2_HAND_CONT(unsigned char cont){ + if(cont != RB2_HAND_ST){ + if(cont==RB2_HAND_CLOSE){ + RB2_DO_CONT(1,1); + }else{ + RB2_DO_CONT(1,0); + } + RB2_HAND_ST=cont; + } +} +////現在位置からx1,y1,z1を経由してx2,y2,z2まで移動(円運動)//// +void RB2_ARC(double x1,double y1,double z1,double x2,double y2,double z2,unsigned int speed,unsigned int acc){ + char RB2_BUF[128]; + + sprintf(RB2_BUF,"Arc(%f,%f,%f,%f,%f,%f,SpeedL=%d,AccL=%d)",x1,y1,z1,x2,y2,z2,speed,acc); + if(RB2_SEND_CMD(RB2_BUF)==0){ + RB2_X_SET=x2; + RB2_Y_SET=y2; + RB2_Z_SET=z2; + }else{//コマンド送信失敗 + ALM_ST=ALM_DOBOT2_CM; + ALM_HOLD_SET(); + } + +} +void RB2_EMG_STOP(){ + RB2_SEND_CMD("EmergencyStop()"); + } + +void RB2_SPEED_SET(unsigned char SET){ + if(SET==RB_HIGH){ + RB2_SPEED_ADJ = RB_SPEED_HIGH; + RB2_ACC_ADJ = RB_ACC_HIGH; + }else{ + RB2_SPEED_ADJ = RB_SPEED_LOW; + RB2_ACC_ADJ = RB_ACC_LOW; + } +} \ No newline at end of file