APP下载

嵌入式系统中Modbus/TCP 协议栈的设计和实现

2020-12-22

机电产品开发与创新 2020年6期
关键词:网卡数据包嵌入式

柳 青

(北京电子科技职业学院, 北京 100176)

0 引言

随着工业物联网、制造智能化进程的推进,嵌入式设备之间能够实现简单、 可靠的通信成为自动化领域的实际需要。 Modbus/TCP 将Modbus 协议嵌入到TCP 协议的应用层,由于其具有开放的、标准的协议格式,广泛应用于工业通信。 而TCP/IP 协议结构庞大,嵌入式系统的存储计算资源有限,因此研究Modbus/TCP 在嵌入式系统上的设计方法很有必要。

渠薇等设计了基于W5500 的Modbus/TCP 服务器[1],这种方案需要采用专用的协议芯片完成TCP/IP 协议解析,不仅使电路设计复杂,而且受限于外围芯片与处理器的通信带宽,会影响系统的整体性能。刘大千等提出了一种μC / OS 实时操作系统、LWIP 轻型协议栈和MODBUS协议相结合的方法[2],这种方案需要对操作系统和协议栈进行移植,软件代码量较大,对系统的维护升级提出很大挑战。 综合以上研究,设计了一种直接运行于微处理器上的,精简的Modbus/TCP 协议栈,避免了设计专用电路和代码移植的工作,同时能够改善通信的实时性能。

1 Modbus /TCP 协议栈整体设计

Modbus/TCP 协议底层以TCP/IP 协议为基础,在桌面系统中,该协议由操作系统提供的套接字接口来实现,但是在嵌入式系统中,芯片驱动只包含最底层的以太网接收、发送数据的功能, 所以需要构建TCP/IP协议。 另外,由于以太网数据包中必须包含硬件MAC 地址,所以需要实现ARP 协议[3]。

设计的协议栈整体流程如图1 所示, 处理器不断从网卡读取数据包, 然后判断该数据包是ARP 数据还是IP 数据,如果是ARP 数据,则对该数据包进行地址解析;如果是IP 数据包,进一步判断是否是TCP 数据包,最后判断是不是Modbus 协议数据,如果全部成立则进行Modbus 协议解析。

图1 Modbus/TCP 协议栈流程

2 Modbus/TCP 协议栈实现

2.1 TCP 协议

TCP 协议是面向连接的协议,在数据通信之前,必须要建立连接,否则通信的双方不能交换数据;在通信结束之前也必须关闭连接,以便节省系统资源,并且保证下次通信连接能够正确建立。 建立连接的过程称为 “三次握手”,关闭连接的过程称为“四次挥手”[4]。通过判断TCP 协议中的控制字字段来判断该报文是请求连接报文还是关闭连接报文。

在TCP 协议解析中,会对SYN 标志位和FIN 标志位依次进行判断。如果数据包的SYN 位为1,则表示该数据包为请求连接数据包,协议栈将返回ACK 应答包,通知客户端本机已经准备好接收数据, 客户端收到收到应答包后则通信连接完全建立,可以开始数据交换。 如果FIN标志位为1,则表示该数据包为关闭连接数据包,协议栈等待发送缓冲区为空时,返回ACK 应答包,通知服务器可以断开连接,服务器收到应打包后,断开连接,数据交换终止。 TCP 协议解析代码如下所示:

2.2 Modbus 协议

Modbus/TCP 是以标准modbus 作为用户层协议,modbus 协议报文格式如下[5]:

首先计算寄存器的其实地址,由于Modbus 的数据顺序与内存存储顺序相反,因此地址的计算需要移位操作,然后用同样的方法计算寄存器数量。 根据寄存器地址和数量可以计算出数据块在内存中的存储地址以及长度,将内存数据复制到数据包中,作为返回数据。最后再将实际读取的数据长度更新到协议中的长度字段中, 作为数据包长度返回到客户端。 第106 个数据包和第107 个数据包是一对Moubus/TCP 请求应答数据,可以看出从请求到应答的时间间隔仅有132μs, 说明该协议栈具有一定的实时性。

2.3 ARP 协议

客户端第一次向服务器请求连接或者数据的时候,客户端只知道服务器的IP 地址,并不知道客户端的网卡设备硬件地址, 因此主机需要将询问硬件地址的报文广播到网络上,具有匹配的IP 地址的服务器会将自己的网卡地址添加到返回数据包中发送回客户端, 客户端就得到了对应服务器的网卡地址, 这个协议称为地址解析协议(arp),地址解析协议的数据类型字段为0x0608,当程序检查出数据包具有该种类型是, 则跳转至地址解析函数中。 地址解析协议源码如下:

首先判断该数据包的Message Type 字段是不是类型1,类型1 代表该数据包为地址请求操作,进而判断该数据包的目的IP 地址是否与本地IP 地址一致, 如果一致则说明该数据包即为请求本地IP 的网卡地址,本地机需要对该数据包进行相应。此时协议栈需要组装响应报文,将报文的Messege Type 字段设置为类型2, 表示返回数据包为ARP 响应包;之后将源IP 和源MAC 地址均设置为本地地址,目标地址则利用请求包中的源地址。

3 Modbus/TCP 通信实验

为了验证所设计的modbus/TCP 协议栈的正确性,搭建了如图2 所示的通信实验平台。 其中嵌入式板卡以xilinx 的zynq-7020 为 处 理器, 其上运行了设计的协议栈,IP 设置为192.168.1.9。笔记本电脑上运行测试程序,IP 设置为192.168.1.1, 并采用Wireshark 软件进行抓包,抓取的数据包如图3 所示。

从图3 中可以看出, 第101 个数据包为计算机发出的ARP 请求包, 询问IP 地址为192.168.1.9 的主机的MAC 地址, 第102 个数据包是板卡返回的ARP 应答包,报告了板卡的地址信息。 第103 个数据包为计算机发出的TCP 建立连接请求, 第104 个数据包为板卡返回的请求应当, 第105 个数据包为计算机对应答的确认, 至此TCP 连接建立完成。 从第105 个数据包开始,计算机和板卡开始利用Modbus/TCP 协议进行数据交互。

图2 Modbus/TCP 通信实验平台

图3 Wireshark 抓包数据

4 结论

通过详细分析TCP/IP 协议和Modbus 协议规范,并在此基础上设计了Modbus/TCP 协议栈,实现了ARP 地址解析协议,最后将设计的协议栈代码在xilinx 微处理器上运行,与计算机进行通信实验。 实验表明,协议栈能够与计算机进行数据交换,应答时间小于1ms,实时性较好。

猜你喜欢

网卡数据包嵌入式
二维隐蔽时间信道构建的研究*
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
民用飞机飞行模拟机数据包试飞任务优化结合方法研究
部署Linux虚拟机出现的网络故障
TS系列红外传感器在嵌入式控制系统中的应用
Server 2016网卡组合模式
C#串口高效可靠的接收方案设计
搭建基于Qt的嵌入式开发平台
挑战Killer网卡Realtek网游专用Dragon网卡
倍福 CX8091嵌入式控制器