西门子plc与ABB510变频器modbus通讯 1,读写变频器的内部参数 2,控制变频器启停,读频率电流 3,设置变频器输出频率 4,配上位机触摸屏学习,简单 有详细注释,简单易懂
最近在车间折腾西门子1200PLC和ABB510变频器的通讯,踩了不少坑。今天咱们直接上干货,手把手教你怎么用Modbus RTU把这俩设备打通,顺便把触摸屏监控做利索了。
先确认硬件接线。RS485接口A接A(红对红),B接B(黑对黑),记得终端电阻拨码打到ON。变频器参数里把98.02设为Modbus,98.07设站号(比如2),波特率建议用19200。PLC这边用CM1241模块,组态时注意和变频器参数一致。
// PLC程序片段(SCL语言) // 初始化Modbus主站 MB_MASTER_DB( REQ := TRUE, // 持续使能 MB_ADDR := 2, // 变频器站地址 MODE := 0, // 0-读写保持寄存器 DATA_ADDR := 40001, // Modbus起始地址40001对应参数1.01 DATA_LEN := 1, // 读取1个字 DATA_PTR := #readData, // 数据存储区 DONE => #doneBit, // 完成标志位 ERROR => #errorCode); // 错误代码这个功能块是西门子的标准Modbus库,重点注意DATA_ADDR要减40001得到实际地址。比如要读参数1.01(输出频率),对应40001,但实际填寄存器地址0就行。
控制启停要动参数10.01(控制字):
// 启动命令组合(十六进制) 启动:047E -> 二进制 0000010001111110 停止:0476 -> 0000010001110110 // PLC程序 IF "启动按钮" THEN sendData := 16#047E; ELSIF "停止按钮" THEN sendData := 16#0476; END_IF;这里有个坑,控制字是高位在前低位在后。比如16#047E实际发送的字节顺序是04在前,7E在后。用在线转换工具验证下二进制位比较稳妥。
设置频率更简单,直接写40001寄存器。注意ABB510的频率范围是0-50Hz,对应0-5000(0.01Hz分辨率):
// 设置30Hz realFreq := 30.0; scaledValue := INT(realFreq * 100); // 转为3000 MB_MASTER_DB( ... MODE := 1, // 写模式 DATA_ADDR := 40001, DATA_PTR := scaledValue);触摸屏配置用WinCC的话,在连接设置里选S7-1200,变量直接绑定PLC的DB块地址。注意数值量要做缩放处理,比如读到的电流值1234对应12.34A。
调试时推荐先用ModScan32这类工具单独测变频器,确认能正常读写再接入PLC。常见故障排查顺序:检查终端电阻→确认波特率→验证CRC校验→查看参数读写权限(有些参数运行时禁止修改)。
最后附个实用参数对照表:
| 功能 | 参数号 | Modbus地址 | 数据类型 |
|---|---|---|---|
| 输出频率 | 1.01 | 40001 | UINT |
| 输出电流 | 1.04 | 40004 | UINT |
| 控制字 | 10.01 | 41001 | 16bit |
| 目标频率 | 11.01 | 41101 | UINT |
搞定这些基本就能玩转PLC和变频器的通讯了。下次打算写写如何用同样的方法对接施耐德变频器,有兴趣的师傅评论区吱个声。