MODBUS协议范文(功能码及报文解析)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MODBUS 协议范文(功能码及报文解析)
Modbu 是一种串行通信协议,是 Modicon 于 1979 年,为使用可编程
逻辑控制器(PLC)而发表的。

事实上,它已经成为工业领域通信协议标准,并且现在是工业电子设备之间相当常用的连接方式。

Modbu 比其他通
信协议使用的更广泛的主要原因有:
公开辟表并且无版税要求相对容易的工业网络部署
对供应商来说,修改挪移原生的位或者字节没有不少限制Modbu 允许多个设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。

在数据采集与监视控制系统( SCADA) 中, Modbu 通常用来连接监控计算机和 remoteterminalunit(RTU)。

Modbu 协议目前存在用于串口、以太网以及其他支持互联网协议的网
络的版本。

对于通过 TCP/IP (例如以太网)的连接,存在多个 Modbu/TCP 变种,这种方式不需要校验和的计算。

对于所有的这三种通信协议在数据模型和功能调用上都是相同的,只有封装方式是不同的。

Modbu 有一个扩展版本 ModbuPlu(Modbu+或者 MB+),无非此协定是Modicon 专有的,和 Modbu 不同。

它需要一个专门的协处理器来处理类似HDLC 的高速令牌旋转。

它使用 1Mbit/的双绞线,并且每一个节点都有转
换隔离装置,是一种采用转换/边缘触发而不是电压/水平触发的装置。

连接 ModbuPlu 到计算机需要特殊的接口,通常是支持 ISA (SA85) ,PCI
或者者 PCMCIA 总线的板卡。

Modbu 协议是一个 mater/lave 架构的协议。

有一个节点是 mater 节点,其他使用 Modbu 协议参预通信的节点是 lave 节点。

每一个 lave 设备都有一个惟一的地址。

在串行和 MB+网络中,惟独被指定为主节点的节点
可以启动一个命令(在以太网上,任何一个设备都能发送一个 Modbu 命令,但是通常也惟独一个主节点设备启动指令)。

一个 ModBu 命令包含了打算执行的设备的 Modbu 地址。

所有设备都会收到命令,但惟独指定位置的设备会执行及回应指令(地址 0 例外,指定地址 0 的指令是广播指令,所有收到指令的设备都会执行,无非不回应指令)。

所有的 Modbu 命令包含了检查码,以确定到达的命令没有被破坏。

基本的 ModBu 命令能指令一个 RTU 改变
它的寄存器的某个值,控制或者读取一个 I/O 端口,以及指挥设备回送一个或者多个其寄存器中的数据。

有许多 modem 和网关支持 Modbu 协议,因为 Modbu 协议很简单而且容易复制。

它们之中一些为这个协议特殊设计的。

有使用有线、无线通信甚至短消息和 GPRS 的不同实现。

无非设计者
需要克服一些包括高延迟和时序的问题。

MODBUS 通信过程如下图n 个 8Bit16Bit
起始位 1 个字符
设备地功能代码址
数据
LRC 校验
结束符 2 个字符
2 个字 2 个字 2 个字符 n 个字符符符
2 字节 2 字节 1 字节普通为 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 的功
能码。

ModBu 功能码功能码 010********* 名称读取线圈状态读取输入状
态读取保持寄存器读取输入寄存器强置单线圈预置单寄存器作用取得一组逻辑线圈的当前状态(ON/OFF)取得一组开关输入的当前状态(ON/OFF)在一个或者多个保持寄存器中取得当前的二进制值在一个或者多个输入寄存器中取得当前的二进制值强置一个逻辑线圈的通断状态把具体二进值装入一个保持寄存器取得 8 个内部线圈的通断状态,这 8 个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态 080910 回送诊断校验把诊断校验报文送从机,以对通信处理进行评鉴
07
读取异常状态
编程(只用于 484)使主机摹拟编程器作用,修改 PC 从机逻辑可使主
机与一台正在执行长程序任务从机通控
询(只用于 484)信,探询该从机是否已完成其操作任务,仅在含有功
能码 9 的报文发送后,本功能码才发送读取事件计数可使主机发出单问询,并随即判定操作是否成功,特别是该命令或者其他应答产生通信错误时可是主机检索每台从机的 ModBu 事务处理通信事件记录。

