在WinCC中如何使用VBS读取报警记录数据到EXCEL.docx
《在WinCC中如何使用VBS读取报警记录数据到EXCEL.docx》由会员分享,可在线阅读,更多相关《在WinCC中如何使用VBS读取报警记录数据到EXCEL.docx(15页珍藏版)》请在冰豆网上搜索。
在WinCC中如何使用VBS读取报警记录数据到EXCEL
在WinCC中如何使用VBS读取报警记录数据到EXCEL
1概述
介绍如何在WinCC项目中使用VBS脚本读取报警记录归档数据•并把获取的数拯保存成新的Excel文件。
2软件环境
WindowsXPSP3中文版、WinCC7.0SP2ASIA.MicrosoftofficeExcel2007
3访问原理
WinCC报腎记录数据是以斥缩的形式存储在数IK库中.需要通过WinCC连通性软件包提供的OLE・DB接口才能够解压并读取这些数拯。
关于WinCC连通性软件包的详细信息请参考连接:
37436159
呷使用OL&DB方式访问数据库时关键需要注恿连接字符串的写法和查询语句的格式。
连接字符串格式为-ProviderWinCCOLEDBPronder.1;Catalog="七DataSource=***;'\其中:
Catalog为WinCC运行数据库的名称.当修改项目名称或在其它计算机上打开原项目时,Catalog会发生变化。
建议使用WinCC内部变量-@DatasowceNameRT5>获得出前项目的CatalogsDataSource为服务器名称•酪式为《计算机名称KWinCC"。
3.1査询语句格式
査询语句的格式要求如下:
A1ARNI\TEW:
SELECT*FROM[WHEREvCondition>……optional]
其中参数信息如F所示:
ViewName:
数攜库表名。
必须用弼要的语言捋定该表。
比如:
中文字符表名为:
ALGVIEWCHT・英文字符表明为:
ALGVIEWENU等。
Condition:
为过滤标准。
详细说明请参见卜农:
参数
说明
ViewName
数据库表的名称。
必须用需耍的语言指定该表。
例如,五种欧洲诣言的uViewName,,M:
ALGVIEWDEU:
徳语报餐消息归档数据ALGVIEWENU:
英语报饕消息归档数据ALGVIEWESP:
西班牙语报警消息归档数据ALGVIEWFRA:
法语报警消息归档数据
ALGVIEWITA:
意大利语报警消息归档数据
例如,亚洲语詈的"ViewName,'M:
ALGVIEWCHT:
中文(简体)报警消息归档数据ALGVIEWCHT:
中文(唸体)报警消息归档数据ALGVIEWJPN:
日语报警消息归档数摇
ALGVIEWKOR:
韩语消息归档数摇
注
支持在WinCC基本系统中安装的语言或者在WmCC文本库中组恣的语言。
有关可接受的查询语言或相应的^ViewName"的信息可在SQL-Server链接报誓归档的“视图”下找到。
相应归档中支持的所令语言显于时都带令其ID,例如,此处为“GENVIEWENLT。
Condition
过滤标准,例如:
DateTime^^OOS-Oe-OTANDDateTime<,2003-07-01,
DateTime>,2003-06-0117:
30:
00*
MsgNr=5
MsgNrin(4,5)
State=2
使用DateTimeat,仅可使用绝对时间表示法。
表1査询参数农
3・2查询结果
査询结果作为记录集返回。
可以根据需要有选择的返回特定的数据塔例如:
oRs.Fields(0).Value返回的是消息的编号:
oRs.Fields
(2).Value返回的是消息的时间戮:
oRs.Fieids(37).Value返回的是消息文本的内容。
记录集的结构如卜•表所示:
位置
域名称
类型
注释
1
MsgNo
整型(4字节}
消息号
2
State
小整型(2字节)
报警记录状态
3
DateTime
日期时间(8字节)
消息的时间霍(不带蠢秒的日期/时间)
4
Ms
小聲型(7字节)
消息的时间戳(毫秒)
5
Instance
VarChar(255)
报警记录的实例名称
6
Flags1
整型(4字节}
(仅限于内部使用)
7
PValueUsed
整型(£字节}
使用的过程值
8到17
PValue!
S
PValuelO
实型(B字节)
数字过程值1到10
185127
PText!
H
PTextW
VarChar(255)
过程值文本1到10
28
ComputerName
VarChar(255)
计算机的名称
29
应用程序
VarChar(255)
应用程序名称
30
Comment
VarChar(255)
注释
31
UserName
VarChar(255)
用户名
32
Counter
整型(4字节}
运行报警消息计数器
33
TimeDiff
整a(4字节)
与“迸入'状态的时间差
34
ClassName
VarChar(255)
消息类别的名称
35
Typename
VarChar(255)
消息类型的名称
36
Class
小熬型(2字节)
消息类别ID
37
Type
小壑型(2字节)
消息类型ID
38到47
Textl到TextIO
VarChar(255)
消息文本1到10
48
AG_NR
小餾型(7字节)
PLC的编号
49
CRU_NR
小墜型(2字节)
CPU的编号
50
Ci-ComeFore
整型(4字节}
“进入”状态的前貴色
表2记录集结构
位置
域名称
类型
注释
51
CrComeBack
整型(4字节)
“进入”状态的背景色
&2
CrGoFore
整型(4字节)
"离开"状态的前景色
53
CrGoBack
整型(4字节)
“离开”状态的背貴色
54.
CrAckFore
整型(4字节)
“已确认”状态的前景色
55
CrAckBack
整型(4字节)
“已确认”状态的背景色
56
LocallD
整型(4字节)
报瞽的位置
57
Priority
整型(4字节)
优尢级
58
APjype
整型(4字节)
报警循环
59
APname
VarChar(255)
报警循环函数名称
60
AP_PAR
VarChar(255)
报警循环画面
61
InfoText
VarChar(255)
信息文本
62
TxtCame
VarChar(255)
已进入的文本
63
TxtWent
VarChar(255)
己离开的文本
64
TxtCameNWent
VarChar(255)
己逬入和己离开的文本
65
TxtAck
VarChar(255)
己确认的文本
66
AlaiTnTag
整型(4字节)
消息变昂
67
AckType
小整型(2字节)
确认类型
68
Params
整型(4字节)
参数
69
Servername
VarChar(255)
Servemame
後3记录集结构(续表)
注氐WinCC的归档数拯是使用UTC(协调世界时)时间保存的。
本例中所采用的时间均为UTC时间.如果需要实现在本地时间和UTC时间之间的转换,请参考下列连接:
如何计算本地时间和UTC时间的时间差,如何转换UTC时间成SQL语句格式?
22115636
如何将本地计算机时间的时间裁(日期时间)转换成协调世界时(UTC)?
24201113
4组态介绍
4・1准备工作
1)创建变St
其中AlmTagAxAlmTagB和AlmTagC用于组态报家MySqlStr用于动态化査询条件。
如卜图所示:
二进制变屋
二进制变呈
二进制变量
文本变量8位字符集
|jAlmT&gA|AlmTagB||AlmTagC^MySqlStr\
图]变盘
2)组态报警
在报警记录中组态如卜报警:
图2报警信息
单个消息②冈
3)创建Excel模板
在特定的路径卞预先创建一个Excel文件作为模板.这样可以很好的控制输出格式。
本例中任
D:
\WinCCWriteExcel卜创建一个名称为abc.xlsx的Excel文件。
如卜图所示:
A1
▼
Ams读取报警记录测试报表
1
2
A
B
C
D
编号
YBS读取报警记录测试报表II
状态日期吋间消息文本
3
4
5
6
7
图4EXCEL模板
4.2组态査询界面
画而上新建五个按机.上面的四个按纽分别用于设置不同的查询条件。
按纽卜•方的紳态文本用于显示查询条件。
玻卜•方的按纽用于执行査询报警记录的VBS脚本。
其中査询条件的设定是通过按钮的直接连接方式实现。
图5查询界面
在按钮属性对话框的鼠标动作中选择直接连接打开如卜界面.配置查询条件。
其中来源部分为査询字符串.目标部分为存储査询条件的变显。
图6按紐直接连接配置
4.3详细脚本介绍
1)打开Excel模板
以后台方式打开之前创建好的Excel模板。
其中sheetname作为变駅对以定义Excel中Sheet的名字。
需要注童模板文件的存储路径。
SetobjExcelApp=CreateObjectCExcel.Application'*)
objExcelApp.Visible=False
objExcelApp.Workbooks.Open"D:
\WinCCWriteExcel\abc.xlsx'*
objExcelApp.Worksheets(sheetname).Activate
2)准备查询条件
主要是确定和格式化Catalog和査询条件。
关键抑本如卜•:
■准备査询条件Catalog
SettagDSNName=HMIRuntime.TagsC'^^DatasourceNameRT")
tagDSNName.Read
'拼接查询条件
MySqIStr.Read
sSql=-ALARMVIEW^elect*FROMAlgViewCHTH&MySqlSmVMe
其中NlySqlStr为定义的内部字符串类型的变显.当点击査if|J条件中的按钮时•就会把相应的査询*件字符串传给该变齟(需要根抑:
项目的实际情况调整査询条件〉。
木例中的四*盘询条件的完整i?
l句如卜•图所示:
Sqlis:
ALARMV1EW:
Select*FROMAlgViewCHT
Sqlis:
ALARMVIEW:
Sclcct*FROMAlgViewCHTWhereMsgNr=10
Sqlis:
ALARMVlEW:
Select•FROMAlgViewCHTWhereState=2
Sqlis:
ALARMVlEV/:
Select*FROMAlgViewCHTWhereDateTime>'2011-09-08*ANDDateTime<7011-09-1O'
图7査询条件
3)完整的代码
•变显定义和初始化
DimsPro.sDsiLsSensCon.conn.sSql.oRs.oCom
DimtagDSNName
Dimm.i
DimobjExcelApp.objExcelBook.objExcelSheet.sheetname
DimMySqlStr
SetMySqlStr=HMIRuntime.Tags(MMySqlStr*f)
item.Enabled=False
OnErrorResumeNext
sheetname="Sheetl"
•打开Excel模板
SetobjExcelApp=CreateObjectC'Excel.Application")objExcelApp.Visible=False
objExcelApp.Workbooks.Open"D:
\WinCCWriteExcel\abc.xlsx'*objExcelApp.Worksheets(sheetname).Activate
•准备査询条件Catalog
SettagDSNName=HMIRunlime.Tags(”@DalasourceNameRT")tagDSNName.Read
•创建数拯库联接
sPro='Provider=WinCCOLEDBProvider.1
sDsn="Catalog="&tagDSNName.Value&
sSer=*DataSource=.\WinCC"
sCon=sPro+sDsn+sSer
Setconn=CreateObject('AIX)DB.ConnectionM)conn.ConnectionString=sConconn.CursorLocation=3
conn.Open
•定义查询的命令文本SQL
MySqIStr.Read
sSql=-ALARMVIEW:
Select*FROMAlgViewCHTH&MySqlStr.\5ue
HMIRuntime.Trace”Sqlis:
"&sSql&vbCrLf
SetoRs=CreateObjectCADODB.Recordset")
SetoCom=CreateObject(HADODB.Command*)
oCom.CommandType=1
SetoCom.ActiveConnection=connoCom.CommandText=sSql
•填充数搦到Excel中
SetoRs=oCom.Execute
m=oRs.RecordCount
If(m>0)Then
oRs.MoveFirst
i=3
DoWhileNotoRs.EOF'是否到记录末尾.循环填写农擀objExcelApp.Worksheets(sheetname).cells(i,1).value=CStrtoRs.Fields(O).Value)objExcelAppAVorksheets(sheetnaine).cells(i,2).value=CStr(oRs.Fields
(1).Value)objExcelApp.Worksheets(sheetname).cells(i3)value=CStr(oRs.Fields
(2).Value)objExcelApp.Worksheets(sheetname).cells(i4).value=CStr(oRs.Fields(37).Value)oRs.MoveNexti=i+l
Loop
oRs.Close
Else
MsgBox”没有所需数据……w
item.Enabled=True
SetoRs=Nothing
conn.Close
Setconn=Nothing
objExcelApp.Workbooks.Close
objExcelApp.Quit
SetobjExcelApp=Nothing
ExitSub
EndIf
•释放资源
SetoRs=Nothing
conn.Close
Setconn=Nothing
•生成新的文件•关闭Excel
Dimpatch,!
ilename
filename=CStr(Year(Now))&CStr(MoiHh(Now))&CStrfDiiy(Now))&CStr(Hour(Now))+CStr(M!
nute(Now))&CStr(Second(Now))patch=Hd:
\M&filename&"demo.xlsx"
objExcelApp.ActiveWorkbook.SaveAspatch
objExcelApp.Workbooks.Close
objExcelApp.Quit
SetobjExcelApp二Nothing
MsgBox“成功生成数据文件!
”
item.Enabled=True
5结果和建议
卜图为程序执行的结果。
仅供参考^
—
1
2
A
B
C
D
r编号
YES读取报警记录测试报表II
状态日期时间消息文本
3
10
2
2011-9-807
07:
4:
4:
餅错误消息文卑
4
11
2
2011-9-807
07:
46
E#错误消息文本
5
12
2
2011-9-807
07:
4:
8C#错误消息文本
6
10
1
2011-9-907
08:
35肘错误消息文本
7
11
1
2011-9-907
08:
37
餌错误消息文本
8
12
1
2011-9-907
08:
38C#错误消息文本
9
10
1
2011-9-908
贾:
44肘错误消息文本
10
11
1
2011-9-908
33:
4:
6错误消息文本
11
12
1
2011-9-908
33:
钉瑞错误消息文本
12
10
3
2011-9-908
33:
4:
9AS错误消息文本
13
11
3
2011-9-908
33:
4:
9瑞错误消息文本
14
12
3
2011-9-908
33:
4=9
B错误消息文本
15
10
2
2011-9-908
33:
51
时错误消息文本
ie.
17
11
12
2
2
2011-9-908
2011-9-908
33:
53E#错误消息文本
33:
55C#错误消息文本
18
10
1
2011-9-908
33:
58
时错误消息文本
19
11
1
2011-9-908
33:
59
B#错误消息文本
20
12
1
2011-9-908
34:
:
01
C#错误消息文本
21
10
2
2011-9-908
34:
05
紂错误消息文本
22
11
2
2011-9-908
34:
06时错误消息文本
~23"
12
2
2011-9-908
3i:
08C#错误消息文本
24
10
3
2011-9-908
34:
:
10制错误消息文本
25
11
3
2011-9-908
34:
10
E#错误消息文本
26
12
3
2011-9-908
34:
10
C#错误消息文本
27
28
29
144卜/Sheet3/^lJ
图8输出结果
建议:
为了改善本地访问期间的性能.请输入y计算机名称>\WinCC-作为数据源.而不是-.\WmCC\为了捉髙系统的执行效率.建议仅读取少駅的数拥。
为了避免町能造成的数抵损失,建议在执行操作之前先退fllExcel用程序。