Modbus协议整理

  • Post author:
  • Post category:其他




01 读线圈状态

读取从机的线圈状态(ON/OFF),位操作。

例:请求从机设备17读00020-00056线圈。其中00020-00056为线圈的寄存器信息地址,这些线圈的寄存器寻址地址为0019 – 0055,共访问37个线圈。

描述 Hex
从机地址 11
功能码 01
起始地址(高) 00
起始地址(低) 13
线圈数量(高) 00
线圈数量(低) 25
CRC校验(高)
CRC校验(低)

响应:响应信息中的各线圈的状态与数据区的每一位的值相对应,1代表ON;0代表OFF。若返回的线圈数不是8的倍数,则在最后的数据字节未使用的位中全部填充0,字节数区说明全部数据的字节数。

描述 Hex
从机地址 11
功能码 01
返回字节数 05
数据1(线圈00027-线圈00020) CD
数据2(线圈00035-线圈00028) 6B
数据3(线圈00043-线圈00036) B2
数据4(线圈00051-线圈00044) 0E
数据5(线圈00056-线圈00052) 1B
CRC校验(高)
CRC校验(低)



使用Modbus Slave、Modbus Slave和Virtual Serial Port Driver,三个工具进行modbus通信模拟



示例


发送

读取从00地址开始后8个线圈的状态

从机地址 功能码 起始地址(高) 起始地址(低) 线圈数量(高) 线圈数量(低) CRC校验(高) CRC校验(低)
01 01 00 00 00 08 3D CC


回复

00到07的线圈的状态都是off

从机地址 功能码 返回字节数 数据1 CRC校验(高) CRC校验(低)
01 01 01 00 51 88

Tx: 01 01 00 00 00 08 3D CC

Rx: 01 01 01 00 51 88



发送

读取从01地址开始后4个线圈的状态

从机地址 功能码 起始地址(高) 起始地址(低) 线圈数量(高) 线圈数量(低) CRC校验(高) CRC校验(低)
01 01 00 01 00 04 6C 09


回复

01到04的线圈的状态分别是on on on off

从机地址 功能码 返回字节数 数据1 CRC校验(高) CRC校验(低)
01 01 01 07 10 4A

Tx: 01 01 00 01 00 04 6C 09

Rx: 01 01 01 07 10 4A




02 读输入位状态

读取从机的输入状态(ON/OFF),位操作。

用法同上



示例


发送

读取从00地址开始后8个输入位的状态

从机地址 功能码 起始地址(高) 起始地址(低) 输入位数量(高) 输入位数量(低) CRC校验(高) CRC校验(低)
01 02 00 00 00 08 79 CC


回复

00到07的输入位的状态都是off

从机地址 功能码 返回字节数 数据1 CRC校验(高) CRC校验(低)
01 02 01 00 A1 88

Tx: 01 02 00 00 00 08 79 CC

Rx: 01 02 01 00 A1 88



发送

读取从01地址开始后4个的状态

从机地址 功能码 起始地址(高) 起始地址(低) 输入位数量(高) 输入位数量(低) CRC校验(高) CRC校验(低)
01 02 00 01 00 04 28 09


回复

01到04的输入位的状态分别是on on on off

从机地址 功能码 返回字节数 数据1 CRC校验(高) CRC校验(低)
01 02 01 07 E0 4A

Tx: 01 02 00 01 00 04 28 09

Rx: 01 02 01 07 E0 4A




03 读保持寄存器

读取从机的保持寄存器,一个寄存器两个字节,字操作。

例:请求从机设备17的0x13,0x14,0x15三个寄存器的数据

描述 Hex
从机地址 11
功能码 03
寄存器起始地址(高) 00
寄存器起始地址(低) 13
寄存器数量(高) 00
寄存器数量(低) 03
CRC校验(高)
CRC校验(低)

响应:

描述 Hex
从机地址 11
功能码 03
返回字节数 06
数据1(寄存器0x13高位) CD
数据1(寄存器0x13低位) 6B
数据2(寄存器0x14高位) 6B
数据2(寄存器0x14低位) 6B
数据3(寄存器0x15高位) 6B
数据3(寄存器0x15低位) 6B
CRC校验(高)
CRC校验(低)



示例


发送

读取从00地址开始后8个保持寄存器的值

从机地址 功能码 寄存器起始地址(高) 寄存器起始地址(低) 寄存器数量(高) 寄存器数量(低) CRC校验(高) CRC校验(低)
01 03 00 00 00 08 44 0C


回复

00到07的保持寄存器的值都为0x0000

从机地址 功能码 返回字节数 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 CRC校验(高) CRC校验(低)
01 03 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E4 59

Tx: 01 03 00 00 00 08 44 0C

Rx: 01 03 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E4 59




04 读输入寄存器

读取从机的输入寄存器,一个寄存器两个字节,字操作。

用法同上



示例


发送

读取从00地址开始后8个寄存器的值

从机地址 功能码 寄存器起始地址(高) 寄存器起始地址(低) 寄存器数量(高) 寄存器数量(低) CRC校验(高) CRC校验(低)
01 04 00 00 00 08 F1 CC


回复

00到07的寄存器的值都为0x0000

