admin 管理员组文章数量: 887037
2024年1月25日发(作者:文本框类型)
MODBUS协议
Modbus就是一种串行通信协议,就是Modicon于1979年,为使用可编程逻辑控制器(PLC)而发表得。事实上,它已经成为工业领域通信协议标准,并且现在就是工业电子设备之间相当常用得连接方式.Modbus比其她通信协议使用得更广泛得主要原因有:
公开发表并且无版税要求
相对容易得工业网络部署
对供应商来说,修改移动原生得位或字节没有很多限制
Modbus允许多个设备连接在同一个网络上进行通信,举个例子,一个由测量温度与湿度得装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机与remote terminal unit (RTU)。
Modbus协议目前存在用于串口、以太网以及其她支持互联网协议得网络得版本。
大多数Modbus设备通信通过串口EIA-485物理层进行[1].
对于串行连接,存在两个变种,它们在数值数据表示不同与协议细节上略有不同。Modbus RTU就是一种紧凑得,采用二进制表示数据得方式,Modbus ASCII就是一种人类可读得,冗长得表示方式。这两个变种都使用串行通讯(serial munication)方式。RTU格式后续得命令/数据带有循环冗余校验得校验与,而ASCII格式采用纵向冗余校验得校验与。被配置为RTU变种得节点不会与设置为ASCII变种得节点通信,反之亦然。
对于通过TCP/IP(例如以太网)得连接,存在多个Modbus/TCP变种,这种方式不需要校验与得计算。
对于所有得这三种通信协议在数据模型与功能调用上都就是相同得,只有封装方式就是不同得。
Modbus 有一个扩展版本 Modbus Plus(Modbus+或者MB+),不过此协定就是Modicon专有得,与 Modbus不同。它需要一个专门得协处理器来处理类似HDLC得高速令牌旋转。它使用1Mbit/s得双绞线,并且每个节点都有转换隔离装置,就是一种采用转换/边缘触发而不就是电压/水平触发得装置。连接Modbus Plus到计算机需要特别得接口,通常就是支持ISA(SA85),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通信过程如下图
MODBUS RTU 报文格式
起始位 设备地址 功能代码
T1-T2-T3-T4
8Bit 8Bit
数据 CRC校验 结束符
T1-T2-T3—T4
n个8Bit 16Bit
MODBUS ASCII 报文格式
设备地起始位 功能代码 数据
址
LRC校验
结束符
2个字符
2个字2个字1个字符 2个字符 n个字符
符 符
MODBUS TCP报文
交互标识 协议标识 报文长度 设备标识 功能代码 数据
2字节
一般为0
2字节 2字节 1字节
一般为0 高字节在也就就是1个字符 n个字符
前 设备地址
实际上MODBUS RTU与ASCII得内容就是完全相同得,不同得得ASCII方式用“:”标识帧起始,用“CR LF”标识帧结束.校验采用LRC,把RTU帧中一个字节得内容换成了2个ASCII字符.比如在RTU方式下设备地址 01 只有一个字节,在ASCII方式下转换成字符串“01"(16进制得30 31 ).
MODBUS TCP 中得设备标识,功能码等与MODBUS RTU相同,可以认为就是在MODBUS RTU报文得前边加了一个头,去掉了CRC校验这个尾。
MODBUS协议定义了4种基本数据类型:可读写位数据,只读位数据,只读16位数据,可读写16位数据。这些数据分别被称为线圈状态,输入状态,输入寄存器,保持寄存器。
MODBUS协议中定义得这些数据都就是一个从地址1开始得数组,访问时需要指明从哪个地址开始访问,访问多少个数据。下表就是MODBUS得功能码.
ModBus功能码
功能码
名称 作用
取得一组逻辑线圈得当前状态(ON/OFF)
取得一组开关输入得当前状态(ON/OFF)
在一个或多个保持寄存器中取得当前得二进制值
01 读取线圈状态
02 读取输入状态
03 读取保持寄存器
04 读取输入寄存器
05 强置单线圈
06 预置单寄存器
在一个或多个输入寄存器中取得当前得二进制值
强置一个逻辑线圈得通断状态
把具体二进值装入一个保持寄存器
取得8个内部线圈得通断状态,这8个线圈得地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态
把诊断校验报文送从机,以对通信处理进行评鉴
07 读取异常状态
08 回送诊断校验
09 编程(只用于484) 使主机模拟编程器作用,修改PC从机逻辑
可使主机与一台正在执行长程序任务从机通10 控询(只用于484) 信,探询该从机就是否已完成其操作任务,仅在含有功能码9得报文发送后,本功能码才发送
11 读取事件计数
可使主机发出单询问,并随即判定操作就是否成功,尤其就是该命令或其她应答产生通信错误时
可就是主机检索每台从机得ModBus事务处理12 读取通信事件记录 通信事件记录。如果某项事务处理完成,记录会给出有关错误
13
编程(184/384 48可使主机模拟编程器功能修改PC从机逻辑
4 584)
可使主机与正在执行任务得从机通信,定期控探询(184/384 4814 询该从机就是否已完成其程序操作,仅在含有4 584)
功能13得报文发送后,本功能码才得发送
15 强置多线圈
16 预置多寄存器
17 报告从机标识
强置一串连续逻辑线圈得通断
把具体得二进制值装入一串连续得保持寄存器
可使主机判断编址从机得类型及该从机运行指示灯得状态
发生非可修改错误后,就是从机复位于已知状态,可重置顺序字节
显示扩展存储器文件中得数据信息
18 (884与MICRO 84) 可使主机模拟编程功能,修改PC状态逻辑
19 重置通信链路
20
21
读取通用参数(584L)
写入通用参数(58把通用参数写入扩展存储文件,或修改之
4L)
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 响应
功能码
字节计数
线圈状态
1 BYTE
2 BYTE
2 BYTE
1 BYTE
1 BYTE
0X01
0X0000 TO 0XFFFF
1 TO 2000(0X7D0)
0X01
N
n =N or N+1
n BYTE
N =读取数量/8 如果余数不为0 则N=N+1
错误 响应
功能码
错误代码
举例
请求
域名称
功能码
起始地址高(字节)
起始地址低(字节)
读取数量高(字节)
读取数量低(字节)
数据(hex)
01
00
13
00
13
域名称
功能码
字节计数
1 BYTE
1 BYTE
0X01+ 0X80
0x1 or 0x2 or 0x3 or
0x4
响应
数据(hex)
01
03
CD
6B
05
27(h)~20状态
35(h)~28状态
38(h)~36状态
02 命令 读取输入状态 MODBUS地址 10001~
MODBUS 请求
功能码
起始地址
读取数量
MODBUS 响应
功能码
字节计数
输入状态
1 BYTE
1 BYTE
n BYTE
0X02
N
n =N or N+1
1 BYTE
2 BYTE
2 BYTE
0X02
0X0000 TO 0XFFFF
1 TO 2000(0X7D0)
N =读取数量/8 如果余数不为0 则N=N+1
错误 响应
功能码
错误代码
1 BYTE
1 BYTE
0X02+ 0X80
0x1 or 0x2 or 0x3 or 0x4
举例
请求
域名称
功能码
起始地址高(字节)
起始地址低(字节)
读取数量高(字节)
读取数量低(字节)
数据(hex)
02
00
C4
00
16
域名称
功能码
字节计数
204(h)~197状态
212(h)~205状态
218(h)~213状态
响应
数据(hex)
02
03
AC
DB
35
03 读保持寄存器 MODBUS地址 40001~
MODBUS 请求
功能码
起始地址
读取数量
MODBUS 响应
功能码
字节计数
输入状态
错误 响应
功能码
错误代码
举例
请求
域名称
功能码
起始地址高(字节)
起始地址低(字节)
读取数量高(字节)
读取数量低(字节)
数据(hex)
03
00
6B
00
03
域名称
功能码
字节计数
寄存器高(108)
寄存器低(108)
寄存器高(109)
寄存器低(109)
寄存器高(110)
响应
数据(hex)
03
06
02
2B
00
00
00
1 BYTE
1 BYTE
0X03+ 0X80
0x1 or 0x2 or 0x3
or 0x4
1 BYTE
1 BYTE
N*2 BYTE
0X03
N*2
1 BYTE
2 BYTE
2 BYTE
0X03
0X0000 TO 0XFFFF
1 TO 125(0X7D)
寄存器低(110)
64
04 输入寄存器 MODBUS地址 30001~
MODBUS 请求
功能码
起始地址
读取数量
MODBUS 响应
功能码
字节计数
输入状态
错误 响应
功能码
错误代码
举例
请求
域名称
功能码
起始地址高(字节)
起始地址低(字节)
读取数量高(字节)
读取数量低(字节)
数据(hex)
04
00
08
00
01
域名称
功能码
字节计数
输入寄存器高(9)
输入寄存器低(9)
响应
数据(hex)
04
02
00
0A
1 BYTE
1 BYTE
0X04+ 0X80
0x1 or 0x2 or 0x3
or 0x4
1 BYTE
1 BYTE
N*2 BYTE
0X04
N*2
1 BYTE
2 BYTE
2 BYTE
0X04
0X0000 TO 0XFFFF
1 TO 125(0X7D)
05
设置单个继电器状态
MODBUS 请求
功能码
设置地址
设置内容
1 BYTE
2 BYTE
2 BYTE
0X05
0X0000 TO 0XFFFF
0x0000 OR
0XFF00
0x0000 释放继电器
0xff00 吸合继电器
MODBUS 响应
功能码 1 BYTE 0X05
设置地址
设置内容
错误 响应
功能码
错误代码
举例(吸合6号继电器)
请求
域名称
功能码
设置地址高(字节)
设置地址低(字节)
设置内容高(字节)
设置内容低(字节)
2 BYTE
2 BYTE
1 BYTE
1 BYTE
0X0000 TO 0XFFFF
0x0000 OR 0XFF00
0X05+ 0X80
0x1 or 0x2 or 0x3 or 0x4
响应
数据(hex)
05
00
05
FF
00
域名称
功能码
设置地址高(字节)
设置地址低(字节)
设置内容高(字节)
设置内容低(字节)
数据(hex)
05
00
05
FF
FF
06
设置单个保持寄存器
MODBUS 请求
功能码
设置地址
设置内容
MODBUS 响应
功能码
设置地址
设置内容
错误 响应
功能码
错误代码
举例
设置9号保持寄存器内容为25
请求
域名称
功能码
数据(hex)
06
域名称
功能码
响应
数据(hex)
06
1 BYTE
1 BYTE
0X06+ 0X80
0x1 or 0x2 or 0x3
or 0x4
1 BYTE
2 BYTE
2 BYTE
0X06
0X0000 TO 0XFFFF
0x0000 to 0XFF00
1 BYTE
2 BYTE
2 BYTE
0X06
0X0000 TO 0XFFFF
0x0000 to 0XFF00
设置地址高(字节)
设置地址低(字节)
设置内容高(字节)
设置内容低(字节)
00
08
00
19
设置地址高(字节)
设置地址低(字节)
设置内容高(字节)
设置内容低(字节)
00
08
00
19
15 设置多个继电器状态
MODBUS 请求
功能码
设置起始地址
设置长度
字节计数
设置内容
MODBUS 响应
功能码
设置起始地址
设置长度
错误 响应
功能码
错误代码
举例
设置继电器
请求
域名称
功能码
设置地址高(字节)
设置地址低(字节)
设置数量高(字节)
数据(hex)
0F
00
13
00
域名称
功能码
设置地址高(字节)
设置地址低(字节)
设置数量高(字响应
数据(hex)
0F
00
13
00
1 BYTE
1 BYTE
0X0F+ 0X80
0x1 or 0x2 or 0x3 or 0x4
1 BYTE
2 BYTE
2 BYTE
0X0F
0X0000 TO 0XFFFF
0X0000 TO 0X7B0
1 BYTE
2 BYTE
2 BYTE
1 BYTE
N BYTE
0X0F
0X0000 TO
0XFFFF
0X0000 TO 0X7B0
N
节)
设置数量低(字节)
字节计数
设置内容高(字节)
设置内容低(字节)
0A
02
CD
01
设置数量低(字节)
0A
16 设置多个保持寄存器
MODBUS 请求
功能码
设置起始地址
设置长度
字节计数
设置内容
MODBUS 响应
功能码
设置起始地址
设置长度
错误 响应
功能码
错误代码
举例
设置多个保持寄存器
请求
域名称
功能码
设置地址高(字节)
设置地址低(字节)
设置数量高(字数据(hex)
10
00
01
00
域名称
功能码
设置地址高(字节)
设置地址低(字节)
设置数量高(字响应
数据(hex)
0F
00
01
00
1 BYTE
1 BYTE
0X10+ 0X80
0x1 or 0x2 or
0x3 or 0x4
1 BYTE
2 BYTE
2 BYTE
0X10
0X0000 TO 0XFFFF
0X0000 TO 0X7B0
1 BYTE
2 BYTE
2 BYTE
1 BYTE
N*2 BYTE
0X10
0X0000 TO 0XFFFF
0X0000 TO 0X7B0
N*2
节)
设置数量低(字节)
字节计数
设置内容高(字节)
设置内容低(字节)
设置内容高(字节)
设置内容低(字节)
02
04
00
0A
01
02
节)
设置数量低(字节)
02
MODBUS协议在智能设备中得应用
上面讲述了MODBUS协议得报文以及命令,那么在智能设备中如何使用这个协议呢?
如果智能设备有开关量输入输出,模拟量输入输出,有计数器等。很明显开关量输入可以映射到 10001地址,第一路开关量输入为10001,第二路为10002,………
开关量输出映射到 00001地址,第一路为00001,第二路为00002,……、
模拟量输入映射到 30001地址,第一路为 30001,第二路为30002,……
模拟量输出与计数器输入映射到40001地址,第一路为 40001,第二路为40002,……
当然也可以把所有得数据都放在保持寄存器中,这样对于MODBUS主设备访问时要简单,访问效率能提高,但就是处理起来略显繁琐。
版权声明:本文标题:MODBUS协议(功能码及报文解析)-485功能码 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1706174849h502983.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论