# functions.py 函数文档
Modbus协议的功能函数实现模块,提供各种Modbus命令的打包和验证功能。
## Modbus读取功能
### read_coils
python
def read_coils(starting_address, quantity)
- 功能: 生成读取线圈的Modbus命令
- 参数:
- starting_address: 起始地址
- quantity: 线圈数量 (1-2000)
- 返回值: 打包的命令字节串
- 异常: 数量超出范围时抛出ValueError
### read_discrete_inputs
python
def read_discrete_inputs(starting_address, quantity)
- 功能: 生成读取离散输入的Modbus命令
- 参数:
- starting_address: 起始地址
- quantity: 输入点数量 (1-2000)
- 返回值: 打包的命令字节串
- 异常: 数量超出范围时抛出ValueError
### read_holding_registers
python
def read_holding_registers(starting_address, quantity)
- 功能: 生成读取保持寄存器的Modbus命令
- 参数:
- starting_address: 起始地址
- quantity: 寄存器数量 (1-125)
- 返回值: 打包的命令字节串
- 异常: 数量超出范围时抛出ValueError
### read_input_registers
python
def read_input_registers(starting_address, quantity)
- 功能: 生成读取输入寄存器的Modbus命令
- 参数:
- starting_address: 起始地址
- quantity: 寄存器数量 (1-125)
- 返回值: 打包的命令字节串
- 异常: 数量超出范围时抛出ValueError
## Modbus写入功能
### write_single_coil
python
def write_single_coil(output_address, output_value)
- 功能: 生成写单个线圈的Modbus命令
- 参数:
- output_address: 输出地址
- output_value: 输出值 (0x0000或0xFF00)
- 返回值: 打包的命令字节串
- 异常: 输出值非法时抛出ValueError
### write_single_register
python
def write_single_register(register_address, register_value, signed=True)
- 功能: 生成写单个寄存器的Modbus命令
- 参数:
- register_address: 寄存器地址
- register_value: 寄存器值
- signed: 是否有符号 (默认True)
- 返回值: 打包的命令字节串
### write_multiple_coils
python
def write_multiple_coils(starting_address, value_list)
- 功能: 生成写多个线圈的Modbus命令
- 参数:
- starting_address: 起始地址
- value_list: 值列表
- 返回值: 打包的命令字节串
- 特性:
- 自动分段处理
- 按8位打包数据
### write_multiple_registers
python
def write_multiple_registers(starting_address, register_values, signed=True)
- 功能: 生成写多个寄存器的Modbus命令
- 参数:
- starting_address: 起始地址
- register_values: 寄存器值列表
- signed: 是否有符号 (默认True)
- 返回值: 打包的命令字节串
- 异常: 寄存器数量超出范围(1-123)时抛出ValueError
## 响应验证
### validate_resp_data
python
def validate_resp_data(data, function_code, address, value=None, quantity=None, signed=True)
- 功能: 验证Modbus响应数据
- 参数:
- data: 响应数据
- function_code: 功能码
- address: 地址
- value: 写入值(可选)
- quantity: 数量(可选)
- signed: 是否有符号(默认True)
- 返回值: 布尔值,表示验证是否通过
- 验证内容:
- 数据完整性
- 地址匹配
- 值/数量匹配
## 使用示例
### 读取操作
python
# 读取10个线圈
cmd = read_coils(0x0000, 10)
# 读取5个保持寄存器
cmd = read_holding_registers(0x0000, 5)
### 写入操作
python
# 写单个线圈
cmd = write_single_coil(0x0000, 0xFF00) # 打开
# 写单个寄存器
cmd = write_single_register(0x0000, 100) # 写入100
# 写多个线圈
cmd = write_multiple_coils(0x0000, [1, 0, 1, 0, 1])
# 写多个寄存器
cmd = write_multiple_registers(0x0000, [100, 200, 300])
### 响应验证
python
# 验证单个写入响应
is_valid = validate_resp_data(
response_data,
Const.WRITE_SINGLE_REGISTER,
0x0000,
value=100
)
# 验证多个写入响应
is_valid = validate_resp_data(
response_data,
Const.WRITE_MULTIPLE_REGISTERS,
0x0000,
quantity=3
)
## 技术规格
### 数据范围
1. 线圈操作
- 读取: 1-2000个
- 写入: 无限制(自动分段)
2. 寄存器操作
- 读取: 1-125个
- 写入: 1-123个
### 数据格式
1. 线圈值
- 0x0000: 关闭
- 0xFF00: 打开
2. 寄存器值
- 有符号: 16位整数 (-32768 到 32767)
- 无符号: 16位整数 (0 到 65535)
## 注意事项
1. 数据验证
- 始终检查返回值
- 验证响应数据完整性
- 注意地址匹配
2. 性能优化
- 合并多个操作
- 使用多寄存器写入
- 注意数据包大小
3. 错误处理
- 捕获ValueError异常
- 验证响应数据
- 处理通信超时
4. 最佳实践
- 遵循Modbus协议规范
- 正确处理字节序
- 合理使用signed参数