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

news/2025/10/9 22:51:09/文章来源:https://www.cnblogs.com/hei-mao/p/19120042

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

MODULE Module1CONST 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;ENDIFmove0:!对接收到的报文进行解释,找出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" THENWaitTime 0.5;ELSETPWrite "Failed.";GOTO end;ENDIFTPWrite "OK. Now sending position.";!发送坐标报文SocketSend socket1\Str:= now_Position;!显示发送成功,然后循环回到等待接收报文部分TPWrite "Success.";ENDWHILE!结束程序段,跳到此则跳出循环,并结束程序.end:EXIT;ENDPROC
ENDMODULE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/933906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.1.1.1 金融市场的定义与功能

金融市场的定义与功能 1. 知识点的由来 历史渊源: 金融市场起源于古代的物物交换和货币借贷活动。最早可追溯到古巴比伦时期(公元前2000年左右)的借贷记录和贸易活动。真正的现代金融市场雏形出现在15-16世纪的意大…

使用c#操作elasticsearch8

注意事项 若Es的客户端版本是8.x以下,建议用NEST或者Elasticsearch.Net,这两个包最高只支持7.x系列。 若Es的客户端是8.x以上,则推荐使用Elastic.Clients.Elasticsearch。 注意选择版本的时候最好和客户端版本保持一…

使用虚幻引擎|UE5制作自动开关门 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

计算机中级

计算机中级Posted on 2025-10-09 22:39 心默默言 阅读(0) 评论(0) 收藏 举报计算机软考 0.考试介绍1.计算机系统知识

CF45C Dancing Lessons 题解

CF45C Dancing Lessons 题解 不就是洛谷的 P1878 吗,雾。 暴力的时间复杂度是 \(O(n^2)\) 的,考虑优化。 考虑使用优先队列。内部存三个元素:绝对值、左边的孩子、右边的孩子。 这样我们重载运算符可以以绝对值为第…

APUE学习笔记之文件IO(三) - Invinc

本文记录《UNIX环境高级编程》第3版中第3章文件IO的一些知识点。本文记录《UNIX环境高级编程》第3版中第3章文件IO的一些知识点。文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负…

tornado异步操作数据库-mysql

import json from tornado import web, ioloop import aiomysql settings = { "debug" : True, "mysql":{ "host": "127.0.0.1", "port": 3306, "user":…

供应链优化技术助力应对疫情挑战

本文探讨了某中心如何利用供应链优化技术应对疫情带来的长期需求高峰,包括深度学习预测模型、注意力机制在时间序列分析中的应用,以及自适应容量控制系统的优化与创新。在7月12日至13日,数百万会员访问某中心商店购…

搜索关键词 - 呓语

使用Trae开发一个能够根据输入的搜索关键词,同时搜索淘宝、京东等购物平台商品的比价程序(需要网络爬虫、本地客户端展示、本地客户端存储等技术) 刚开始告诉trae后,并没有爬取数据,而是在后端写了几个模拟数据,…

阅读《构建之法》产生的问题

好的,根据您提供的《构建之法》第16章和第17章的内容,我提出以下五个问题,并按照您的要求进行阐述。问题一:在敏捷开发和快速迭代的背景下,“萝卜”与“白菜”的价值该如何重新评估?问题来源与上下文这个问题来源…

每日反思

今天下大雨,明天上早八然后好好学习

每日反思(2025.10.09)

今天下雨,没有学额外内容。上午跟着算法与数据结构课学习了队列和栈,了解了队列的先进先出与栈的先进后出,学习了栈的基本原理

软件工程学习日志2025.10.9

📝 今日学习主题 简单工厂模式(Simple Factory Pattern) 在实际场景中的应用 🎯 模式理解 简单工厂模式属于创建型模式,它提供了一个统一的接口来创建不同类型的对象,而无需向客户端暴露实例化的逻辑。 核心思…

1.1.1.2 直接融资vs间接融资的区别

直接融资vs间接融资的区别 1. 知识点的由来 历史渊源: 直接融资和间接融资的分化起源于金融中介的演进。在古代,融资主要通过直接的借贷关系进行(直接融资)。随着银行业的发展,银行作为中介机构吸收存款再发放贷款…

柳高国庆小小说创作比赛的构思和成文(未完成)

宇宙创生 创作原因是学校在国庆开展小小说创作比赛。 #0 成文展示#1 创作构建 本小说完全参考游戏《群星》中关于"宇宙创生(文灾)"的游戏流程,来源于国庆爽打了一局群星(doge)。 使用了 DeepSeek 来完善构…

实用指南:制冷剂中表压对应温度值的获取(Selenium)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

分布式锁的 Java 实现与性能对比:从实战落地到选型指南(一) - 指南

分布式锁的 Java 实现与性能对比:从实战落地到选型指南(一) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…