Socket直译为插座,对于计算机通信而言,为设备与设备间基于TCP/IP协议通讯的基本端口。通过socket,一台设备可以接收其他设备的数据,也可以向其他设备发送数据,本文就ABB机器人如何通过相关RAPID程序建立scoket连接进行讲解:
在Socket连接中,服务端就像一个插排,上面具有多个插座供客户端这些插头进行连接通讯,其通讯模型如下图所示:
创建Server服务端
对于服务器端的创建,需要先初始化socket(close及create),然后与ip地址及端口进行绑定(bind),***后对socket设备进行监听(listen)。这些都设置后,就可调用accept指令,等待客户端的连接,编程示例如下:
VAR socketdev server;
VAR socketdev client1;
VAR socketstatus status;
VAR string text1;//定义程序所需的变量,分别为Socket设备变量server、client1;socket通信状态变量status;字符串数据text1;
SocketClose server;//关闭socket设备指令,清除原有数据
SocketCreate server;//创建socket设备指令,与关闭指令一样,后面均直接添加socket变量即可。
SocketBind server,"192.168.240.124",2000;//将用于作为服务端的socket设备与服务器的ip地址及端口号进行绑定。服务器ip地址为公共WAN地址或控制器服务端口地址;默认配置下,abb机器人自身的控制器服务器端口地址为192.168.125.1。需要注意在仿真软件上,控制器的服务器端口是不可用的,因此该范例地址选用计算机上的ip地址。端口号选用自由端口号即可。
SocketListen server;//对socket设备server进行监听
SocketAccept server,client1;//调用accept指令,指定服务端server及客户端client,此时服务端等待客户端的输入连接。
创建客户端Client
客户端的创建和服务端类似,创建后连接上服务端绑定的ip地址及端口号即可:
VAR socketdev client1;
VAR socketstatus status;
VAR string text2;//与服务端程序类似,定义程序所需的变量:Socket设备变量client1;socket通信状态变量status;字符串数据text2;
SocketClose client1;
SocketCreate client1;//关闭并新建Socket设备client1
SocketConnect client1,"192.168.240.124",2000;//使用SocketConnect连接指令,指定client1为客户端,连接至上文服务器绑定的ip地址与端口号;
当两边设备的程序运行到这一步,此时双方已建立起了Socket通信通道,接下来可以通过相关通信指令进行数据的传输。
数据的发送与接收
SocketSend
SocketSend 为数据发送指令,其指令编程格式如为:SocketSend socket [\Str] | [\RawData] | [\Data]
其中,在服务器中,该指令的Socket必须为Accept指令中指定用于接受发送的Socket设备,即Accept指令中的client1;在客户端中,必须为已经创建及连接上服务器的Socket设备,即SocketConnect指令中的client1;
可发送的数据类型有字符、字节、原始数据字节三种;
SocketReceive
SocketReceive 为数据接收指令,其指令编程格式如为:SocketSend socket [\Str] | [\RawData] | [\Data] [\Time]
Socket的选用要求与发送指令相同,可接收的数据类型一样也是字符、字节、原始数据字节三种,在程序中这要指定对应的变量,对接收的数据进行储存;添加项[\Time]为执行接收指令的等待时间,若未设置,这默认等待60秒。若需要永久等待,则需使用预定义常量WAIT_MAX。
编程示例
服务端的后续程序如下:
status:= SocketGetStatus(client1);
if (status = SOCKET_CONNECTED) then
//将client1的通信状态赋值给变量status,随后将status的值作为if判断指令的判断条件,若通信状态为已连接,则执行后续通信指令。
SocketReceive client1\Str:= text1;//接收客户端client1的字符串数据,并将其存入字符串变量text1中
SocketSend client1\Str:= "hello client";//发送字符串数据hello client至客户端client1
WaitTime 3;
ENDIF
SocketClose server;
SocketClose client1;//通信结束后,关闭所有已使用的socket设备
客户端处的后续程序则如下:
status:= SocketGetStatus(client1);
if (status = SOCKET_CONNECTED) then
//与服务端的相同,将程序中client1的通信状态赋值给变量status,并以状态值为判断条件执行if判断指令;
SocketSend client1\Str:= "hello server";//发送字符串数据hello server至连接上服务器的socket设备client1;
SocketReceive client1\Str:= text2\Time:=20;//接收发送至client1的字符串数据,并将其存入字符串变量text2中,数据接收等待时间为20秒;
TPWrite text2;\\将text2的值显示于示教器屏幕上
WaitTime 3;
ENDIF
SocketClose client1;//通信结束后,关闭程序中所有已使用的socket设备
双方程序运行完后,服务端将会接收到hello server并将其存入变量text1中,客户端则会接收到hello client存入变量text2中。
***后需要注意设备间的程序运行顺序,需先运行服务端的通信程序,令作为服务器的socke设备处于等待接收状态后再运行客户端设备的通信程序,这样才可正确构建起两台设备间的scoket通信。
更多详情了解ABB机器人配件网
新闻中心