(一)Modbus 简明介绍

声明:该资源从安富莱论坛摘录

1.Modbus简介——来自*

Modbus是一种串行通信协议,是Modicon于1979年,为使用可编程逻辑控制器(PLC)而发表的。MODBUS是工业领域通信协议的业界标准,并且现在是工业电子设备之间相当常用的连接方式。Modbus比其他通信协议使用的更广泛的主要原因有:
1.公开发表并且无版税要求
2.相对容易的工业网络部署
3.对供应商来说,修改移动原生的位元或字节没有很多限制

2.MODBUS指令说明

2.1 读线圈寄存器01H

1) 描述:

读MODBUS从机线圈寄存器当前状态。

2) 查询:

例如从机地址为0x11,线圈寄存器的起始地址为0x0013,结束地址为0x0037。该次查询总共访问(0x0037-0x0013 + 1)37个线圈寄存器。

表2.1.1 读线圈寄存器-查询
  Hex
从机地址(1个字节) 11
功能码(1个字节) 01
寄存器起始地址高字节(1个字节) 00
寄存器起始地址低字节(1个字节) 13
寄存器数量高字节(1个字节) 00
寄存器数量低字节(1个字节) 25
CRC校验高字节(1个字节) 0E
CRC校验低字节(1个字节) 84

3) 响应

响应负载中的各线圈状态与数据内容每位相对应。1代表ON,0代表OFF。若返回的线圈数不为8的倍数,则在最后数据字节未尾使用0代替。

表2.1.2 读线圈寄存器-响应
  Hex
从机地址(1个字节) 11
功能码(1个字节) 01
返回字节数(1个字节) 05
数据1(线圈0x001A - 线圈0x0013)(1个字节) CD
数据2(线圈0x0022 - 线圈0x001B)(1个字节) 6B
数据3(线圈0x002A - 线圈0x0023)(1个字节) B2
数据4(线圈0x0032 - 线圈0x002B)(1个字节) 0E
数据5(线圈0x0037 - 线圈0x0033)(1个字节) 1B
CRC校验高字节(1个字节) 45
CRC校验低字节(1个字节) E6

线圈0x0013到线圈0x001A的状态为0xCD,二进制值为11001101,该字节的最高字节为线圈0x001A,最低字节为线圈0x0013。线圈0x001A到线圈0x0013的状态分别为ON-ON-OFF-OFF-ON-ON-OFF-ON。

表2.1.3 线圈0x0013到0x001A状态
0x001A 0x0019 0x0018 0x0017 0x0016 0x0015 0x0014 0x0013
ON ON OFF OFF ON ON OFF ON

最后一个数据字节中,线圈0x0033到线圈0x0037状态为0x1B(二进制00011011),线圈0x0037是左数第4位,线圈0x0033为该字节的最低字节,线圈0x0037至线圈0x0033的状态分别为ON-ON-OFF-ON-ON,剩余3位使用0填充。

表2.1.4 线圈0x0033到线圈0x0037状态
0x003A 0x0039 0x0038 0x0037 0x0036 0x0035 0x0034 0x0033
填充 填充 填充 ON ON OFF ON ON

 

2.2 读离散输入寄存器 02H

1) 说明

读离散输入寄存器状态。

2) 查询

从机地址为0x11。离散输入寄存器的起始地址为0x00C4,结束寄存器地址为0x00D9。总共访问(0x00D9-0x00C4+1)22个离散输入寄存器。

表 2.2.1 读离散输入寄存器——查询
  Hex
从机地址(1个字节) 11
功能码(1个字节) 02
寄存器地址高字节(1个字节) 00
寄存器地址低字节(1个字节) C4
寄存器数量高字节(1个字节) 00
寄存器数量低字节(1个字节) 16
CRC校验高字节(1个字节) BA
CRC校验低字节(1个字节) A9

3) 响应

响应各离散输入寄存器状态,分别对应数据区中的每位值,1 代表ON;0 代表OFF。第一个数据字节的LSB(最低字节)为查询的寻址地址,其他输入口按顺序在该字节中由低字节向高字节排列,直到填充满8位。下一个字节中的8个输入位也是从低字节到高字节排列。若返回的输入位数不是8的倍数,则在最后的数据字节中的剩余位至该字节的最高位使用0填充。

表2.2.1 读输入寄存器-响应
  Hex
从机地址(1个字节) 11
功能码(1个字节) 02
返回字节数(1个字节) 03
数据1(0x00CB - 0x00C4)(1个字节) AC
数据1(0x00D3 - 0x00CC)(1个字节) DB
数据1(0x00D9 - 0x00D4)(1个字节) 35
CRC校验高字节(1个字节) 20
CRC校验低字节(1个字节) 18

离散输入寄存器0x00D4到0x00D9的状态为0x35 (二进制00110101)。输入寄存器0x00D9为左数第3位,输入寄存器0x00D4为最低位,输入寄存器0x00D9到0x00D4的状态分别为ON-ON-OFF-ON-OFF-ON。0x00DB寄存器和0x00DA寄存器被0填充。

