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.
ROBO2_CONT.cpp
- Committer:
- js
- Date:
- 2022-10-21
- Revision:
- 2:71b3736a1bd7
File content as of revision 2:71b3736a1bd7:
#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; } }