那智不二越机器人的SOCKET通讯

家人们,经过长久的出差之后,我又回公司继续开发那智机器人的通讯了。总体来说那智机器人本身的开发语言还算比较方便,提供了比较多的接口与说明,但是这沟槽的仿真软件真的难用,目前我仅实现了通讯与一些IO的操作,运动规划啥的还没开始搞。开始上菜。

一、仿真软件的使用

        首先,要是想使用那智机器人的通讯,必须要使用它的用户任务功能,而要使用用户任务功能,就必须将仿真软件与实际的机器人控制柜进行连接,以进行激活。在安装仿真软件后应该有两个图标,包括FD ON DESK MENU 与FD ON DESK,需要激活的是如图中红色框框住的应用。

        在使用网线连接电脑与那智机器人的控制柜后,重新打开的软件界面就跟完全离线仿真的没有什么区别,唯一的区别在于该应用提供了工程管理与应用程序管理。如图。

        这个时候在我们根据实际的机器人型号选择完毕后,进入后就如上图所示。此时可以在最上方亮起的地方对示教器界面进行显示或隐藏。此时,注意工程树,在你建立work文件夹后,UNIT1为选择的机器人型号,程序文件夹与USERTASK以及下方的后缀为.INC格式的文件分别代表那智机器人前台运动程序,在后台运行的用户任务,以及共享的全局变量文件。这个全局变量文件即前台程序与后台程序或后台与后台程序之间进行通信的内容。这里的名字修改不了,只能修改它的序号。因此在设计好运行方案后,先把全局的共享变量先在PUBLIC.INC中进行声明,然后在使用它的用户任务或前台程序中进行定义与修改。

二、代码及说明

        这里简单的将我写的变量贴一下以供参考。

[GLOBAL] '全局声明
DIM speed AS SINGLE '将TCP速度声明为实数

'将TCP速度声明为实数数组
DIM JposCur[6] AS SINGLE
DIM PposCur[6] AS SINGLE

'将工作原点声明为实数数组
DIM Xhome[6] AS SINGLE 

'将后续通信的数字定义为整数数组
DIM int[6] AS SINGLE 

        再贴一下通讯的代码

INCLUDE "PUBLIC" '导入全局变量,此时界面左下角有显示

V1% = 54601 'port
CPRIMCR 5

'在字符串变量中写入字符串以观察程序运行情况
V1$ = "create socket"

'建立套接字 1
SOCKCREATE 1,0


V1$  = "bind socket"
'绑定套接字1 与 端口
SOCKBIND 1,V1% 'bind socket
V1$ = "socket listen"

'监听等待连接,使用套接字1进行通讯,套接字2进行数据接收发送
SOCKWAIT 1,2,0 'listen and wait to be connected

'接收消息并进行分析
WHILE 1
V2$ = " "

'手动将输出O44 变为ON,即可设置工作原点位置并保存
IF GETSIG(44,1) = 1 '监听IO 如果O44 = ON 则将当前的关节角度存在Xhome数组里

Xhome[1] = SYSTEM!(900) '根据手册中的系统输出访问关节数据
Xhome[2] = SYSTEM!(901)
Xhome[3] = SYSTEM!(902)
Xhome[4] = SYSTEM!(903)
Xhome[5] = SYSTEM!(904)
Xhome[6] = SYSTEM!(905)

'开始接收数据
V1$ = "start recieve data"
SOCKRECV 2,1,96,5,V3% '接收数据到1缓冲区中,超时时间为5s,实际接收字节存在V3%中,这里自己查看手册进行了解

'当出现错误,重新开放端口等待连接
WHILE E1% < 0 OR E2% > 0
V1$ = "recieve error"
GOSUB *Reconnect '跳转到*Reconnect那里然后返回,类似函数一样
ENDW
WHILE V3% <> 52 '当收到的字节数不为自己想要的 同样重新连接
GOSUB *Reconnect
ENDW 

V1$ = "finish recieve data"

'开始分析数据
FOR L1% = 1 TO 4 STEP 1 '循环,步进1
GETBYTE 1,V10%,L1%-1 '将缓冲区1的数据按地址进行获取保存在V10%里,这里必须使用系统自带的变量储存过度
INT[L1%] = V10%   '赋值
NEXT

'同样的将当前的关节与位置存在全局变量中
FOR L1% = 1 TO 6 STEP 1
GETREAL 1,V10!,4*L1%  '获取实数
JointCur[L1%] = V10!
NEXT
FOR L1% = 1 TO 6 STEP 1
GETREAL 1,V11!,4*L1%+24
PosCur[L1%] = V11!
NEXT

'发送数据
GOSUB *SendData

ENDW '结束循环

'开始声明函数并定义
*SenData
V2$ = "start send data"

'发送字节类型的整数到1缓冲区 第一个参数为缓冲区 第二个为数值 第三个为地址数
SETBYTE 1,1,0
SETBYTE 1,1,1
SETBYTE 1,1,2
SETBYTE 1,1,3

'按顺序发送当前的关节角与位置,类型为实数
SETREAL 1,SYSTEM!(900),4
SETREAL 1,SYSTEM!(901),8
SETREAL 1,SYSTEM!(902),12
SETREAL 1,SYSTEM!(903),16
SETREAL 1,SYSTEM!(904),20
SETREAL 1,SYSTEM!(905),24
SETREAL 1,SYSTEM!(810),28
SETREAL 1,SYSTEM!(811),32
SETREAL 1,SYSTEM!(812),36
SETREAL 1,SYSTEM!(813),40
SETREAL 1,SYSTEM!(814),44
SETREAL 1,SYSTEM!(815),48

'将缓冲区的数据发送到套接字2中,此时发送数据完毕
SOCKSEND 2,1,96,5,V2%

'发送失败重新连接
IF (E1% < 0 OR E2% > 0 OR V2% <> 52)
V1$ = "send error wait to reconnect"
GOSUB *Rewait
ELSEIF E1% >= 0 AND V2% = 96
V2$ = "finish send data"

'返回
RETURN

'声明重新连接的函数并定义,逻辑与前面一致,此时如果超时或客户端断开 可以重新等待连接 且不连接无法进行下去,这里是针对接收数据时发生错误
*Reconnect
V2$ = "start reconnect"
SOCKCLOSE 1
SOCKCLOSE 2
SOCKCREATE 1,0
V1% = 54601
SOCKBIND 1,V1%
SOCKWAIT 1,2,0
SOCKRECV 2,1,96,5,V3%
WHILE E1% < 0
GOSUB *Reconnect
ENDW
V2$ = "finish reconnect"
RETURN

'声明重新等待的函数,这里是针对在发送数据时发生错误
*Rewait
V2$ = "start rewait"
SOCKCLOSE 1
SOCKCLOSE 2
SOCKCREATE 1,0
V1% = 54601
SOCKBIND 1,V1%
SOCKWAIT 1,2,0
WHILE E1% < 0 OR E2% > 0
GOSUB *Rewait
ENDW
V2$ = "finish rewait"
RETURN

END

在全都弄好之后点击最上面的编译 如果没错误 则可以在示教器中进行运行 如图所示。

 

      

        按照上面图示点击进行运行,注意这里建立的用户任务序号要为0。开机后可以自动运行。如果问怎么汉化 建议去B站搜一下,这里就不展开。  此时使用SOKIT就可以进行通讯了。

        有问题欢迎交流,时不时会回复的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值