摘要:WINCC技術(shù)的不斷更新,使得其可操作性更強。腳本的加入給WINCC項目帶來了極大的靈活性和開放性,通過一些腳本的介入,能夠完成一些WINCC基本組態(tài)無法實現(xiàn)的功能。在V6版本以后WINCC加入了VB腳本,它編寫起來更加簡單、容易入手。
關(guān)鍵詞:腳本函數(shù);WINCC;C語言;VBS;香料廚房防差錯技術(shù);配料系統(tǒng)
中圖分類號:TS43 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-2374(2012)31-0049-04
香料廚房防差錯技術(shù)是北京卷煙廠新上馬的項目,供料方式由原來的人工推料到現(xiàn)場改為了集中調(diào)配、集中發(fā)料的方式,實現(xiàn)了煙草加工過程對控制信息化、智能化、自動化的要求。同時也要求了對現(xiàn)場發(fā)料的準(zhǔn)確性,目前我廠統(tǒng)計的配置的香料品種48個,香精品種14個。由于品種繁多,極易出現(xiàn)發(fā)料錯誤,目前采用的是PLC采集現(xiàn)場編碼利用S7程序進(jìn)行編碼比對,考慮到過程控制工業(yè)總線PRFINET的局限性,不能完全保證料液編碼的比對正確(如工控限制條件的改變、網(wǎng)絡(luò)通訊的故障都能導(dǎo)致料液編碼的比對出現(xiàn)錯誤,模擬測試時就出現(xiàn)過誤發(fā)料情況)。因此我們準(zhǔn)備利用WINCC VB及C語言的腳本編程,通過調(diào)用ORACREL數(shù)據(jù)庫中的煙牌名稱與料罐中的料液名稱,利用高級編程語言編寫腳本進(jìn)行比對,作為對編碼比對的校驗程序,確保發(fā)料的準(zhǔn)確性。
1 腳本函數(shù)
1.1 腳本函數(shù)的介入
西門子公司在推出了WINCC V6版本之后,引入了腳本函數(shù)這一概念。使得整個WINCC系統(tǒng)通過完整和豐富的編程系統(tǒng)實現(xiàn)了雙向的開放性。
借助C腳本動作,WINCC幾乎可以無限制地訪問ORACEL數(shù)據(jù)庫及其平臺上的各種應(yīng)用功能。
而VB腳本也以其易用性和開發(fā)快速性贏得了廣大用戶的青睞。
1.2 C腳本及VB腳本的設(shè)計
1.2.1 C腳本。
internal functions(內(nèi)部函數(shù)):內(nèi)部函數(shù)是指C語言的內(nèi)嵌函數(shù),同被經(jīng)常用到的函數(shù)。
project functions(項目函數(shù)):可生成全局訪問的函數(shù)。
standard functions(標(biāo)準(zhǔn)函數(shù)):包含用于WINCC歸檔、編輯器、報警等功能。
action(動作功能):有用戶創(chuàng)建,不由其他C腳本中調(diào)用,和其他函數(shù)不同,它是由其他判斷觸發(fā)的。
acyclic非周期型,根據(jù)時間和日期調(diào)用一次。cyclic周期型,分為每秒、每分、每小時等。tag triggered變量標(biāo)簽觸發(fā),當(dāng)綁定的標(biāo)簽觸發(fā)時觸發(fā)。
上面這段程序是我們要創(chuàng)建的一個動作程序,如圖3所示,每當(dāng)我們創(chuàng)建好后就會自動產(chǎn)生一段缺省程序(圈中的部分是WINCC自帶腳本注釋),在我廠的香料廚房中基本應(yīng)用的都是動作功能。
1.2.2 VBS。由于C語言腳本的開發(fā)相對復(fù)雜,制作周期較長,所以新版本的WINCC系統(tǒng)引入了新的腳本語言VB,WINCC集成了微軟基于VB的運行期腳本語言,能夠使用微軟的標(biāo)準(zhǔn)工具進(jìn)行編輯、調(diào)試。能夠訪問ActiveX控件和Windows應(yīng)用的屬性和方法。
VBS的應(yīng)用:WINCC中實現(xiàn)動態(tài)化(圖形編輯器中)、WINCC中的動態(tài)化、集成ActiveX控件;通過Microsoft outlook發(fā)送電子郵件;集成Microsoft internet Explorer;集成Acrobat reader;集成在線幫助功能、聯(lián)接Office應(yīng)用(Excel、word、access)、讀寫變量,啟動報表;鏈接數(shù)據(jù)庫。
2 香料廚房的C腳本及VB的應(yīng)用
2.1 C腳本在配料系統(tǒng)中的應(yīng)用
首先我們我們看到的是香廚系統(tǒng)在配料時彈出配料界面的C動作。
接下來我們來分析下這段C語言動作(我們以301號罐為例):
#include "apdefap.h" 插入一個文本
HWND hwnd=NULL 定義一個句柄目的是為了下文的彈出對話框找到出處
int iRet 定義一個名稱為iRet的整型變量
hwnd=FindWindow(NULL,"WinCC-運行系
統(tǒng)-");調(diào)用的彈出對話框在WINCC中顯示
if(GetTagBit("TL_B_PT_Start")&(GetTagWord("TL_I_PT_InSelect")!=1))
說明:一個嵌套功能語句"TL_B_PT_Start"在PLC中為配料啟動按鈕,"TL_I_PT_InSelect"為配糖畫面中的料罐選擇,這條語句的意思是當(dāng)配料啟動為1時且配料選擇按鈕不等于1時執(zhí)行下一句。
if(GetTagWord("TL_I_PT_InSelect")==2) 當(dāng)配料選則等于2時
iRet=MessageBox(hwnd,"配料畫面不能打開,301罐配料正在進(jìn)行中"
"操作提示" 說明:MessageBox函數(shù)彈出對
話框
",MB_OK|MB_ICONQUESTION|MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_APPLMODAL);當(dāng)這條語句執(zhí)行是彈出OK確認(rèn)鍵
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時執(zhí)行else后的語句,SetVisible是彈出配料界面并將料罐號設(shè)置為1。
以上程序就是配料的過程中進(jìn)行料罐選擇的C腳本。
2.2 VBS腳本在配料系統(tǒng)中的應(yīng)用
圖7中的上述界面是由調(diào)制罐到將香料送到儲存罐的動作過程。
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,"不能完成操作"
說明:上面一條語句是當(dāng)"TL_I_JT_OutNO303"即303出料啟動為1時,比較"TL_TX_QG_Name413"和"TL_TX_QG_Name303"這兩個料液名稱如果不同,彈出對話框"與413罐料液名稱不符,不能出料",并且VB執(zhí)行動作不能操作。
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的變量聯(lián)接到"TL_TX_FT_Name302",此變量是來自現(xiàn)場加料點的料液名稱
Set Cn = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")聲明鏈接數(shù)據(jù)庫的變量
Cn.Open "Provider=MSDAORA.1;Password=wang1001;User ID=zswang;Data Source=xlcf;Persist Security Info=TRUE"
說明:上一步已經(jīng)聲明過變量,這步是鏈接數(shù)
據(jù)庫。
Set RS = Cn.Execute("SELECT mn_materialname FROM materialname WHERE mn_materialcode LIKE '" & s1 & "'")
說明:根據(jù)S1這個變量在數(shù)據(jù)庫中找到相應(yīng)的的料液編碼。
If HMIRuntime.Tags("TL_I_FT_InNO302").Read = 1 Then
HMIRuntime.Tags("TL_TX_FT_ReceiveNN302").Write HMIRuntime.Tags("TL_TX_QG_Name407").Read
說明:上面這條語句是賦值語句是將現(xiàn)場加料點的料液名稱賦給料罐的料液名稱。
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
說明:以上這段是我們根據(jù)后來的生產(chǎn)情況添加的香料廚房對比塊,保證香料廚房出料的正確性,在我們之前聲明過變量之后,首先將s2= RTrim(RS(0))即將數(shù)據(jù)庫中調(diào)出的料液名稱。當(dāng)"TL_I_FT_InNO302"為1時,即料罐被選中時,比較"TL_TX_QG_Name407"與S2的變量是否相同,即確認(rèn)現(xiàn)場發(fā)來的牌號與料罐存儲的牌號是否相符,如果不相符即彈出對話框"所選料罐料名不同"。Rtrim是一個消除空格的指令,防止在數(shù)據(jù)庫中輸入時產(chǎn)生全角、半角等問題而導(dǎo)致誤判斷。
4 結(jié)語
我們添加的防差錯程序基本是由VBS動作腳本編寫而成,但是其中很多的料罐參數(shù)變量分別由配料的C腳本程序和調(diào)配罐到存儲罐發(fā)料的VBS腳本提供。最開始設(shè)計的程序由于存在全角和半角的差異,經(jīng)常誤報所選料罐料名不同,因此我們在后面添加了Rtrim命令消除差異。在經(jīng)過一段時間的觀察后發(fā)現(xiàn),檢驗正確率100%,沒有發(fā)現(xiàn)誤檢測情況,杜絕了發(fā)料錯誤,提高了生產(chǎn)的可靠性、安
全性。
參考文獻(xiàn)
[1] 周良志.C++實踐之路[M].北京:人民郵電出版社.
[2] 西門子自動化與驅(qū)動集團(tuán).WINCC全局腳本手冊[M].
[3] 龔沛曾,陸慰民.VB程序設(shè)計簡明教材[M].北京:高等教育出版社.
作者簡介:劉振強(1985-),男,北京人,上海煙草集團(tuán)北京卷煙廠助理工程師,研究方向:自動控制。
(責(zé)任編輯:周 瓊)