4.9 KiB
4.9 KiB
VWED Modbus TCP 测试说明
概述
这个测试套件提供了完整的 Modbus TCP 功能测试环境,包括模拟服务器和客户端测试脚本。
文件说明
1. test_modbus_server.py
- Modbus TCP 模拟服务器
- 提供完整的 Modbus TCP 服务器实现
- 支持所有标准 Modbus 功能码
- 动态数据更新,模拟真实设备
- 支持多个从站ID
2. test_modbus_client.py
- 完整功能测试
- 测试所有 VWED Modbus 模块功能
- 包括读取、写入、批量操作等
- 自动验证测试结果
3. test_modbus_example.py
- 使用示例
- 展示在线脚本中如何使用 Modbus 功能
- 包含实际应用场景示例
- 演示最佳实践
快速开始
方法1: 分离模式(推荐用于开发调试)
终端1 - 启动模拟服务器:
cd /mnt/d/jsw_code/project/VWED_server
python tests/test_modbus_server.py
终端2 - 运行测试:
cd /mnt/d/jsw_code/project/VWED_server
python tests/test_modbus_client.py
# 或者
python tests/test_modbus_example.py
方法2: 自动化模式
运行完整测试:
cd /mnt/d/jsw_code/project/VWED_server
python tests/test_modbus_client.py
(测试脚本会自动启动和停止服务器)
测试服务器配置
连接参数
- 主机: localhost
- 端口: 5020
- 从站ID: 1, 2
数据布局
线圈 (0x区域)
- 地址范围: 0-99
- 初始值: False
- 可读写
离散输入 (1x区域)
- 地址范围: 0-99
- 动态变化: 每秒更新
- 只读
输入寄存器 (3x区域)
- 地址范围: 0-99
- 动态变化: 数值递增模式
- 只读
保持寄存器 (4x区域)
- 地址范围: 0-99
- 初始值: [1000, 2000, 3000, 4000, ...]
- 可读写
测试功能覆盖
基础功能
- ✅ 读取线圈 (功能码01)
- ✅ 读取离散输入 (功能码02)
- ✅ 读取保持寄存器 (功能码03)
- ✅ 读取输入寄存器 (功能码04)
- ✅ 写入单个线圈 (功能码05)
- ✅ 写入单个保持寄存器 (功能码06)
批量操作
- ✅ 批量读取线圈
- ✅ 批量读取离散输入
- ✅ 批量读取保持寄存器
- ✅ 批量读取输入寄存器
- ✅ 批量写入线圈 (功能码0F)
- ✅ 批量写入保持寄存器 (功能码10)
高级功能
- ✅ 通用读写操作 (根据地址类型自动选择功能码)
- ✅ 实例化配置管理
- ✅ 数据类型转换 (有符号/无符号)
- ✅ 错误处理和异常管理
使用示例
在线脚本中的用法
# 创建VWED对象
VWED = create_vwed_object("my_script")
# 基础读取
value = VWED.modbus.read_holding_register("192.168.1.100", 502, 1, 0, 2)
print(f"寄存器值: {value}")
# 批量操作
values = VWED.modbus.batch_read_holding_registers("192.168.1.100", 502, 1, 0, 10)
print(f"批量读取: {values}")
# 写入操作
success = VWED.modbus.write_holding_register("192.168.1.100", 502, 1, 0, 2, 12345)
print(f"写入结果: {'成功' if success else '失败'}")
# 配置实例
VWED.modbus.configure_modbus_instance("PLC1", "192.168.1.100", 502, 1, "4x")
value = VWED.modbus.read_single_modbus_value_by_instance_name("PLC1", 0)
# 通用操作
value = VWED.modbus.read_single_modbus_value("192.168.1.100", 502, 1, "4x", 0)
故障排除
连接问题
- 确保服务器已启动并监听正确端口
- 检查防火墙设置
- 验证IP地址和端口配置
读写失败
- 检查从站ID是否正确
- 验证地址范围是否有效
- 确认数据类型匹配
性能优化
- 使用批量操作代替多次单个操作
- 配置实例避免重复连接参数
- 合理设置超时时间
扩展测试
自定义测试场景
可以修改测试脚本添加特定的业务逻辑测试:
# 例如:模拟生产线控制
def test_production_line():
# 读取传感器状态
sensor_status = VWED.modbus.batch_read_input_status("localhost", 5020, 1, 0, 8)
# 根据传感器状态控制执行器
if all(sensor_status[:4]): # 前4个传感器都激活
VWED.modbus.write_coil_status("localhost", 5020, 1, 0, True) # 启动机器
else:
VWED.modbus.write_coil_status("localhost", 5020, 1, 0, False) # 停止机器
注意事项
- 网络延迟: 实际网络环境中可能有延迟,建议适当调整超时设置
- 并发访问: 避免多个客户端同时写入同一地址
- 数据一致性: 读取后立即写入可能因网络延迟导致不一致
- 错误恢复: 实现适当的重试机制处理网络故障
支持的 Modbus 功能码
功能码 | 操作类型 | 数据类型 | 支持状态 |
---|---|---|---|
01 | 读线圈 | 布尔值 | ✅ |
02 | 读离散输入 | 布尔值 | ✅ |
03 | 读保持寄存器 | 16位整数 | ✅ |
04 | 读输入寄存器 | 16位整数 | ✅ |
05 | 写单个线圈 | 布尔值 | ✅ |
06 | 写单个保持寄存器 | 16位整数 | ✅ |
0F | 写多个线圈 | 布尔值数组 | ✅ |
10 | 写多个保持寄存器 | 16位整数数组 | ✅ |