1、*民办高等学校品牌专业建设(计科)(ZLG01903)资助工业以太网作为一种高效的局域网络是现代工厂信息化的基础,也是工业4.0的核心1。以太网技术当前发展迅速,以高效低成本优势,并逐渐形成工业以太网技术,在以太网TCP帧中嵌入Modbus信息帧形成Modbus TCP/IP协议,利用网络传输Modbus协议报文2,相较串行通信,它具有侦错能力强、数据传输量大、实时性好、通信距离长、稳定性好、开放性好等特点,在工控领域和工业以太网上被广泛应用3-4。在我国Mod-bus TCP/IP已经成为工业标准,本文主要介绍如何在自己开发的嵌入式仪表中实现Modbus TCP/IP服务器程序和如何开发Mo
2、dbus客户端程序,实现二者之间的高效、稳定数据传输5。1以太网帧格式及TCP/IP传输模型在以太网中实现的Modbus协议是应用层的协议,在以太网TCP帧中嵌入Modbus信息帧就形成Modbus TCP/IP协议。首先要了解以太网帧格式及其数据是如何在TCP/IP模型上进行传输的。以太网帧格式如图1所示:图1以太网帧格式TCP/IP传输模型以TCP协议为例,如图2所示:图2TCP/IP传输模型这个传输模型是以TCP协议为例来说明发送方的数据封装过程,在接收方是按照反方向进行数据解包的过程。在这四个层中,开发人员需要实现工作就是在应用层实现Modbus协议,而其他各层的实现由操作系统的TCP
3、/IP协议栈自动完成。2Modbus TCP/IP协议Modbus TCP/IP协议是应用层的协议,在TCP/IP传输模型的应用层实现,采用服务器客户端模式,其实现需要设备连接在一个Ethernet(以太网)TCP/IP网络上。其模型如图3所示:图3Modbus服务器/客户端模型模型中请求是客户端发送启动事务处理;指示是服务器接收事务处理;响应是服务器发送响应信息;确认是客户端接收响应信息6。Modbus TCP/IP通信可以连接不同的类型设备,通讯设备有连接至TCP/IP网络的客户机和服务器等相关设备以及互联的网桥、路由器或网关7。包括:连接至TCP/IP网络的ModbusTCP/IP客户机
4、和服务器设备;互连设备,例如:在TCP/IP网络和串行链路子网之间互连的网桥、路由器或网关联接,该子网允许将Modbus串行链路客户机和服务器终端设备连接起来8。Modbus TCP/IP协议的数据帧包括MBAP报文头、功能码和数据三部分组成。它不需要CRC或者LRC校验9,差错校验在以太网帧中做FCS校验,其帧格式如图4所示。其中MBAP报文头(Modbus Application Protocol Header)是TCP/IP专Modbus TCP/IP 协议的客户端与服务器实现*史亚平(黄河科技学院,河南 郑州450006)Implementation of Client/Server
5、Based on Modbus TCP/IP Protocol摘要:针对工业以太网通信在自动化控制系统中应用,介绍了Modbus TCP/IP传输协议,提出了如何在自动化仪表中利用套接字实现Modbus TCP/IP协议,给出了在ARM9实验板上实现Modbus TCP/IP服务器和电脑上实现客户端的方法和实例,并详细介绍了程序的软件流程图。调试结果表明,该服务器/客户端可以有效地进行数据传输,为研发人员对仪表实现Modbus TCP/IP协议提供了方法,并有效促进了Modbus TCP/IP在自动化仪表中的应用。关键词:Modbus;TCP/IP协议;套接字;客户端;服务器Abstract:
6、According to the application of industrial Ethernet communication in automation control system,this paper in-troduces the Modbus TCP/IP transport protocol,presents how to use Sockets to realize the Modbus TCP/IP protocol in in-struments,and gives a way and an example to implement Modbus TCP/IP serve
7、r on ARM platform and the client on acomputer,and the software flow chart system is described in detail of the program.Results of debug show that the server/client can be effective for data transmission,it provides a way for developers to implement Modbus TCP/IP protocol in in-struments,and it effec
8、tively promotes the application of the protocol in automatic instrument.Keywords:Modbus,TCP/IP Protocol,Socket,client,server图4Modbus TCP/IP帧格式Modbus TCP/IP协议的客户端与服务器实现54工业控制计算机2023年第36卷第2期用的报文头,用来识别Modbus应用数据单元。MBAP头共有7个字节,其格式说明如图5所示:图5MBAP报文头格式其中单元事务标识符是Modbus请求/响应事务处理的识别码;协议表示符为0代表Modbus协议;长度代表后续字
9、节总和;单元标识符代表设备地址。以一个具体的Modbus帧格式实例来说,例如要以0的偏移从UI 0读取读取1寄存器,返回的数值为3124,那么客户端发送:00 00 0000 00 06 00 03 00 00 00 01,服务器响应:0000 00 00 00 05 00 03 02 0C 34,其中客户端发送00 00 0000 00 06 00代表MBAP头,03代表读保持寄存器,00 00是寄存器的地址,00 01代表读取一个字节。服务器端响应:00 0000 00 00 05 00代表MBAP头,03代表读保持寄存器,02代表返回字节数,0C 34代表返回的数据,转换成十进制是312
10、4。3Modbus TCP/IP服务器和客户端的实现服务器端就是自己开发的仪表,客户端一般指的是电脑上用VC 6.0或者其他开发工具开发的软件10。在TCP/IP通信中,服务器和客户端的实现是基于BSD(伯克利软件分配代码)套接字实现的,当然有些TCP/IP栈可能使用其他类型的接口。本文中服务器和客户端的实现是基于BSD套接字接口的。套接字是通信中的基本组成块,通过套接字发送和接收数据来执行一个Modbus通信。TCP/IP库提供了使用TCP和基于连接的流式套接字,而Modbus TCP/IP通信就是使用这个流式套接字。由于通信采用服务器/客户机模式是主从请求方式,服务器端要先启动,并根据请求
11、提供相应的服务11。一个典型的基于TCP/IP服务器客户端的Socket编程流程图如图6所示:图6Socket编程模型在Modbus TCP/IP通信中,服务器端初始化建立Socket,绑定服务器地址和TCP 502端口连接并监听;客户端也要初始化建立Socket,建立连接并与服务器端进行通信;当服务器端接收到客户端的请求时,服务器端进行帧的判断,如果接收的MBAP报头正确则读完报文,并对协议类型值0判断,只有协议类型正确才对请求帧进行下一步操作,否则直接丢弃报文。接着对功能代码分析,不同的功能代码执行不同的操作,在通信中,可以进行超时判断处理,错误处理等操作以提高系统的可靠性和实时性。本文服
12、务器选择ARM9实验板,在这个实验板中实现Linux操作系统,在应用层编程实现Modbus协议服务器,客户端为电脑,开发板服务器IP为172.18.171.250,客户机IP为172.18.171.25。本文说明如何建立服务器和客户端,服务器端采用C程序实现,客户端使用VC+6.0来实现。服务器端程序流程图如图7所示。其中接收帧判断处理函数就是判断接收过来的帧的功能代码:如果是03读保持寄存器的值,那么就对响应的数据做处理,处理完了之后发送响应数据;如果是05强制单个线圈,那么就对响应的数据处理,处理完了之后发送响应数据等。客户端程序流程图如图8所示。其中的处理显示数据就是判断接收过来的数据功
13、能码是否正确,正确则处理并显示所需要的数据。具体实现在程序测试部分详细说明。4服务器客户端程序测试服务器端和客户端程序编程完后就要对其调试,在服务器端首先启动,然后打开客户机软件。服务器端运行如图9所示,客户端运行如图10所示。图9服务器端的运行情况说明:服务器ARM9端运行后在等待,如果客户机也运行,则打印出客户机的请求信息,同时由于客户端发送请求代码00 0000 00 00 06 00 03 00 00 00 02(由客户端打印信息可以看出),此时服务器端也打印出客户机请求的寄存器地址regNo=0,寄存器数量regCount=2,然后服务器再把保持寄存器的值打印出来bi=0,bi+1=
14、193,后边的两个bi=0,bi+1=0,是由于客户读取两个寄存器的值,而本程序的服务器里面仅设置了返回温度这个值,第二个值程序里没有给出连接,所以是0。193就是ARM板上ds18b20的温度值的10倍,温度值是19.3,然后发送给客户端,客户端收到后打印出收到的信息帧,ibuf=00 00图8客户端程序流程图图7服务器端程序流程图5500 00 00 07 00 03 04 00 193并提取转换最后需要的数值打印出来word 0=193,这个就是客户机读取保持寄存器的结果为193,转换后温度值为19.3,本程序重在说明协议通信的实现性,所以服务器和客户端程序都没有在内部做温度10倍的转换
15、。以上运行情况可以看出,服务器端的温度数值成功地通过以太网Modbus协议传送到了客户端并显示。为了进一步验证通信的正确性,使用Ethereal网络分析软件进行数据包帧的抓取12,查看Modbus TCP/IP通信情况是否与程序调试相符合。抓取的客户端发送的帧如图11所示,服务器响应帧如图12所示:图11客户端发送帧图12服务器端响应帧这里TCP/IP帧格式具体详情分析见参考文献7。从图11、图12中可以看到,发送的帧最后的12个字节为00 00 00 0000 06 00 03 00 00 00 02即为Modbus请求的报文,它表示从寄存器0地址开始读取2个数据。可以看到Modbus响应的
16、报文最后11个字节为00 0000 00 00 07 00 03 04 00 C1 00 00;其中07代表后续有7个字节,03代表读保持寄存器,04代表四个字节,00 C1和00 00则为要读取的数据,00C1其十进制为193,00 00十进制 就 是0。在 服 务 器 程 序 中 设 置 的 返 回 值 前 两 个 字 节 为ds18b20温度值的10倍,则表明返回值正确。后两个字节没有设置,所以为0。从图11、图12中也可以看到软件自动检测出了此次Modbus TCP/IP通信协议、端口号响应等信息。5结束语本文利用ARM9实验板和电脑成功实现了Modbus TCP/IP服务器和客户端,成功将ARM9开发板上DS18b20温度的数据通过以太网Modbus协议传送的电脑客户端,为ModbusTCP/IP通信的实现提供了实例。如果要在ARM+Linux操作系统的仪表中实现Modbus TCP/IP服务器,则可以在嵌入式Linux应用程序中使用套接字编写实现的Modbus TCP/IP协议,这个具有通用性和较好的扩展性。因此,本文对ModbusTCP/IP通信的实现与实时性有很重要的应