n
1概述
介绍如何在WinCC项目中使用VBS脚本读取报警记录归档数据,并把获取的数据保存成新的Excel文件。n
2软件环境
Windows XP SP3中文版、WinCC7.0 SP2 ASIA、Microsoft office Excel 2007n
3访问原理
WinCC报警记录数据是以压缩的形式存储在数据库中,需要通过 WinCC连通性软件包提供的OLE-DB接口才能够解压并读取这些数据。关于WinCC连通性软件包的详细信息请参考连接:37436159
当使用 OLE-DB方式访问数据库时关键需要注意连接字符串的写法和查询语句的格式。连接字符串格式为“Provider= WinCCOLEDBProvider.1; Catalog= ***; Data Source= ***;”,其中:Catalog为WinCC运行数据库的名称, 当修改项目名称或在其它计算机上打开原项目时, Catalog会发生变化。建议使用WinCC内部变量 “@DatasourceNameRT” 获得当前项目的Catalog。Data Source 为服务器名称,格式为“<计算机名称>WinCC”。
3.1 查询语句格式
查询语句的格式要求如下:
AlARMVIEW:SELECT * FROM <ViewName> [ WHERE<Condition>……optional ]
其中参数信息如下所示:
ViewName:数据库表名。必须用需要的语言指定该表。
比如:中文字符表名为:ALGVIEWCHT,英文字符表明为:ALGVIEWENU等。
Condition:为过滤标准。n
详细说明请参见下表:n
表1查询参数表n
3.2查询结果
查询结果作为记录集返回。可以根据需要有选择的返回特定的数据集。例如:oRs.Fields(0).Value 返回的是消息的编号;oRs.Fields(2).Value 返回的是消息的时间戳;oRs.Fields(37).Value返回的是消息文本的内容。记录集的结构如下表所示:n
表2记录集结构n
表3记录集结构 (续表)
注意:WinCC的归档数据是使用UTC(协调世界时)时间保存的。本例中所采用的时间均为UTC时间,如果需要实现在本地时间和UTC时间之间的转换,请参考下列连接:
如何计算本地时间和 UTC 时间的时间差,如何转换 UTC 时间成 SQL 语句格式?n
如何将本地计算机时间的时间戳(日期时间)转换成协调世界时 (UTC)?n
4组态介绍
4.1准备工作n
1)创建变量
其中AlmTagA、AlmTagB和AlmTagC用于组态报警,MySqlStr用于动态化查询条件。如下图所示:n
图1变量n
2)组态报警
在报警记录中组态如下报警:n
图2报警信息n
图3单个消息组态界面n
3)创建Excel模板
在特定的路径下预先创建一个Excel文件作为模板,这样可以很好的控制输出格式。本例中在D:WinCCWriteExcel下创建一个名称为abc.xlsx的Excel文件。如下图所示:n
图4EXCEL模板n
4.2组态查询界面
画面上新建五个按钮,上面的四个按钮分别用于设置不同的查询条件。按钮下方的静态文本用于显示查询条件。最下方的按钮用于执行查询报警记录的VBS脚本。其中查询条件的设定是通过按钮的直接连接方式实现。n
图5 查询界面n
在按钮属性对话框的鼠标动作中选择直接连接打开如下界面,配置查询条件。其中来源部分为查询字符串,目标部分为存储查询条件的变量。n
图6按钮直接连接配置n
4.3详细脚本介绍n
1)打开Excel模板
以后台方式打开之前创建好的Excel模板。其中sheetname作为变量可以定义Excel中Sheet的名字。需要注意模板文件的存储路径。
Set objExcelApp = CreateObject("Excel.Application")
objExcelApp.Visible = False
objExcelApp.Workbooks.Open "D:WinCCWriteExcelabc.xlsx"
objExcelApp.Worksheets(sheetname).Activate
2)准备查询条件
主要是确定和格式化Catalog和查询条件。关键脚本如下:
'准备查询条件 Catalog
Set tagDSNName = HMIRuntime.Tags("@DatasourceNameRT")
tagDSNName.Read
‘拼接查询条件
MySqlStr.Read
sSql = "ALARMVIEW:Select * FROM AlgViewCHT "&MySqlStr.Value
其中MySqlStr为定义的内部字符串类型的变量,当点击查询条件中的按钮时 ,就会把相应的查询条件字符串传给该变量(需要根据项目的实际情况调整查询条件)。本例中的四条查询条件的完整语句如下图所示:
图7查询条件n
3)完整的代码
'变量定义和初始化
Dim sPro,sDsn,sSer,sCon,co,sSql,oRs,oCom
Dim tagDSNName
Dim m,i
Dim objExcelApp,objExcelBook,objExcelSheet,sheetname
Dim MySqlStr
Set MySqlStr = HMIRuntime.Tags("MySqlStr")
item.Enabled = False
'On Error Resume Next
sheetname="Sheet1"
'打开Excel模板
Set objExcelApp = CreateObject("Excel.Application")
objExcelApp.Visible = False
objExcelApp.Workbooks.Open "D:WinCCWriteExcelabc.xlsx"
objExcelApp.Worksheets(sheetname).Activate
'准备查询条件 Catalog
Set tagDSNName = HMIRuntime.Tags("@DatasourceNameRT")
tagDSNName.Read
'创建数据库联接
sPro = "Provider=WinCCOLEDBProvider.1;"
sDsn = "Catalog=" &tagDSNName.Value& ";"
sSer = "Data Source=.WinCC"
sCon = sPro + sDsn + sSer
Set co = CreateObject("ADODB.Coection")
co.CoectionString = sCon
co.CursorLocation = 3
co.Open
'定义查询的命令文本 SQL
MySqlStr.Read
sSql = "ALARMVIEW:Select * FROM AlgViewCHT "&MySqlStr.Value
HMIRuntime.Trace "Sql is: " & sSql & vbCrLf
Set oRs = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
oCom.CommandType = 1
Set oCom.ActiveCoection = co
oCom.CommandText = sSql
'填充数据到Excel中
Set oRs = oCom.Execute
m = oRs.RecordCount
If (m > 0) Then
oRs.MoveFirst
i=3
Do While Not oRs.EOF '是否到记录末尾,循环填写表格
objExcelApp.Worksheets(sheetname).cells(i,1).value= CStr(oRs.Fields(0).Value)
objExcelApp.Worksheets(sheetname).cells(i,2).value= CStr(oRs.Fields(1).Value)
objExcelApp.Worksheets(sheetname).cells(i,3).value= CStr(oRs.Fields(2).Value)
objExcelApp.Worksheets(sheetname).cells(i,4).value= CStr(oRs.Fields(37).Value)
oRs.MoveNext
i=i+1
Loop
oRs.Close
Else
MsgBox "没有所需数据……"
item.Enabled = True
Set oRs = Nothing
co.Close
Set co = Nothing
objExcelApp.Workbooks.Close
objExcelApp.Quit
Set objExcelApp= Nothing
Exit Sub
End If
'释放资源
Set oRs = Nothing
co.Close
Set co = Nothing
'生成新的文件,关闭Excel
Dim patch,filename
filename=CStr(Year(Now))&CStr(Month(Now))&CStr(Day(Now))&CStr(Hour(Now))+CStr(Minute(Now))&CStr(Second(Now))
patch= "d:"&filename&"demo.xlsx"
objExcelApp.ActiveWorkbook.SaveAs patch
objExcelApp.Workbooks.Close
objExcelApp.Quit
Set objExcelApp= Nothing
MsgBox "成功生成数据文件!"
item.Enabled = True
5结果和建议
下图为程序执行的结果。仅供参考:
图8输出结果
建议:为了改善本地访问期间的性能,请输入“<计算机名称>WinCC”作为数据源,而不是“.WinCC”。为了提高系统的执行效率,建议仅读取少量的数据。为了避免可能造成的数据损失,建议在执行操作之前先退出Excel应用程序。
声明:
本文所述的方法为WinCC的高级用法,提供的代码程序仅供用户参考,西门子公司不提供任何调试和热线支持。敬请谅解!
程序实例:VBSReadAlarm.zip ( 8720 KB )
关键词
WinCC、Excel、VBS、脚本、连通性软件包
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc325361.html