西门子1200plc与施耐德变频器modbus通讯程序,可以控制变频启停,设定频率,读取变频器电压、电流、运行频率,博图V14版本程序。

直接上干货,今天聊聊西门子S7-1200跟施耐德ATV310变频器的Modbus串口通讯。现场用这种组合的兄弟应该不少,实测V14版本博图能稳定跑起来。先说重点:硬件接线用RS485半双工,3线制(T+/T-加GND),记得终端电阻看情况挂。

PLC这边先组态个CM1241模块,参数配置直接贴关键代码:

MB_COMM_LOAD_DB(REQ:=TRUE, PORT:=0, //RS485模块位置
                BAUD:=9600, PARITY:=3, //偶校验
                FLOW_CTRL:=0, RTS_ON_DLY:=0, 
                RTS_OFF_DLY:=0);

这个指令块初始化通讯模块,注意校验方式要和变频器设成一致。遇到过有人PARITY参数填错导致数据乱码,盯着报文抓半小时才发现。

读写功能块用轮询方式最稳,别同时发多个请求。启停控制写个功能块:

MB_MASTER_DB(REQ:=Start_Cmd,          //触发信号
             MB_ADDR:=1,              //变频器站号
             MODE:=1,                 //写操作
             DATA_ADDR:=8193,         //施耐德控制字地址
             DATA_LEN:=1,             
             DATA_PTR:=P#DB1.DBX0.0); //指向控制字"047E"切运行

重点在施耐德的控制字结构,启动时要先发047E再切047F,这个坑踩过的都懂。频率设定值给16384对应50Hz,记得做标定转换。

西门子1200plc与施耐德变频器modbus通讯程序,可以控制变频启停,设定频率,读取变频器电压、电流、运行频率,博图V14版本程序。

读参数用个循环队列,电压电流频率三连读:

CASE State OF
1: //读输出频率
   MB_MASTER(ADDR:=1, DATA_ADDR:=8448, DATA_LEN:=1);
2: //读直流电压
   MB_MASTER(ADDR:=1, DATA_ADDR:=8460, DATA_LEN:=1);
3: //读输出电流
   MB_MASTER(ADDR:=1, DATA_ADDR:=8449, DATA_LEN:=1);
END_CASE;

实测施耐德这些参数的寄存器地址和西门子的偏移算法不太一样,直接查ATV手册最稳。数据回来要做INT转REAL,注意有的参数需要除10或100处理。

调试时用博图自带的报文监控,看到Error=16#8308多半是站号不对,报超时就查接线。有个邪门情况:某次GND线虚接导致能发不能收,拿万用表量了半小时才发现。建议备个USB转485调试器直接抓包,比PLC在线诊断快得多。

最后说个骚操作:用指针直接操作数据块能省不少事,比如:

P#DB2.DBD4 //直接指向浮点数存储区

但千万注意别越界,曾经手滑写错指针把参数区数据全冲了...血的教训。整体程序框架建议用状态机轮询,别在OB1里直接堆指令,否则扫描周期超了通讯会丢包。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