WinCC使用VBS腳本完美實現操作記錄
在WinCC之中,其本身所集成的操作記錄功能在使用起來時并不是那么的人性化,比如模擬量進行設定值更改的時候,它只能顯示變量名稱,不能隨意的進行操作設備、內容方面的自定義,經過大量的嘗試和修改,現整理VBS腳本實現操作記錄的完美方式,記錄在這,以備忘。
在這個方式中,主要涉及到的操作內容有:
1、Microsoft Office Access數據庫的讀寫,主要是存儲操作對象的一些基本信息,存儲前后操作的內容;
2、操作記錄觸發的問題;
3、操作記錄氛圍兩種,一種是按鈕型,一種是參數設置型;
一、基礎腳本
1、本地Access數據庫打開關閉函數
Function LocalDB_OPEN(LDBCN,DatabassFileName) '用AODDB.Connection打開Access文件“本地數據庫.mdb”連接,LDBCN:AODDB.Connection對象,具體本地數據庫名稱根據需要進行設置 '連接成功返回1,文件“本地數據庫.mdb”不存在返回-2,指定路徑不存返回-1,連接失敗返回0; On Error Resume Next Dim Result Dim FSO Dim ProjectDataPath Dim LocalDBFileName ProjectDataPath=HMIRuntime.ActiveProject.Path+ "\WinccDataFolder"'HMIRuntime.Tags("@NOP::ProjectDataPath").Read Set FSO=CreateObject("Scripting.FileSystemObject") If FSO.FolderExists(ProjectDataPath) Then LocalDBFileName=ProjectDataPath & "\"&DatabassFileName&".mdb" If FSO.FileExists(LocalDBFileName) Then Set LDBCN=CreateObject("ADODB.Connection") LDBCN.ConnectionString="Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & LocalDBFileName LDBCN.CursorLocation = 3 '數據訪問客戶端 LDBCN.Open If LDBCN.State=1 Then Result=1 Else Result=0 End If Else Result=-2 End If Else Result=-1 End If Set FSO=Nothing LocalDB_OPEN=Result End Function Sub LocalDB_CLOSE(LDBCN)'關閉LocalDB.mdb的ADODB連接 On Error Resume Next If LDBCN.State=1 Then LDBCN.Close End If End Sub
'對Access讀取操作函數
Function ReadTagValue(LDBCN,DatabassFileName,SheetName,TargetHeadName,ConditionHeadName,ConditionValue)
On Error Resume Next
LocalDB_OPEN LDBCN,DatabassFileName
Dim MdbString,oRs
MdbString="SELECT "&TargetHeadName&" FROM "&SheetName&" where "&ConditionHeadName&"='"&ConditionValue&"'"
Set oRs=LDBCN.execute(MdbString)
If IsNull(oRs.fields(0).value)=True Then
ReadTagValue=""
Else
ReadTagValue=oRs.fields(0).value
End If
Set oRs=Nothing
LocalDB_CLOSE LDBCN
End Function
'對Access寫入操作函數
Function WriteTagValue(LDBCN,DatabassFileName,SheetName,TargetHeadName,TargetValue,ConditionHeadName,ConditionValue)
On Error Resume Next
LocalDB_OPEN LDBCN,DatabassFileName
Dim MdbString,oRs
MdbString="update "&SheetName&" Set "&TargetHeadName&"='"&TargetValue&"' where "&ConditionHeadName&"='"&ConditionValue&"'"
Set oRs=LDBCN.execute(MdbString)
Set oRs=Nothing
LocalDB_CLOSE LDBCN
End Function
二、按鈕型操作記錄
1、記錄原理
通過按鈕按下以后得觸發事件,觸發按鈕型操作記錄腳本,對預存儲在Access中的對應設備信息進行讀取,進而使用這些信息在WinCC中使用預設的消息,生成一條報警記錄,最終把需要的報警記錄進行篩選
2、WinCC中創建消息號,此處創建消息號為2021101

3、更改操作記錄所需要用到的過程值塊,消息塊名稱,在此處用到的過程值塊為過程值8、過程值9以及過程值10,分改為操作對象、操作內容和操作用戶名。

4、創建數據庫

