基于Socket通信的AGV上位机控制系统
2021-11-07张功学徐耀辉
薛 哲,张功学,何 凯,徐耀辉,崔 聪
(1.陕西科技大学机电工程学院,陕西 西安 710021;2.中国科学院深圳先进技术研究院,广东 深圳 518055)
现在AGV导引技术正在迅速发展,很多行业已经开始采用AGV导引技术[1]。但是部分AGV小车的控制方式为触摸屏控制,需要人工近距离操作,步骤繁琐。并且在复杂实验环境下或者AGV小车行驶过程中操作时,存在一定的安全隐患。因此,为了提高AGV小车操控的安全性与方便性,本文使用C#编程语言,结合Socket通信与串口转WIFI技术,设计出一款适用于AGV小车的上位机控制系统,此系统可使人在较远距离使用电脑控制AGV小车,即使在复杂实验环境下也可以很方便的操控AGV小车并且保证了人员的安全。
AGV通讯系统用于实现AGV与地面控制站及地面监控设备之间的信息交换[2]。在本文中AGV的通讯系统采用一问一答式,上位机发送询问数据,AGV控制板在接收到数据之后,根据接收到的数据进行回应或者不回应,通过询问数据对AGV小车进行控制。
1 Socket通信原理
Socket作为进程通信机制,是2个程序之间进行双向数据传输的网络通讯端点,用一个地址和一个端口号标识[3]。Socket通常也称作“套接字”,用于描述IP地址和端口。
1.1 服务器端和客户端
在通信过程中,客户端主动打开连接,服务器端是被动的[4]。当客户端和服务端彼此交换数据前,必须先在双方之间建立一个TCP连接之后才能传输数据[5]。
服务器端的Socket至少需要两个,一个负责接收客户端的连接请求,但是不负责与客户端的通信;当服务端接收到客户端的连接后便会在服务端产生一个负责通信的Socket,这个Socket是在收到客户端的连接时创建。
客户端的Socket必须指定要连接的服务端的IP地址和端口;通过创建一个Socket对象来初始化一个到服务端的TCP连接。
1.2 Socket通信基本流程
服务端先初始化Socket,通过bind函数与端口绑定,调用listen函数对端口进行监听,再调用accept函数等待客户端的连接。当有客户端初始化一个Socket后,调用connect函数与服务端进行连接,服务端接收到客户端的连接请求并连接成功后,这时客户端就可以发送数据请求,服务端接收并处理请求,然后把回应数据发送给客户端,客户端读取数据,一次服务端与客户端的交互结束。
图1 AGV小车控制系统通信流程图
2 系统设计
2.1 服务端设计
当打开服务端软件后,先是服务端开始监听并且接受AGV小车发来的连接请求,连接成功后便可以向AGV小车核心板发送数据,如果AGV小车成功接收到数据并作出相应指令,会向服务端回应信息,显示在相应区域,回应信息分为AGV当前实时状态和每条询问指令成功接收的应答信息。
2.2 服务端功能实现
2.2.1 创建一个负责监听的Socket
部分代码如下:
Socket SocketWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
IPEndPoint point = new IPEndPoint(ip,Convert.ToInt32(txtPort.Text));
SocketWatch.Bind(point);
ShowMsg("监听成功/r/n");
SocketWatch.Listen(10);
首先新实例初始化Socket类使用指定的地址族、流式套接字和TCP协议;
接下来提供Internet协议(IP)地址,并侦听所有网络接口上的客户端活动的IP地址;
然后新实例初始化IPEndPoint类具有指定的地址和端口号;
使用Bind()函数将IP地址、端口号与负责监听的Socket相关联;
使用SocketWatch对象的Listen()函数使监听的Socket处于侦听状态;
最后当打开服务端软件时在ShowMsg对话框显示监听成功。
2.2.2 创建一个负责通信的Socket
部分代码如下:
Socket socketsend = SocketWatch.Accept();
ShowMsg(socketsend.RemoteEndPoint.ToString() + ":" + "连接成功" + "/r/n");
为了接收来自客户端的连接请求,使用Socket类中的Accept()函数创建一个新的Socket用于与客户端进行通信;当连接成功后则会在ShowMsg对话框显示连接成功。
2.2.3 接收和发送消息
int r=socketsend.Receive(buffer);
ShowMsg(socketsend.RemoteEndPoint.ToString() + ":" + str + "/r/n");
使用Socketsend对象中的Receive()函数接收客户端发来的消息并存储到接收缓冲区中,最后将其显示在ShowMsg对话框中。
socketsend.Send(buffer);
使用Socketsend对象中的Send()函数向客户端发送消息。
在本控制系统中,上位机向AGV核心板发送的为十六进制数据,共14个字节。其中起始码占1个字节,为通信开始标志位;功能码占1个字节,代表询问指令功能;数据码占5个字节,代表对应的数据码含义;预留5个字节,为无效数据位;结束码占1个字节,为通信结束标志位;校验码占1个字节,为前边所有码相加除以256的余数。例如AA C1 00 03 E8 03 E8 00 00 00 00 00 BB 11为14个字节,其所代表的含义为AGV小车向前运行,左右电机转速为1000 rpm/min。
因为要计算校验码,所以需要将前边所有编码提取出来转化为int类型相加除以256求余,求出来的余数为校验码,再将所有的编码转换成string类型进行相加;由于只能发送Byte类型的数据,最后将相加的string类型编码转换成Byte类型则为最终要发送的编码。
部分代码如下:
int[] suma = new int[8];
suma[0] = Convert.ToInt32(str[0],16);
将所有编码转化成int类型。
int sum=new int();
for (int i=0;i { sum+=suma[i]; } int check=sum%256; 使用for循环将所有转化成int类型的编码相加,最后再求余得出校验码。 图2 界面设计 如图2所示,TextBox1为服务端IP地址,TextBox2为端口号,TextBox3显示AGV小车的返回信息,TextBox4和5可以调节AGV小车左右电机的转速,TextBox 6和7可以控制AGV小车升降平台的升降高度和速度。当AGV小车启动后,PC端连接WIFI,输入IP地址和端口号再点击连接按钮,就会收到AGV小车的连接请求,连接成功后会在TextBox 3显示连接成功,如果AGV小车行进或升降过程中出现异常情况,可以立即点击停止按钮就会停止设备,界面中其他按钮则实现其相对应的功能。 由于AGV核心控制板只预留了RS232接口,RS232接口支持全双工、不间断通信;再使用WIFI串口服务器将RS232接口转换成WIFI,然后安装好WIFI天线,就能够使用笔记本电脑等设备进行连接。 AGV 与上位机采用一问一答式通信,每当上位机发送的指令被AGV成功接收到后会进行回应;每条询问指令成功接收的应答信息共14个字节。其中起始码、功能码、结束码和校验码各占1个字节;数据码占2个字节,01代表设置成功,00代表设置失败;预留8个字节。 完成所有设计后,开始进行实际实验。为AGV小车设计L型路径,分别进行前进、后退、左转、右转和上升、下降操作,再进行停止升降和停止移动操作,最后点击查询状态按钮查询AGV当前状态。进行操作时AGV的应答信息如表1所示。 表1 操作时AGV应答信息 由应答信息可知,所有操作的数据码为01,即证明设置成功;由查询状态按钮返回的信息可知当前升降板处在720 mm的高度。 从实验结果看,上位机控制系统操作AGV小车更加方便,保证了小车行驶过程中人员的安全。在实验过程中,上位机与AGV小车通信良好,AGV小车能够对上位机所发出的指令迅速做出反应,Socket服务端界面中的所有功能均运行正常。AGV小车如图3所示。 图3 AGV小车实际图 基于Socket通信的AGV小车上位机控制系统,其主要优点有:在复杂实验环境下,使用Socket无线控制AGV小车,便于操作人员在远距离条件下对AGV小车的控制,提高了实验效率,保证了在实验环境下操作人员的安全。2.3 服务端界面设计
2.4 客户端模块
3 实际测试
4 结束语