MODBUS协议功能码及报文解析Word格式.docx
《MODBUS协议功能码及报文解析Word格式.docx》由会员分享,可在线阅读,更多相关《MODBUS协议功能码及报文解析Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
有被指定为主节点的节点可以启动一个命令(在以太网上,任何一个设备都能发送一个Modbus命令,但是通常也只有一个主节点设备启动指令)。
一个ModBus命令包含了打算执行的设备的Modbus地址。
所有设备都会收到命令,但只有指定位置的设备会执行及回应指令(地址0例外,指定地址0的指令是广播指令,所有收到指令的设备都会执行,不过不回应指令)。
所有的Modbus命令包含了检查码,以确定到达的命令没有被破坏。
基本的ModBus命令能指令一个RTU改变
它的寄存器的某个值,控制或者读取一个I/O端口,以及指挥设备回送一个或者多个其寄存器中的数据。
有许多modem和网关支持Modbus协议,因为Modbus协议很简单而且容易复制。
它们当中一些为这个协议特别设计的。
有使用有线、无线通信甚至短消息和GPRS勺不同实现。
不过设计者需要克服一些包括高延迟和时序的问题。
MODBUS信过程如下图
MODBUSRT报文格式
起始位
设备地
功能代
址
码
数据
CRC校验
结束符
T1-T2-T3-T4
8Bit
n个8Bit
16Bit
MODBUSASCI报文格式
MODBUSTCP文
交互标识
协议标识报文长度设备标识功能代码数据
2字节
一般为0
2字节2字节1字节
一般为0咼字节在也就是设1个字符n个字符
前备地址
实际上MODBUSRTUASCII的内容是完全相同的,不同的的AS
CII方式用“:
”标识帧起始,用“CRLF'
标识帧结束。
校验采用LRC把RTU帧中一个字节的内容换成了2个ASCII字符。
比如在RTU方式下设备地址01只有一个字节,在ASCII方式下转换成字符串“01”(16进制的3031)。
MODBUSTC中的设备标识,功能码等与MODBUSRTU同,可以
认为是在MODBUSRTU文的前边加了一个头,去掉了CRC校验这个尾。
MODBUS、议定义了4种基本数据类型:
可读写位数据,只读位数据,只读16位数据,可读写16位数据。
这些数据分别被称为线圈状态,输入状态,输入寄存器,保持寄存器。
功能
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
MODBU协议中定义的这些数据都是一个从地址1开始的数组,
访问时需要指明从哪个地址开始访问,访问多少个数据。
下表是MOD
BUS的功能码。
ModBus功能码
名称
读取线圈状态
读取输入状态
读取保持寄存器
读取输入寄存器
强置单线圈
预置单寄存器
读取异常状态
回送诊断校验
编程(只用于484)
控询(只用于484)
读取事件计数
读取通信事件记录
编程(184/384484
584)
探询(184/384484
强置多线圈
作用
取得一组逻辑线圈的当前状态(ON/OFF)取得一组开关输入的当前状态(ON/OFF)在一个或多个保持寄存器中取得当前的二进制值
在一个或多个输入寄存器中取得当前的二进制
值
强置一个逻辑线圈的通断状态
把具体二进值装入一个保持寄存器
取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态
把诊断校验报文送从机,以对通信处理进行评鉴
使主机模拟编程器作用,修改PC从机逻辑可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时可是主机检索每台从机的ModBus事务处理通信事件记录。
如果某项事务处理完成,记录会给出有关错误
可使主机模拟编程器功能修改PC从机逻辑
可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送强置一串连续逻辑线圈的通断
16
预置多寄存器
把具体的二进制值装入一串连续的保持寄存器1
17
报告从机标识
可使主机判断编址从机的类型及该从机运行指示灯的状态
18
(884和MICRO84
可使主机模拟编程功能,修改PC状态逻辑
19
重置通信链路
发生非可修改错误后,是从机复位于已知状态,可重置顺序子节
20
读取通用参数
(584L)
显示扩展存储器文件中的数据信息
21
写入通用参数
把通用参数写入扩展存储文件,或修改之
22〜
保留作扩展功能备
64
用
65〜
72
保留以备用户功能
所用
留作用户功能的扩展编码
73〜
非法功能
119
120〜
127
保留
留作内部作用
128〜
用于异常应答
255
各个功能码对应的数据类型
代
数据类型
读
位
16位整型
写
整16位整型
MODBU协议相当复杂,但是常用的命令也就简单的几个,01,0
2,03,04,05,06,15,16号命令。
各个命令的功能和报文如下:
01命令读取线圈状态MODBUSfe址00001
MODBUS请求
功能码
1BYTE
0X01
起始地址
2BYTE
0X0000TOOXFFFF
读取数量
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命令读取输入状态MODBUSfe址10001
0X02
输入状态
0X02+0X80
C4
204(h)〜197状态
AC
212(h)〜205状态
DB
218(h)〜213状态
35
03读保持寄存器MODBUS地址40001
0X03
0X0000TO0XFFFF
1TO125(0X7D)
N*2
N*2BYTE
0X03+0X80
寄存器高(108)
寄存器低(108)
2B
寄存器高(109)
寄存器低(109)
寄存器高(110)
寄存器低(110)
04输入寄存器MODBUSfe址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
OXOF
0X0F+0X80
设置继电器
0F
设置地址高(字节「
设置地址低(字节)1
设置数量高(字节)
设置数量低(字节)
16设置多个保持寄存器
0X10
0X10+0X80
设置多个保持寄存器
设置地址低(字节「
MODBI协议在智能设备中的应用
上面讲述了MODBUS、议的报文以及命令,那么在智能设备中如何
使用这个协议呢?
如果智能设备有开关量输入输出,模拟量输入输出,有计数器等。
很明显开关量输入可以映射到10001地址,第一路开关量输入为10001,第二路为10002,,,,
开关量输出映射到00001地址,第一路为00001,第二路为000
02,,,.
模拟量输入映射到30001地址,第一路为30001,第二路为30
002,,,
模拟量输出和计数器输入映射到40001地址,第一路为40001,第二路为40002,,,
当然也可以把所有的数据都放在保持寄存器中,这样对于MODBU
S主设备访问时要简单,访问效率能提高,但是处理起来略显繁琐。