# const.py 函数文档
Modbus协议常量定义模块,包含功能码、异常码、PDU常量以及CRC校验表。
## Modbus功能码
### 基础读写操作
python
# 线圈操作
READ_COILS = 0x01 # 读线圈
WRITE_SINGLE_COIL = 0x05 # 写单个线圈
WRITE_MULTIPLE_COILS = 0x0F # 写多个线圈
# 离散输入
READ_DISCRETE_INPUTS = 0x02 # 读离散输入
# 寄存器操作
READ_INPUT_REGISTER = 0x04 # 读输入寄存器
READ_HOLDING_REGISTERS = 0x03 # 读保持寄存器
WRITE_SINGLE_REGISTER = 0x06 # 写单个寄存器
WRITE_MULTIPLE_REGISTERS = 0x10 # 写多个寄存器
### 高级功能码
python
READ_WRITE_MULTIPLE_REGISTERS = 0x17 # 读写多个寄存器
MASK_WRITE_REGISTER = 0x16 # 屏蔽写寄存器
READ_FIFO_QUEUE = 0x18 # 读FIFO队列
READ_FILE_RECORD = 0x14 # 读文件记录
WRITE_FILE_RECORD = 0x15 # 写文件记录
### 诊断功能码
python
READ_EXCEPTION_STATUS = 0x07 # 读取异常状态
DIAGNOSTICS = 0x08 # 诊断
GET_COM_EVENT_COUNTER = 0x0B # 获取通信事件计数
GET_COM_EVENT_LOG = 0x0C # 获取通信事件日志
REPORT_SERVER_ID = 0x11 # 报告服务器ID
READ_DEVICE_IDENTIFICATION = 0x2B # 读取设备标识
## 异常码
### 通用异常
python
ILLEGAL_FUNCTION = 0x01 # 非法功能
ILLEGAL_DATA_ADDRESS = 0x02 # 非法数据地址
ILLEGAL_DATA_VALUE = 0x03 # 非法数据值
SERVER_DEVICE_FAILURE = 0x04 # 服务器设备故障
### 特定异常
python
ACKNOWLEDGE = 0x05 # 确认
SERVER_DEVICE_BUSY = 0x06 # 服务器设备忙
MEMORY_PARITY_ERROR = 0x08 # 内存奇偶校验错误
GATEWAY_PATH_UNAVAILABLE = 0x0A # 网关路径不可用
DEVICE_FAILED_TO_RESPOND = 0x0B # 设备响应失败
## PDU常量
python
CRC_LENGTH = 0x02 # CRC长度
ERROR_BIAS = 0x80 # 错误偏移
RESPONSE_HDR_LENGTH = 0x02 # 响应头长度
ERROR_RESP_LEN = 0x05 # 错误响应长度
FIXED_RESP_LEN = 0x08 # 固定响应长度
MBAP_HDR_LENGTH = 0x07 # MBAP头长度
## CRC16查找表
- 用途: 用于快速计算Modbus RTU消息的CRC校验值
- 大小: 256个16位值
- 生成多项式: 0xA001 (逆序的0x8005)
### CRC16表生成算法
python
def generate_crc16_table():
"""生成CRC16查找表的算法"""
crc_table = []
for byte in range(256):
crc = 0x0000
for _ in range(8):
if (byte ^ crc) & 0x0001:
crc = (crc >> 1) ^ 0xa001
else:
crc >>= 1
byte >>= 1
crc_table.append(crc)
return crc_table
## 使用示例
### 功能码使用
python
# 读取线圈
function_code = READ_COILS
# 写入单个寄存器
function_code = WRITE_SINGLE_REGISTER
### 异常处理
python
def check_response(response):
if response[1] & ERROR_BIAS:
error_code = response[2]
if error_code == ILLEGAL_FUNCTION:
raise ValueError("非法功能码")
elif error_code == ILLEGAL_DATA_ADDRESS:
raise ValueError("非法数据地址")
### CRC校验使用
python
def calculate_crc(message):
"""计算消息的CRC值"""
crc = 0xFFFF
for byte in message:
crc = (crc >> 8) ^ CRC16_TABLE[(crc ^ byte) & 0xFF]
return crc
## 技术规格
### 功能码范围
- 标准功能码: 1-127
- 用户自定义: 128-255
### 异常码特性
- 异常响应: 功能码 + 0x80
- 标准异常码: 1-11
### CRC特性
- 多项式: x^16 + x^15 + x^2 + 1
- 初始值: 0xFFFF
- 反转输入/输出: 是
- XOR输出: 0x0000
## 注意事项
1. 功能码使用
- 确认设备支持
- 注意参数范围
- 处理异常响应
2. 异常处理
- 检查所有响应
- 适当的错误恢复
- 记录异常情况
3. CRC校验
- 所有RTU消息必需
- 验证接收数据
- 注意字节顺序
4. 最佳实践
- 使用常量提高可读性
- 合理的异常处理
- 正确的CRC计算