表2.2.2 离散输入寄存器0x00C4到0x00DB状态
0x00CB 0x00CA 0x00C9 0x00C8 0x00C7 0x00C6 0x00C5 0x00C4
0 0 1 1 0 1 0 1
0x00D3 0x00D2 0x00D1 0x00D0 0x00CF 0x00CE 0x00CD 0x00CC
1 1 1 0 1 0 1 1
0x00DB 0x00DA 0x00D9 0x00D8 0x00D7 0x00D6 0x00D5 0x00D4
填充 填充 1 1 0 1 0 1

2.3 读保持寄存器 03H

1) 说明
读保持寄存器。可读取单个或多个保持寄存器。
2) 查询
从机地址为0x11。保持寄存器的起始地址为0x006B,结束地址为0x006D。该次查询总共访问(0x006D-0x006B+1)3个保持寄存器。

表2.3.1 读保持寄存器-查询
  Hex
从机地址(1个字节) 11
功能码(1个字节) 03
寄存器地址高字节(1个字节) 00
寄存器地址低字节(1个字节) 6B
寄存器数量高字节(1个字节) 00
寄存器数量低字节(1个字节) 03
CRC高字节(1个字节) 76
CRC低字节(1个字节) 87


3) 响应
保持寄存器的长度为2个字节。对于单个保持寄存器而言,寄存器高字节数据先被传输,低字节数据后被传输。保持寄存器之间,低地址寄存器先被传输,高地址寄存器后被传输。

表2.3.2 读保持寄存器-响应
  Hex
从机地址(1个字节) 11
功能码(1个字节) 03
字节数(1个字节) 06
数据1高字节(0x006B)(1个字节) 00
数据1低字节(0x006B)(1个字节) 6B
数据2高字节(0x006C)(1个字节) 00
数据2低字节(0x006C)(1个字节) 13
数据3高字节(0x006D)(1个字节) 00
数据3低字节(0x006D)(1个字节) 00
CRC高字节(1个字节) 38
CRC低字节(1个字节) B9
表2.3.3保持寄存器0x006B到0x006D结果

0x006B

高字节

0x006B

低字节

0x006C

高字节

0x006C

低字节

0x006D

高字节

0x006D

低字节

00 6B 00 13 00 00

2.4 读输入寄存器 04H


1) 说明
读输入寄存器命令。该命令支持单个寄存器访问也支持多个寄存器访问。
2) 查询
从机地址为0x11。输入寄存器的起始地址为0x0008,寄存器的结束地址为0x0009。本次访问访问2个读入寄存器。

表2.4.1 读输入寄存器-查询
  Hex
从机地址(1个字节) 11
功能码(1个字节) 04
寄存器起始地址高字节(1个字节) 00
寄存器起始地址低字节(1个字节) 08
寄存器数量高字节(1个字节) 00
寄存器数量低字节(1个字节) 02
CRC高字节(1个字节) F2
CRC低字节(1个字节) 99

3) 响应
输入寄存器长度为2个字节。对于单个输入寄存器而言,寄存器高字节数据先被传输,低字节数据后被传输。输入寄存器之间,低地址寄存器先被传输,高地址寄存器后被传输。

表2.4.2 读寄存器-响应
  Hex
从机地址(1个字节) 11
功能码(1个字节) 04
字节数(1个字节) 04
数据1高字节(0x0008)(1个字节) 00
数据1低字节(0x0008)(1个字节) 0A
数据2高字节(0x0009)(1个字节) 00
数据2低字节(0x0009)(1个字节) 0B
CRC高字节(1个字节) 8B
CRC低字节(1个字节) 80
表2.4.3输入寄存器0x0008到0x0009结果

0x0008

高字节

0x0008

低字节

0x0009

高字节

0x0009

低字节

0x00 0x0A 0x00 0x0B

2.5 写单个线圈寄存器 05H

1) 说明
写单个线圈寄存器。0xFF00值请求线圈处于ON状态,0x0000值请求线圈处于OFF状态。0x05指令设置单个线圈的状态,0x15指令可以设置多个线圈的状态,两个指令虽然都设定线圈的ON/OFF状态,但是ON/OFF的表达方式却不同。
2) 查询
从机地址为0x11,线圈寄存器的地址为0x00AC。使0x00AC线圈处于ON状态,即数据内容为0xFF00。

表2.5.1 写单个线圈-查询
  Hex
从机地址(1个字节) 11
功能码(1个字节) 05
寄存器地址高字节(1个字节) 00
寄存器地址低字节(1个字节) AC
数据1高字节(1个字节) FF
数据1低字节(1个字节) 00
CRC校验高字节(1个字节) 4E
CRC校验低字节(1个字节) 8B

 

3) 响应

2.5.1强制单个线圈——响应
  Hex
从机地址(1个字节) 11
功能码(1个字节) 05
寄存器地址高字节(1个字节) 00
寄存器地址低字节(1个字节) AC
寄存器1高字节(1个字节) FF
寄存器1低字节(1个字节) 00
CRC校验高字节(1个字节) 4E
CRC校验低字节(1个字节) 8B

