# 导入 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 之间的整数。")