现场有一套CEMS,数采仪使用的是北京万维盈创产品,需要和中控室西门子S7 1200PLC通讯,考虑到通讯协议兼容性,使用modbusTCP协议。数采仪IP地址设置成192.168.0.130,这是网络中没有其他设备使用的IP地址,万维盈创数采仪通讯协议和IP地址设置方法参考下面的链接,其他厂家数采仪设置方法会有所不同:
施耐德M580与北京万维盈创数采仪进行modbusTCP通讯配置_来自金沙江的小鱼_新浪博客
设置完成后,使用MODSCAN软件扫描一下,能得到数据的话,证明设置没有问题。
一、硬件设置
在博图17中新建一个项目,选择S7 1200PLC,本次实际硬件CPU为6ES7 214-1BG40-0XB0。
在属性-ProfiNet接口属性中,添加一个网络,设置IP地址为192.168.0.139
在CPU属性-系统和时钟存储器中勾选“启用系统存储器字节”和“启用时钟存储器字节”。
在属性-时间处,设置时间为北京时间。
至此,CPU硬件的属性设置就完成了。
二、通讯编程
新建一个全局数据块DB1,符号为MB_DATA,在数据块内部定义以下变量
在此数据快属性设置中,取消“优化的块访问”
新建一个FC,在FC中写下面的程序,符号为CEMS通讯
背景数据块DB2需要设置一下MB_Unit_ID数值为1,这个数值和数采仪设置一致,默认数值不符合要求
由于从数采仪读取上来的REAL数据高低字排列与西门子TIA中REAL高低字顺序相反,因此需要做高低字交换。下面的程序就是同来高低字交换的。
在OB1中调用FC1即可实现1200PLC与数采仪的modbusTCP通讯。
三、均值计算
有了基础数据,就可以进行均值计算。现场需要粉尘和SO2数据的分钟均值、小时均值和日均值计算,均值超限进行报警提示,通过自定义功能块来实现。
均值计算涉及小时、分钟、秒系统数据,先通过编程读取这些数据
1. 获取CPU系统时钟信息
新建全局DB数据块,建立以下内部变量
建立FC,符号为Get_PLC_DT,写下面的程序
在OB1中调用此FC,就完成了读取CPU系统时钟信息的功能。
2. 分钟均值计算
新建FB,符号为Minute_Average,先建立以下内部变量。设置成非保持是因为实际用的这一款CPU保持存储区有限,而且本次编程不涉及安全联锁调节等重要功能,仅仅是数据采集和计算。
写下面的SCL程序,计算最近60秒的算术均值
#PV_Array[#Second] := #PV;
#Sum := 0.0;
FOR #i := 0 TO 59 DO
#Sum := #Sum + #PV_Array[#i];
END_FOR;
#Minute_Average := #Sum / 60.0;
3. 小时均值计算
新建FB,符号为HOur_Average,建立下面的内部变量,如前所述,也设置成非保持型类型,为避免计算量大,从而造成工作存储器超标,每隔10秒记录一次数据进行计算。
写下面的SCL程序,计算最近3600秒的算术均值,由于一小时采样只有360个数据,所以最后算数平均值除以360.0
#PV_Array[#Minute, #Second] := #PV;
#Sum := 0.0;
FOR #i := 0 TO 59 DO
FOR #j := 0 TO 5 DO
#Sum := #Sum + #PV_Array[#i, #j];
END_FOR;
END_FOR;
#Hour_AVerage := #Sum / 360.0;
这里SCL编程比梯形图简洁多了。
4. 日均值计算功能块
新建FB,符号为Day_Average,建立下面的内部变量,如前所述,也设置成非保持型类型。由于TIA对数组类型元素数量上限为65536,也是为了避免工作存储器超标,10秒采集一次数据。
建立下面的SCL程序,计算最近一天的算数均值
IF #Second MOD 10 = 0 THEN
#PV_Array[#Hour, #Minute, #Second/2] := #PV;
END_IF;
#sum := 0.0;
FOR #i := 0 TO 23 DO
FOR #j := 0 TO 59 DO
FOR #k := 0 TO 5 DO
#sum := #sum + #PV_Array[#i, #j, #k];
END_FOR;
END_FOR;
END_FOR;
#Day_Average := #sum / 8640.0;
至此,分钟均值、小时均值、日均值计算自定义功能块全部完成。
5. 调用均值计算
新建全局数据块,存放均值数据
新建FC4,调用均值计算FB
报警判断,实际上这部分可以做在FB中
6. 为了减轻CPU负荷,新建循环中断组织块OB31,中断时间1000ms,在OB31调用
检查一下存储器占用情况,点击程序信息,看看装载存储器、工作存储器、保持性存储器有没有超标 。我在刚开始做的时候,工作存储器严重超标,通过修改均值计算程序,减少数组元素数量,降低采样频率后解决。
到此,PLC编程完成。
四、WINCC通讯配置
现场wincc使用的是7.4版本。
打开WINCC,在变量管理中新建SIMATIC S7-1200,1500 PLC Chanel驱动,新建连接,参数如下:
其下建立以下变量:
后续数据显示、变量记录、趋势、报警功能就很好实现了,这里不做记录了。