| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- # 导入 pymodbus 客户端库
- from pymodbus.client import ModbusSerialClient
- # --- 根据您的设备和文档配置参数 ---
- # 串口配置
- # 在 Windows 上可能是 'COM3', 'COM4' 等
- # 在 Linux 或 macOS 上可能是 '/dev/ttyUSB0', '/dev/tty.usbserial-XXXX' 等
- SERIAL_PORT = '/dev/ttyUSB0' # !! 重要:请根据您的实际情况修改此端口 !!
- BAUD_RATE = 9600 # 波特率,根据文档设置为 9600
- # Modbus 设备配置
- CONTROLLER_ADDRESS = 0x20 # 控制器地址,默认为 0x01 [cite: 9]
- # 根据文档,第一层第四路灯 (W2) 的寄存器地址是 0x000B
- LIGHT_REGISTER = 0x0007
- def set_light_intensity(intensity: int):
- """
- 连接到Modbus控制器并设置指定灯光的亮度。
- :param intensity: 要设置的亮度值 (0-100)。
- """
- # 检查输入值的有效性
- if not 0 <= intensity <= 100:
- print("错误:亮度值必须在 0 和 100 之间。")
- return
- print(f"准备设置灯光...")
- print(f" - 串口: {SERIAL_PORT}")
- print(f" - 控制器地址: {CONTROLLER_ADDRESS}")
- print(f" - 目标寄存器: {hex(LIGHT_REGISTER)}")
- print(f" - 目标亮度: {intensity}")
- # 初始化 Modbus RTU 客户端
- client = ModbusSerialClient(
- port=SERIAL_PORT,
- baudrate=BAUD_RATE,
- stopbits=1,
- bytesize=8,
- parity='N',
- timeout=1
- )
- try:
- # 尝试连接到串口
- if not client.connect():
- print(f"错误:无法连接到串口 {SERIAL_PORT}。请检查设备连接和端口号。")
- return
- # 使用功能码 0x06 (write_register) 写入数据
- # pymodbus 会自动处理 CRC 校验码
- response = client.write_register(
- address=LIGHT_REGISTER,
- value=intensity,
- slave=CONTROLLER_ADDRESS
- )
- # 检查响应是否成功
- if response.isError():
- print(f"错误:Modbus通信失败。 {response}")
- else:
- print(f"\n成功!已发送指令将第一层第四路灯的亮度设置为 {intensity}%。")
- except Exception as e:
- print(f"发生意外错误: {e}")
- finally:
- # 确保在使用后关闭连接
- client.close()
- print("客户端连接已关闭。")
- if __name__ == "__main__":
- try:
- # 从用户输入获取亮度值
- target_intensity = int(input("请输入您想设置的亮度 (0-100): "))
- set_light_intensity(target_intensity)
- except ValueError:
- print("输入无效,请输入一个 0 到 100 之间的整数。")
|