1概述
介绍如何在WinCC项目中使用VBS脚本读取报警记录归档数据,并把获取的数据保存成新 的Excel文件。 2软件环境
Windows XP SP3 中文版、WinCC7.0 SP2 ASIA、Microsoft office Excel 2007
3访问原理
WinCC报警记录数据是以压缩的形式存储在数据库中,需要通过WinCC连通性软件包提供 的OLE-DB接口才能够解压并读取这些数据。
当使用OLE-DB方式访问数据库时关键需要注意连接字符串的写法和查询语句的格式。连接 字符串格式为“ Provider=WinCCOLEDBProvider.1; Catalog= ***; Data Source= ***;”,其中: Catalog为WinCC运行数据库的名称,当修改项目名称或在其它计算机上打开原项目时, Catalog会发生变化。建议使用WinCC内部变量“@DatasourceNameRT”获得当前项目的 Catalog。Data Source为服务器名称,格式为“〈计算机名称>\\WinCC”。 3.1 查询语句格式
查询语句的格式要求如下:
AlARMVIEW:SELECT * FROM [ WHERE ..... optional ]
其中参数信息如下所示:
ViewName:数据库表名。必须用需要的语言指定该表。
比如:中文字符表名为:ALGVIEWCHT,英文字符表明为:ALGVIEWENU等。 Condition:为过滤标准。 详细说明请参见下表:
参数 Vi&wNanne 说明 数据库表的名称。必须用笔要的语言指定该表.例如,五种 欧洲语言的\"iewN日是: ALGVIEWDEU :德吾报警消息归档数据 ALGVIEWENU :英语报警消息归档数据 ALGVIEWESP :西班牙语报警消息归档数据 ALGVIEWFRA :法语报警消息归档数据 ALGWEWITA:.意大利语报瞽消息归档数据 例如,亚洲语言的\"VimwNjrn。\"是: ALGVIEWCHT :中文《简体)报警消息归档数据 ALGVIEWCHT :由文(赞体)报警消息归档数据 ALGVIEWJPN :日谙报警消息归档数据 ALGVIEWKOR :韩语消息归档次推 支持在WinCC基本系统中安装的语言或者在WinCC文本库 中维奇的语言.有关可接受的查询语言或相应茁TViewNamJ 的信息可在SQL-Swn/w「能接报警归档的\"视图R下找到口相应 归档中支持的所有语A显示时都片有具ID ,例如,此姓为 \"GENVIEWENU^ Condition 过滤标准,例如; 0ateTime>12003-06-0T AND DateTim©<'2003-07-DV DateTime>'2003-06-01 17:30:00, MsgNr= 5 MsgNr ir (4: 5) State - 2 使用DateTime时:仅可便用绝对时间表示法。 表1查询参数表
3.2查询结果
查询结果作为记录集返回。可以根据需要有选择的返回特定的数据集。例如:
oRs.Fields(0).Value返回的是消息的编号;oRs.Fields(2).Value返回的是消息的时间戳; oRs.Fields(37).Value返回的是消息文本的内容。记录集的结构如下表所示:
位置 1 2 3 域名称 Msg No Stat-e DateTime 类型 注释 整型[4字节) 造息号 小整型(2子T报警记录壮寿 > J 日期时间(8字 消息的时向曲(不带K秒的日期」时间) 节) 小整型(2子T〕 VarChar (255) 4 5 6 7 8到17 Ms Instance Flagsl PValueUsed PValuel 到 PValueW 消息的时同诙{亳秒) 报看记录的实例书称 整型(4字节) {仅限于底部使用) 整型(4字节} 使用的过程值 实型(8字节> 数字过程值1到10 VarChnr (2&5J 18 到 27 PTexH 到 PT-exll 0 28 29 30 31 32 33 34 35 36 37 过苣值文本1到10 计算机的名称 Comput-eirNarTis VarChnr (2&5) 应用程序 Comment UserName Counter TimeDiff ClassName Typename Class TVarChar (2&5; 应用程序名称 VarChar (255) VarChar (255) 注解 用户名 11整型(4字节} 运行报警消息计数器 壁型(4字节> 与”进入状态的时间差 VarChar (255) VarChar (255) 消息类别的名称 消皂类型的名称 小型型(2孑「) 消息槊别ID 小型型(2手T J 消息类基ID VarChar (2&&; yPe 38 到 47 Textl 到 TextIO 48 49 AG_NR CPU_NR 小整型(2子「J PLC的^号 小整型(2子「J CPU的编号 。 50 CiConeFore 表2记录集结构 壁型(4字节) “进入”状点的前景色 位置 51 52 53 域名称 CrComeBack CrGoFore CrGoBack CrA-ckFore 类型 注释 整型(4字节} “进入”状春的背景色 整型(4字节) \"离开”状.春的前提色 整型(4字节) \"离开”状森的背景色 整型(4字节) ’,已确认”状春的前宾色 整型(4字节) \"已明认\"状态.的背景色 整型(4字节) 报警的位置 整型(4字节) 忧先缀 整型(4字节) 报警循环 VarChar (255) VarChar (255) VarChar (255) 55 56 57 58 59 60 61 62 63 64 65 66 67 6S 69 CrAckBack LocallD Priori ty APJype AP_n3me AP_PAR InioText TxtCsrrie TxtWent TxtCameNW-ert TxtAck AlamiT3g AckType Params Seivername 报警循环函数名称 报导循环画面 信息文本 VsrChar (255; 已进入的文本 VsrChar (255; 己离开的文本 VarChar (255) VarChar (255) 已进入利己猛开的文本 已确认的文本 整型(4字节) 消息变段 小整型(2字确认类星 〒) 整型(4字节] 参数 VarChar (255) Servemamc 表3记录集结构(续表)
注意:WinCC的归档数据是使用UTC (协调世界时)时间保存的。本例中所采用的时间均为 UTC时间,如果需要实现在本地时间和UTC时间之间的转换,请参考下列连接:
如何计算本地时间和UTC时间的时间差,如何转换UTC时间成SQL语句格式? 22115636 如何将本地计算机时间的时间戳(日期时间)转换成协调世界时(UTC)? 24201113
4组态介绍
准备工作 1)创建变量
其中AlmTagA、AlmTagB和AlmTagC用于组态报警,MySqlStr用于动态化查询条件。如下图 所示:
4.1
名称
QALmT&或 QAlmTagB
QAlmTagC
■ ■■■■■■■■■■■■■■■■■■■■■■■■■■^ ___________ ^MyEqlStr ;
______ L类型
二进制变量 二进制变量 二进制变量
立本变量8位字符集 图1变量
2)组态报警
在报警记录中组态如下报警:
国号 笑别 尖型 10 错误 报警 12 优无缴 □ 0 □ 消息费量 |洎息位 klmTagA |0 AlnTm 啰 o AlmTagC 11 错误 警告 错误 故障 状态变星|状态应 0 0 0 消思文本 ° 儿棉音误消息文B棉音误消息文C标普误消息文图2报警信息
图3单个消息组态界面 3)创建Excel模板
在特定的路径下预先创建一个Excel文件作为模板,这样可以很好的控制输出格式。本例中 在D:\\WinCCWriteExcel下创建一个名称为abc.xlsx的Excel文件。如下图所示:
图4 EXCEL模板
4.2组态查询界面
画面上新建五个按钮,上面的四个按钮分别用于设置不同的查询条件。按钮下方的静态文本 用于显示查询条件。最下方的按钮用于执行查询报警记录的VBS脚本。其中查询条件的设 定是通过按钮的直接连接方式实现。
图5查询界面
在按钮属性对话框的鼠标动作中选择直接连接打开如下界面,配置查询条件。其中来源部分 为查询字符串,目标部分为存储查询条件的变量。
图6按钮直接连接配置 4.3详细脚本介绍 1)打开Excel模板
以后台方式打开之前创建好的Excel模板。其中sheetname作为变量可以定义Excel中Sheet 的名字。需要注意模板文件的存储路径。
Set objExcelApp = CreateObject(\"Excel.Application\") objExcelApp.Visible = False
objExcelApp.Workbooks.Open \"D:\\WinCCWriteExcel\\abc.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为定义的内部字符串类型的变量,当点击查询条件中的按钮时,就会把相应 的查询条件字符串传给该变量(需要根据项目的实际情况调整查询条件)。本例中的四条查 询条件的完整语句如下图所示:
Sql 1芭 ALAHIUVIEW唱。他M 1r FROM AlgVlewCHT
Sqlis: ALARMSEWlS Sql 1^ ALaRM'/l EW^Sele cl * mOM AlgVlewCHTT Where DaleTl mt) ,2011-0 9-DQ' AND Pair Time C'?ni 109-10, 图7查询条件 3)完整的代码 '变量定义和初始化 Dim sPro,sDsn,sSer,sCon,conn,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:\\WinCCWriteExcel\\abc.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 conn = CreateObject(\"ADODB.Connection\") conn.ConnectionString = sCon conn.CursorLocation = 3 conn.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.ActiveConnection = conn 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 conn.Close Set conn = Nothing objExcelApp.Workbooks.Close objExcelApp.Quit Set objExcelApp= Nothing Exit Sub End If '释放资源 Set oRs = Nothing conn.Close Set conn = 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结果和建议 下图为程序执行的结果。仅供参考: A1 ▼ A HBS读取报警记录测试报表 A 1 2 编号 3 4 5 6 7 8 9 10 B 状态 10 11 12 10 11 12 10 11 12 10 11 12 10 11 12 10 11 12 10 11 12 10 11 12 C D II 11 12 13 U 15 16 17 18 19 20 21 22 23 24= 25 26 2T 2S 29 VBS读取报警记录测试报表 日期时间 消息文本 2 2011-9-S 07;。?; 44 A#错俣消息文本 2 2011-9-8 口7:07:铀B#错误消息文本 2 2011-9-S 07:07:受C#错误消息文本 1 2011-9-9 0? :口日:354#错误消息文本 1 2011-9-9。7;。8;37 E#错俣消息文本 1 2011-9-9 QT : Q日:能匚并错误消息文本 1 2011-9-9。日:笺:44也#错误消息文本 1 2011-9-9 0日:E#错误消息文本 1 2011-9-9 QB;M;47 C#解退消息文主 3 2011-9-9 口日:33:4曰错误消息文本 3 2011-9-9 0日:羽:铀E#错误消息文本 3 2011-9-9。日:日日:49 C#错误消息文本 2 2011-9-5 00:33:51必#错误消息文本 2 2011-9-9 0日:33:53 B#错误消息文本 2 2011-9-9 0日:的:腼C#错误消息文本 1 2011-9-9 口H: 33:53也#错误消息文本 1 2011-9-9 QB;M;59 E#皤误消息文主 1 2011-9-9 08:34:01 C#错误消息文本 2 2011-9-9 0日:34:05 错误消息文本 2 2011-9-9 08; 34; 06 E#错俣消息文本 2 2011-9-9 口日:34:04 C#错误消息文本 3 2011-9-9 0日:孔:1。4#错误消息文本 3 2011-9-9。日:羽:1口 E#错误消息文本 3 2011-9-9。日;34; 10 C#错俣消息文本 H * 卜 H Sheetl Sheet2 SheetS 组.' 图8输出结果 建议:为了改善本地访问期间的性能,请输入“〈计算机名称>\\WinCC”作为数据源,而不 是\".\\WinCC”。为了提高系统的执行效率,建议仅读取少量的数据。为了避免可能造成的数 据损失,建议在执行操作之前先退出Excel应用程序。 声明: 本文所述的方法为WinCC的高级用法,提供的代码程序仅供用户参考,西门子公司不提供 任何调试和热线支持。敬请谅解! 关键词 WinCC、Excel、VBS、脚本、连通性软件包 因篇幅问题不能全部显示,请点此查看更多更全内容