如果某项事务处理完成,记录会给出有关错误
读取通信事件记录
编程(184/384484 可使主机摹拟编程器功能修改 PC 从机逻辑 584)可
使主机与正在执行任务的从机通信,定期控探询(184/384484 询该从机是
否已完成其程序操作,仅在含有功 584)能 13 的报文发送后,本功能码才
得发送强置多线圈强置一串联续逻辑线圈的通断
预置多寄存器报告从机标识
把具体的二进制值装入一串联续的保持寄存器可使主机判断编址从机的类型及该从机运行指示灯的状态发生非可修改错误后,是从机复位于已知状态,可重置顺序字节显示扩展存储器文件中的数据信息把通用参数写入扩展存储文件,或者修改之
(884 和 MICRO84)可使主机摹拟编程功能,修改 PC 状态逻辑重置通信链路读取通用参数(584L)写入通用参数(584L)
22~保留作扩展功能备 64 用65~保留以备用户功能 72 所用 73~非法功能 119120~保留 127128~保留 255 留作内部作用用于异常应答留作用户功能的扩展编码
各个功能码对应的数据类型代功能码 010******* 读读读读写位位 16 位整型 16 位整型位数据类型
写写写
整 16 位整型位整 16 位整型
各个命令的功能和报文如下: 01 命令读取线圈状态 MODBUS 地址00001~MODBUS 请求功能码起始地址读取数量 MODBUS 响应功能码字节计数线圈状态 N=读取数量/8 错误响应功能码错误代码举例请求域名称功能码起始地址高(字节)起始地址低(字节)读取数量高(字节)读取数量低(字节) 数据(he 某)010******* 域名称功能码字节计数 27(h)~20 状态 35(h)~28 状态 38(h)~36 状态响应数据(he 某)0103CD6B0511BYTEBYTE0 某
01Nn=NorN+11BYTE2BYTE2BYTE0 某 010 某 0000TO0 某 FFFF1TO2000(0 某
7D0)
nBYTE 如果余数不为 0 则 N=N+111BYTEBYTE
02 命令读取输入状态MODBUS 地址 10001~
MODBUS 请求功能码起始地址读取数量 MODBUS 响应功能码字节计数输入状态 N=读取数量/8 错误响应功能码错误代码举例请求域名称功能码起始地址高(字节)起始地址低(字节)读取数量高(字节)读取数量低(字节)数据(he 某)0200C40016 域
名称功能码字节计数 204(h)~197 状态 212(h)~205 状态 218(h)~213 状态响应数据(he 某)0203ACDB3511BYTEBYTE0 某
02Nn=NorN+11BYTE2BYTE2BYTE0 某 020 某 0000TO0 某 FFFF1TO2000(0 某
7D0)
nBYTE 如果余数不为 0 则 N=N+111BYTEBYTE
03 读保持寄存器
功能码字节计数输入状态错误响应功能码错误代码举例请求域名称功能码起始地址高(字节)起始地址低(字节)读取数量高(字节)读取数量低(字节)
BYTEBYTEBYTE
BYTEBYTE
04 输入寄存器MODBUS 地址 30001~
MODBUS 请求功能码起始地址读取数量 MODBUS 响应功能码字节计数输入状态错误响应功能码错误代码举例 11BYTEBYTE0 某 04+0 某 800 某 1or0 某 2or0 某 3or0 某 411N 某 2BYTEBYTEBYTE0 某 04N 某 21BYTE2BYTE2BYTE0 某 040 某 0000TO0 某 FFFF1TO125(0 某 7D)
请求域名称功能码起始地址高(字节)起始地址低(字节)读取数量高(字节)读取数量低(字节)数据(he 某)0400080001 域名称功能码字节计数响应数据(he 某)0402000A
输入寄存器高(9)输入寄存器低(9)
设置单个继电器状态
MODBUS 响应功能码设置地址设置内容错误响应功能码错误代码举例(吸合 6 号继电器)请求域名称功能码设置地址高(字节)设置地址低(字节) 设置内容高(字节)设置内容低(字节)数据(he 某)050005FF00 域名称功能码设置地址高(字节)设置地址低(字节)设置内容高(字节)设置内容低(字节)响应数据(he 某)050005FFFF11BYTEBYTE0 某 05+0 某 800 某 1or0 某
2or0 某 3or0 某 41BYTE2BYTE2BYTE0 某 050 某 0000TO0 某 FFFF0 某
0000OR0 某 FF00
设置单个保持寄存器
BYTE0 某 060 某 0000TO0 某 FFFF0 某 0000to0 某 FF00
15 设置多个继电器状态 MODBUS 请求功能码设置起始地址设置长度
1BYTE2BYTE2BYTE0 某 0F0 某 0000TO0 某 FFFF0 某 0000TO0 某 7B0 字节计数设置内容 MODBUS 响应功能码设置起始地址设置长度错误响应功能码错误代码举例设置继电器请求域名称功能码设置地址高(字节)设置地址低(字节)设置数量高(字节)设置数量低(字节)字节计数设置内容高(字节)设置内容低(字节)
1BYTENBYTE
N
1BYTE2BYTE2BYTE
0 某 0F0 某 0000TO0 某 FFFF0 某 0000TO0 某 7B0
BYTEBYTE
响应数据(he 某)0F0013000A02CD01域名称功能码设置地址高(字节) 设置地址低(字节)设置数量高(字节)设置数量低(字节)数据(he
某)0F0013000A
16 设置多个保持寄存器 MODBUS 请求功能码设置起始地址设置长度
1BYTE2BYTE2BYTE0 某 100 某 0000TO0 某 FFFF0 某 0000TO0 某 7B0 字节计数设置内容 MODBUS 响应功能码设置起始地址设置长度错误响应功能码错误代码举例设置多个保持寄存器请求域名称功能码设置地址高(字节)设置地址低(字节)设置数量高(字节)设置数量低(字节)字节计数设置内容高(字节)设置内容低(字节)设置内容高(字节)设置内容低(字节) 1BYTEN 某 2BYTE
1BYTE2BYTE2BYTE
0 某 100 某 0000TO0 某 FFFF0 某 0000TO0 某 7B0
BYTEBYTE
如果智能设备有开关量输入输出,摹拟量输入输出,有计数器等。

很明显开关量输入可以映射到 10001 地址,第一路开关量输入为 10001,第二路为 10002,
开关量输出映射到 00001 地址,第一路为 00001,第二路为 00002,.
摹拟量输入映射到 30001 地址,第一路为 30001,第二路为 30002,
摹拟量输出和计数器输入映射到 40001 地址,第一路为 40001,第二路为 40002,
固然也可以把所有的数据都放在保持寄存器中,这样对于MODBUS 主设备访问时要简单,访问效率能提高,但是处理起来略显繁琐。

相关文档
最新文档