Modbus通讯格式详解教程

发布时间:2018-06-26 17:44:22

Modbus通讯协议格式

Modbus通讯协议格式为

主机发送:[开始] [从机地址] [功能代码] [起始寄存器地址高8 ] [8] [写单寄存器数高8 ] [8 ] [LRC 校验码] [CR] [LF]

所以本文依据格式逐个介绍解疑:

[开始]

[从机地址] 为已知;

[功能代码] 的名称、作用将在下面介绍;

[寄存器地址]分配及寄存器中值的含义将在下面介绍;

[LRC 校验码] 可以用Commix软件算出来,详细请参考Commix相关资料;

最后是实例加以说明验证。

功能码 名称 作用

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/384 484 584 可使主机模拟编程器功能修改PC从机逻辑

14 探询(184/384 484 584 可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送

15 强置多线圈 强置一串连续逻辑线圈的通断

16 预置多寄存器 把具体的二进制值装入一串连续的保持寄存器

17 报告从机标识 可使主机判断编址从机的类型及该从机运行指示灯的状态

18 884MICRO 84 可使主机模拟编程功能,修改PC状态逻辑

19 重置通信链路 发生非可修改错误后,是从机复位于已知状态,可重置顺序字节

20 读取通用参数(584L 显示扩展存储器文件中的数据信息

21 写入通用参数(584L 把通用参数写入扩展存储文件,或修改之

2264 保留作扩展功能备用

6572 保留以备用户功能所用 留作用户功能的扩展编码

73119 非法功能

120127 保留 留作内部作用

128255 保留 用于异常应答

保护器Modbus 通讯协议

半双工 RS485 口,传输距离≤1200 米。

波特率:9600bt 1 个起始位;8 个数据位,1 位停止位,无奇偶校验位。

选用 ASCII 模式,LRC 检测。

保持寄存器分配

0000000100020003A 相电流 00~01H:整数部分;02~03H:小数部分)

0004000500060007B 相电流 04~05H:整数部分;06~07H:小数部分)

00080009000A000BC 相电流 08~09H:整数部分;0A~0BH:小数部分)

000C000D:电压

000E000F:状态位1 D3 位为“0”工作正常,为“1”电机故障已跳闸)

00100011:状态位2 D4 位为“0”电机未启动,为“1”电机已启动)

00120013:状态位3 D5 位为“0”工作正常,为“1”故障报警)

00140015:状态位4 (故障位)

D0 位:过流

D1 位:堵转

D2 位:不平衡

D3 位:断相

D4 位:欠压

D5 位:过压

D6 位:短路

D7 位:漏电

控制寄存器分配:

0064H00

0065H:控制电机

A1:启动电机

A2:停止电机

A4:故障复位

实例

在这些功能码中较长使用的是123456号功能码,使用它们即可实现对下位机的数字量和模拟量的读写操作。

1、读可读写数字量寄存器(线圈状态):

计算机发送命令:[设备地址] [命令号01] [起始寄存器地址高8] [8] [读取的寄存器数高8] [8] [CRC校验的低8] [CRC校验的高8]

例:[11][01][00][13][00][25][CRC][CRC]

意义如下:

<1>设备地址:在一个485总线上可以挂接多个设备,此处的设备地址表示想和哪一个设备通讯。例子中为想和17(十进制的17是十六进制的11)通讯。

<2>命令号01:读取数字量的命令号固定为01

<3>起始地址高8位、低8位:表示想读取的开关量的起始地址(起始地址为0)。比如例子中的起始地址为19

<4>寄存器数高8位、低8位:表示从起始地址开始读多少个开关量。例子中为37个开关量。

<5>CRC校验:是从开头一直校验到此之前。在此协议的最后再作介绍。此处需要注意,CRC校验在命令中的高低字节的顺序和其他的相反。

设备响应:[设备地址] [命令号01] [返回的字节个数][数据1][数据2]...[数据n][CRC校验的低8] [CRC校验的高8]

