资源预览内容
第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
第9页 / 共14页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1概述介绍如何在WinCC项目中使用VBS脚本读取变量归档值,并把获取的数据保存成新的Excel文件。文中示例代码仅适用于以绝对时间间隔方式访问。2软件环境Windows XP SP3中文版、WinCC7.0 SP2 ASIA、Microsoft office Excel 20073访问原理WinCC变量归档数据是以压缩的形式存储在数据库中,需要通过 WinCC连通性软件包提供的OLE-DB接口才能够解压并读取这些数据。关于WinCC连通性软件包的详细信息请参考连接:37436159当使用 OLE-DB方式访问数据库时关键需要注意连接字符串的写法和查询语句的格式。连接字符串格式为“Provider=WinCCOLEDBProvider.1; Catalog= *; Data Source= *;”,其中Catalog为WinCC运行数据库的名称, 当修改项目名称或在其它计算机上打开原项目时, Catalog会发生变化。建议使用WinCC内部变量 “DatasourceNameRT” 获得当前项目的Catalog。Data Source 为服务器名称,格式为“WinCC”。31 查询语句格式数据的查询语句的格式要求如下:8 字节长 ValueID 的请求:TAG_LLVID:R,4 字节长 ValueID 的请求:TAG:R,其中:ValueID:过程值归档变量的唯一标识符。ValueName:过程值归档变量的名称,格式为“ArchiveNameValue_Name”,可以使用多个名称。TimeBegin,TimeEnd:时间范围,格式 “YYYY-MM-DD hh:mm:ss.msc”。SQL_Clause:SQL 语法中的过滤标准。TimeStep:时间间隔。使用 时,必须将 指定为绝对时间。禁止使用相对语句“0000-00-00 00:00:00.000”。其中ValueID和ValueName的对应关系如下图所示:图1 ValueID和ValueName的对应关系32几种常用的查询需求和语句1)绝对时间间隔2)相对时间间隔请注意,查询不能包含任何空格。习惯上,执行绝对时间查询时需要将查询的时间条件转换成UTC (协调世界时)时间。执行相对时间查询时请一定要注意相对时间的格式。建议使用MsgBox或者HMIRuntime.Trace等方式输出数值以检查格式是否正确。33 查询结果查询结果作为记录集返回。过程值归档的记录集结构如下表所示:表1记录集结构注意,WinCC的归档数据是使用UTC(协调世界时)时间保存的。因此在对数据进行查询和显示时,需要对时间进行适当的转换。4组态介绍(以绝对时间间隔为例)41准备工作1)创建变量其中:NewTag用于创建过程值归档,strBeginTime 和strEndTime用于存储查询条件。sVal是时间间隔参数。如下图所示:图2 变量2) 创建过程值归档创建归档周期为一分钟的过程值归档。如下图所示:图3 归档配置3)创建Excel模板在特定的路径下预先创建一个Excel文件作为模板,这样可以很好的控制输出格式。本例中在D:WinCCWriteExcel下创建一个名称为abc.xlsx的Excel文件。如下图所示:图4 Excel模板42组态查询界面画面上新建三个输入/输出域,分别用于输入开始时间、结束时间和间隔时间。按钮中执行用于访问变量归档数据的VBS脚本。图5 查询界面43关键脚本介绍1)打开Excel模板以后台方式打开之前创建好的Excel模板。其中sheetname作为变量可以定义Excel中Sheet的名字。Set objExcelApp = CreateObject(Excel.Application)objExcelApp.Visible = FalseobjExcelApp.Workbooks.Open D:WinCCWriteExcelabc.xlsxobjExcelApp.Worksheets(sheetname).Activate2)准备查询条件主要是确定和格式化Catalog、UTC开始时间、UTC结束时间、时间间隔等查询条件。因为北京时间和UTC(协调世界时)时间相差8个小时,所以直接在程序中写入固定的时间差值。Set tagDSNName = HMIRuntime.Tags(DatasourceNameRT)tagDSNName.ReadSet LocalBeginTime = HMIRuntime.Tags(strBeginTime)LocalBeginTime.ReadSet LocalEndTime = HMIRuntime.Tags(strEndTime)LocalEndTime.ReadUTCBeginTime = 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 UTC Begin Time: & UTCBeginTime & vbCrLfHMIRuntime.Trace UTC end Time: & UTCEndTime & vbCrLfSet sVal = HMIRuntime.Tags(sVal)sVal.Read另外,因为WinCC中对访问数据库的时间格式有特殊的要求。所以程序中增加了格式化时间的代码。更多详细资料请参考连接:如何计算本地时间和 UTC 时间的时间差,如何转换 UTC 时间成 SQL 语句格式?221156363)读取数据并写入Excel中本段代码主要是获取数据并按照一定的格式填写到打开的Excel文件中。其中sSql可以很灵活的定义开始和结束时间、排序方法和数据分析方法等。创建数据库联接sPro = Provider=WinCCOLEDBProvider.1;sDsn = Catalog= &tagDSNName.Value& ;sSer = Data Source=.WinCCsCon = sPro + sDsn + sSerSet conn = CreateObject(ADODB.Connection)conn.ConnectionString = sConconn.CursorLocation = 3conn.Open定义查询的命令文本 SQLsSql = Tag:R,(PVArchiveNewTag), & UTCBeginTime & , & UTCEndTime & ,sSql=sSql+order by Timestamp ASC,TimeStep= & sVal.Value & ,1Set oRs = CreateObject(ADODB.Recordset)Set oCom = CreateObject(ADODB.Command)oCom.CommandType = 1Set oCom.ActiveConnection = connoCom.CommandText = sSql填充数据到Excel中Set oRs = oCom.Executem = oRs.RecordCountIf (m 0) ThenobjExcelApp.Worksheets(sheetname).cells(2,1).value=oRs.Fields(0).NameobjExcelApp.Worksheets(sheetname).cells(2,2).value=oRs.Fields(1).NameobjExcelApp.Worksheets(sheetname).cells(2,3).value=oRs.Fields(2).NameobjExcelApp.Worksheets(sheetname).cells(2,4).value=oRs.Fields(3).NameobjExcelApp.Worksheets(sheetname).cells(2,5).value=oRs.Fields(4).NameoRs.MoveFirsti=3Do While Not oRs.EOF 是否到记录末尾,循环填写表格objExcelApp.Worksheets(sheetname).cells(i,1).value= oRs.Fields(0).ValueobjExcelApp.Worksheets(sheetname).cells(i,2).value=GetLocalDate(oRs.Fields(1).Value)objExcelApp.Worksheets(sheetname).cells(i,3).value= oRs.Fields(2).ValueobjExcelApp.Worksheets(sheetname).cells(i,4).value= oRs.Fields(3).ValueobjExcelApp.Worksheets(sheetname).cells(i,5).value= oRs.Fields(4).ValueoRs.MoveNexti=i+1LoopoRs.CloseElseMsgBox 没有所需数据item.Enabled = TrueSet oRs = Nothingconn.CloseSet conn = NothingobjExcelApp.Workbooks.CloseobjExcelApp.QuitSet objExcelApp= NothingExit SubEnd If注意:因为数据库中数据存储的时间戳是UTC时间,所以在显示的时候需要把UTC时间转换为本地时间,上段代码中的GetLocalDate函数就是实现这样的功能。本例中是在全局脚本的VBS-Editor中创建的该函数。添加函数的方法如下图所示:图6添加时间转换函数主要的代码如下:Function GetLocalDate(vtDate)Dim DoYDim dsoDim dwiDim strC
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号