从机地址 功能码 返回字节数 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 数据 CRC校验(高) CRC校验(低)
01 04 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 2C

Tx: 01 04 00 00 00 08 F1 CC

Rx: 01 04 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 2C




05 写单个线圈

ff00h为写1,0000h为写0。

例:把地址为0的线圈写1

描述 Hex
从机地址 11
功能码 05
寄存器起始地址(高) 00
寄存器起始地址(低) 00
线圈值(高) ff
线圈值(低) 00
CRC校验(高)
CRC校验(低)

响应:

描述 Hex
从机地址 11
功能码 05
寄存器起始地址(高) 00
寄存器起始地址(低) 00
线圈值(高) ff
线圈值(低) 00
CRC校验(高)
CRC校验(低)



示例


发送

把地址为1的线圈写0

从机地址 功能码 寄存器起始地址(高) 寄存器起始地址(低) 线圈值(高) 线圈值(低) CRC校验(高) CRC校验(低)
01 05 00 01 00 00 9C 0A


响应

从机地址 功能码 寄存器起始地址(高) 寄存器起始地址(低) 线圈值(高) 线圈值(低) CRC校验(高) CRC校验(低)
01 05 00 01 00 00 9C 0A

Tx: 01 05 00 01 00 00 9C 0A

Rx: 01 05 00 01 00 00 9C 0A




06 写单个保持寄存器

写从机的保持寄存器,一个寄存器两个字节,字操作。

例:往地址为0的寄存器写1

描述 Hex
从机地址 11
功能码 06
寄存器起始地址(高) 00
寄存器起始地址(低) 00
寄存器值(高) 00
寄存器值(低) 01
CRC校验(高)
CRC校验(低)

响应:

描述 Hex
从机地址 11
功能码 06
寄存器起始地址(高) 00
寄存器起始地址(低) 00
寄存器值(高) 00
寄存器值(低) 01
CRC校验(高)
CRC校验(低)



示例


发送

把地址为1的线圈写1

从机地址 功能码 寄存器起始地址(高) 寄存器起始地址(低) 寄存器值(高) 寄存器值(低) CRC校验(高) CRC校验(低)
01 06 00 01 00 01 19 CA


响应

从机地址 功能码 寄存器起始地址(高) 寄存器起始地址(低) 寄存器值(高) 寄存器值(低) CRC校验(高) CRC校验(低)
01 06 00 01 00 01 19 CA

Tx: 01 06 00 01 00 01 19 CA

Rx: 01 06 00 01 00 01 19 CA




15 写多个线圈

写从机的多个线圈,位操作。

例:请求从机设备17写00020-00030线圈,未使用位补0。

描述 Hex
从机地址 11
功能码 0f
起始地址(高) 00
起始地址(低) 13
线圈数量(高) 00
线圈数量(低) 0a
字节数 04
数据1(线圈27-20) 00
数据2(线圈29-28) 00
CRC校验(高)
CRC校验(低)

响应:

描述 Hex
从机地址 11
功能码 0f
起始地址(高) 00
起始地址(低) 13
线圈数量(高) 00
线圈数量(低) 0a
CRC校验(高)
CRC校验(低)



示例


发送

从机地址 功能码 起始地址(高) 起始地址(低) 线圈数量(高) 线圈数量(低) 字节数 数据1 CRC校验(高) CRC校验(低)
01 0F 00 01 00 08 01 37 82 83


响应

从机地址 功能码 起始地址(高) 起始地址(低) 线圈数量(高) 线圈数量(低) CRC校验(高) CRC校验(低)
01 0F 00 01 00 08 05 CD

Tx: 01 0F 00 01 00 08 01 37 82 83

Rx: 01 0F 00 01 00 08 05 CD




16 写多个保持寄存器

写从机的保持寄存器,一个寄存器两个字节,字操作。

例:往地址0x13,0x14的寄存器写值

描述 Hex
从机地址 11
功能码 10
寄存器起始地址(高) 00
寄存器起始地址(低) 13
寄存器数量(高) 00
寄存器数量(低) 02
字节数 04
数据1(高位) 00
数据1(低位) 00
数据2(高位) 00
数据2(低位) 00
CRC校验(高)
CRC校验(低)

响应:

描述 Hex
从机地址 11
功能码 10
寄存器起始地址(高) 00
寄存器起始地址(低) 13
寄存器数量(高) 00
寄存器数量(低) 02
CRC校验(高)
CRC校验(低)



示例


发送

往01 02地址分别写入0x1122 0x3344

从机地址 功能码 寄存器起始地址(高) 寄存器起始地址(低) 寄存器数量(高) 寄存器数量(低) 字节数 数据1(高位) 数据1(高位) 数据2(高位) 数据2(高位) CRC校验(高) CRC校验(低)
01 10 00 01 00 02 04 11 22 33 44 83 96


响应

从机地址 功能码 寄存器起始地址(高) 寄存器起始地址(低) 寄存器数量(高) 寄存器数量(低) CRC校验(高) CRC校验(低)
01 10 00 01 00 02 10 08

Tx: 01 10 00 01 00 02 04 11 22 33 44 83 96

Rx: 01 10 00 01 00 02 10 08




版权声明:本文为kangweijian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。