WINCC+VBS报表.docx

上传人:b****6 文档编号:3646788 上传时间:2022-11-24 格式:DOCX 页数:11 大小:346.19KB
下载 相关 举报
WINCC+VBS报表.docx_第1页
第1页 / 共11页
WINCC+VBS报表.docx_第2页
第2页 / 共11页
WINCC+VBS报表.docx_第3页
第3页 / 共11页
WINCC+VBS报表.docx_第4页
第4页 / 共11页
WINCC+VBS报表.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

WINCC+VBS报表.docx

《WINCC+VBS报表.docx》由会员分享,可在线阅读,更多相关《WINCC+VBS报表.docx(11页珍藏版)》请在冰豆网上搜索。

WINCC+VBS报表.docx

WINCC+VBS报表

WINCC+VBS报表

1概述

介绍如何在WinCC项目中使用VBS脚本读取变量归档值,并把获取的数据保存成新的Excel文件。

文中示例代码仅适用于以绝对时间间隔方式访问。

2软件环境

WindowsXPSP3中文版、WinCC7.0SP2ASIA、MicrosoftofficeExcel2007

3访问原理

WinCC变量归档数据是以压缩的形式存储在数据库中,需要通过WinCC连通性软件包提供的OLE-DB接口才能够解压并读取这些数据。

关于WinCC连通性软件包的详细信息请参考连接:

37436159

当使用OLE-DB方式访问数据库时关键需要注意连接字符串的写法和查询语句的格式。

连接字符串格式为“Provider=WinCCOLEDBProvider.1;Catalog=***;DataSource=***;”,其中Catalog为WinCC运行数据库的名称,当修改项目名称或在其它计算机上打开原项目时,Catalog会发生变化。

建议使用WinCC内部变量“@DatasourceNameRT”获得当前项目的Catalog。

DataSource为服务器名称,格式为“<计算机名称>\WinCC”。

3.1查询语句格式

数据的查询语句的格式要求如下:

8字节长ValueID的请求:

TAG_LLVID:

R,,,[,][,]

4字节长ValueID的请求:

TAG:

R,

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("h",-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

HMIRuntime.Trace"UTCendTime:

"&UTCEndTime&vbCrLf

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'),'"&UTCBeginTime&"','"&UTCEndTime&"',"

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

EndIf

DoY=DatePart("y",vtDate)

dso=DatePart("y","31.03")-DatePart("w","31.03")+1

dwi=DatePart("y","31.10")-DatePart("w","31.10")+1

IfDoY>=dsoAndDoY

'sommer

TimeZone=TimeZone+1'additionaloffset1hinsummer

EndIf

vtDateLocalDate=DateAdd("h",1*TimeZone,vtDate)

GetLocalDate=vtDateLocalDate

EndFunction

更多关于时间转换的信息请参考连接:

如何将本地计算机时间的时间戳(日期时间)转换成协调世界时(UTC)?

  24201113

4)保存文件并释放资源

'释放资源

SetoRs=Nothing

conn.Close

Setconn=Nothing

'生成新的文件,关闭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

objExcelApp.Workbooks.Close

objExcelApp.Quit

SetobjExcelApp=Nothing

MsgBox"成功生成数据文件!

"

item.Enabled=True

5结果和建议

下图为程序执行的结果。

仅供参考:

图7输出结果

建议:

为了改善本地访问期间的性能,请输入“<计算机名称>\WinCC”作为数据源,而不是“.\WinCC”。

为了提高系统的执行效率,建议仅读取少量的数据。

为了避免可能造成的数据损失,建议在执行操作之前先退出Excel应用程序。

附代码仅供参考:

 GetLocalDate.txt (1KB)          VBSReadPVDatatoExcel.txt (4KB)

声明:

本文所述的方法为WinCC的高级用法,提供的代码程序仅供用户参考,西门子公司不提供任何调试和热线支持。

敬请谅解!

1、建立access表 

 

新建 

设计视图 

输入对应字段名称 

2、ODBC链接 

在控制面板中选择管理工具,在管理工具中选择数据源(ODBC) 

 

 

选择添加 

选择access 

定义数据源名称,选择D盘刚

才建立的access文件。

 3、wincc全局脚本 

选择VBS,进入后新建动作 

 

 

 

设定触发器 触发时间。

 

4、VBS脚本 

Dim objConnection 

Dim strConnectionString Dim lngValue Dim lngValuea Dim lngValueb Dim strSQL 

Dim objCommand Dim riqi riqi=Now  

strConnectionString = "Provider=MSDASQL;DSN=SampleDSN;UID=;PWD=;"   

lngValue = HMIRuntime.Tags("yali").Read lngValuea = HMIRuntime.Tags("wendu").Read lngValueb = riqi   

strSQL = "INSERT INTO WINCC_DATA (TagValue,TagValuea,TagValueb) VALUES ('" & lngValue & "','" & lngValuea & "','" & lngValueb & "');"    

Set objConnection = CreateObject("ADODB.Connection")  

objConnection.ConnectionString = strConnectionString  

objConnection.Open  

Set objCommand = CreateObject("ADODB.Command")  

With objCommand  

    .ActiveConnection = objConnection  

    .CommandText = strSQL  

 

 

End With  

objCommand.Execute  

Set objCommand = Nothing  

objConnection.Close  

Set objConnection = Nothing 

注:

yali,wendu 为变量标签名称。

SampleDSN为数据源名称。

TagValue,TagValuea,TagValueb为access表格中对应列名称。

WINCC_DATA为access表格名称。

 5、wincc试验 

用输入输出域写入相应变量数值 

在access表中打

开可以看数值。

 

Dim vbbb

Set vbbb=CreateObject("wscript.shell")

vbbb.Run(D:

\report.exe)

set vb=nothing

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1