admin 管理员组文章数量: 887038
2024年1月25日发(作者:java资料入门)
Modbus是一种串行通信协议;是于1979年;为使用可编程逻辑控制器PLC而发表的..事实上;它已经成为工业领域通信协议;并且现在是工业电子设备之间相当常用的连接方式..Modbus比其他通信协议使用的更广泛的主要原因有:
公开发表并且无版税要求
相对容易的工业网络部署
对供应商来说;修改移动原生的位或字节没有很多限制
Modbus允许多个设备连接在同一个网络上进行通信;举个例子;一个由测量温度和湿度的装置;并且将结果发送给计算机..在数据采集与监视控制系统SCADA中;Modbus通常用来连接监控计算机和remoteterminalunitRTU..
Modbus协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本..
大多数Modbus设备通信通过串口物理层进行..
对于串行连接;存在两个变种;它们在数值数据表示不同和协议细节上略有不同..ModbusRTU是一种紧凑的;采用二进制表示数据的方式;ModbusASCII是一种人类可读的;冗长的表示方式..这两个变种都使用串行通讯serialcommunication方式..RTU格式后续的命令/数据带有的校验和;而ASCII格式采用纵向冗余校验的校验和..被配置为RTU变种的节点不会和设置为ASCII变种的节点通信;反之亦然..
对于通过例如的连接;存在多个Modbus/TCP变种;这种方式不需要校验和的计算..
对于所有的这三种通信协议在数据模型和功能调用上都是相同的;只有封装方式是不同的..
Modbus有一个扩展版本ModbusPlusModbus+或者MB+;不过此协定是Modicon专有的;和Modbus不同..它需要一个专门的协处理器来处理类似的高速令牌旋转..它使用1Mbit/s的;并且每个节点都有转换隔离装置;是一种采用转换/边缘触发而不是电压/水平触发的
装置..连接ModbusPlus到计算机需要特别的接口;通常是支持ISASA85;PCI或者PCMCIA总线的板卡..
Modbus协议是一个master/slave架构的协议..有一个节点是master节点;其他使用Modbus协议参与通信的节点是slave节点..每一个slave设备都有一个唯一的地址..在串行和MB+网络中;只有被指定为主节点的节点可以启动一个命令在以太网上;任何一个设备都能发送一个Modbus命令;但是通常也只有一个主节点设备启动指令..
一个ModBus命令包含了打算执行的设备的Modbus地址..所有设备都会收到命令;但只有指定位置的设备会执行及回应指令地址0例外;指定地址0的指令是广播指令;所有收到指令的设备都会执行;不过不回应指令..所有的Modbus命令包含了检查码;以确定到达的命令没有被破坏..基本的ModBus命令能指令一个RTU改变它的寄存器的某个值;控制或者读取一个I/O端口;以及指挥设备回送一个或者多个其寄存器中的数据..
有许多modems和网关支持Modbus协议;因为Modbus协议很简单而且容易复制..它们当中一些为这个协议特别设计的..有使用有线、无线通信甚至短消息和GPRS的不同实现..不过设计者需要克服一些包括高延迟和时序的问题..
MODBUS通信过程如下图
MODBUSRTU报文格式
起始位
T1-T2-T3-T4
设备地址
功能代码
8Bit
8Bit
数据
n个8Bit
CRC校验
16Bit
结束符
T1-T2-T3-T4
MODBUSASCII报文格式
设备地起始位
址
1个字符
2个字符
2个字符
n个字符
2个字符
2个字符
MODBUSTCP报文
功能代码
数据
LRC校验
结束符
交互标识
协议标识
报文长度
设备标识
功能代码
2字节
2字节
1字节
也就是设备地址
数据
2字节
一般为0
高字节在一般为0
前
1个字符
n个字符
实际上MODBUSRTU与ASCII的内容是完全相同的;不同的的ASCII方式用“:”标识帧起始;用“CRLF”标识帧结束..校验采用LRC;把RTU帧中一个字节的内容换成了2个ASCII字符..比如在RTU方式下设备地址01只有一个字节;在ASCII方式下转换成字符串“01”16进制的3031..
MODBUSTCP中的设备标识;功能码等与MODBUSRTU相同;可以认为是在MODBUSRTU报文的前边加了一个头;去掉了CRC校验这个尾..
MODBUS协议定义了4种基本数据类型:可读写位数据;只读位数据;只读16位数据;可读写16位数据..这些数据分别被称为线圈状态;输入状态;输入寄存器;保持寄存器..
MODBUS协议中定义的这些数据都是一个从地址1开始的数组;访问时需要指明从哪个地址开始访问;访问多少个数据..下表是MODBUS的功能码..
ModBus功能码
功能名称
码
01
读取线圈状态
02
读取输入状态
取得一组逻辑线圈的当前状态ON/OFF
取得一组开关输入的当前状态ON/OFF
在一个或多个保持寄存器中取得当前的二03
读取保持寄存器
进制值
在一个或多个输入寄存器中取得当前的二04
读取输入寄存器
进制值
作用
05
强置单线圈
06
预置单寄存器
强置一个逻辑线圈的通断状态
把具体二进值装入一个保持寄存器
取得8个内部线圈的通断状态;这8个线圈的地址由控制器决定;用户逻辑可以将这些07
读取异常状态
线圈定义;以说明从机状态;短报文适宜于迅速读取状态
把诊断校验报文送从机;以对通信处理进行08
回送诊断校验
评鉴
09
编程只用于484
使主机模拟编程器作用;修改PC从机逻辑
可使主机与一台正在执行长程序任务从机通信;探询该从机是否已完成其操作任务;10
控询只用于484
仅在含有功能码9的报文发送后;本功能码才发送
可使主机发出单询问;并随即判定操作是否11
读取事件计数
成功;尤其是该命令或其他应答产生通信错误时
可是主机检索每台从机的ModBus事务处理12
读取通信事件记录
通信事件记录..如果某项事务处理完成;记录会给出有关错误
编程13
184/384484584
14
探询可使主机与正在执行任务的从机通信;定期可使主机模拟编程器功能修改PC从机逻辑
184/384484584
控询该从机是否已完成其程序操作;仅在含有功能13的报文发送后;本功能码才得发送
15
强置多线圈
强置一串连续逻辑线圈的通断
把具体的二进制值装入一串连续的保持寄16
预置多寄存器
存器
可使主机判断编址从机的类型及该从机运17
报告从机标识
行指示灯的状态
18
884和MICRO84
可使主机模拟编程功能;修改PC状态逻辑
发生非可修改错误后;是从机复位于已知状19
重置通信链路
态;可重置顺序字节
20
读取通用参数584L
显示扩展存储器文件中的数据信息
21
写入通用参数584L
把通用参数写入扩展存储文件;或修改之
22~保留作扩展功能备64
用
65~保留以备用户功能留作用户功能的扩展编码
72
所用
73~非法功能
119
120~保留
127
128~保留
用于异常应答
留作内部作用
255
各个功能码对应的数据类型
代功能
码
01
02
03
04
05
06
15
16
读
读
读
读
写
写
写
写
位
位
16位整型
16位整型
位
整16位整型
位
整16位整型
数据类型
MODBUS协议相当复杂;但是常用的命令也就简单的几个;01;02;03;04;05;06;15;16号命令..
各个命令的功能和报文如下:
01命令读取线圈状态MODBUS地址00001~
MODBUS请求
功能码
起始地址
读取数量
MODBUS响应
功能码
1BYTE
0X01
1BYTE
2BYTE
2BYTE
0X01
0X0000TO0XFFFF
1TO20000X7D0
字节计数
线圈状态
1BYTE
nBYTE
N
n=NorN+1
N=读取数量/8如果余数不为0则N=N+1
错误响应
功能码
错误代码
举例
请求
域名称
功能码
起始地址高字节
起始地址低字节
读取数量高字节
读取数量低字节
数据hex
01
00
13
00
13
域名称
功能码
字节计数
27h~20状态
35h~28状态
38h~36状态
响应
数据hex
01
03
CD
6B
05
1BYTE
1BYTE
0X01+0X80
0x1or0x2or0x3or0x4
02命令读取输入状态MODBUS地址10001~
MODBUS请求
功能码
起始地址
读取数量
MODBUS响应
功能码
字节计数
输入状态
1BYTE
1BYTE
nBYTE
0X02
N
n=NorN+1
1BYTE
2BYTE
2BYTE
0X02
0X0000TO0XFFFF
1TO20000X7D0
N=读取数量/8如果余数不为0则N=N+1
错误响应
功能码
错误代码
举例
请求
域名称
功能码
起始地址高字节
起始地址低字节
读取数量高字节
读取数量低字节
数据hex
02
00
C4
00
16
域名称
功能码
字节计数
204h~197状态
212h~205状态
218h~213状态
响应
数据hex
02
03
AC
DB
35
1BYTE
1BYTE
0X02+0X80
0x1or0x2or0x3or0x4
03读保持寄存器MODBUS地址40001~
MODBUS请求
功能码
起始地址
读取数量
MODBUS响应
功能码
字节计数
输入状态
错误响应
功能码
错误代码
举例
1BYTE
1BYTE
0X03+0X80
0x1or0x2or0x3or0x4
1BYTE
1BYTE
N2BYTE
1BYTE
2BYTE
2BYTE
0X03
0X0000TO0XFFFF
1TO1250X7D
0X03
N2
请求
域名称
功能码
起始地址高字节
起始地址低字节
读取数量高字节
读取数量低字节
响应
数据hex
03
00
6B
00
03
域名称
功能码
字节计数
寄存器高108
寄存器低108
寄存器高109
寄存器低109
寄存器高110
寄存器低110
数据hex
03
06
02
2B
00
00
00
64
04输入寄存器MODBUS地址30001~
MODBUS请求
功能码
起始地址
读取数量
MODBUS响应
功能码
字节计数
输入状态
错误响应
功能码
错误代码
举例
1BYTE
1BYTE
0X04+0X80
0x1or0x2or0x3or0x4
1BYTE
1BYTE
N2BYTE
1BYTE
2BYTE
2BYTE
0X04
0X0000TO0XFFFF
1TO1250X7D
0X04
N2
请求
域名称
功能码
起始地址高字节
起始地址低字节
读取数量高字节
读取数量低字节
响应
数据hex
04
00
08
00
01
域名称
功能码
字节计数
输入寄存器高9
输入寄存器低9
数据hex
04
02
00
0A
05 设置单个继电器状态
MODBUS请求
功能码
设置地址
设置内容
1BYTE
2BYTE
2BYTE
0X05
0X0000TO0XFFFF
0x0000OR0XFF00
0x0000释放继电器
0xff00吸合继电器
MODBUS响应
功能码
设置地址
设置内容
错误响应
功能码
错误代码
举例吸合6号继电器
请求
响应
1BYTE
1BYTE
0X05+0X80
0x1or0x2or0x3or0x4
1BYTE
2BYTE
2BYTE
0X05
0X0000TO0XFFFF
0x0000OR0XFF00
域名称
功能码
设置地址高字节
设置地址低字节
设置内容高字节
设置内容低字节
数据hex
05
00
05
FF
00
域名称
功能码
设置地址高字节
设置地址低字节
设置内容高字节
设置内容低字节
数据hex
05
00
05
FF
FF
06 设置单个保持寄存器
MODBUS请求
功能码
设置地址
设置内容
MODBUS响应
功能码
设置地址
设置内容
错误响应
功能码
错误代码
举例
设置9号保持寄存器内容为25
请求
域名称
功能码
数据hex
06
域名称
功能码
响应
数据hex
06
1BYTE
1BYTE
0X06+0X80
0x1or0x2or0x3or0x4
1BYTE
2BYTE
2BYTE
0X06
0X0000TO0XFFFF
0x0000to0XFF00
1BYTE
2BYTE
2BYTE
0X06
0X0000TO0XFFFF
0x0000to0XFF00
设置地址高字节
设置地址低字节
设置内容高字节
设置内容低字节
00
08
00
19
设置地址高字节
设置地址低字节
设置内容高字节
设置内容低字节
00
08
00
19
15设置多个继电器状态
MODBUS请求
功能码
设置起始地址
设置长度
字节计数
设置内容
MODBUS响应
功能码
设置起始地址
设置长度
错误响应
功能码
错误代码
举例
设置继电器
请求
域名称
功能码
数据hex
0F
域名称
功能码
响应
数据hex
0F
1BYTE
1BYTE
0X0F+0X80
0x1or0x2or0x3or0x4
1BYTE
2BYTE
2BYTE
0X0F
0X0000TO0XFFFF
0X0000TO0X7B0
1BYTE
2BYTE
2BYTE
1BYTE
NBYTE
0X0F
0X0000TO0XFFFF
0X0000TO0X7B0
N
设置地址高字节
设置地址低字节
设置数量高字节
设置数量低字节
字节计数
设置内容高字节
设置内容低字节
00
13
00
0A
02
CD
01
设置地址高字节
设置地址低字节
设置数量高字节
设置数量低字节
00
13
00
0A
16设置多个保持寄存器
MODBUS请求
功能码
设置起始地址
设置长度
字节计数
设置内容
MODBUS响应
功能码
设置起始地址
设置长度
错误响应
功能码
错误代码
举例
设置多个保持寄存器
1BYTE
1BYTE
0X10+0X80
0x1or0x2or0x3or0x4
1BYTE
2BYTE
2BYTE
0X10
0X0000TO0XFFFF
0X0000TO0X7B0
1BYTE
2BYTE
2BYTE
1BYTE
N2BYTE
0X10
0X0000TO0XFFFF
0X0000TO0X7B0
N2
请求
域名称
功能码
设置地址高字节
设置地址低字节
设置数量高字节
设置数量低字节
字节计数
设置内容高字节
设置内容低字节
设置内容高字节
设置内容低字节
响应
数据hex
10
00
01
00
02
04
00
0A
01
02
域名称
功能码
设置地址高字节
设置地址低字节
设置数量高字节
设置数量低字节
数据hex
0F
00
01
00
02
MODBUS协议在智能设备中的应用
上面讲述了MODBUS协议的报文以及命令;那么在智能设备中如何使用这个协议呢
如果智能设备有开关量输入输出;模拟量输入输出;有计数器等..很明显开关量输入可以映射到10001地址;第一路开关量输入为10001;第二路为10002;………
开关量输出映射到00001地址;第一路为00001;第二路为00002;…….
模拟量输入映射到30001地址;第一路为30001;第二路为30002;……
模拟量输出和计数器输入映射到40001地址;第一路为40001;第二路为40002;……
当然也可以把所有的数据都放在保持寄存器中;这样对于MODBUS主设备访问时要简单;访问效率能提高;但是处理起来略显繁琐..
版权声明:本文标题:MODBUS协议功能码及报文解析要点 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1706174811h502981.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论