Modbus 协议一之 MODBUS 事物处理
前言
-
该标准包括两个通信规程中使用的MODBUS 应用层协议和服务规范:
- 串行链路上的MODBUS
- TCP/IP 上的MODBUS
-
MODBUS 是一个请求/应答协议,并且提供功能码规定的服务
-
MODBUS
功能码
是MODBUS请求/应答PDU 的元素
一、总体描述
1.1 协议描述
-
协议数据单元(PDU)
-
应用数据单元(ADU)
1.1.1 客户机请求
-
客户机创建MODBUS 的ADU,功能码向服务器指示将执行哪种操作。
-
MODBUS 数据单元的功能码域占一个字节,有效的码字范围是十进制1-255,28-255 为异常响应保留
-
客户机向服务器设备发送的报文数据域包括
附加信息
,服务器使用此附加信息执行功能码定义的操作。该数据域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。 -
数据域可以是不存在的(0 长度),在此情况下服务器不需要任何附加信息。
-
在一个正确接收的MODBUS ADU中,不出现与请求MODBUS 功能有关的差错,服务器至客户机的
响应数据域包括请求数据
。出现与请求MODBUS 功能有关的差错,那么域包 括一个异常码
,服务器应用能够使用这个域确定下一个执行的操作。
1.1.2 ADU、PDU字节大小
-
最大RS485
ADU=256字节
,对串行链路通信来说,MODBUSPDU=256-服务器地址(1 字节)-CRC(2 字节)=253字节
-
RS232 / RS485 ADU = 253 字节+服务器地址(1 byte) + CRC (2 字节) = 256 字节
-
TCP MODBUS ADU = 249 字节+ MBAP (7 字节) = 256 字节
1.1.2 PDU
MODBUS 协议定义了三种PDU:
- MODBUS 请求PDU,mb_req_pdu
- MODBUS 响应PDU,mb_rsp_pdu
- MODBUS 异常响应PDU,mb_excep_rsp_pdu
mb_req_pdu = { function_code, request_data},
其中function_code : [1 个字节] MODBUS 功能码
request_data :[n 个字节],该域与功能码有关,通常包括可变参考、变量、数据偏移量、子功能码等信息
mb_rsp_pdu = { function_code, response_ data},其中
function_code :[1 个字节] MODBUS 功能码
response_data : [n 个字节],该域与功能码有关,通常包括可变参考、变量、数据偏移量、子功能码等信息
mb_excep_rsp_pdu = { function_code, request_data},其中
function_code : [1 个字节] MODBUS 功能码+ 0x80
exception_code : [1 个字节],在下表中定义了MODBUS 异常码。
1.2 数据编码
- MODBUS 使用 大端 表示地址项和数据项。发射多个字节时,首先发送最高有效
寄存器大小 | 值 |
---|---|
16比特 | 0x1234 |
- 发送的第一字节为0x12 然后0x34
1.3 MODBUS数据模型
1.4 MODBUS事务处理的定义
- 服务器侧MODBUS 事务处理的一般处理过程。
MODBUS 服务器事务建立MODBUS 响应,可以建立两种类型响应:
-
MODBUS 正常响应: 响应功能码 = 请求功能码
-
MODBUS 异常响应: 响应功能码 = 请求功能码 + 0x80;
- 为客户机提供处理过程中与被发现的差错相关的信息
- 提供一个异常码来指示差错原因。
1.5 功能码的分类(三类)
1.5.1 公共功能码
- 唯一性
- 公开性
- MB IETF RFC 中证明
1.5.2 用户定义功能码
- 范围为:65 至72 和十进制100 至110
- 自行定义
- 不能保证被选功能码的使用是唯一
1.5.3 保留功能码
1.6 功能码描述
1.6.1 01(0x01)读线圈
- 作用:读取线圈的1 至2000 连续状态
- 起始地址,即指定的第一个线圈地址和线圈编号
- 从零开始寻址线圈。因此寻址线圈1-16 为0-15
- 根据数据域的每个比特将响应报文中的线圈分成为一个线圈(指示状态为1= ON 和0= OFF)
- 返回的输出数量不是八的倍数,用零填充最后数据字节中的剩余比特,字节数量域说明了数据的完整字节数
- *N=输出数量/8,余数不等于0,那么 N = N+1
例如:请求读离散量输出20-38
- 输出27-20 的状态表示为十六进制字节值CD,或二进制1100 1101。输出27是这个字节的MSB,输出20是LSB。
- 第一字节的输出从左至右为27 至20。下一个字节的输出从左到右为35 至28
- 串行发射比特时,从LSB 向MSB 传输:20 . . .27、28 . . . 35 等等。
注:用零填充五个剩余比特(一直到高位端)
1.6.2 02 (0x02)读离散量输入
- 作用:读取离散量输入的1 至2000 连续状态
- 起始地址,即指定的第一个输入地址和输入编号
- 从零开始寻址输入,寻址输入1-16 为0-15
- 根据数据域的每个比特将响应报文中的离散量输入分成为一个输入,指示状态为1= ON 和0 = OFF
- 返回的输入数量不是八的倍数,将用零填充最后数据字节中的剩余比特
- 字节数量域说明了数据的完整字节数。
- *N=输出数量/8,如果余数不等于0,那么N = N+1
例如:请求读离散量输入197-218
- 离散量输入状态204-197 表示为十六进制字节值AC,或二进制1010 1100。输入204是这个字节的MSB,输入197是这个字节的LSB
注:用零填充2 个剩余比特(一直到高位端)
MODBUS异常响应
-
客户机设备向服务器设备发送请求时,客户机希望一个正常响应.
-
异常响应报文有两个与正常响应不同的域:
功能码域:正常响应
,服务器利用响应功能码域来应答最初请求的功能码。最高有效位(MSB)都为0
。异常响应
,服务器设置功能码的MSB 为1,异常响应中的功能码值比正常响应中的功能码值高十六进制80。
数据域: 正常响应,服务器返回数据域中数据或统计表。异常响应
中,服务器返回数据域中的异常码
例如:
- 客户机对服务器设备寻址请求
- 功能码(01)用于读输出状态操作,“请求” 地址1245(十六进制04A1)的输出状态
- 服务器设备中不存在输出地址,服务器将返回异常码(02)的异常响应
代码 | 名称 | 含义 |
---|---|---|
01 | 非法功能 | |
02 | 非法数据地址 | |
03 | 非法数据值 | |
04 | 从站设备故障 | |
05 | 确认 | |
06 | 从属设备忙 | |
08 | 存储奇偶性差错 | |
0A | 不可用网关路径 | |
0B | 网关目标设备响应失 |
本文来自博客园,作者:登云上人间,转载请注明原文链接:https://www.cnblogs.com/lj15941314/articles/CommunicationProtocol.html