摘要:WINCC技术的不断更新,使得其可操作性更强。脚本的加入给WINCC项目带来了极大的灵活性和开放性,通过一些脚本的介入,能够完成一些WINCC基本组态无法实现的功能。在V6版本以后WINCC加入了VB脚本,它编写起来更加简单、容易入手。
关键词:脚本函数;WINCC;C语言;VBS;香料厨房防差错技术;配料系统
中图分类号:TS43 文献标识码:A 文章编号:1009-2374(2012)31-0049-04
香料厨房防差错技术是北京卷烟厂新上马的项目,供料方式由原来的人工推料到现场改为了集中调配、集中发料的方式,实现了烟草加工过程对控制信息化、智能化、自动化的要求。同时也要求了对现场发料的准确性,目前我厂统计的配置的香料品种48个,香精品种14个。由于品种繁多,极易出现发料错误,目前采用的是PLC采集现场编码利用S7程序进行编码比对,考虑到过程控制工业总线PRFINET的局限性,不能完全保证料液编码的比对正确(如工控限制条件的改变、网络通讯的故障都能导致料液编码的比对出现错误,模拟测试时就出现过误发料情况)。因此我们准备利用WINCC VB及C语言的脚本编程,通过调用ORACREL数据库中的烟牌名称与料罐中的料液名称,利用高级编程语言编写脚本进行比对,作为对编码比对的校验程序,确保发料的准确性。
1 脚本函数
1.1 脚本函数的介入
西门子公司在推出了WINCC V6版本之后,引入了脚本函数这一概念。使得整个WINCC系统通过完整和丰富的编程系统实现了双向的开放性。
借助C脚本动作,WINCC几乎可以无限制地访问ORACEL数据库及其平台上的各种应用功能。
而VB脚本也以其易用性和开发快速性赢得了广大用户的青睐。
1.2 C脚本及VB脚本的设计
1.2.1 C脚本。
internal functions(内部函数):内部函数是指C语言的内嵌函数,同被经常用到的函数。
project functions(项目函数):可生成全局访问的函数。
standard functions(标准函数):包含用于WINCC归档、编辑器、报警等功能。
action(动作功能):有用户创建,不由其他C脚本中调用,和其他函数不同,它是由其他判断触发的。
acyclic非周期型,根据时间和日期调用一次。cyclic周期型,分为每秒、每分、每小时等。tag triggered变量标签触发,当绑定的标签触发时触发。
上面这段程序是我们要创建的一个动作程序,如图3所示,每当我们创建好后就会自动产生一段缺省程序(圈中的部分是WINCC自带脚本注释),在我厂的香料厨房中基本应用的都是动作功能。
1.2.2 VBS。由于C语言脚本的开发相对复杂,制作周期较长,所以新版本的WINCC系统引入了新的脚本语言VB,WINCC集成了微软基于VB的运行期脚本语言,能够使用微软的标准工具进行编辑、调试。能够访问ActiveX控件和Windows应用的属性和方法。
VBS的应用:WINCC中实现动态化(图形编辑器中)、WINCC中的动态化、集成ActiveX控件;通过Microsoft outlook发送电子邮件;集成Microsoft internet Explorer;集成Acrobat reader;集成在线帮助功能、联接Office应用(Excel、word、access)、读写变量,启动报表;链接数据库。
2 香料厨房的C脚本及VB的应用
2.1 C脚本在配料系统中的应用
首先我们我们看到的是香厨系统在配料时弹出配料界面的C动作。
接下来我们来分析下这段C语言动作(我们以301号罐为例):
#include "apdefap.h" 插入一个文本
HWND hwnd=NULL 定义一个句柄目的是为了下文的弹出对话框找到出处
int iRet 定义一个名称为iRet的整型变量
hwnd=FindWindow(NULL,"WinCC-运行系
统-");调用的弹出对话框在WINCC中显示
if(GetTagBit("TL_B_PT_Start")&(GetTagWord("TL_I_PT_InSelect")!=1))
说明:一个嵌套功能语句"TL_B_PT_Start"在PLC中为配料启动按钮,"TL_I_PT_InSelect"为配糖画面中的料罐选择,这条语句的意思是当配料启动为1时且配料选择按钮不等于1时执行下一句。
if(GetTagWord("TL_I_PT_InSelect")==2) 当配料选则等于2时
iRet=MessageBox(hwnd,"配料画面不能打开,301罐配料正在进行中"
"操作提示" 说明:MessageBox函数弹出对
话框
",MB_OK|MB_ICONQUESTION|MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_APPLMODAL);当这条语句执行是弹出OK确认键
else {
SetVisible("配料1.PDL","画面窗口5",1); //Return-Type:BOOL
SetVisible("配料1.PDL","画面窗口4",0); //Return-Type:BOOL
SetTagWord("N_I_PT_InSelect",2); //Return-Type:BOOL
}
说明:从ELSE这条语句开始表示如果配料选择为2时执行else后的语句,SetVisible是弹出配料界面并将料罐号设置为1。
以上程序就是配料的过程中进行料罐选择的C脚本。
2.2 VBS脚本在配料系统中的应用
图7中的上述界面是由调制罐到将香料送到储存罐的动作过程。
Sub OnClick(ByVal Item)声明子程序
If HMIRuntime.Tags("TL_I_JT_OutNO303").Read = 1 And (HMIRuntime.Tags("TL_TX_QG_Name413").Read >< "" And HMIRuntime.Tags("TL_TX_QG_Name413").Read >< HMIRuntime.Tags("TL_TX_QG_Name303").Read) Then
MsgBox "与413罐料液名称不符,不能出料",vbExclamation,"不能完成操作"
说明:上面一条语句是当"TL_I_JT_OutNO303"即303出料启动为1时,比较"TL_TX_QG_Name413"和"TL_TX_QG_Name303"这两个料液名称如果不同,弹出对话框"与413罐料液名称不符,不能出料",并且VB执行动作不能操作。
Else
If HMIRuntime.Tags("TL_I_JT_OutNO303").Read = 1 And ((HMIRuntime.Tags("TL_B_QG_OutAll303").Read = 1 And HMIRuntime.Tags("TL_R_QG_Weight303").Read+ HMIRuntime.Tags("TL_R_QG_Weight413").Read >= 300) Or (HMIRuntime.Tags("TL_B_QG_OutAll303").Read = 0 And HMIRuntime.Tags("TL_R_QG_SWeight303").Read+ HMIRuntime.Tags("TL_R_QG_Weight413").Read >= 300)) Then
MsgBox "超出413罐容量上限,不能出料",vbExclamation,"不能完成操作"
说明:此段程序中是比较"TL_R_QG_Weight303"与"TL_R_QG_Weight413",表示出料量超出413存储容量时不能出料。
Else
HMIRuntime.Tags("TL_B_JT_Start303").Write 1
说明:以上条件都不满足是将"TL_B_JT_Start303"变量置1即出料启动。
3 防差错程序的编写
首先我们先定义变量Dim s1 Dim s2 Dim Cn Dim RS
s1 = HMIRuntime.Tags("TL_TX_FT_Name302").Read 将S1的变量联接到"TL_TX_FT_Name302",此变量是来自现场加料点的料液名称
Set Cn = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")声明链接数据库的变量
Cn.Open "Provider=MSDAORA.1;Password=wang1001;User ID=zswang;Data Source=xlcf;Persist Security Info=TRUE"
说明:上一步已经声明过变量,这步是链接数
据库。
Set RS = Cn.Execute("SELECT mn_materialname FROM materialname WHERE mn_materialcode LIKE '" & s1 & "'")
说明:根据S1这个变量在数据库中找到相应的的料液编码。
If HMIRuntime.Tags("TL_I_FT_InNO302").Read = 1 Then
HMIRuntime.Tags("TL_TX_FT_ReceiveNN302").Write HMIRuntime.Tags("TL_TX_QG_Name407").Read
说明:上面这条语句是赋值语句是将现场加料点的料液名称赋给料罐的料液名称。
s2 = RTrim(RS(0))
If HMIRuntime.Tags("TL_I_FT_InNO302").Read = 1 Then
If RTrim(HMIRuntime.Tags("TL_TX_QG_Name407").Read) = s2Then
HMIRuntime.Tags("TL_TX_FT_ReceiveNN302").Write HMIRuntime.Tags("TL_TX_QG_Name407").Read
HMIRuntime.Tags("TL_TX_FT_ReceiveName302").Write s1
HMIRuntime.Tags("TL_B_FT_CSend302").Write 1
Else MsgBox "所选料罐料名不同"
End If
说明:以上这段是我们根据后来的生产情况添加的香料厨房对比块,保证香料厨房出料的正确性,在我们之前声明过变量之后,首先将s2= RTrim(RS(0))即将数据库中调出的料液名称。当"TL_I_FT_InNO302"为1时,即料罐被选中时,比较"TL_TX_QG_Name407"与S2的变量是否相同,即确认现场发来的牌号与料罐存储的牌号是否相符,如果不相符即弹出对话框"所选料罐料名不同"。Rtrim是一个消除空格的指令,防止在数据库中输入时产生全角、半角等问题而导致误判断。
4 结语
我们添加的防差错程序基本是由VBS动作脚本编写而成,但是其中很多的料罐参数变量分别由配料的C脚本程序和调配罐到存储罐发料的VBS脚本提供。最开始设计的程序由于存在全角和半角的差异,经常误报所选料罐料名不同,因此我们在后面添加了Rtrim命令消除差异。在经过一段时间的观察后发现,检验正确率100%,没有发现误检测情况,杜绝了发料错误,提高了生产的可靠性、安
全性。
参考文献
[1] 周良志.C++实践之路[M].北京:人民邮电出版社.
[2] 西门子自动化与驱动集团.WINCC全局脚本手册[M].
[3] 龚沛曾,陆慰民.VB程序设计简明教材[M].北京:高等教育出版社.
作者简介:刘振强(1985-),男,北京人,上海烟草集团北京卷烟厂助理工程师,研究方向:自动控制。
(责任编辑:周 琼)