如上圖中,是按鈕型操作記錄預先錄入的信息,該信息包括以下內容:
<1>、在WinCC項目文件夾中創建文件夾,名稱為WinCCDataFolder;
<2>、在以上文件夾中創建Access數據庫,Access數據庫名稱此處為ButtonHis.mdb,注意為mdb格式;
<3>、在數據庫中創建表格Button,表格中包含四列,分別為TagID、TagName、HandEqui以及HandTips;
<4>、在表格中添加內容,其中TagName為相應按鈕的按鈕名稱,HandEqui對應該按鈕所操作的設備,HandTips對應的是該按鈕對該設備進行的操作內容。
5、腳本
'觸發按鈕記錄的函數
Function ButtonRecord(ConditionValue) On Error Resume Next Dim MyAlarm,LDBCN Set MyAlarm = HMIRuntime.Alarms(2021101) MyAlarm.State =1 MyAlarm.ProcessValues(10) =HMIRuntime.tags("@NOP::@CurrentUserName").read MyAlarm.ProcessValues(8) =ReadTagValue(LDBCN,"ButtonHis","Button","HandEqui","TagName",ConditionValue) MyAlarm.ProcessValues(9) =ReadTagValue(LDBCN,"ButtonHis","Button","HandTips","TagName",ConditionValue) MyAlarm.Create "MyApplication" Set MyAlarm =Nothing End Function
'觸發按鈕記錄的事件
'比如在一個名稱為ButtonT1的按鈕單擊事件中寫入以下腳本:
ButtonRecord item.ObjectName
以上腳本中,ConditionValue表示待操作按鈕所命名的專用名稱,每一個按鈕都需要對應一個不同的名稱,并且將需要進行操作記錄的按鈕名稱錄入到Access數據庫中,每次按下按鈕之后,WinCC都會自動生成一條記錄信息。
三、設置型操作記錄
1、記錄原理
通過修改WinCC的IO域之后,會產生一個IO域輸入/輸出更改的事件,此處需要使用IO域的輸出更改所觸發的事件,因為經過多次測試只有使用該事件,才能完美的完成設置型操作記錄。當輸出更改后,會觸發設置型操作記錄的基本,對預存儲在Access中的對應設備信息進行讀取,進而使用這些信息在WinCC中使用預設的消息,生成一條報警記錄,最終把需要的報警記錄進行篩選,從而達到操作型操作記錄的目的。
2、WinCC中創建消息號,此處創建消息號為2021102
3、更改操作記錄所需要用到的過程值塊,消息塊名稱,在此處用到的過程值塊為過程值2、過程值3、過程值8、過程值9以及過程值10,分改為修改前值、修改后值、操作對象、操作內容和操作用戶名。
4、創建數據庫
<1>、在ButtonHis數據庫中創建表格OpAndTagName,表格中包含七列,分別為TagID、TagName、Comment、BefValue、AftValue、Unit以及OperMess;
<2>、在表格中添加內容,具體如下:
TagName為相應IO域名稱;
Comment對應IO域所代表的意義,如頻率等;
BefValue在該處會記錄設置操作以前的設定值;
AftValue記錄更改以后得設定值;
Unit表示該設定值的單位;
OperMess進行參數設置的操作內容,如頻率設定。

5、腳本
Function IORecordAcces(ConditionValue) On Error Resume Next Dim Bef,Aft,BN,AN,LDBCN '判斷輸入是否為用戶名,或者輸入值為空,則認為未登錄,否則將待寫入的值記錄到Bef If ConditionValue="@CurrentUserName" And HMIRuntime.tags("@NOP::"+ConditionValue).read="" Then Bef="未登錄" Else Bef=CStr(HMIRuntime.tags("@NOP::"+ConditionValue).read) End If '將之前未寫入之前的值讀取到Aft中 Aft=CStr(ReadTagValue(LDBCN,"ButtonHis","OpAndTagName","AftValue","TagName",ConditionValue)) '寫入到Aft中之后,將 WriteTagValue LDBCN,"ButtonHis","OpAndTagName","BefValue",Aft,"TagName",ConditionValue If Bef<>Aft Then WriteTagValue LDBCN,"ButtonHis","OpAndTagName","AftValue",Bef,"TagName",ConditionValue End If Dim MyAlarm,user,OName,Unit Unit=ReadTagValue(LDBCN,"ButtonHis","OpAndTagName","Unit","TagName",ConditionValue) If HMIRuntime.tags("@NOP::@CurrentUserName").read="" Then user="未登錄" Else user=HMIRuntime.tags("@NOP::@CurrentUserName").read End If 'Msgbox "Bef="+CStr(Bef) 'Msgbox "Aft="+CStr(Aft) If Trim(CStr(Bef))<>Trim(CStr(Aft)) And Trim(CStr(Bef))<>"" And Trim(CStr(Aft))<>"" Then If ConditionValue<>"@CurrentUserName" Then Set MyAlarm = HMIRuntime.Alarms(2021102) Else Set MyAlarm = HMIRuntime.Alarms(2021104) End If With MyAlarm .State =1'5 .ProcessValues(10) =user '用戶名 If InStr(CStr(Bef),".")=0 And ConditionValue<>"@CurrentUserName" Then .ProcessValues(3) =CStr(Bef)+".0" '修改后值 Else .ProcessValues(3) =CStr(Bef) End If If InStr(CStr(Aft),".")=0 And ConditionValue<>"@CurrentUserName" Then .ProcessValues(2) =CStr(Aft)+".0" '修改前值 Else .ProcessValues(2) =CStr(Aft) End If .ProcessValues(8) =ReadTagValue(LDBCN,"ButtonHis","OpAndTagName","Comment","TagName",ConditionValue)'操作對象 If ConditionValue<>"@CurrentUserName" Then .ProcessValues(9) =ReadTagValue(LDBCN,"ButtonHis","OpAndTagName","OperMess","TagName",ConditionValue)+"(單位:"+Unit +")" '操作內容 Else .ProcessValues(9) =ReadTagValue(LDBCN,"ButtonHis","OpAndTagName","OperMess","TagName",ConditionValue) End If .Create "MyApplication" End With Set MyAlarm = Nothing End If End Function
'在輸出更改的事件中添加以下腳本
IORecordAcces item.ObjectName

6、報警插件設置
<1>.操作記錄需要在報警插件中顯示,首先選擇消息塊,選擇日期、時間、操作用戶名、操作對象、操作內容、設定前值及其設定后值,設定好字號、居中、寬度等信息。

<2>.設置控件篩選內容,根據報警消息號為2021101,2021102設置篩選內容,如下圖:

浙公網安備 33010602011771號