test.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # 导入 pymodbus 客户端库
  2. from pymodbus.client import ModbusSerialClient
  3. # --- 根据您的设备和文档配置参数 ---
  4. # 串口配置
  5. # 在 Windows 上可能是 'COM3', 'COM4' 等
  6. # 在 Linux 或 macOS 上可能是 '/dev/ttyUSB0', '/dev/tty.usbserial-XXXX' 等
  7. SERIAL_PORT = '/dev/ttyUSB0' # !! 重要:请根据您的实际情况修改此端口 !!
  8. BAUD_RATE = 9600 # 波特率,根据文档设置为 9600
  9. # Modbus 设备配置
  10. CONTROLLER_ADDRESS = 0x20 # 控制器地址,默认为 0x01 [cite: 9]
  11. # 根据文档,第一层第四路灯 (W2) 的寄存器地址是 0x000B
  12. LIGHT_REGISTER = 0x0007
  13. def set_light_intensity(intensity: int):
  14. """
  15. 连接到Modbus控制器并设置指定灯光的亮度。
  16. :param intensity: 要设置的亮度值 (0-100)。
  17. """
  18. # 检查输入值的有效性
  19. if not 0 <= intensity <= 100:
  20. print("错误:亮度值必须在 0 和 100 之间。")
  21. return
  22. print(f"准备设置灯光...")
  23. print(f" - 串口: {SERIAL_PORT}")
  24. print(f" - 控制器地址: {CONTROLLER_ADDRESS}")
  25. print(f" - 目标寄存器: {hex(LIGHT_REGISTER)}")
  26. print(f" - 目标亮度: {intensity}")
  27. # 初始化 Modbus RTU 客户端
  28. client = ModbusSerialClient(
  29. port=SERIAL_PORT,
  30. baudrate=BAUD_RATE,
  31. stopbits=1,
  32. bytesize=8,
  33. parity='N',
  34. timeout=1
  35. )
  36. try:
  37. # 尝试连接到串口
  38. if not client.connect():
  39. print(f"错误:无法连接到串口 {SERIAL_PORT}。请检查设备连接和端口号。")
  40. return
  41. # 使用功能码 0x06 (write_register) 写入数据
  42. # pymodbus 会自动处理 CRC 校验码
  43. response = client.write_register(
  44. address=LIGHT_REGISTER,
  45. value=intensity,
  46. slave=CONTROLLER_ADDRESS
  47. )
  48. # 检查响应是否成功
  49. if response.isError():
  50. print(f"错误:Modbus通信失败。 {response}")
  51. else:
  52. print(f"\n成功!已发送指令将第一层第四路灯的亮度设置为 {intensity}%。")
  53. except Exception as e:
  54. print(f"发生意外错误: {e}")
  55. finally:
  56. # 确保在使用后关闭连接
  57. client.close()
  58. print("客户端连接已关闭。")
  59. if __name__ == "__main__":
  60. try:
  61. # 从用户输入获取亮度值
  62. target_intensity = int(input("请输入您想设置的亮度 (0-100): "))
  63. set_light_intensity(target_intensity)
  64. except ValueError:
  65. print("输入无效,请输入一个 0 到 100 之间的整数。")