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设置筛选内容,如下图: