modbus 05功能码报文
时间: 2024-12-31 07:37:29 浏览: 17
### Modbus 协议中 05 功能码的报文格式
#### 请求帧结构
对于 Modbus RTU 中的功能码 05,其请求帧由以下几个部分组成:
- **设备地址 (1 字节)**:指定目标设备的地址。
- **功能码 05 (1 字节)**:表示写单个线圈的操作。
- **起始地址高字节 (1 字节)** 和 **低字节 (1 字节)**:指明要操作的寄存器位置。该地址范围通常是 `0x0000` 到 `0xFFFF`。
- **输出值高字节 (1 字节)** 和 **低字节 (1 字节)**:定义所写的数值。在线圈情况下,只有两种有效状态——`FF 00` 表示 ON 或闭合;`00 00` 表示 OFF 或断开。
- **错误检测域 CRC 高位 (1 字节)** 和 **低位 (1 字节)**:用于确保传输过程中数据未被篡改。
因此,完整的请求消息可能如下所示[^2]:
```plaintext
[设备地址][05][起始地址高位][起始地址低位][输出值高位][输出值低位][CRC高位][CRC低位]
```
例如,如果想要设置位于地址为 `0x001F` 的线圈到开启状态,则发送的数据包应为:
```plaintext
01 05 00 1F FF 00 B8 0A
```
其中,
- `01`: 设备地址;
- `05`: 功能码;
- `00 1F`: 起始地址 (`0x001F`);
- `FF 00`: 输出值(ON/关闭);
- `B8 0A`: 计算得到的 CRC 值。
#### 正常响应帧结构
一旦接收到有效的命令并成功执行后,服务器会返回一个确认信息给客户端,此回复仅包含前面提到过的相同字段而不改变任何参数值,即重复回传原始指令中的所有内容加上新的 CRC 校验和[^3]:
```plaintext
[原设备地址][05][原起始地址高位][原起始地址低位][原输出值高位][原输出值低位][新计算出的CRC高位][新计算出的CRC低位]
```
假设上述例子中的请求被执行无误,那么回应将是相同的序列号以及重新计算后的校验和:
```plaintext
01 05 00 1F FF 00 47 C9
```
#### 异常情况下的响应处理
当遇到错误时,除了正常的反馈外还会附加额外的信息来指示具体发生了什么问题。此时,第二字节不再是原来的功能码而是变为带有标志位的形式(`原功能码 + 0x80`)再加上具体的异常代码作为第三个字节。
比如,在尝试访问非法地址或超出允许范围的情况下可能会触发此类事件,并且回答将类似于这样:
```plaintext
[设备地址][05+0x80=85][异常原因编码][旧CRC高位不变][旧CRC低位也不变]
```
阅读全文