西门子PLc程序博途V16 V17版1200与多台G120变频器通过过modbus RTU485 通讯控制模拟量转换温度转换压力Pid控制西门子KTP700 HMi 含电路图G120变频器报文最近在车间折腾西门子1200PLC和G120变频器的Modbus通讯这玩意儿说简单也简单说坑也真能掉坑里。直接上干货先说怎么用485总线让PLC同时撩七八台变频器。硬件接线先别急着通电RS485总线A/B线记得手拉手接法首尾两台G120的终端电阻拨到ON。之前有个兄弟没注意这个通讯时好时坏折腾了两天最后发现是终端电阻没开这玩意儿跟串糖葫芦似的两头必须得堵上。博途里记得装GSD文件组态G120时选标准报文1PZD2/2。重点来了每个变频器的Modbus从站地址必须在CU240E-2参数里设置P2021千万别直接改硬件拨码开关那玩意儿是给USS协议用的。贴段关键代码//Modbus主站轮询程序 #FOR i : 1 TO 8 DO MB_MASTER( REQ : Modbus_Trigger, //上升沿触发 MB_ADDR : i, //从站地址 MODE : 0, //0-读 1-写 DATA_ADDR : 40001, //40001对应PZD1 DATA_LEN : 4, //读4个字 DATA_PTR G120_Data[i]); //数据存放数组 WAIT 50; //每个请求间隔50ms #END_FOR;这段代码用循环轮询8台设备注意每个请求之间必须加延时实测低于30ms容易丢包。DATA_ADDR设置40001对应的是控制字和设定频率40003是状态字和实际频率。西门子PLc程序博途V16 V17版1200与多台G120变频器通过过modbus RTU485 通讯控制模拟量转换温度转换压力Pid控制西门子KTP700 HMi 含电路图G120变频器报文模拟量处理这块有个骚操作用SCALE函数直接转换//4-20mA转温度0-100℃ Temp_Raw : AI_Channel; SCALE( IN : Temp_Raw, HI_LIM: 27648.0, LO_LIM: 5530.0, //4mA对应5530 OUT Real_Temp);注意5530这个值不是固定的拿万用表实测4mA时的模拟量值更准。之前有个项目温度总漂移5度后来发现是现场电磁干扰导致基准电流不稳加了个软件滤波才解决。PID控制别傻乎乎自己写算法直接调用PID_Compact。重点是把PID输出映射到变频器PID_Compact_DB.CtrlOutput : Speed_Setpoint; MB_DATA_WRITE[1] : WORD_TO_BLOCK_DB(16#047E); //控制字准备 MB_DATA_WRITE[2] : REAL_TO_WORD(Speed_Setpoint*16384/50.0); //50Hz对应16384这里有个坑频率设定值要按16384/额定频率的比例换算。比如50Hz对应16384那40Hz就是16384*0.813107.2记得用ROUND取整。HMI部分KTP700直接绑定PLC变量就行。但想搞点花活的话可以在画面上做速度曲线趋势视图 变量1 Actual_Speed 颜色红色 变量2 Set_Speed 颜色蓝色 采样周期 500ms遇到最多的问题是通讯中断建议在HMI上做心跳检测每台变频器的状态字第12位是通讯状态位用这个触发报警指示灯。最后说报文结构G120的Modbus映射表要记牢40001: 控制字启停命令40002: 主设定值40003: 状态字40004: 实际转速40005: 电流值40006: 故障代码调试时开个Modbus Poll工具监控比PLC在线诊断快多了。遇到数据对不上先查字节顺序西门子默认是高字节在前有些变频器要改成低字节在前这个在MB_MASTER函数的参数里可以设置。搞这玩意儿的精髓就是耐心抓包勤做数据映射表别相信记忆。每个项目都可能会遇到新的妖蛾子上次就碰到个G120固件版本太老不认Modbus命令升级到V4.7才搞定。