PCM_Report/test_modbus_pause_resume.py

131 lines
4.4 KiB
Python
Raw Permalink Normal View History

2025-12-11 14:32:31 +08:00
#!/usr/bin/env python3
"""
测试Modbus暂停/继续控制值
"""
def test_hex_values():
"""测试十六进制控制值"""
print("测试十六进制控制值")
print("=" * 40)
# 定义控制值
START_VALUE = 0x5555 # 继续/开始
PAUSE_VALUE = 0xAAAA # 暂停
print(f"继续/开始值:")
print(f" 十六进制: 0x{START_VALUE:04X}")
print(f" 十进制: {START_VALUE}")
print(f" 二进制: {bin(START_VALUE)}")
print(f"\n暂停值:")
print(f" 十六进制: 0x{PAUSE_VALUE:04X}")
print(f" 十进制: {PAUSE_VALUE}")
print(f" 二进制: {bin(PAUSE_VALUE)}")
# 验证值的范围
print(f"\n值范围验证:")
print(f" 0x5555 = {START_VALUE} (在16位寄存器范围内: {0 <= START_VALUE <= 65535})")
print(f" 0xAAAA = {PAUSE_VALUE} (在16位寄存器范围内: {0 <= PAUSE_VALUE <= 65535})")
def simulate_pause_resume_logic():
"""模拟暂停/继续逻辑"""
print("\n模拟暂停/继续逻辑")
print("=" * 40)
# 模拟实验状态
paused_experiments = set()
exp_id = 123
def toggle_experiment_pause(exp_id, is_paused):
"""模拟切换实验暂停状态"""
if is_paused:
# 当前是暂停状态,点击后继续
target_value = 0x5555
paused_experiments.discard(exp_id)
new_label = "暂停"
status_msg = "实验已继续"
else:
# 当前是运行状态,点击后暂停
target_value = 0xAAAA
paused_experiments.add(exp_id)
new_label = "继续"
status_msg = "实验已暂停"
return target_value, new_label, status_msg
# 测试场景1: 运行中 -> 暂停
print("场景1: 实验运行中,点击暂停")
is_paused = exp_id in paused_experiments
target_value, new_label, status_msg = toggle_experiment_pause(exp_id, is_paused)
print(f" 当前状态: {'暂停' if is_paused else '运行'}")
print(f" 发送值: 0x{target_value:04X} ({target_value})")
print(f" 按钮文本: {new_label}")
print(f" 状态消息: {status_msg}")
# 测试场景2: 暂停中 -> 继续
print("\n场景2: 实验暂停中,点击继续")
is_paused = exp_id in paused_experiments
target_value, new_label, status_msg = toggle_experiment_pause(exp_id, is_paused)
print(f" 当前状态: {'暂停' if is_paused else '运行'}")
print(f" 发送值: 0x{target_value:04X} ({target_value})")
print(f" 按钮文本: {new_label}")
print(f" 状态消息: {status_msg}")
def test_modbus_register_format():
"""测试Modbus寄存器格式"""
print("\n测试Modbus寄存器格式")
print("=" * 40)
values = [0x5555, 0xAAAA, 1, 0]
print("寄存器1200写入值格式:")
for value in values:
# 模拟pymodbus的write_register调用
print(f" write_register(1200, {value}) -> 0x{value:04X}")
# 显示字节表示
high_byte = (value >> 8) & 0xFF
low_byte = value & 0xFF
print(f" 高字节: 0x{high_byte:02X}, 低字节: 0x{low_byte:02X}")
def main():
print("Modbus暂停/继续控制测试")
print("=" * 50)
print("修改内容:")
print("- 继续/开始: 0x5555 (21845)")
print("- 暂停: 0xAAAA (43690)")
print("- 寄存器地址: 1200")
print("=" * 50)
# 1. 测试十六进制值
test_hex_values()
# 2. 模拟暂停/继续逻辑
simulate_pause_resume_logic()
# 3. 测试Modbus寄存器格式
test_modbus_register_format()
print("\n" + "=" * 50)
print("修改总结:")
print("✅ _toggle_experiment_pause 方法已更新")
print("✅ 继续操作发送 0x5555 到寄存器1200")
print("✅ 暂停操作发送 0xAAAA 到寄存器1200")
print("✅ 日志显示十六进制和十进制值")
print("✅ 方法文档已更新")
print("\n测试方法:")
print("1. 启动程序并创建实验")
print("2. 开始实验进入'进行中'状态")
print("3. 点击'暂停'按钮 -> 发送0xAAAA")
print("4. 点击'继续'按钮 -> 发送0x5555")
print("5. 查看日志确认发送的值")
print("\n注意事项:")
print("- 确保Modbus TCP配置正确")
print("- 寄存器1200必须支持16位写入")
print("- 设备需要正确解析0x5555和0xAAAA")
if __name__ == "__main__":
main()