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

 

 

    

 

posted on 2025-04-06 21:28  老迈克  阅读(176)  评论(0)    收藏  举报

导航