Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。
了解modbus协议应该从消息收发结构来理解
经常用的modbus功能码有01,02,03,05,06,15,16这7个功能码
这7个功能码可以操作四块分区,其中两块bool(布尔变量)寄存器,两块整数寄存器
4个分区有只读区和读写区,并且命名为 : 0x,1x,3x,4x
0x:形象的叫做线圈(coil status),意味着可读可写(获取状态,设置状态),用功能码01,05,15操作这部分的寄存器
1x:离散输入(inputs status),很明显这是一块只读区。只能用功能码02 操作
(我也不知道为什么没有2x,都是个名字无所谓叫什么记住就好了嘛,可能是因为名字不好听)
3x:输入寄存器(input registers),也是一块只读区,只能用功能码04操作
4x:保持寄存器(holding registers),这是一块可读可写的数据区,用功能码03 06 16 操作这部分的寄存器
分解了这4部分的寄存器区我们就开始解读功能码的含义了,ModbusRTU和MoudbsTCP结构差不了多少只是帧头和帧尾有一点区别 我们暂且那ModubsRTU来操作,MoudbsuRTU都是用的串口来读写数据。
功能码01 读取线圈状态(0x)
下面的意思是:读取25个线圈状态
功能码02读取离散输入(1x)
同样是读取25个输入寄存器的状态
功能码03 读保持寄存器(4x)
下面的意思是读取了三个保持寄存器的数据
功能码05 设置线圈状态(0x)
下面的意思是设置寄存器0的线圈状态为1
功能码06 写单个保持寄存器(4x)
设置保持就存起00地址 的数据位10
功能码15设置多个线圈状态(0x)
设置10个线圈的状态
功能码16 设置多个寄存器值(4x)
到此为止基本上功能码已经解读完毕,写的比较简陋主要也是给自己留个底,将来好回忆。不过做过modbus通信的朋友基本上看到这些都能回忆起来 (比如区域和功能码的代表什么)。还有提醒一下新手朋友如果碰到设备恢复的消息不是上述正常的恢复基本上是产生故障了,比如说访问的超过寄存器地址范围等一些故障,那就就搜索一下modbus故障码就了解了。
下面我在写一下TCP的结构有什么区别
开始已经说了Moudbus帧头和帧尾有区别,帧尾比较好叙述因为TCP协议已经带了校验信号,所以modbus/tcp就把CRC校验位的两个字节的数据去掉了。剩下的帧头的结构看下面图片介绍