200plc与施耐德ATV610变频器modbus通讯 1,读写变频器的内部参数 2,控制变频器正反转,停止,读电压电流 3,设置变频器输出频率 有详细注释,简单易懂
先看通信基础配置,200PLC这边需要初始化Modbus主站:
//主程序OB1 Network1 LD SM0.1 CALL MBUS_CTRL:SBR1, 1, 9600, 0, 0, &VB100, 0这段代码用SM0.1上电初始化。MBUS_CTRL是通信设置指令,参数分别是波特率9600、无校验、超时1秒,错误信息存VB100。注意PLC的Port0口默认是PPI通信,用之前记得在系统块里改成自由口模式。
读写参数的核心是MBUS_MSG指令。比如读取输出电压:
Network2 LD M10.0 //触发读取 EU CALL MBUS_MSG:SBR2, 1, &VB200, 0, 40033, 2, &VB300参数解析:从站地址1,功能码04读保持寄存器,起始地址40033(对应输出电压),读取2个字节存到VB300。ATV610的参数地址要+40000,比如40033实际对应内部参数033。
控制启停的代码更有意思:
Network3 LD M10.1 //正转触发 = Q0.0 //保持触发状态 CALL MBUS_MSG:SBR3, 1, &VB400, 1, 40001, 1, &VB500这里用MBUS_MSG写保持寄存器。参数40001是控制字地址,写入值6(正转指令)。注意控制字需要按位设置,施耐德的标准控制字中:
- 位0=1:运行指令通道选择
- 位1=1:允许运行
- 位3=0:正转方向
设置频率更简单:
Network4 LD M10.2 MOVW 3000, VW600 //30.00Hz CALL MBUS_MSG:SBR4, 1, &VB700, 1, 40002, 1, &VW600这里要注意频率值的处理。ATV610的频率参数是16位整数,单位0.01Hz,所以3000对应30.00Hz。写入地址40002是频率给定地址,记得数据格式要转成Modbus的整型。
调试时最常遇到的坑是数据格式问题。比如读取电流值时:
Network5 LD M10.3 CALL MBUS_MSG:SBR5, 1, &VB800, 0, 40035, 2, &VD810读回来的电流值在VD810里,但这是32位浮点数。需要先用SWAP指令调整字节顺序:
Network6 LD SM0.0 MOVW VD810, VW900 SWAP VW900 MOVW VD812, VW902 SWAP VW902这样才能得到正确的IEEE754浮点数值。实测发现施耐德的浮点数是高位在前,和西门子的存储顺序刚好相反。
最后说几个实用技巧:
- 每个
MBUS_MSG指令之间要有50ms以上的间隔 - 重要参数建议做双字校验
- 用状态字40020做心跳检测
- 遇到通信中断先检查终端电阻是否匹配
这些代码在ATV610固件版本≥2.2的机型上实测通过,老版本可能需要调整控制字。建议调试时先用Modscan工具验证通信,再用PLC对接会事半功倍。