目录
4.1.2、RobotStudio添加616-1 PC Interface
2、SocketConnect 连接远程计算机(仅客户应用程序)
6、SocketReceiveFrom 接收来自远程计算机的数据
8、SocketBind 套接字与端口绑定(仅服务器应用程序)
10、SocketAccept 接受连接(仅服务器应用程序)
PLC端:开放式用户通信(作为服务器)
1、硬件配置
这里通信是ABB机器人主动建立连接,需要注意的点是伙伴IP以及本地端口。
2、数据块
ShowABB是用于在PLC端进行展示,SendABB/RecvABB是用于在ABB端进行展示,由于它们的数据结构存在高低字节问题,因此建立两个方便查看以及修改,后续只需要修改ShowABB中的数据即可。
3、TSEND_C:建立连接并发送数据
发送数据前需要对数据进行处理,如果是REAL数据需要转换成DWORD并进行高低字节转换后发送。
REQ:在上升沿启动发送作业。
CONT:控制通信连接。0表示断开通信连接、1表示建立并保持通信连接。
CONNECT:指向连接描述结构的指针。
DATA:指向发送区的指针,该发送区包含要发送数据的地址和长度。传送结构时,发送端和接收端的结构必须相同。
4、TRCV_C:建立连接并接收数据
这里同样是进行数据转换,将接收的DWORD数据先进行高低字节转换最后在转换成REAL。
EN_R:启用接收功能。
CONT:控制通信连接。0表示断开通信连接、1表示建立并保持通信连接。
CONNECT:指向连接描述结构的指针。
DATA:指向接收区的指针,该接收区包含要发送数据的地址和长度。传送结构时,发送端和接收端的结构必须相同。
ABB端:Socket套接字通信(作为客户端)
1、硬件支持
标准接口通讯选项:616-1 PC Interface
616-1 PC Interface 常用于 SOCKET 通讯 PC端,通过网络连接实现机器人与PC端的通讯。
2、硬件配置
添加一个Socket通讯地址IP设置,需要注意的IP和接口Interface。
IP对应PLC中配置的远程伙伴IP。
Interface接口有多个选项(WAN、LAN、LAN3),这里选择需要更具实际网线所对应的网口有关。
3、程序实现
MODULE Socket !定义变量数据 VAR num SendPos{9};!用于发送数据暂存 VAR num RecvPos{9};!用于接收数据暂存 VAR jointtarget JPos;!用于存储机器人关节数据,A1、A2、A3、A4、A5、A6 VAR robtarget LPos;!用于存储机器人线性数据,X、Y、Z VAR rawbytes SendPlc;!用于向PLC发送数据 VAR rawbytes RecvPlc;!用于从PLC接收数据 VAR socketdev SocketClient;!Socket套接字通信 PROC main() !主程序 Init;!调用Init子程序,复位/初始化参数 SocketClose SocketClient;!先关闭Socket套接字通信 SocketCreate SocketClient;!创建Socket套接字通信 SocketConnect SocketClient,"192.168.0.13",5000;!连接Socket套接字通信,这里的ip是PLC的ip(string类型)、端口对应PLC端口(num类型) WHILE TRUE DO !这里通信一直循环,后面可以做成后台任务一直进行。 SocketReceive SocketClient\RawData:=RecvPlc;!接收PLC发送过来的数据,存储在套接字中 Unpack;!调用Unpack子程序,对接收的套接字数据进行解析 WaitTime 0.2;!等待时间 Pack;!调用Pack子程序,对发送的套接字数据进行打包 WaitTime 0.2;!等待时间 SocketSend SocketClient\RawData:=SendPlc;!将套接字中数据发送到PLC中。 ENDWHILE ENDPROC PROC Init() !初始化 SendPos:=[0,0,0,0,0,0,0,0,0]; RecvPos:=[0,0,0,0,0,0,0,0,0]; ENDPROC PROC Pack() !压包 ClearRawBytes SendPlc;!这里是清除发送的套接字中的数据,如果不清楚后面会溢出,导致RawBytesLen报错 JPos:=CJointT();!调用系统函数,获取实时机器人关节数据 LPos:=CRobT();!调用系统函数,获取实时机器人线性数据 SendPos{1}:=JPos.robax.rax_1;!对数据进行赋值 SendPos{2}:=JPos.robax.rax_2; SendPos{3}:=JPos.robax.rax_3; SendPos{4}:=JPos.robax.rax_4; SendPos{5}:=JPos.robax.rax_5; SendPos{6}:=JPos.robax.rax_6; SendPos{7}:=LPos.trans.x; SendPos{8}:=LPos.trans.y; SendPos{9}:=LPos.trans.z; PackRawBytes SendPos{1},SendPlc,RawBytesLen(SendPlc)+1\Float4;!将数据压包 PackRawBytes SendPos{2},SendPlc,RawBytesLen(SendPlc)+1\Float4; PackRawBytes SendPos{3},SendPlc,RawBytesLen(SendPlc)+1\Float4; PackRawBytes SendPos{4},SendPlc,RawBytesLen(SendPlc)+1\Float4; PackRawBytes SendPos{5},SendPlc,RawBytesLen(SendPlc)+1\Float4; PackRawBytes SendPos{6},SendPlc,RawBytesLen(SendPlc)+1\Float4; PackRawBytes SendPos{7},SendPlc,RawBytesLen(SendPlc)+1\Float4; PackRawBytes SendPos{8},SendPlc,RawBytesLen(SendPlc)+1\Float4; PackRawBytes SendPos{9},SendPlc,RawBytesLen(SendPlc)+1\Float4; ENDPROC PROC Unpack() !解包 UnpackRawBytes RecvPlc, 1, RecvPos{1}\Float4;!将数据解包 UnpackRawBytes RecvPlc, 5, RecvPos{2}\Float4; UnpackRawBytes RecvPlc, 9, RecvPos{3}\Float4; UnpackRawBytes RecvPlc, 13, RecvPos{4}\Float4; UnpackRawBytes RecvPlc, 17, RecvPos{5}\Float4; UnpackRawBytes RecvPlc, 21, RecvPos{6}\Float4; UnpackRawBytes RecvPlc, 25, RecvPos{7}\Float4; UnpackRawBytes RecvPlc, 29, RecvPos{8}\Float4; UnpackRawBytes RecvPlc, 33, RecvPos{9}\Float4; ENDPROC ENDMODULE
4、关键技术
4.1、SOCKET
SOCKET通信是一种基于TCP/IP协议的通信方式,提供了程序内部与外界通信的端口并为通信双方提供了数据传输通道。ABB机器人实现SOCKET通信必须要在Communication选项中勾选616-1 PC Interface选项功能。
4.1.1、查看616-1 PC Interface
4.1.2、RobotStudio添加616-1 PC Interface
4.1.3、配置Socket通信
添加一个Socket通讯地址IP设置,需要注意的IP和接口Interface。
IP对应PLC中配置的远程伙伴IP。
Interface接口有多个选项(WAN、LAN、LAN3),这里选择需要更具实际网线所对应的网口有关。
方式一:在机器人示教器中配置
方式二:在RobotStudio中配置
4.1.4、编写Socket通信程序
VAR socketdev SocketClient; !创建一个SocketClient通信 SocketClose SocketClient; !关闭SocketClient通信 SocketCreate SocketClient; !创建SocketClient通信 SocketConnect SocketClient,"PLC_IP",PLC_PORT; !连接SocketClient通信 !以套接字的方式进行通信 VAR rawbytes SendPlc; VAR rawbytes RecvPlc; SocketReceive SocketClient\RawData:=RecvPlc;!接收数据 SocketSend SocketClient\RawData:=SendPlc;!发送数据
4.1.5、指令说明
1、SocketCreate 创建新套接字
定义: PROC SocketCreate(socketdev Socket[\UDP]) 示例: VAR socketdev SocketClient; SocketCreate SocketClient;
参数 | 说明 |
---|---|
Socket | 数据类型:socketdev 用于储存系统内部套接字数据的变量。 |
[ \UDP ] | 数据类型:switch 指定套接字应当为数据电报型协议UDP/IP。 |
2、SocketConnect 连接远程计算机(仅客户应用程序)
定义: PROC SocketConnect(socketdev Socket, string Address, num Port [\Time:=num]) 示例: SocketConnect SocketClient,"PLC_IP",PLC_PORT;
参数 | 说明 |
---|---|
Socket | 数据类型:socketdev 有待连接的服务器套接字。必须创建尚未连接的套接字。 |
Address | 数据类型:string 远程计算机的地址。必须将远程计算机指定为一个IP地址。不可能使用远程计算机的名称。 |
Port | 数据类型:num 位于远程计算机上的端口。通常,可自由使用端口1025-4999。可能已经采用了低于1025的端口。 |
[ \Time] | 数据类型:num 程序执行等待接受或否定连接的最长时间量。如果在满足条件之前耗尽时间,则将调用错误处理器,如果存在这样的情况,则采用错误代码ERR_SOCK_TIMEOUT。如果不存在错误处理器,则将停止执行。 如果未使用参数\Time,则等待时间为60秒。为了永久等待,则使用预定义常量WAIT_MAX。 |
3、SocketSend 向远程计算机发送数据
定义: PROC SocketSend(socketdev Socket [\str:=string]|[\RawData:=rawbytes]|[\Data:=byte{}] [\NoOfBytes:=num]) 示例: VAR rawbytes SendPlc; VAR socketdev SocketClient; SocketClose SocketClient; SocketCreate SocketClient; SocketConnect SocketClient,"PLC_IP",PLC_PORT; SocketSend SocketClient\RawData:=SendPlc;
参数 | 说明 |
---|---|
Socket | 数据类型:socketdev 在客户端应用中,必须已经创建和连接用于发送的套接字。 在服务器应用中,必须已经接受用于发送的套接字。 |
[ \Str ] | 数据类型:string 将string发送到远程计算机。 |
[\RawData] | 数据类型:rawbytes 将rawbytes数据发送到远程计算机。 |
[\Data] | 数据类型:array of byte 将byte数组中的数据发送到远程计算机。 同一时间只能使用可选参数\Str、\RawData或\Data中的一个。 |
[\NoOfBytes] | 数据类型:num 如果指定该参数,则仅将该字节数发送到远程计算机。如果\NoOfBytes大于待发送数据结构中的实际字节数,则SocketSend调用将失败。 如果未指定该参数,则将整个数据结构(rawbytes的有效部分)发送到远程计算机。 |
注意:\Str、\RawData、\Data在同一时间只有一个参数可用使用。
4、SocketSendTo 向远程计算机发送数据
5、SocketReceive 接收来自远程计算机的数据
定义: PROC SocketReceive(socketdev Socket [\str:=string]|[\RawData:=rawbytes]|[\Data:=byte{}] [\ReadNofBytes:=num] [\NoRecBytes:=num] [\Time:=num]) 示例: VAR rawbytes RecvPlc; VAR socketdev SocketClient; SocketClose SocketClient; SocketCreate SocketClient; SocketConnect SocketClient,"PLC_IP",PLC_PORT; SocketReceive SocketClient\RawData:=RecvPlc;
参数 | 说明 |
---|---|
Socket | 数据类型:socketdev 在客户端应用中,必须已经创建和连接用于发送的套接字。 在服务器应用中,必须已经接受用于发送的套接字。 |
[ \Str ] | 数据类型:string 接收到的字符串的变量数据被存储在该变量。最大可以处理的字符数为80。 |
[\RawData] | 数据类型:rawbytes 接收到的rawbytes变量被存储在该变量。最大处理的字节数为rawbytes1024字节。 |
[\ReadNofBytes] | 数据类型:array of byte 变量存储接收到的字节数据。最大可以处理的字节数量1024。 |
[\NoOfBytes] | 数据类型:num 读取的字节数。指定读取字节的最小值为1,最大值为使用的数据类型的最大值(如果使用数据类型为字符串的变量,最大数据类型为80字节。)。如果客户端使用混合的数据类型,这个参数可以指定SocketReceive指令接收多少数量的byte字节数。 |
[\NoRecBytes] | 数据类型:num 套接口收到的字节数。从指定的套接口需要多少字节数才能存储变量,也可用其他的方式实现。 |
[\Time] | 数据类型:num 等待接收数据的最大等待时间(s)。如果在最大时间之内没有接收到数据,那么产生一个错误句柄,错误代码ERR_SOCK_TIMEOUT。如果没有错误处理,那么程序停止执行。如果\Time没有使用,那么默认60s。永远等待,那么使用常量WAIT_MAX指定。 |
注意:\Str、\RawData、\Data在同一时间只有一个参数可用使用。
6、SocketReceiveFrom 接收来自远程计算机的数据
7、SocketClose 关闭套接字
定义: PROC SocketClose(socketdev Socket) 示例: SocketClose SocketClient;
参数 | 说明 |
---|---|
Socket | 数据类型:socketdev 用于储存系统内部套接字数据的变量。 |
8、SocketBind 套接字与端口绑定(仅服务器应用程序)
定义: PROC SocketBind(socketdev Socket, string LocalAddress, num Localport) 示例: VAR socketdev SocketClient; SocketClose SocketClient; SocketCreate SocketClient; SocketBind SocketClient, "LocalAddress", Localport;
参数 | 说明 |
---|---|
Socket | 数据类型:socketdev 有待绑定的服务器套接字。必须创建尚未绑定的套接字。 |
LocalAddress | 数据类型:string 将服务器网络地址与套接字绑定。唯一有效的地址为所有公共WAN地址,或控制器服务端口地址192.168.125.1。 |
LocalPort | 数据类型:num 将服务器端口号与套接字绑定。通常,可自由使用端口1025-4999。 |
9、SocketListen 监听连接(仅服务器应用程序)
定义: PROC SocketListen(socketdev Socket) 示例: VAR socketdev SocketClient; SocketClose SocketClient; SocketCreate SocketClient; SocketBind SocketClient, "LocalAddress", Localport; SocketListen SocketClient;
参数 | 说明 |
---|---|
Socket | 数据类型:socketdev 用于储存系统内部套接字数据的变量。 |
10、SocketAccept 接受连接(仅服务器应用程序)
定义: PROC SocketListen(socketdev Socket, socketdev ClientSocket [\ClientAddress:=string] [\Time:=num]) 示例: !创建服务器套接字,并绑定至地址为192.168.0.1的控制器网络上的端口1025。在执行SocketListen之后,服务器套接字开始监听位于该端口和地址上输入连接。SocketAccept等待所有输入连接,接受连接请求,并返回已建立连接的客户端套接字。 VAR socketdev server_socket; VAR socketdev client_socket; SocketClose server_socket; SocketClose client_socket; SocketCreate server_socket; SocketBind server_socket,"192.168.0.1", 1025; SocketListen server_socket; SocketAccept server_socket, client_socket; !服务器套接字将等待所有输入连接请求。当接受输入连接请求时,本指令就绪,且返回的客户端套接字默认连接,并可用于SocketSend和SocketReceive指令。
参数 | 说明 |
---|---|
Socket | 数据类型:socketdev 正在等待输入连接的服务器套接字。套接字必须已经创建、绑定并准备进行监听。 |
ClientSocket | 数据类型:socketdev 将按照接受的输入连接请求,对返回的新客户端套接字进行更新。 |
[\ClientAddress] | 数据类型:string 将通过已接受输入连接请求的IP地址来进行更新的变量。 |
[\Time] | 数据类型:num 程序执行等待输入连接的最长时间量。如果在任意输入连接之前耗尽时间,则将调用错误处理器,如果存在这样的情况,则采用错误代码ERR_SOCK_TIMEOUT。如果不存在错误处理器,则将停止执行。 如果未使用参数\Time,则等待时间为60秒。为了永久等待,则使用预定义常量WAIT_MAX。 |
11、SocketGetStatus 获得当前套接字的状态
12、SocketPeek 测试套接字上数据的存在
4.2、PackRawBytes
定义: PROC PackRawBytes(ANYTYPE# Value, rawbytes RawData [\Network], num StartIndex [\IntX:=num] | [\Float4] | [\ASCII]) 示例: PackRawBytes SendPos{1},SendPlc,RawBytesLen(SendPlc)+1\Float4;
参数 | 说明 |
---|---|
Value | 数据类型:ANYTYPE 有待装入RawData的数据。容许的数据类型包括:num、dnum、byte或string。无法使用数组。 |
RawData | 数据类型:rawbytes 将装入数据的变量容器。 |
[\Network] | 数据类型:switch |
StartIndex | 数据类型:num 介于1和1024之间的StartIndex表明,应当将Value中包含的首字节置于RawData中。 |
[\IntX] | 数据类型:num 待装入的value具有num或dnum格式。根据该指定数据类型inttypes的常量,其为整数,且应当存储在RawData中。 |
[\Float4] | 数据类型:switch 待装入的Value具有num格式,且应当作为4字节浮动值,存储在RawData中。 |
[\ASCII] | 数据类型:switch 待装入的Vaule具有byte或string格式。 |
4.3、UnpackRawBytes
定义: PROC UnpackRawBytes(rawbytes RawData [\Network], num StartIndex, ANYTYPE# Value [\Hex1] | [\IntX:=num] | [\Float4] | [\ASCII:=num]) 示例: UnpackRawBytes RecvPlc, 1, RecvPos{1}\Float4;
参数 | 说明 |
---|---|
RawData | 数据类型:rawbytes 用于解包数据源的变量容器。 |
[\Network] | 数据类型:switch |
StartIndex | 数据类型:num 介于1和1024之间的StartIndex表明,表明开始从RawData解包数据的位置。 |
Value | 数据类型:ANYTYPE 包含从RawData解包的数据的变量。容许的数据类型包括:num、dnum、byte或string。无法使用数组。 |
[\IntX] | 数据类型:inttypes 待解包数据拥有符合数据类型inttypes指定常量的格式。数据将转换成包含整数,并存储在Value中的num或dnum变量。 |
[\Float4] | 数据类型:switch 待解包并置于值中的数据具有浮点4字节格式,并将转换为包含浮点的num变量。 |
[\ASCII] | 数据类型:num 待解包并置于Value中的数据具有byte或string格式。 |
4.4、CJointT():读取当前接头的角度
CJointT(Current Joint Target)用于读取机械臂轴和外轴的当前角度。该函数返回值,数据类型:jointtarget 有关臂侧上机械臂各轴的当前角度,以度计。有关外轴的当前值,线性轴以mm计,旋转轴以度计。返回值与校准位置相关。
4.5、CRobT():读取当前位置(机器人位置)数据
CRobT(Current Robot Target)用于读取机械臂和外轴的当前位置。该函数返回robtarget值以及位置(X、Y、Z)、方位(q1...q4)、机械臂轴配置和外轴位置。如果仅读取机械臂TCP(pos)的x、y和z值,则转而使用函数CPos。