在WinCC中如何使用VBS读取变量归档数据到EXCELWord下载.docx
《在WinCC中如何使用VBS读取变量归档数据到EXCELWord下载.docx》由会员分享,可在线阅读,更多相关《在WinCC中如何使用VBS读取变量归档数据到EXCELWord下载.docx(10页珍藏版)》请在冰豆网上搜索。
SQL_clause>
][,<
TimeStep>
]
4字节长ValueID的请求:
TAG:
ValueID或
ValueName>
其中:
ValueID:
过程值归档变量的唯一标识符。
ValueName:
过程值归档变量的名称,格式为“ArchiveName\Value_Name”,可以使用多个名称。
TimeBegin,TimeEnd:
时间范围,格式“YYYY-MM-DDhh:
mm:
ss.msc”。
SQL_Clause:
SQL语法中的过滤标准。
TimeStep:
时间间隔。
使用<
时,必须将<
指定为绝对时间。
禁止使用相对语句“0000-00-0000:
00:
00.000”。
其中ValueID和ValueName的对应关系如下图所示:
图1ValueID和ValueName的对应关系
3.2几种常用的查询需求和语句
1)绝对时间间隔
2)相对时间间隔
请注意,查询不能包含任何空格。
习惯上,执行绝对时间查询时需要将查询的时间条件转换成UTC(协调世界时)时间。
执行相对时间查询时请一定要注意相对时间的格式。
建议使用MsgBox或者HMIRuntime.Trace等方式输出数值以检查格式是否正确。
3.3查询结果
查询结果作为记录集返回。
过程值归档的记录集结构如下表所示:
表1记录集结构
注意,WinCC的归档数据是使用UTC(协调世界时)时间保存的。
因此在对数据进行查询和显示时,需要对时间进行适当的转换。
4组态介绍(以绝对时间间隔为例)
4.1准备工作
1)创建变量
NewTag用于创建过程值归档,strBeginTime和strEndTime用于存储查询条件。
sVal是时间间隔参数。
如下图所示:
图2变量
2)创建过程值归档
创建归档周期为一分钟的过程值归档。
图3归档配置
3)创建Excel模板
在特定的路径下预先创建一个Excel文件作为模板,这样可以很好的控制输出格式。
本例中在D:
\WinCCWriteExcel下创建一个名称为abc.xlsx的Excel文件。
图4Excel模板
4.2组态查询界面
画面上新建三个输入/输出域,分别用于输入开始时间、结束时间和间隔时间。
按钮中执行用于访问变量归档数据的VBS脚本。
图5查询界面
4.3关键脚本介绍
1)打开Excel模板
以后台方式打开之前创建好的Excel模板。
其中sheetname作为变量可以定义Excel中Sheet的名字。
SetobjExcelApp=CreateObject("
Excel.Application"
)
objExcelApp.Visible=False
objExcelApp.Workbooks.Open"
D:
\WinCCWriteExcel\abc.xlsx"
objExcelApp.Worksheets(sheetname).Activate
2)准备查询条件
主要是确定和格式化Catalog、UTC开始时间、UTC结束时间、时间间隔等查询条件。
因为北京时间和UTC(协调世界时)时间相差8个小时,所以直接在程序中写入固定的时间差值。
SettagDSNName=HMIRuntime.Tags("
@DatasourceNameRT"
tagDSNName.Read
SetLocalBeginTime=HMIRuntime.Tags("
strBeginTime"
LocalBeginTime.Read
SetLocalEndTime=HMIRuntime.Tags("
strEndTime"
LocalEndTime.Read
UTCBeginTime=DateAdd("
h"
-8,LocalBeginTime.Value)
UTCEndTime=DateAdd("
-8,LocalEndTime.Value)
UTCBeginTime=Year(UTCBeginTime)&
"
-"
&
Month(UTCBeginTime)&
Day(UTCBeginTime)&
Hour(UTCBeginTime)&
:
"
Minute(UTCBeginTime)&
Second(UTCBeginTime)
UTCEndTime=Year(UTCEndTime)&
Month(UTCEndTime)&
Day(UTCEndTime)&
Hour(UTCEndTime)&
Minute(UTCEndTime)&
Second(UTCEndTime)
HMIRuntime.Trace"
UTCBeginTime:
UTCBeginTime&
vbCrLf
UTCendTime:
UTCEndTime&
SetsVal=HMIRuntime.Tags("
sVal"
sVal.Read
另外,因为WinCC中对访问数据库的时间格式有特殊的要求。
所以程序中增加了格式化时间的代码。
更多详细资料请参考连接:
如何计算本地时间和UTC时间的时间差,如何转换UTC时间成SQL语句格式?
22115636
3)读取数据并写入Excel中
本段代码主要是获取数据并按照一定的格式填写到打开的Excel文件中。
其中sSql可以很灵活的定义开始和结束时间、排序方法和数据分析方法等。
'
创建数据库联接
sPro="
Provider=WinCCOLEDBProvider.1;
sDsn="
Catalog="
tagDSNName.Value&
;
sSer="
DataSource=.\WinCC"
sCon=sPro+sDsn+sSer
Setconn=CreateObject("
ADODB.Connection"
conn.ConnectionString=sCon
conn.CursorLocation=3
conn.Open
定义查询的命令文本SQL
sSql="
Tag:
R,('
PVArchive\NewTag'
),'
'
"
sSql=sSql+"
orderbyTimestampASC'
TimeStep="
sVal.Value&
1'
SetoRs=CreateObject("
ADODB.Recordset"
SetoCom=CreateObject("
ADODB.Command"
oCom.CommandType=1
SetoCom.ActiveConnection=conn
oCom.CommandText=sSql
填充数据到Excel中
SetoRs=oCom.Execute
m=oRs.RecordCount
If(m>
0)Then
objExcelApp.Worksheets(sheetname).cells(2,1).value=oRs.Fields(0).Name
objExcelApp.Worksheets(sheetname).cells(2,2).value=oRs.Fields
(1).Name
objExcelApp.Worksheets(sheetname).cells(2,3).value=oRs.Fields
(2).Name
objExcelApp.Worksheets(sheetname).cells(2,4).value=oRs.Fields(3).Name
objExcelApp.Worksheets(sheetname).cells(2,5).value=oRs.Fields(4).Name
oRs.MoveFirst
i=3
DoWhileNotoRs.EOF'
是否到记录末尾,循环填写表格
objExcelApp.Worksheets(sheetname).cells(i,1).value=oRs.Fields(0).Value
objExcelApp.Worksheets(sheetname).cells(i,2).value=
GetLocalDate(oRs.Fields
(1).Value)
objExcelApp.Worksheets(sheetname).cells(i,3).value=oRs.Fields
(2).Value
objExcelApp.Worksheets(sheetname).cells(i,4).value=oRs.Fields(3).Value
objExcelApp.Worksheets(sheetname).cells(i,5).value=oRs.Fields(4).Value
oRs.MoveNext
i=i+1
Loop
oRs.Close
Else
MsgBox"
没有所需数据……"
item.Enabled=True
SetoRs=Nothing
conn.Close
Setconn=Nothing
objExcelApp.Workbooks.Close
objExcelApp.Quit
SetobjExcelApp=Nothing
ExitSub
EndIf
注意:
因为数据库中数据存储的时间戳是UTC时间,所以在显示的时候需要把UTC时间转换为本地时间,上段代码中的GetLocalDate函数就是实现这样的功能。
本例中是在全局脚本的VBS-Editor中创建的该函数。
添加函数的方法如下图所示:
图6添加时间转换函数
主要的代码如下:
FunctionGetLocalDate(vtDate)
DimDoY
Dimdso
Dimdwi
DimstrComputer,objWMIService,colItems,objItem
DimTimeZone
DimvtDateLocalDate
strComputer="
."
SetobjWMIService=GetObject("
winmgmts:
{impersonationLevel=impersonate}!
\\"
strComputer&
\root\cimv2"
SetcolItems=objWMIService.ExecQuery("
Select*fromWin32_TimeZone"
ForEachobjItemIncolItems
TimeZone=objItem.Bias/60'
offsetTimeZoneInhours
Next
IfIsDate(vtDate)<
>
TrueThen
IS_GetLocalDate=False
ExitFunction
DoY=DatePart("
y"
vtDate)
dso=DatePart("
"
31.03"
)-DatePart("
w"
)+1
dwi=DatePart("
31.10"
IfDoY>
=dsoAndDoY<
dwiThen
sommer
TimeZone=TimeZone+1'
additionaloffset1hinsummer
vtDateLocalDate=DateAdd("
1*TimeZone,vtDate)
GetLocalDate=vtDateLocalDate
EndFunction
更多关于时间转换的信息请参考连接:
如何将本地计算机时间的时间戳(日期时间)转换成协调世界时(UTC)?
24201113
4)保存文件并释放资源
释放资源
生成新的文件,关闭Excel
Dimpatch,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.SaveAspatch
成功生成数据文件!
item.Enabled=True
5结果和建议
下图为程序执行的结果。
仅供参考:
图7输出结果
建议:
为了改善本地访问期间的性能,请输入“<
\WinCC”作为数据源,而不是“.\WinCC”。
为了提高系统的执行效率,建议仅读取少量的数据。
为了避免可能造成的数据损失,建议在执行操作之前先退出Excel应用程序。