MODBUS协议功能码及报文解析要点Word格式文档下载.docx
《MODBUS协议功能码及报文解析要点Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《MODBUS协议功能码及报文解析要点Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
一个ModBus命令包含了打算执行的设备的Modbus地址。
所有设备都会收到命令,但只有指定位置的设备会执行及回应指令(地址0例外,指定地址0的指令是广播指令,所有收到指令的设备都会执行,不过不回应指令)。
所有的Modbus命令包含了检查码,以确定到达的命令没有被破坏。
基本的ModBus命令能指令一个RTU改变它的寄存器的某个值,控制或者读取一个I/O端口,以及指挥设备回送一个或者多个其寄存器中的数据。
有许多modems和网关支持Modbus协议,因为Modbus协议很简单而且容易复制。
它们当中一些为这个协议特别设计的。
有使用有线、无线通信甚至短消息和GPRS的不同实现。
不过设计者需要克服一些包括高延迟和时序的问题。
MODBUS通信过程如下图
MODBUSRTU报文格式
起始位
设备地址
功能代码
数据
CRC校验
结束符
T1-T2-T3-T4
8Bit
n个8Bit
16Bit
MODBUSASCII报文格式
LRC校验
1个字符
2个字符
n个字符
MODBUSTCP报文
交互标识
协议标识
报文长度
设备标识
2字节
一般为0
高字节在前
1字节
也就是设备地址
实际上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
读取线圈状态
取得一组逻辑线圈的当前状态(ON/OFF)
02
读取输入状态
取得一组开关输入的当前状态(ON/OFF)
03
读取保持寄存器
在一个或多个保持寄存器中取得当前的二进制值
04
读取输入寄存器
在一个或多个输入寄存器中取得当前的二进制值
05
强置单线圈
强置一个逻辑线圈的通断状态
06
预置单寄存器
把具体二进值装入一个保持寄存器
07
读取异常状态
取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态
08
回送诊断校验
把诊断校验报文送从机,以对通信处理进行评鉴
09
编程(只用于484)
使主机模拟编程器作用,修改PC从机逻辑
10
控询(只用于484)
可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送
11
读取事件计数
可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时
12
读取通信事件记录
可是主机检索每台从机的ModBus事务处理通信事件记录。
如果某项事务处理完成,记录会给出有关错误
13
编程(184/384484584)
可使主机模拟编程器功能修改PC从机逻辑
14
探询(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
用于异常应答
各个功能码对应的数据类型
代码
功能
数据类型
读
位
16位整型
写
整16位整型
MODBUS协议相当复杂,但是常用的命令也就简单的几个,01,02,03,04,05,06,15,16号命令。
各个命令的功能和报文如下:
01命令读取线圈状态MODBUS地址00001~
MODBUS请求
1BYTE
0X01
起始地址
2BYTE
0X0000TO0XFFFF
读取数量
1TO2000(0X7D0)
MODBUS响应
字节计数
N
线圈状态
nBYTE
n=NorN+1
N=读取数量/8如果余数不为0则N=N+1
错误响应
0X01+0X80
错误代码
0x1or0x2or0x3or0x4
举例
请求
响应
域名称
数据(hex)
起始地址高(字节)
00
起始地址低(字节)
27(h)~20状态
CD
读取数量高(字节)
35(h)~28状态
6B
读取数量低(字节)
38(h)~36状态
02命令读取输入状态MODBUS地址10001~
0X02
输入状态
0X02+0X80
C4
204(h)~197状态
AC
212(h)~205状态
DB
218(h)~213状态
35
03读保持寄存器MODBUS地址40001~
0X03
1TO125(0X7D)
N*2
N*2BYTE
0X03+0X80
寄存器高(108)
寄存器低(108)
2B
寄存器高(109)
寄存器低(109)
寄存器高(110)
寄存器低(110)
64
04输入寄存器MODBUS地址30001~
0X04
0X04+0X80
输入寄存器高(9)
输入寄存器低(9)
0A
05?
?
设置单个继电器状态
0X05
设置地址
设置内容
0x0000OR0XFF00
0x0000释放继电器
0xff00吸合继电器
0X05+0X80
举例(吸合6号继电器)
设置地址高(字节)
设置地址低(字节)
设置内容高(字节)
FF
设置内容低(字节)
06?
设置单个保持寄存器
0X06
0x0000to0XFF00
0X06+0X80
设置9号保持寄存器内容为25
15设置多个继电器状态
0X0F
设置起始地址
设置长度
0X0000TO0X7B0
NBYTE
0X0F+0X80
设置继电器
0F
设置数量高(字节)
设置数量低(字节)
16设置多个保持寄存器
0X10
0X10+0X80
设置多个保持寄存器
MODBUS协议在智能设备中的应用
上面讲述了MODBUS协议的报文以及命令,那么在智能设备中如何使用这个协议呢?
如果智能设备有开关量输入输出,模拟量输入输出,有计数器等。
很明显开关量输入可以映射到10001地址,第一路开关量输入为10001,第二路为10002,………
开关量输出映射到00001地址,第一路为00001,第二路为00002,…….
模拟量输入映射到30001地址,第一路为30001,第二路为30002,……
模拟量输出和计数器输入映射到40001地址,第一路为40001,第二路为40002,……
当然也可以把所有的数据都放在保持寄存器中,这样对于MODBUS主设备访问时要简单,访问效率能提高,但是处理起来略显繁琐。