Modbus TCP协议的研究与应用
2019-04-27李煦侃
李煦侃
摘 要:随着现场总线技术和工业以太网技术的快速发展,工业自动化领域的通信网络正在逐步统一到工业以太网。Modbus/TCP是工业以太网技术中最有发展前景的一种,在工业自动化领域具有很高的应用价值。该文简要概述了工业以太网和Modbus/TCP的历史与现状,以及Modbus协议的基本内容,并阐述了Modbus/TCP客户端的发送、接收应用,对提升我国工业自动化企业的自动化水平、提高企业综合竞争力、加快企业信息化建设等方面都具有现实的意义。
关键词:现场总线 工业以太网 Modbus协议 Modbus/TCP客户端 Modbus/TCP报文
中图分类号:TP273 文献标识码:A 文章编号:1672-3791(2019)01(b)-0-04
Abstract:With the rapid development of fieldbus technology and industrial Ethernet technology, the communication network in the field of industrial automation is gradually unifying to industrial Ethernet. Modbus/TCP is one of the most promising industrial Ethernet technologies and has high application value in the field of industrial automation. This paper briefly summarizes the history and current status of Industrial Ethernet and Modbus/TCP, as well as the basic content of Modbus protocol, and expounds the transmission and receiving applications of Modbus/TCP client, which improves the automation level of industrial automation enterprises in China and improves the comprehensive competition of enterprises. It is of practical significance to accelerate and accelerate the construction of enterprise information.
Key Words:Fieldbus; Indusntrial Ethernet; Modbus Protocal; Modbus/TCP Client; Modbus/TCP Message
隨着现场总线技术和工业以太网技术的快速发展,以及关键问题的突破,使得工业自动化领域的通信网络正在逐步统一到工业以太网。
Modbus/TCP是工业以太网技术中最有发展前景的一种。Modbus主从式通信机制能很好地满足确定性的要求,与互联网的客户机/服务器通信机理相对应。
Modbus通过与TCP/IP相结合,在TCP帧中嵌入Modbus信息帧,在工业自动化领域具有很高的性价比,是一种真正开放的理想解决方案,试验表明了它的有效性,应用案例己证明了它在实际应用中的价值。
1 工业以太网
随着现场总线技术和工业以太网技术的快速发展,以及关键技术的突破进展,使得工业自动化领域控制级以上的通信网络正在逐步统一到工业以太网。嵌入式技术的快速发展使得以太网进入工控领域成为可能,而以太网技术的不断发展很大程度上解决了以太网成为工业控制网络的实时性问题。所谓工业以太网,一般来讲其在技术上与商用以太网(即IEEE802.3)兼容,但在产品设计时,在材质选用、产品强度、适用性以及实时性、可互操作性、可靠性、抗干扰性和本质安全等方面能满足工业现场环境的要求。按照国际电工委员会IEC SC65C的定义,工业以太网是指用于工业自动化环境、符合IEEE802.3标准、按照IEEE802.1D媒体访问控制网桥规范和IEEE802.IQ局域网虚拟网桥规范、对其没有进行任何实时扩展而实现的以太网络[1]。通过采用减轻以太网符合、提高网络速度、采用交换式以太网和全双工通信、采用信息优先级和流量控制以及虚拟局域网等技术,目前为止可以将工业以太网的实时响应时间做到5~10ms,相当于现有的现场总线。工业以太网作为一种新兴、统一、快速发展的标准,己经在工业企业综合自动化系统中的资源管理层、执行制造层得到了广泛应用,同时已呈现出向下延伸直接应用于工业控制现场的趋势。
2 Modbus/TCP的历史与现状
Modbus协议原为美国Modicon公司PLC产品通信协议,后来由于其使用十分广泛,由Modbus组织于2002年发展延伸为Modbus TCP/IP规范[2]。Modbus对于分布式自动化解决方案的未来很重要。通过Modbus协议,控制器相互之间、控制器经由网络(如以太网)和其他设备之间可以通信。它是一个标准的、真正开放的、在工业自动化领域应用最广泛的网络通讯协议,SCADA和HMI软件可以通过Modbus协议非常方便地与串行设备集成到一起。
Modbus/TCP协议是Modbus协议的另一版本,于1999年由施耐德公司推出,以一种非常简单的方式将Modbus帧嵌入到TCP帧中,使Modbus与以太网和TCP/IP结合,成为Modbus TCP/IP[3]。Modbus/TCP和它的一个配套协议RTPS一起,作为实时工业以太网协议簇,被提交给IEC SC65C。
Modbus/TCP已经成为世界领先的工业以太网协议。Modbus/TCP协议的开放性及用户对它的熟悉程度再加上其应用的简单易学,是Modbus/TCP在当今市场中获得成功的关键。Modbus协议的串行链路版本已经在市场上长期占有主导地位,并且己有大量的网关产品可以实现串行链路Modbus和Modbus/TCP之间的桥接。
3 Modbus/TCP的通信协议
3.1 Modbus的通信协议简介
Modbus协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。
当在一个Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其他网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。
3.2 Modbus/TCP的通信结构模型
Modbus/TCP的通信系统可以包括不同类型的设备。所有连接到Modbus/TCP通讯网络的设备都通过Modbus事务报文来实现Modbus客户端和服务器端之间的通讯任务。而Modbus客户端和服务器TCP/IP网关则实现了将在串行链路上的Modbus通讯设备连入到Modbus/TCP通讯网络。如图1所示。
3.3 Modbus/TCP应用数据单元
Modbus协议定义了一个与底层通信协议无关的简单协议数据单元(PDU)。特定总线或网络上的Modbus協议映射能够在应用数据单元上引入附加域。启动Modbus事务处理的客户端建立Modbus应用数据单元,服务器接收应用数据单元并根据功能码执行相应的动作。其在串行链路上的应用数据单元如图2所示。
Modbus在TCP/IP上使用专用报文头识别Modbus应用数据单元。这种报文头称为MBAP报文头。Modbus在TCP/IP网络上的应用数据单元如图3所示。
4 Modbus/TCP客户端的发送、接收应用
4.1 常用Modbus/TCP功能码
读线圈:0x02(输入)、0x01(输出);
写线圈:0x0f(输出);
读寄存器:0x04(输入)、0x03(输出);
写寄存器:0x10(输出);
说明:一般线圈用于开关量、寄存器用于模拟量。
4.2 读线圈的Modbus/TCP发送包格式以及返回包格式
4.2.1 Modbus/TCP发送包格式
[0][0][0][0][0][包长度][设备号][功能码][初始线圈高八位][初始线圈低八位][读取线圈数高八位][读取线圈数低八位]
说明:每个[]内代表2位16进制整型数,转换为二进制是8bit;一个[]可以称为一个功能位。
[0][0][0][0][0]:约定为该套接字连接发送Modbus包的数量,例如发送第一个Modbus包时为[1][0][0][0][0],发送第十五个Modbus包时为[F][0][0][0][0],发送第十六个Modbus包时为[0][1][0][0][0],不必考虑清零。
[包长度]:该功能位标明Modbus包在该位之后的字节数。
[设备号]:每个Modbus设备的编号,通常从1到31依次编号。
[功能码]:使用方法参见5.1,这里用功能码0x02。
[初始线圈高八位]、[初始线圈低八位]、[读取线圈数高八位]、[读取线圈数低八位]各功能位意义与字面意思一致。
4.2.2 Modbus/TCP返回包格式
[0][0][0][0][0][包长度][设备号][功能码][返回的数据长度][返回数据1][返回数据2]……[返回数据n]
说明:每个[]内代表2位16进制整型数,转换为二进制是8bit;一个[]可以称为一个功能位。
[0][0][0][0][0]:约定为该套接字连接发送Modbus包的数量,例如发送第一个Modbus包时为[1][0][0][0][0],发送第十五个Modbus包时为[F][0][0][0][0],发送第十六个Modbus包时为[0][1][0][0][0],不必考虑清零。
[包长度]:该功能位标明Modbus包在该位之后的字节数。
[设备号]:同发送包的设备号。
[功能码]:同发送包的功能码。
[返回的数据长度]:该功能位标明该位之后数据位的长度。
[返回数据1]:即读取的数据。
……
[返回数据n]:即读取的数据。
4.3 写线圈的Modbus/TCP发送包格式以及返回包格式
4.3.1 Modbus/TCP发送包格式
[0][0][0][0][0][包长度][设备号][功能码][初始线圈高八位][初始线圈低八位][写入线圈数高八位][写入线圈数低八位][写入的数据长度][写入数据1] [写入数据2]……[写入数据n]
说明:每个[]内代表2位16进制整型数,转换为二进制是8bit;一个[]可以称为一个功能位。
[0][0][0][0][0]:约定为该套接字连接发送Modbus包的数量,例如发送第一个Modbus包时为[1][0][0][0][0],发送第十五个Modbus包时为[F][0][0][0][0],发送第十六个Modbus包时为[0][1][0][0][0],不必考虑清零。
[包长度]:该功能位标明Modbus包在该位之后的字节数。
[设备号]:每个Modbus设备的编号,通常从1到31依次编号。
[功能码]:使用方法参见5.1,这里用功能码0x0f。
[初始线圈高八位]、[初始线圈低八位]、[写入线圈数高八位]、[写入线圈数低八位]各功能位意义与字面意思一致。
[写入的数据长度]:该功能位标明该位之后数据位的长度。
[写入数据1]:包含写入的数据。
……
[写入数据n]:包含写入的数据。
4.3.2 Modbus/TCP返回包格式
接收返回的Modbus/TCP包格式和发送包格式类似,但是没有[寫入的数据长度] [数据1] [数据2]……[数据n]功能位。
4.4 读寄存器的Modbus/TCP发送包格式以及返回包格式
4.4.1 Modbus/TCP发送包格式
[0][0][0][0][0][包长度][设备号][功能码][初始寄存器高八位][初始寄存器低八位][读取寄存器数高八位][读取寄存器数低八位]
说明:每个[]内代表2位16进制整型数,转换为二进制是8bit;一个[]可以称为一个功能位。
[0][0][0][0][0]:约定为该套接字连接发送Modbus包的数量,例如发送第一个Modbus包时为[1][0][0][0][0],发送第十五个Modbus包时为[F][0][0][0][0],发送第十六个Modbus包时为[0][1][0][0][0],不必考虑清零。
[包长度]:该功能位标明Modbus包在该位之后的字节数。
[设备号]:每个Modbus设备的编号,通常从1到31依次编号。
[功能码]:使用方法参见5.1,这里用功能码0x04。
[初始寄存器高八位]、[初始寄存器低八位]、[读取寄存器数高八位]、[读取寄存器数低八位]各功能位意义与字面意思一致。
4.4.2 Modbus/TCP返回包格式
[0][0][0][0][0][包长度][设备号][功能码][返回的数据长度][ 返回数据1高八位][返回数据1低八位][ 返回数据2高八位][ 返回数据2低八位]……[返回数据n高八位][ 返回数据n低八位]
说明:每个[]内代表2位16进制整型数,转换为二进制是8bit;一个[]可以称为一个功能位。
[0][0][0][0][0]:约定为该套接字连接发送Modbus包的数量,例如发送第一个Modbus包时为[1][0][0][0][0],发送第十五个Modbus包时为[F][0][0][0][0],发送第十六个Modbus包时为[0][1][0][0][0],不必考虑清零。
[包长度]:该功能位标明Modbus包在该位之后的字节数。
[设备号]:同发送包的设备号。
[功能码]:同发送包的功能码。
[返回的数据长度]:该功能位标明该位之后数据位的长度。
[数据1高八位][数据1低八位][数据2高八位][数据2低八位]……[数据n高八位][数据n低八位]各功能位意义与字面意思一致。
4.5 写寄存器的Modbus/TCP发送包格式以及返回包格式
4.5.1 Modbus/TCP发送包格式
[0][0][0][0][0][包长度][设备号][功能码][初始寄存器高八位][初始寄存器低八位][写入寄存器数高八位][写入寄存器数低八位][写入的数据长度][写入数据1高八位] [写入数据1低八位] [写入数据2高八位] [写入数据2低八位]……[写入数据n高八位][ 写入数据n低八位]
说明:每个[]内代表2位16进制整型数,转换为二进制是8bit;一个[]可以称为一个功能位。
[0][0][0][0][0]:约定为该套接字连接发送Modbus包的数量,例如发送第一个Modbus包时为[1][0][0][0][0],发送第十五个Modbus包时为[F][0][0][0][0],发送第十六个Modbus包时为[0][1][0][0][0],不必考虑清零。
[包长度]:该功能位标明Modbus包在该位之后的字节数。
[设备号]:每个Modbus设备的编号,通常从1到31依次编号。
[功能码]:使用方法参见5.1,这里用功能码0x10。
[初始寄存器高八位]、[初始寄存器低八位]、[写入寄存器数高八位]、[写入寄存器数低八位]各功能位意义与字面意思一致。
[写入的数据长度]:该功能位标明该位之后数据位的长度。
[写入数据1高八位] [写入数据1低八位] [写入数据2高八位] [写入数据2低八位]……[写入数据n高八位][ 写入数据n低八位]各功能位意义与字面意思一致。
4.5.2 Modbus/TCP返回包格式
接收到返回的Modbus/TCP包格式和发送包格式类似,但是没有[数据1高八位] [数据1低八位] [数据2高八位] [数据2低八位]……[数据n高八位][数据n低八位]功能位。
5 结语
Modbus/TCP协议是工业以太网技术最有发展前景的一种,研究和探讨Modbus/TCP工业以太网技术及其在我国工业自动化的应用对提升我国工业自动化企业的自动化水平、提高企业综合竞争力、加快企业信息化建设和打破国际垄断等方面都具有现实的意义。
参考文献
[1] 佚名.工业以太网协助工厂向工业4.0时代过渡[J].智慧工厂,2018(10):20-21.
[2] 张玉鹏,温蜜,李婧,等.面向Modbus的安全认证通信机制分析[J].上海电力学院学报,2017,33(4):372-377.
[3] 赵艳领,韩丹涛,闫晓风.一种嵌入式KNX-Modbus TCP网关的实现方法[J].智能建筑与智慧城市,2016(7):66-68.