要实现三菱 FX3UPLC 通过 FX3U-485ADP 模块读取数据,核心是利用RS-485 通信协议(通常采用三菱专用的 MC 协议或通用 Modbus-RTU 协议),通过外部设备(如电脑、单片机)与 485 模块建立通信,进而读取 PLC 内部寄存器(如 D 寄存器、M 继电器)的数据。以下提供基于Modbus-RTU 协议(通用性强,支持多数上位机 / 单片机)和Python 串口通信的实现方案,包含硬件连接、PLC 参数设置、上位机 python 代码及调试步骤。
FX3U-485ADP 是 FX3U 的扩展模块,需先完成物理连接:
模块安装:将 FX3U-485ADP 模块插入 FX3UPLC 的扩展总线接口(右侧扩展槽),确保模块卡扣扣紧。
RS-485 接线:485 模块的通信端子为SDA
(DATA+)、SDB
(DATA-)、SG
(信号地),需与上位机(如 USB 转 485 模块)的对应端子连接:
电源:FX3U-485ADP 由 PLC 扩展总线供电,无需额外接电源。
FX3U-485ADP 默认不启用 Modbus-RTU 协议,需通过编程软件配置通信参数:
打开 GX Works2/3,新建 “FX3U” 项目,连接 PLC 后进入 “参数设置”→“扩展模块参数”→“FX3U-485ADP”。
配置通信基本参数:
通信协议:选择 “Modbus-RTU”(或 “MC 协议”,此处以 Modbus-RTU 为例,通用性更强)。
波特率:默认 9600bps(可设 4800/19200bps,需与上位机代码一致)。
数据位:8 位。
停止位:1 位。
校验位:无校验(或偶校验,需与上位机一致)。
从站地址:默认 1(可设 1-247,需与代码中 “slave_id” 一致)。
配置寄存器映射(Modbus 地址与 PLC 内部寄存器对应):
三菱 PLC 内部寄存器与 Modbus 地址的默认映射关系(关键!):
PLC 内部寄存器 | 功能码 | Modbus 地址范围 | 说明(读取示例) |
---|
D 寄存器(数据寄存器) | 0x03 | 40001~49999 | 读取 D0→Modbus 地址 40001,D1→40002 |
M 继电器(位寄存器) | 0x01 | 00001~00999 | 读取 M0→Modbus 地址 00001 |
使用 Python 的pyserial
(串口通信)和pymodbus
(Modbus 协议解析)库,实现从 FX3U-485ADP 读取 D 寄存器数据(如读取 D0~D4 的 5 个数据)。
先安装依赖库(需 Python 3.7+):
bash
pip install pyserial pymodbus
FX3U-485ADP Modbus-RTU数据读取Python程序
V1
创建时间:22:51
SERIAL_PORT
:需在电脑设备管理器中查看 “USB 转 485” 的端口(如 Windows 的 “COM3”,macOS 的 “/dev/tty.usbserial-xxx”)。
PLC_SLAVE_ID
:与 GX Works 中配置的 “从站地址” 一致(默认 1)。
MODBUS_START_ADDR
:读取的起始 Modbus 地址(如读取 D10→40011,需将该参数改为 40011)。
BAUDRATE
:与 PLC 配置的波特率一致(默认 9600bps,若改 19200 需同步修改)。
硬件检查:
PLC 参数验证:
代码运行与问题排查:
若提示 “串口连接失败”:检查端口号是否正确(设备管理器中确认)、USB 转 485 模块是否插好、驱动是否安装(CH340/CP2102 芯片需装驱动)。
若提示 “Modbus 协议异常”:检查从站地址是否与 PLC 一致、功能码是否正确(D 寄存器用 0x03,M 继电器用 0x01)、Modbus 地址是否计算正确(如 D0→40001,而非 0)。
若读取值为 0 或错误值:确认 PLC 中 D 寄存器已赋值,检查 485 线路是否有干扰(可缩短接线距离,或在总线两端加 120Ω 终端电阻)。
读取 M 继电器:将function_code
改为 1(读取离散输入寄存器),start_addr
设为 00001(对应 M0),示例代码:
python
运行
# 读取M0~M4(5个继电器状态,1=通,0=断)response = client.read_discrete_inputs(
address=0, # M0→Modbus地址00001,对应address=0
count=5,
slave=1,
function_code=1)
单次读取:删除主程序中的while True
和time.sleep(2)
,改为单次调用函数即可。
若调试中遇到具体报错(如 “timeout”“ModbusError”),可告诉我报错信息,进一步帮你定位问题!