例:[11][01][05][CD][6B][B2][0E][1B][CRC][CRC]

意义如下:

<1>设备地址和命令号和上面的相同。

<2>返回的字节个数:表示数据的字节个数,也就是数据12...n中的n的值。

<3>数据1...n:由于每一个数据是一个8位的数,所以每一个数据表示8个开关量的值,每一位为0表示对应的开关断开,为1表示闭合。比如例子中,表示20(索引号为19)开关闭合,21号断开,22闭合,23闭合,24断开,25断开,26闭合,27闭合...如果询问的开关量不是8的整倍数,那么最后一个字节的高位部分无意义,置为0

<4>CRC校验同上。

2、读只可读数字量寄存器(输入状态):

和读取线圈状态类似,只是第二个字节的命令号不再是1而是2

3、写数字量(线圈状态):

计算机发送命令:[设备地址] [命令号05] [需下置的寄存器地址高8] [8] [下置的数据高8] [8] [CRC校验的低8] [CRC校验的高8]

[11][05][00][AC][FF][00][CRC][CRC]

意义如下:

<1>设备地址和上面的相同。

<2>命令号:写数字量的命令号固定为05

<3>需下置的寄存器地址高8位,低8位:表明了需要下置的开关的地址。

<4>下置的数据高8位,低8位:表明需要下置的开关量的状态。例子中为把该开关闭合。注意,此处只可以是[FF][00]表示闭合[00][00]表示断开,其他数值非法。

<5>注意此命令一条只能下置一个开关量的状态。

设备响应:如果成功把计算机发送的命令原样返回,否则不响应。

4、读可读写模拟量寄存器(保持寄存器):

计算机发送命令:[设备地址] [命令号03] [起始寄存器地址高8] [8] [读取的寄存器数高8] [8] [CRC校验的低8] [CRC校验的高8]

例:[11][03][00][6B][00][03][CRC][CRC]

意义如下:

<1> 设备地址和上面的相同。

<2>命令号:读模拟量的命令号固定为03

<3>起始地址高8位、低8位:表示想读取的模拟量的起始地址(起始地址为0)。比如例子中的起始地址为107

<4>寄存器数高8位、低8位:表示从起始地址开始读多少个模拟量。例子中为3个模拟量。注意,在返回的信息中一个模拟量需要返回两个字节。

设备响应:[设备地址] [命令号03] [返回的字节个数][数据1][数据2]...[数据n][CRC校验的低8] [CRC校验的高8]

例:[11][03][06][02][2B][00][00][00][64][CRC][CRC]

意义如下:

<1>设备地址和命令号和上面的相同。

<2>返回的字节个数:表示数据的字节个数,也就是数据12...n中的n的值。例子中返回了3个模拟量的数据,因为一个模拟量需要2个字节所以共6个字节。

<3>数据1...n:其中[数据1][数据2]分别是第1个模拟量的高8位和低8位,[数据3][数据4]是第2个模拟量的高8位和低8位,以此类推。例子中返回的值分别是5550100

<4>CRC校验同上。

5、读只可读模拟量寄存器(输入寄存器):

和读取保存寄存器类似,只是第二个字节的命令号不再是2而是4

6、写单个模拟量寄存器(保持寄存器):

计算机发送命令:[设备地址] [命令号06] [需下置的寄存器地址高8] [8] [下置的数据高8] [8] [CRC校验的低8] [CRC校验的高8]

例:[11][06][00][01][00][03][CRC][CRC]

意义如下:

<1>设备地址和上面的相同。

<2>命令号:写模拟量的命令号固定为06

<3>需下置的寄存器地址高8位,低8位:表明了需要下置的模拟量寄存器的地址。

<4>下置的数据高8位,低8位:表明需要下置的模拟量数据。比如例子中就把1号寄存器的值设为3

<5>注意此命令一条只能下置一个模拟量的状态。

设备响应:如果成功把计算机发送的命令原样返回,否则不响应。

Modbus通讯格式详解教程

相关推荐