IRB-120机械臂socket通信接受上位机指令运行程序段

IRB-120机械臂使用socket通信接受上位机指令程序段
功能:可接受坐标系坐标和单轴坐标,可实现相对运动或绝对运动
可与上位机握手避免连接错误
可向上位机发送当前位置(坐标系、单轴)

MODULE Module1
    CONST robtarget phome:=[[364.353852323,0,594.000007845],[0.499999961,0,0.866025426,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST jointtarget jpos10:=[[-9,-14,24,9,77,-15],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    TASK PERS tooldata tool1:=[TRUE,[[0,0,0],[1,0,0,0]],[1,[0,0,1],[1,0,0,0],0,0,0]];
    TASK PERS wobjdata wobj1:=[FALSE,TRUE,"",[[0,0,0],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];
    CONST robtarget Target_10:=[[329.569435314,226.251705913,408.944462824],[0.676573537,-0.495214417,0.518157305,0.168890315],[0,-1,-1,1],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    
    PROC main()
        VAR robtarget pCurrentPos;
        
        VAR socketdev socket1;
        VAR string temp;
        VAR num startBit_x;
        VAR num endBit_x;
        VAR num lenBit_x;
        VAR num startBit_y;
        VAR num endBit_y;
        VAR num lenBit_y;
        VAR num startBit_z;
        VAR num endBit_z;
        VAR num lenBit_z;
        VAR num endBit;
        VAR string length;
        VAR string strx;
        VAR string stry;
        VAR string strz;
        VAR num x;
        VAR num y;
        VAR num z;
        VAR bool ok;
        
        VAR num current_x;
        VAR num current_y;
        VAR num current_z;
        VAR string str_x;
        VAR string str_y;
        VAR string str_z;
        VAR string now_Position;
        
        VAR num startBit_1;
            VAR num endBit_1;
            VAR num lenBit_1;
            VAR num startBit_2;
            VAR num endBit_2;
            VAR num lenBit_2;
            VAR num startBit_3;
            VAR num endBit_3;
            VAR num lenBit_3;
            VAR num startBit_4;
            VAR num endBit_4;
            VAR num lenBit_4;
            VAR num startBit_5;
            VAR num endBit_5;
            VAR num lenBit_5;
            VAR num startBit_6;
            VAR num endBit_6;
            VAR num lenBit_6;
            VAR string str_1;
            VAR string str_2;
            VAR string str_3;
            VAR string str_4;
            VAR string str_5;
            VAR string str_6;
            VAR string sendstr_1;
            VAR string sendstr_2;
            VAR string sendstr_3;
            VAR string sendstr_4;
            VAR string sendstr_5;
            VAR string sendstr_6;
            VAR num num_1;
            VAR num num_2;
            VAR num num_3;
            VAR num num_4;
            VAR num num_5;
            VAR num num_6;
            VAR jointtarget currentPos;
            VAR jointtarget targetPos;
        
		 !初始化,先回原点
        MoveAbsJ jpos10\NoEOffs,v1000,fine,tool1;
	    TPErase;
		!先关闭,防止上次没有正确关闭
    	SocketClose socket1;
	    SocketCreate socket1;
	    SocketConnect socket1,"192.168.125.2", 1026;
		!连接上之后显示一条日志,已连接
	    TPWrite "Connected.";
		!发送握手包
        SocketSend socket1\Str:="T";
        !TPWrite "Handshaking...";
		!等待接收,并且把接受到的东西显示.
        !SocketReceive socket1\Str:=temp;
        !TPWrite "Received:" + temp;
		!判断,如果返回报文正确,则进行下一步,否则退出程序.
        !IF temp = "T" THEN
        !    TPWrite "Success.";
        !    GOTO run;
        !ELSE
        !     TPWrite "Failed.";
        !    GOTO end;
        !ENDIF
        !run:
		!死循环
		WHILE TRUE DO
			!等待接收格式报文
			TPWrite "Waiting...";
			SocketReceive socket1\Str:=temp;
			TPWrite "Received:" + temp;
			!收到格式报文后,返回报文T,表示已经收到格式报文,上位机可以发送坐标报文
            SocketSend socket1\Str:="T";
			!判断格式报文的内容,并决定进行下一步操作.
            IF temp = "0" THEN
			!为0时,为坐标系运动,进行坐标系操作.
                TPWrite "MOVEL";
    		    SocketReceive socket1\Str:=temp;
                TPWrite "Received:" + temp;
                GOTO move0;
            ELSEIF temp =  "1" THEN
			!为1时,为单轴运动,进行单轴操作.
                TPWrite "MOVEJ";
                SocketReceive socket1\Str:=temp;
                TPWrite "Received:" + temp;
                GOTO move1;
            ENDIF
            
            move0:
            !对接收到的报文进行解释,找出xyz字母在字符串中的位置
            startBit_x:=1;
            endBit_x:=StrFind(temp,startBit_x,"x");
            lenBit_x:=endBit_x-startBit_x;
            startBit_y:=endBit_x+1;
            endBit_y:=StrFind(temp,startBit_y,"y");
            lenBit_y:=endBit_y-startBit_y;
            startBit_z:=endBit_y+1;
            endBit_z:=StrFind(temp,startBit_z,"z");
            lenBit_z:=endBit_z-startBit_z;
            !根据上述程序运行结果拆出xyz字符串坐标
            strx:=StrPart(temp,startBit_x,lenBit_x);
            stry:=StrPart(temp,startBit_y,lenBit_y);
            strz:=StrPart(temp,startBit_z,lenBit_z);
            !将xyz字符串坐标转为数值
            ok:=StrToVal(strx,x);
            ok:=StrToVal(stry,y);
            ok:=StrToVal(stry,z);
            !显示目标坐标值.判断解释是否正确
            TPWrite "Now moving to: "+ strx + " X " + stry + " Y " + strz + " Z";
            !移动,使用相对坐标移动.
            MoveL Offs(CRobT(),x,y,z), v500, fine, tool1\WObj:=wobj1;
            !转到向上位机发送坐标的程序段
            GOTO sendposition;
            
            
            move1:
            !对接收报文进行解释
            !接收报文为6个坐标值,其中以英文逗号作为分隔
            startBit_1:=1;
            endBit_1:=StrFind(temp,startBit_1,",");
            lenBit_1:=endBit_1-startBit_1;
            startBit_2:=endBit_1+1;
            endBit_2:=StrFind(temp,startBit_2,",");
            lenBit_2:=endBit_2-startBit_2;
            startBit_3:=endBit_2+1;
            endBit_3:=StrFind(temp,startBit_3,",");
            lenBit_3:=endBit_3-startBit_3;
            startBit_4:=endBit_3+1;
            endBit_4:=StrFind(temp,startBit_4,",");
            lenBit_4:=endBit_4-startBit_4;
            startBit_5:=endBit_4+1;
            endBit_5:=StrFind(temp,startBit_5,",");
            lenBit_5:=endBit_5-startBit_5;
            startBit_6:=endBit_5+1;
            endBit_6:=StrFind(temp,startBit_6,",");
            lenBit_6:=endBit_6-startBit_6;
            !按照以上分隔结果将字符串拆解
            str_1:=StrPart(temp,startBit_1,lenBit_1);
            str_2:=StrPart(temp,startBit_2,lenBit_2);
            str_3:=StrPart(temp,startBit_3,lenBit_3);
            str_4:=StrPart(temp,startBit_4,lenBit_4);
            str_5:=StrPart(temp,startBit_5,lenBit_5);
            str_6:=StrPart(temp,startBit_6,lenBit_6);
            !将字符串格式的坐标转为数值格式坐标
            ok:=StrToVal(str_1,num_1);
            ok:=StrToVal(str_2,num_2);
            ok:=StrToVal(str_3,num_3);
            ok:=StrToVal(str_4,num_4);
            ok:=StrToVal(str_5,num_5);
            ok:=StrToVal(str_6,num_6);
            !显示解释后的坐标,验证解释是否正确
            TPWrite "Now moving to:"+ str_1 + "," + str_2 + "," + str_3 + "," + str_4 + "," + str_5 + "," + str_6;
            !将解释后的坐标赋值给目标坐标变量
            targetPos.robax.rax_1 := num_1;
            targetPos.robax.rax_2 := num_2;
            targetPos.robax.rax_3 := num_3;
            targetPos.robax.rax_4 := num_4;
            targetPos.robax.rax_5 := num_5;
            targetPos.robax.rax_6 := num_6;
            !移动到坐标
            MoveAbsJ targetPos, v100, fine, tool0;
            GOTO sendposition;
            
            
            sendposition:
            !发送坐标程序段
            !获取机器人当前坐标
            currentPos := CJointT();
            !由于上位机接收格式为字符串格式,将数值转为字符串
            sendstr_1 := NumToStr(currentPos.robax.rax_1,3);
            sendstr_2 := NumToStr(currentPos.robax.rax_2,3);
            sendstr_3 := NumToStr(currentPos.robax.rax_3,3);
            sendstr_4 := NumToStr(currentPos.robax.rax_4,3);
            sendstr_5 := NumToStr(currentPos.robax.rax_5,3);
            sendstr_6 := NumToStr(currentPos.robax.rax_6,3);
            
            !获取当前坐标系坐标
            pCurrentPos := CRobT();
            current_x := pCurrentPos.trans.x;
            current_y := pCurrentPos.trans.y;
            current_z := pCurrentPos.trans.z;
            !将数值坐标转为字符串坐标
            str_x := NumToStr(pCurrentPos.trans.x,3);
            str_y := NumToStr(pCurrentPos.trans.y,3);
            str_z := NumToStr(pCurrentPos.trans.z,3);
            !当前坐标
            now_Position := str_x + "x" + str_y + "y" + str_z + "z" + sendstr_1 + "," + sendstr_2 + "," + sendstr_3 + "," + sendstr_4 + "," + sendstr_5 + "," + sendstr_6 + ".";
            !显示当前坐标
            TPWrite "Now position:" + now_Position;
            !判断当前字符串长度
            endBit:=Strlen(now_Position);
            !长度转为字符串形式
            length:=NumToStr(endBit,0);
            !返回坐标值字符串长度显示
            TPWrite "Next length:" + length;
            !发送报文,预告下一条坐标报文的长度
            !由于上位机需要指定接收报文的长度,故需预告坐标报文长度
            SocketSend socket1\Str:= length;
            SocketReceive socket1\Str:=temp;
            TPWrite "Received:" + temp;
            !判断对方返回报文.返回报文为T则表示对方做好准备接受下一条坐标报文
            IF temp = "T" THEN
                WaitTime 0.5;
            ELSE
                TPWrite "Failed.";
                GOTO end;
            ENDIF
            TPWrite "OK. Now sending position.";
            !发送坐标报文
            SocketSend socket1\Str:= now_Position;
            !显示发送成功,然后循环回到等待接收报文部分
            TPWrite "Success.";
    	ENDWHILE
        !结束程序段,跳到此则跳出循环,并结束程序.
        end:
        EXIT;
    ENDPROC
ENDMODULE
posted @ 2025-10-09 22:45  黑猫警长8283  阅读(8)  评论(0)    收藏  举报