2.6 写单个保持寄存器 06H


1) 说明
写保持寄存器。注意0x06指令只能操作单个保持寄存器,0x16指令可以设置单个或多个保持寄存器。
2) 查询
从机地址为0x11。保持寄存器地址为0x0001。寄存器内容为0x0003。

表2.6.1 写单个保持寄存器——查询
  Hex
从机地址(1个字节) 11
功能码(1个字节) 06
寄存器地址高字节(1个字节) 00
寄存器地址低字节(1个字节) 01
数据1高字节(1个字节) 00
数据1低字节(1个字节) 01
CRC校验高字节(1个字节) 9A
CRC校验低字节(1个字节) 9B

3) 响应

表2.6.2 写单个保持寄存器——响应
  Hex
从机地址(1个字节) 11
功能码(1个字节) 06
寄存器地址高字节(1个字节) 00
寄存器地址低字节(1个字节) 01
寄存器数量高字节(1个字节) 00
寄存器数量低字节(1个字节) 01
CRC校验高字节(1个字节) 1B
CRC校验低字节(1个字节) 5A

2.7 写多个线圈寄存器 0FH


1) 说明
写多个线圈寄存器。若数据区的某位值为“1”表示被请求的相应线圈状态为ON,若某位值为“0”,则为状态为OFF。
2) 查询
从机地址为0x11,线圈寄存器的起始地址为0x0013,线圈寄存器的结束地址为0x001C。总共访问(0x001C-0x0013+1)10个寄存器。寄存器内容如下表所示。

表2.7.1 线圈寄存器0013H到001CH
0x001A 0x0019 0x0018 0x0017 0x0016 0x0015 0x0014 0x0013
1 1 0 0 1 1 0 1
0x0022 0x0021 0x0020 0x001F 0x001E 0x001D 0x001C 0x001B
0 0 0 0 0 0 0 1

传输的第一个字节0xCD对应线圈为0x0013到0x001A,LSB(最低位)对应线圈0x0013,传输第二个字节为 0x01,对应的线圈为0x001B到0x001C,LSB对应线圈0x001C,其余未使用位使用0填充。

表2.7.1 写多个线圈寄存器——查询
  Hex
从机地址(1个字节) 11
功能码(1个字节) 0F
寄存器地址高字节(1个字节) 00
寄存器地址低字节(1个字节) 13
寄存器数量高字节(1个字节) 00
寄存器数量低字节(1个字节) 0A
字节数(1个字节) 02
数据1(0x0013 - 0x001A)(1个字节) CD
数据2(0x001B - 0x001C)(1个字节) 01
CRC校验高字节(1个字节) BF
CRC校验低字节(1个字节) 0B

3) 响应

表2.7.1 写多个线圈寄存器——响应
  Hex
从机地址(1个字节) 11
功能码(1个字节) 0F
寄存器地址高字节(1个字节) 00
寄存器地址低字节(1个字节) 13
寄存器数量高字节(1个字节) 00
寄存器数量低字节(1个字节) 0A
字节数(1个字节) 02
CRC校验高字节(1个字节) 99
CRC校验低字节(1个字节) 1B

2.8 写多个保持寄存器10H

1) 说明
写多个保持寄存器。
2) 查询
从机地址为0x11。保持寄存器的起始地址为0x0001,寄存器的结束地址为0x0002。总共访问(0x0002-0x0001+1)2个寄存器。保持寄存器0x0001的内容为0x000A,保持寄存器0x0002的内容为0x0102。

表2.8.1 写多个保持寄存器——请求
  Hex
从机地址(1个字节) 11
功能码(1个字节) 10
寄存器起始地址高字节(1个字节) 00
寄存器起始地址低字节(1个字节) 01
寄存器数量高字节(1个字节) 00
寄存器数量低字节(1个字节) 02
字节数(1个字节) 04
数据1高字节(1个字节) 00
数据1低字节(1个字节) 0A
数据2高字节(1个字节) 01
数据2低字节(1个字节) 02
CRC校验高字节(1个字节) C6
CRC校验低字节(1个字节) F0
表2.8.2保持寄存器0x0001到0x0002内容
地址

0x0001

高字节

0x0001

低字节

0x0002

高字节

0x0002

低字节

数值 0x00 0x0A 0x01 0x02

3) 响应

表2.8.3 写多个保持寄存器——响应
  Hex
从机地址(1个字节) 11
功能码(1个字节) 10
寄存器起始地址高字节(1个字节) 00
寄存器起始地址低字节(1个字节) 01
寄存器数量高字节(1个字节) 00
寄存器数量低字节(1个字节) 02
CRC校验高字节(1个字节) 12
CRC校验低字节(1个字节) 98
上一篇:C# ModBus Tcp读写数据 与服务器进行通讯 安卓modbus tcp


下一篇:PLC作为Modbus TCP客户端