这个项目源于我在去年为某包装生产线做的自动化改造。产线上原本使用三菱FX3U PLC通过继电器直接控制三台台达MS300变频器,操作方式非常原始——启动就是全速运行,停止就是急停,不仅能耗高,机械冲击也大。客户要求实现速度可调、加减速可控的精细化控制,还要能在触摸屏上实时监控运行参数。
经过现场考察,最终确定的方案是:
选择485ADP-MB模块是因为:
重要提示:FX3U-485ADP-MB模块的DIP开关必须设置为"2"位置(Modbus RTU主站模式),这个设置错误会导致整个通讯瘫痪。
台达MS300变频器使用的Modbus RTU协议有几个关键特性需要特别注意:
变频器的Modbus地址映射表(部分关键参数):
| 参数名称 | 功能码 | 地址(Hex) | 数据类型 | 读写属性 |
|---|---|---|---|---|
| 运行频率 | 03H | 2000H | U16 | R/W |
| 输出电流 | 03H | 2001H | U16 | R |
| 运行命令 | 06H | 2000H | U16 | W |
FX3U的MODBUS通讯需要使用两条核心指令:
assembly复制MOV K19200 D8120 ; 设置波特率19200
MOV K0 D8121 ; 无校验
assembly复制ADPRW K1 K3 H2000 K1 D100
; 参数说明:
; K1 - 从站地址(站号1)
; K3 - 功能码03H(读取保持寄存器)
; H2000 - 起始地址
; K1 - 读取字数
; D100 - 数据存储首地址
变频器端的RS485接线必须严格遵循:
血泪教训:曾因未接终端电阻导致通讯时好时坏,故障排查了整整两天!
程序采用分层设计:
assembly复制MOV K19200 D8120 ; 波特率设置
MOV K0 D8121 ; 无校验
MOV K100 D8129 ; 超时时间100ms
assembly复制LD M8000
OUT T0 K50 ; 50ms轮询间隔
LD T0
CALL P0 ; 读取1#变频器频率
CALL P1 ; 读取2#变频器电流
; ...其他轮询任务
assembly复制P0:
ADPRW K1 K3 H2000 K1 D100 ; 读1#变频器频率
MOV D100 D200 ; 转存到HMI显示区
RET
频率值的转换需要特别注意:
assembly复制DIV D100 K100 D201 ; 将D100值除以100存入D201
; 例如2000 → 20.00Hz
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 通讯超时 | 波特率不匹配 | 检查D8120与变频器参数P00.15 |
| 数据错误 | 站号冲突 | 确认P00.14设置唯一 |
| 偶发断连 | 终端电阻缺失 | 末端变频器接120Ω电阻 |
| 写操作失败 | 功能码错误 | 写入必须用06H功能码 |
调试时建议分步验证:
多台变频器通讯的经典时间分配方案:
| 设备 | 任务 | 间隔 | 耗时 |
|---|---|---|---|
| 1# | 读频率 | 100ms | ≈15ms |
| 2# | 读电流 | 200ms | ≈15ms |
| 3# | 写频率 | 500ms | ≈20ms |
实测经验:总通讯负载不宜超过波特率的30%,19200bps下建议单次通讯不超过50字节。
建立双缓冲机制避免数据冲突:
对于关键参数(如频率指令),建议增加写确认机制:
assembly复制ADPRW K1 K6 H2000 K1 D300 ; 写入频率
ADPRW K1 K3 H2000 K1 D310 ; 回读验证
CMP D300 D310 ; 比较写入与回读值
这套系统稳定运行至今已超过4000小时,期间只因为一次雷击导致通讯模块损坏。实际应用中最大的收获是:一定要做好通讯异常处理,比如当连续3次读取失败时自动切换为安全速度运行,这个设计后来成功避免了多次潜在的设备损坏事故。