西门子1200plc与施耐德变频器modbus通讯程序,可以控制变频启停,设定频率,读取变频器...
但千万注意别越界,曾经手滑写错指针把参数区数据全冲了...血的教训。整体程序框架建议用状态机轮询,别在OB1里直接堆指令,否则扫描周期超了通讯会丢包。西门子1200plc与施耐德变频器modbus通讯程序,可以控制变频启停,设定频率,读取变频器电压、电流、运行频率,博图V14版本程序。西门子1200plc与施耐德变频器modbus通讯程序,可以控制变频启停,设定频率,读取变频器电压、电流、运行频率
西门子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里直接堆指令,否则扫描周期超了通讯会丢包。

更多推荐
所有评论(0)