1、相关概念
1.1 Modbus
Modbus是一种广泛应用于工业自动化领域的通信协议, Modbus提供了通用的语言在设备之间建立主从式的通信,Modbus协议简单、开放、易于实现,且支持多种物理层通信介质(RS232、RS485、TCP/IP网络等),因此成为了工业领域通信协议的业界标准之一。我们今天要介绍的是一种基于以太网TCP/IP的应用层协议——Modbus TCP/IP协议。
1.2 Modbus TCP
Modbus TCP是Modbus协议在以太网上的一种实现,它保留了Modbus协议的核心功能和数据模型,但对消息封装进行了调整,使其符合TCP/IP的要求。在进行下一步之前我们首先对Modbus中的一些概念做一个了解。
1.3存储区
存储的数据类型分为布尔量和寄存器
1.3.1布尔量
如水阀的开关、灯的开关等数据。
1.3.2寄存器
如流速、导电率、温湿度、空气浓度等数据。
Modbus规定了4个存储区,分别是0、1、3、4,对应下面表格内容,具体为:
0区:可读可写的布尔量
1区:只读布尔量
3区:只读寄存器
4区:可读可写的寄存器
1.4功能码
Modbus定义了一系列的功能码,这些功能码表示了主站请求从站执行的具体操作,下面表格是一些常见的功能码,具体为:
1.4.1读操作
0x01:读输出线圈状态。
0x02:读输入线圈状态。
0x03:读输出寄存器的值。
0x04:读输入寄存器的值。
1.4.2写操作
0x05:写单个线圈状态。
0x06:写单个寄存器的值。
0x0F:写多个线圈状态。
0x10:写多个寄存器的值。
1.5 协议报文
Modbus TCP/IP的报文被封装在一个标准的TCP数据段内,而不是像串行通信那样直接在物理层上发送。TCP报文提供了端到端的可靠传输,包括数据分段、重传、流量控制和拥塞控制等机制。
Modbus TCP/IP的报文帧主要包括:
MBAP头:包含事务标识符、协议标识符、消息长度、设备地址
Modbus PDU:原始Modbus协议的数据部分,包括功能码、数据地址和数据值。
下面我们用一个表格来根据一段报文解释这两部分的具体内容:
主站发送报文:
从站响应报文:
从上面的报文中我们可以知道:
事务标识符:占2个字节,一次通信的过程中主站和从站的报文帧的事务标识符是一致的。
协议标识符:占2个字节,00 00表示Modbus TCP协议。
后面报文的长度:占2个字节,表示后面报文的长度。
从站地址:占1个字节,表示设备的地址,也就是Salve ID的值。
功能码:占1个字节,例子中的03表示的是读输出寄存器的值。
起始地址:占2个字节,表示从该设备的哪个位置开始读。
读取数量:占2个字节,表示从起始位置往后读的数量。
长度:占2个字节,表示后面还报文的长度。
对应的值:根据不同的存储类型所占的字节不同。
接下来我们通过工具来模拟Modbus TCP通讯。
2、工具使用
2.1 Modbus Slave
打开软件之后点击菜单栏的Connection→Connect,如图所示:
在弹出的界面选择协议类型为Modbus TCP/IP,输入IP,端口号点击OK
随后点击Setup→Slave Definition...进入从站设置界面
下面我们新建四个不同存储区的窗口来为后面模拟通讯做准备
根据图中任意方式都可以新建窗口。
可以看到四个窗口在从站地址为2,功能码分别为01、02、03、04。
需要注意的是01、02表示的是读输出线圈和输入线圈,只有开关量,对应的数值为1=On,0=Off。
03、04表示的是读输出寄存器和输入寄存器。
好了,接下来我们去使用工具模拟主站来读取从站的数据。在此之前我们可以勾选Auto increment模拟数据处于变化状态。
2.2 Modbus Poll
使用和从站相同的方法连接之后新建四个窗口分别读取,可以看到读取实时数据成功。
也可以通过查看日志确保主机处于正常读取状态。
下面我们通过使用modbus-master-tcp模拟一个主站去和从站之间进行通信。
3、Java模拟主站
3.1使用modbus-master-tcp库
modbus-master-tcp是基于Netty编写,支持异步与并发。
下面通过Java模拟主站读取从站线圈状态:
输出结果:
4、总结
上述内容就是对Modbus通信协议的介绍及通过工具和代码模拟主站与从站之间进行通信的过程,关于更多Modbus的实际应用可以访问上海研博数据信息技术有限公司 (yanboot.cn)进行查看,关于文章所涉及到的代码可以留言获取,关于更多后续请关注公众号了解。