第33卷第6期机电产品开发与创新Vol.33,No.6 2020年11月Development&Innovation of M achinery&E lectrical P roducts NOV.,2020
文章编号:1002-6673(2020)06-012-04
嵌入式系统中Modbus/TCP协议栈的设计和实现
柳青
(北京电子科技职业学院,北京100176)
摘要:为了能够在嵌入是系统中快速应用Moudbus/TCP协议,设计了直接运行于微处理器之上的mod-bus/TCP协议栈$实现了地址解析协议,TCP的网络连接建立和关闭,以及modbus应用层协议$最后在xilinx公司zynq-7020微处理器上进行协议栈的通信实验,采用Wireshark软件进行网络抓包,通过实验验证了该协议栈的正确性,请求应答响应延时小于1ms,具有较好的实时性$
关键词:Modbus/TCP;协议栈;嵌入式
中图分类号:G710文献标识码:A doi:10.3969/j.issn.1002-6673.2020.06.004
Design of Modbus/TCP Protocol Stack in Embedded System Innovation
LIU Qing
(Beijing Polytechnic,Beijing100176,China)
Abstract:In order to quickly apply the Moudbus/TCP protocol in embedded system,a Modbus/TCP protocol stack running directly on the microprocessor is designed.Implementing address resolution protocol,TCP network connection establishment and closing,and MODBUS application layer protocol.Finally, the protocol stack communication experiment is carried out on the zynq—7020microprocessor of Xilinx company,and Wireshark software is used to capture network packets.The correctness of the protocol stack is verified by the experiment.The response delay of request response is less than1ms,which has good real—time performance.
Keywords:Modbus/TCP;Protocol stack;Embedded
0引言
随着工业物联网、制造智能化进程的推进,嵌入式设备之间能够实现简单、可靠的通信成为自动化领域的实际需要。Modbus/TCP将Modbus协议嵌入到TCP协议的应用层,由于其具有开放的、标准的协议格式,广泛应用于工业通信)而TCP/IP协议结构庞大,嵌入式系统的存储计算资源有限,因此研究Modbus/TCP在嵌入式系统上的设计方法很有必要。
渠薇等设计了基于W5500的Modbus/TCP服务器叫这种方案需要采用专用的协议芯片完成TCP/IP协议解析,不仅使电路设计复杂,而且受限于外围芯片与处理器的通信带宽,会影响系统的整体性能)刘大千等提出了一种!C/OS实时操作系统、LWIP轻型协议栈和MODBUS 协议相结合的方法叫这种方案需要对操作系统和协议栈
修稿日期:2020-10-05
项目来源:北京电子科技职业学院人工智能与智能制造技术研发团队建设项目资助(2019—dkyjsyftd03)
作者简介:柳青(1987-),男,河北人,教师,工程师$研究方向机电一体化技术$进行移植,软件代码量较大,对系统的维护升级提出很大挑战。综合以上研究,设计了一种直接运行于微处理器上的,精简的Modbus/TCP协议栈,避免了设计专用电路和代码移植的工作,同时能够改善通信的实时性能。
1Modbus/TCP协议栈整体设计
Modbus/TCP协议底层以TCP/IP协议为基础,在桌面系统中,该协议由操作系统提供的套接字接口来实现,但是在嵌入式系统中,芯片驱动只包含
最底层的以太网接收、发送数据
的功能,所以需要构建TCP/IP
协议。另外,由于以太网数据包
中必须包含硬件MAC地址,所
以需要实现ARP协议叫
设计的协议栈整体流程如
图1所示,处理器不断从网卡
读取数据包,然后判断该数据
包是ARP数据还是IP数据,如
果是ARP数据,则对该数据包
进行地址解析;如果是IP数据
读数据包
匚开始J
图1Modbus/TCP协议栈
流程
12
•开发与创新•包,进一步判断是否是TCP数据包,最后判断是不是Mod-
bus协议数据,如果全部成立则进行Modbus协议解析。
2Modbus/TCP协议栈实现
2.1TCP协议
TCP协议是面向连接的协议,在数据通信之前,必须要建立连接,否则通信的双方不能交换数据;在通信结束之前也必须关闭连接,以便节省系统资源,并且保证下次通信连接能够正确建立。建立连接的过程称为“三次握手”,关闭连接的过程称为“四次挥手”叫通过判断TCP协议中的控制字字段来判断该报文是请求连接报文还是关闭连接报文&
在TCP协议解析中,会对SYN标志位和FIN标志位依次进行判断&如果数据包的SYN位为1,则表示该数据包为请求连接数据包,协议栈将返回ACK应答包,通知客户端本机已经准备好接收数据,客户端收到收到应答包后则通信连接完全建立,可以开始数据交换&如果FIN 标志位为1,则表示该数据包为关闭连接数据包,协议栈等待发送缓冲区为空时,返回ACK应答包,通知服务器可以断开连接,服务器收到应打包后,断开连接,数据交换终止&TCP协议解析代码如下所示:
int tcp(char*data,int tcp_len)
{
struct_tcp_*tcp=(struct_tcp_*)data;
if(tcp->ctrl&0x0002)//SYN
{
if((tcp->ctrl&0x0010)==0)//ack=0,说明要建立连接
{
tcp ip协议技术
tcp->ctrl=0x12;
else if(tcp->ctrl&0x0001)//FIN四次挥手
{
tcp->ctrl=0x11;
modbus_len=modbuf(tcp->data);
i
i
return0;
i
2.2Modbus协议
Modbus/TCP是以标准modbus作为用户层协议,modbus协议报文格式如下[5]:
MBAP报文头
功能码
数据
Modbus读寄存器功能字的代码实现如下所示:
int modbuf(char*data)
{
struct_modbuf_req_*req=(struct_modbuf_req_*)(data);
int len=0;
if(req->func_code==0x3)//read word
{
int reg_start=((req->start_addr_max)<<8)+req-> start_addr_min;
int reg_num=((req->reg_num_high)<<8)+req-> reg_num_low;
struct_modbuf_rep_*rep=(struct_modbuf_rep_*) (data);
for(int i=0;i<reg_num;i++)
{
rep->data[i*2]=(modbus_data[reg_start+i])>>8;
rep-fdata[i*2+1]=modbus_data[reg_start+i] &0xff;
i
int lenl=reg_num<<l;
int len0=len1+3;
rep->byte_len=len1;
rep->byte_len_max=len0>>8;
rep->byte_len_min=len0&0XFF;
len=len0+6;
else//处理数据
{
if((tcp->len_ctrl>>4)*4!=20)//tcp首部长度如果不是20则不处理
{
return0;
}
if(tcp->data[2]==0&&tcp->data+3]二二0)//modbu;
return len;
i
首先计算寄存器的其实地址,由于Modbus的数据顺序与内存存储顺序相反,因此地址的计算需要移位操作,然后用同样的方法计算寄存器数量+根据寄存器地址和数量可以计算出数据块在内存中的存储地址以及长度,将内存数据复制到数据包中,作为返回数据。最后再将实际读取的数据长度更新到协议中的长度字段中,作为数|据包长度返回到客户端&第106个数据包和第107个数
13
•开发与创新•
据包是一对Moubus/TCP请求应答数据,可以看出从请求到应答的时间间隔仅有132帖,说明该协议栈具有一定的实时性。
2.3ARP协议
客户端第一次向服务器请求连接或者数据的时候,客户端只知道服务器的IP地址,并不知道客户端的网卡设备硬件地址,因此主机需要将询问硬件地址的报文广播到网络上,具有匹配的IP地址的服务器会将自己的网卡地址添加到返回数据包中发送回客户端,客户端就得到了对应服务器的网卡地址,这个协议称为地址解析协议(arp),地址解析协议的数据类型字段为0x0608,当程序检查出数据包具有该种类型是,则跳转至地址解析函建了如图2所示的通信实验
平台。其中嵌入式板卡以
xilinx的zynq-7020为处理
器,其上运行了设计的协议
栈,IP设置为192.168.1.9%笔
记本电脑上运行测试程序,
IP设置为192.168.1.1,并采
用Wireshark软件进行抓包,扌
图2Modbus/TCP通信实验
平台
3所示%从图3中可以看出,第101个数据包为计算机发出的ARP请求包,询问IP地址为192.168.1.9的主机的MAC地址,第102个数据包是板卡返回的ARP应答包,报告了板卡的地址信息。第103个数据包为计算机发出
数中%地址解析协议源码如下:
int arp(struct_arp_*arp)
{
if(arp-〉arp_op??0x0100)
{
if(arp-〉arp_tpa??this_ip)
{
arp-〉arp_op?0x0200;
arp-〉arp_tpa?arp-〉arp_spa;
for(int i?0;i<6;i++)
arp-〉arp_thaFiG?arp-〉arp_sha[iG;
arp-〉arp_spa?this_ip;
for(int i?0;i<6;i++)
arp-〉arp_shaFiG?this_mac[iG;
for(int i?0;i<6;i++)
{
eth-〉KesFiG?arp-〉arp_tha[iG;
eth-〉srcFiG?arp-〉arp_sha[iG;
的TCP建立连接请求,第104个数据包为板卡返回的请求应当,第105个数据包为计算机对应答的确认,至此:TCP连接建立完成%从第105个数据包开始,计算机和板|卡开始利用Modbus/TCP协议进行数据交互%
图3Wireshark抓包数据
4结论
通过详细分析TCP/IP协议和Modbus协议规范,并在此基础上设计了Modbus/TCP协议栈,实现了ARP地址解析协议,最后将设计的协议栈代码在xilinx微处理器上运行,与计算机进行通信实验%实验表明,协议栈能够与计算机进行数据交换,应答时间小于1ms,实时性较好%
首先判断该数据包的Message Type字段是不是类型
1,类型1代表该数据包为地址请求操作,进而判断该数据包的目的IP地址是否与本地IP地址一致,如果一致则说明该数据包即为请求本地IP的网卡地址,本地机需要对该数据包进行相应%此时协议栈需要组装响应报文,将报文的MessegeType字段设置为类型2,表示返回数据包为ARP响应包;之后将源IP和源MAC地址均设置为本地地址,目标地址则利用请求包中的源地址%
3Modbus/TCP通信实验参考文献:
[1]渠薇,韩宗平,等•一种基于W5500的ModbusTCP服务器系统设
计[J]•江苏理工学院学报,2018,4.
[2]刘大千,刘振杰.MODBUS/TCP数据采集接口模块的设计[J].工
业仪表与自动化装置,2015,6.
⑶徐宇杰.TCP/IP协议深入分析[M].北京:清华大学出版社,2009.
⑷金青,戴胜华,等.基于Modbus/TCP的工业以太网通信[J].仪器仪
表标准化与计量,2016,1.
⑸俞野秋,陈坚.Modbus和Modbus-TCP协议转换研究[J].仪表技
术,2013,1.
为了验证所设计的modbus/TCP协议栈的正确性,搭
14

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。