在WinCC中如何使用VBS读取变量归档数据到EXCEL
使用Wincc中的VBS进行变量读取
使用Wincc中的VBS进行变量读取Wincc6包含了VBS脚本编程,对于我等熟悉VB编程的可谓带来的福音,但是,由于西门子的C脚本编程功能实在太强大,加上要保持以前版本的一致性和用户编程习惯的延伸性,所以对于VBS脚本并没有太多的介绍。
这里我先来介绍一下Wincc中对于控件引用的一般性论述。
Wincc对于控件引用一般都采取定义变量-》使用Set 变量=对象.(方法或属性)->引用变量来做的。
在变量读取或写入的过程中,我们要接触到一些属性和方法,例如,Read和Write 方法,变量的Value属性,熟练掌握这些属性和方法相当重要。
下面解释一下Write和Read方法的语法:Read data 其中data是读取变量的方法,如果data=1,直接从AS系统读取,相当于C脚本中的Get*****wait()函数,如果省略,则从Wincc变量管理器中建立的变量中读取。
Write data,1 其中data是需要写入变量的数值,1代表直接写入AS系统,相当于C 脚本中的Set*****wait()函数,1省略,则写入到由Wincc变量管理器建立的变量中去。
实例:读取变量的方法:1 Dim objTagSet objTag=HMIRunTime.Tags("变量名")objTag.Read2 HMIRunTime.Tags("变量名").Read如果以上例程改成直接读取AS系统变量的话,程序为:1 Dim objTagSet objTag=HMIRunTime.Tags("变量名")objTag.Read,12 HMIRunTime.Tags("变量名").Read,1写变量的方法:1 Dim objTagSet objTag=HMIRunTime.Tags("变量名")objTag.Write 1 '向变量写入数值1'也可以写为 objTag.Write 10 向变量写入数值102 HMIRunTime.Tags("变量名").Write 1'也可以写为 objTag.Write 10除了以上方法外,你也可以将一个中间变量的值写入:Dim objTag,valSet objTag=HMIRunTime.Tags("变量名")objTag.Readval=objTag.Value '中间变量val存放了变量的值objtag.Write val '写入变量中去当然,其余的方法还有很多,这些都需要自己在编程过程中总结和灵活运用。
vbs将wincc数据写入数据库+导入到excel
WinCC V6.0 VBS 脚本在自动汽车检测与识别系统中的应用钟时(西门子工厂自动化工程有限公司工程部北京)摘要:本文描述了如何运用西门子上位监控软件WinCC V6.0集成的VBS脚本在自动汽车检测与识别系统中将实时车体信息记录到数据库中,并最终通过用户查询,以报表的形式打印出来。
关键词:WinCC V6.0,VBS,AVIAbstractThis paper introduces that how to store and query the datum by using VBScript -Editor integrating SIEMENS HMI software WinCC V6, then output datum as report style auto-matically.Key Words:WinCC V6.0,VBS,AVI一、项目简介项目的所在地位于山东省烟台市经济技术开发区内的上海通用东岳汽车有限公司。
其油漆车间新上的一套AVI(自动汽车识别)系统通过采用安装在车体滑撬上的西门子MOBY传感器将实时车体信息传递到主控PLC中,再由上位监控计算机采集存入数据库并最终由用户有选择的以报表形式将信息打印输出。
各AVI信息采集站除装有MOBY自动读写头外,还各有一套ET200S远程站和操作员面板采集现场其它信号。
整套AVI系统的现场级均采用西门子PROFIBUS-DP总线来传递信息,PLC与上位监控计算机采用工业以太网进行实时通讯。
二、系统介绍2.1 工艺需求由于油漆车间有其自身的生产工艺,诸如:电泳,喷漆,烘房等,因此各车辆的车体信息会在其进入油漆车间之前被自动存储在车体所对应的滑撬上的MOBY存储单元中。
当车体到达首个固定的AVI读写站时,自动条码扫描枪会读取贴在车体上的条形码信息,同时,MOBY读写头会自动从滑撬上的MOBY存储单元中读出车体信息并与扫描枪扫到的信息进行比对,如果两者比较结果一致,则主控PLC会返回机运线放行信号将此车辆放行。
Wincc V7.3用户归档深入5-用vbs将用户归档的内容导出到excel
Wincc V7.3用户归档深入5-用vbs将用户归档的内容导出到excel我们在用户归档中得到数据之后,如果想导出到excel,思路是和把MSHFGrid数据导出类似的。
网上有些文章是直接从后台数据表读取数据,本文介绍从数据归档控件导出数据。
1. 假设wincc项目已经创建了用户归档,画面上有一个用户归档控件,名字叫做UA,设置一个按钮,按钮点击事件添加以下vbs脚本Sub OnClick(ByVal Item)Dim UA,col,row,rowsDim xlapp,objsheetDim i,j,k,m,n,filenameSet UA=ScreenItems("UA")Set rows=UA.GetRowCollectionm=rows.Countn=UA.ColumnCountIf m>1 Then '如果用户归档控件有记录Set xlapp=CreateObject("Excel.Application")xlapp.visible=Falsexlapp.workbooks.addSet objsheet=xlapp.worksheets(1)For k=1 To nua.ColumnIndex=kobjsheet.cells(3,k)=ua.ColumnCaption '字段名称Nextobjsheet.cells(1,1)="XX用户归档"For i=1 To mFor j= 1 To nobjsheet.cells(i+3,j)=ua.GetRow(i).celltext(j)NextNext'以下代码处理日期时间数据格式以及表格边框线、标题合并单元格等排版objsheet.range("a1:d1").mergecells=True'objsheet.range("a1").ColumnWidth =20 '列宽度objsheet.cells(2,1)="生成时间:"objsheet.cells(2,2)=Year(Now) & "年" & Month(Now) & "月" & Day(Now) & "日"objsheet.cells(1,1).HorizontalAlignment = 3objsheet.range("a3:d" & CStr(3+m)).borders(1).linestyle=9objsheet.range("a3:d" & CStr(3+m)).borders(1).weight=2objsheet.range("a3:d" & CStr(3+m)).borders(2).linestyle=9objsheet.range("a3:d" & CStr(3+m)).borders(2).weight=2objsheet.range("a3:d" & CStr(3+m)).borders(3).linestyle=9objsheet.range("a3:d" & CStr(3+m)).borders(3).weight=2objsheet.range("a3:d" & CStr(3+m)).borders(4).linestyle=9objsheet.range("a3:d" & CStr(3+m)).borders(4).weight=2'保存文件filename= "c:\" & Year(Now) & "年" & Month(Now) & "月" & Day(Now) & "日-" & Hour(Now) & "点" & Minute(Now) & "分" & Second(Now) & "秒生成用户归档.xlsx"xlapp.Activeworkbook.saveas (filename) xlapp.workbooks.closexlapp.quitMsgbox "成功导出到C:\"ElseMsgbox "用户归档没有记录"End IfEnd Sub。
用VBS实现WINCC的用户归档输出到EXCEL表格的方法和例
用VBS实现WINCC的用户归档输出到EXCEL表格的方法和例(2009-12-30 16:47:45)用VBS实现WINCC的用户归档输出到EXCEL表格的方法和例子程序求用VBS实现WINCC的用户归档输出到固定格式的EXCEL表格的方法和例子程序!我主要问题在SQL数据库的查询语句不会。
看见论坛里有关用VBS实现EXCEL的数据查询和导出,我现在想要完成如下功能:每分钟将数据归档,用户可以输入任意的时刻时间查询从任意时刻开始的之后每隔1小时的数据(有点像日报里的24个小时)。
我现在对于VBS查询数据库的语句不懂,望大大赐教!谢谢''SQL查询语句Dim strc as stringstrc = "provider=WinCCOLEDBProvider.1;catalog=CC_RebdI_09_06_22_10_3 8_35R;data source=ComputerName\WinCC"''这个连接字符串可以在SQl2000中看到Dim cc1Set cc1=CreateObject("adodb.connection")cc1.ConnectionString=strccc1.CursorLocation=3cc1.openDim rst As ObjectSet rst = CreateObject("adodb.recordset")dim ssql as stringssql = "Tag:R,'Archive_3\DB1DBD0','2009-7-29 00:00:00.0000','200 9-7-29 23:59:59.999','timestep=3600,258'"''Archive_3\I_DB1DBD0归档和变量''2009-7-29 00:00:00.0000,2009-7-29 23:59:59.999时间段''timestep=3600,258每阁多少秒拿一个数据(3600=1小时),258表示每个时间段取最后一个数据rst.Open ssql, cc1''这样查出来的数据就是一天的每小时的数据''对rst记录集处理就可以得到你要的数据==========================Function actionDim objExcelAppDim i,TimeM,TimeNow,TimeSSet TimeM=HMIRuntime.Tags("TimeM")i=1+TimeM.ReadTimeNow=CStr(Year(Now))&"年"&CStr(Month(Now))&"月"&CStr(Day(Now))&"日"&CStr(Hour(Now))&"-"&CStr(Minute(Now))&":"&CStr(Second(Now))TimeS=Second(Now)Set objExcelApp = CreateObject("Excel.Application")objExcelApp.Visible = FalseobjExcelApp.Workbooks.Open"E:\ExcelTest.xls"objExcelApp.Cells(i, 2).Value =123.47objExcelApp.Cells(i, 1).Value = TimeNowobjExcelApp.DisplayAlerts = FalseobjExcelApp.ActiveWorkbook.SaveobjExcelApp.Workbooks.CloseobjExcelApp.quitSet objExcelApp =NothingEnd Function以上代码用于往指定的Excel表格中写数据。
(完整word版)在WinCC中如何使用VBS读取变量归档数据到EXCEL
(完整word版)在WinCC中如何使⽤VBS读取变量归档数据到EXCEL⽂档类型常问问题, 条⽬ID:77940055, ⽂档发布⽇期2013年7⽉23⽇4)(评估在WinCC中如何使⽤VBS读取变量归档数据到EXCEL推荐⽂档: 西门⼦⼯程师推荐本⽂档!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”。
3.1 查询语句格式数据的查询语句的格式要求如下:8 字节长ValueID 的请求:TAG_LLVID:R,,,[,][,]4 字节长ValueID 的请求:TAG:R,ValueName>,,[,][,]其中:ValueID:过程值归档变量的唯⼀标识符。
ValueName:过程值归档变量的名称,格式为“ArchiveName\Value_Name”,可以使⽤多个名称。
WINCC 一起学-VBS读取变量归档
WINCC 一起学-VBS读取变量归档通过脚本把变量归档里面的数据读出来,后期再导入EXCEL或者控件里面,或有其他的功能。
本文从新建项目开始,一步一步来,想到哪里写到哪里,为了减少工作量,就以温度(T),压力(P)和流量(L)3个变量为例进行读写操作。
软件基础:虚拟机WIN7 SP1 64位旗舰版和WINCC 7.3SE+UPD9+OFFICE2003为基础,未安装连通性软件包。
目的:使用VBS脚本,读取WINCC变量归档数据,然后导出到EXCEL文件或者ListView控件中。
1、参考资料先把一些参考资料放出来,大家一起学习,本文中的资料来自以下文档、手册和WINCC帮助内容,一些朋友问关于报表的问题,我给发的基本上都是这些手册。
2、准备工作2.1 新建项目在D盘目录下新建名为TAGREAD的项目2.2 建立变量在内部变量下,新建分组“TR”,在分组下面,新建名分别为为“P”、“T”、“L”的变量,类型均为:32-位浮点数IEEE 754。
图1同时变量在全局脚本里面进行周期性赋值T:画幅值是10周期10秒的正弦波T:0-10的随机数P:T/100进行累加脚本如下:图2触发方式:周期->250ms2.3 变量归档新建名为:TAGR的过程值归档,为减少数据库的大小,采样和归档时间我设置成1S,其他设置默认。
如图,前三个,下面的请忽略图32.4 设计画面本人的审美不咋的,就随便做一个画面用来测试。
画面内容:3个IO域,显示3个变量的实际值;1个在线趋势控件,显示变量趋势;标尺控件方便查看历史值,Listview控件:方便后面导出显示;应用程序:脚本诊断,用于输出脚本是否正常。
最右一个按钮,名为测试。
运行后如图图44、读取变量归档连接数据库成功,下一步就是从归档之中读取数据了,读取数据要用到两个对象,“ADODB.Recordset”和“mand”对象4.1 ADODB.Recordset4.1.1 简介ADO Recordset 对象用于容纳一个来自数据库表的记录集。
WinCC中全局脚本VBS归档到Excel
WinCC中全局脚本VBS归档到Excel中用一个变量触发数据归档到Excel中,请高手看看我写的为何不能运行。
Sub procedure1If Item.OutputValue = "NewTag" ThenDim oVar,oBlendingVar,objExcelApp,oWorkBook,ExcelTableFull,oFileNameOn Error Resume NextExcelTableFull=0Set objExcelApp=CreateObject("Excel.Application")objExcelApp.Visible=FalseSet oWorkBook=objExcelApp.Workbooks.Open("D:\BKHL_HXBJ\模板\Receipt_Table.xls") Dim iBlankLineiBlankLine=oWorkBook.ActiveSheet.Columns(1).Find("0").Row'MsgBox("iBlankLine="&iBlankLine)If iBlankLine<504 ThenobjExcelApp.Cells(iBlankLine,1).Value=HMIRuntime.SmartTags("Recipe_Number").Value objExcelApp.Cells(iBlankLine,2).Value=HMIRuntime.SmartTags("BaseOil_Percent_1").Value objExcelApp.Cells(iBlankLine,3).Value=HMIRuntime.SmartTags("BaseOil_Percent_2").Value objExcelApp.Cells(iBlankLine,4).Value=HMIRuntime.SmartTags("BaseOil_Percent_3").Value objExcelApp.Cells(iBlankLine,5).Value=HMIRuntime.SmartTags("BaseOil_Percent_4").Value objExcelApp.Cells(iBlankLine,6).Value=HMIRuntime.SmartTags("BaseOil_Percent_5").Value objExcelApp.Cells(iBlankLine,7).Value=HMIRuntime.SmartTags("BaseOil_Percent_6").Value objExcelApp.Cells(iBlankLine,8).Value=HMIRuntime.SmartTags("BaseOil_Percent_7").Value objExcelApp.Cells(iBlankLine,9).Value=HMIRuntime.SmartTags("BaseOil_Percent_8").Value objExcelApp.Cells(iBlankLine,10).Value=HMIRuntime.SmartTags("Additive_Percent_1").Value objExcelApp.Cells(iBlankLine,11).V alue=HMIRuntime.SmartTags("Additive_Percent_2").Value objExcelApp.Cells(iBlankLine,12).Value=HMIRuntime.SmartTags("Additive_Percent_3").Value objExcelApp.Cells(iBlankLine,13).Value=HMIRuntime.SmartTags("Additive_Percent_4").Value objExcelApp.Cells(iBlankLine,14).Value=HMIRuntime.SmartTags("Additive_Percent_5").Value objExcelApp.Cells(iBlankLine,15).Value=HMIRuntime.SmartTags("Additive_Percent_6").Value objExcelApp.Cells(iBlankLine,16).Value=HMIRuntime.SmartTags("Additive_Percent_7").Value objExcelApp.Cells(iBlankLine,17).Value=HMIRuntime.SmartTags("Additive_Percent_8").ValueElse'MsgBox("Data Table Full,Copy to the backup file,continue ?")objExcelApp.displayalerts=FalseoFileName=CStr("D:\BKHL_HXBJ\模板\运行数据_"&Month(Date)&"月"&Day(Date)&"日"&"_"& Hour(Time)&"时"&Minute(Time)&"分"&".xls")oWorkBook.Saveas(oFileName)ExcelTableFull=1objExcelApp.displayalerts=TrueEnd IfoWorkBook.SaveobjExcelApp.Workbooks.CloseobjExcelApp.QuitSet objExcelApp=NothingSet oWorkBook=NothingIf ExcelTableFull=1 Then'MsgBox("Data Table Full, Clear the current data table, continus?")Set objExcelApp=CreateObject("Excel.Application")objExcelApp.Visible=FalseSet oWorkBook=objExcelApp.Workbooks.Open("D:\BKHL_HXBJ\模板\Receipt_Table_Templet.xls")objExcelApp.displayalerts=FalseoWorkBook.Saveas("D:\BKHL_HXBJ\模板\Receipt_Table.xls")objExcelApp.displayalerts=TrueoWorkBook.SaveobjExcelApp.Workbooks.CloseobjExcelApp.QuitSet objExcelApp=NothingSet oWorkBook=NothingEnd IfEnd IfEnd Sub本文转自亿万论坛:/a/a.asp?B=302&ID=1218853&q=1&r=140751。
如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)
如何通过VBS 操作WINCC 在线数据控件并导出至EXCEL(附带程序)1 概述本文主要介绍如何通过 VBS 操作 WINCC 在线数据表格控件。
开发环境:PCS7 V8.2 SP1 / WINCC 7.4 SP1使用限制:1) 时间间隔最多至 1 分钟2) 时间范围太长,数据加载可能会比较慢3) 导出文件 EXCEL 没有置顶,导出后要切换到 EXCEL 程序。
扩展性:可扩展选择参数、保存导出文件、生成 PDF 等功能。
本例采用将参数提前组态在控件内,运行中通过复选框来实现选择。
也可完全使用脚本实现参数添加。
详见附加信息>通过脚本新增参数图 1 根据选择查询数据图 2 导出数据成功图 3 在 EXCEL 中查看导出的数据文件3.1 画面部件说明图 5 测试画面部件说明3.1.1 添加时间控件添加 WINCC Activex 控件 Date and time picker,如下图:图 6 添加时间控件3.1.2 设置导出模板本例设置的 excel 文件模板路径:"\\"+ServerName+"\Export\Export.xlsx",可根据项目情况采用其它导出路径和模板。
如果更换了模板或路径,必须修改导出脚本内的路径。
模板内主要设置了字体、数据格式、显示的小数点位数和列宽,也可再增加页眉、页脚、LOGO 等,以达到更好的显示效果。
3.2 画面打开在画面打开事件内,设置如下脚本,用于初始化画面内各控件:图 7 画面打开事件脚本3.3 选择数值参数版设计图 8 添加参数选择复选框设置复选框,在复选框更改事件下添加脚本:图 9 数据参数显示隐藏设置脚本图 10 脚本与控件属性对应关系 3.4 设置时间系数属性:TimeStepFactor图 11 修改时间间隔脚本图 12 修改时间系数 3.5 设定时间范围在查询按钮释放左键事件里:图 14 时间范围查询按钮事件图 14 时间范围查询按钮事件 3.6 导出在导出按钮释放左键事件里:图 16 导出按钮脚本图 17 导出后自动打开文件夹图 18 新增参数脚本图 19 新增参数运行效果。
将WinCC的历史数据写入Excel文件
将WinCC的历史数据写入Excel文件最近,几个客户提到了一个共性的需求:定期将WinCC的历史归档数据导出到Excel文件中,供第三应用去访问。
实现这个需求的方法很多,如:1)通过IDB(Industrial Databridge工业数据桥选件), 通过简单的组态就能实现,操作视频链接:/xxym.aspx?id=124622)手动点击画面中的表格或趋势控件上的导出按钮,将数据导出;或通过定期(如每小时)执行全局脚本控制表格或趋势控件上的导出按钮导出数据。
核心VBS代码如下:TableControl1.Online = 0 '设置表格控件停止实时更新TableControl1.TimeColumnRangeType=1'设置表格控件时间范围为“开始到结束”TableControl1.TimeColumnBeginTime=XXX'设置表格控件的开始时间TableControl1.TimeColumnEndTime=YYY'设置表格控件的结束时间TableControl1.ExportShowDialog=False'取消表格控件导出时弹出对话框TableControl1.ExportDirectoryname=BBB'设置导出的目录TableControl1.ExportFilename=AAA'设置导出的文件名TableControl1.Export()'执行表格控件的导出动作注意:此种方式,控件所在画面要为当前运行画面或用全局脚本将其置为当前画面,否则全局脚本无法操作此控件。
3)通过脚本调用WinCC OLE DB接口直接读取历史数据,写入到Excel文件中----------------------------------------------这里重点介绍第3)种:VBS访问WinCC OLE DB接口读取历史数据,写入Excel(Connectivitypack连通包提供此接口)这种方式核心代码包括A和B这2部分A. 调用WinCC OLE DB接口读取历史数据核心代码及注解:A1. 查询归档数据scon='Provider=WinCCOLEDBProvider.1;Catalog=CC_test03 _20_06_12_17_50_01R;Data Source=.\WinCC''建立到归档数据库的连接字符串'Catalog为WinCC数据库的名称(内部系统变量@DatasourceNameRT的值),Data Source为服务器名称,本地用“.\WinCC”即可。
(完整word版)在WinCC中如何使用VBS读取变量归档数据到EXCEL
文档类型常问问题,条目ID : 77940055 ,文档发布日期2013年7月23日)4( 评估在WinCC中如何使用VBS读取变量归档数据到EXCEL推荐文档:西门子工程师推荐本文档!文献涉及产品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 ”。
3. 1查询语句格式数据的查询语句的格式要求如下:8字节长ValuelD 的请求:TAG_LLVID:R,<ValuelD 或ValueName>,<TimeBegin>,vTimeEnd>[,<SQL_clause>][,vTimeStep>]4字节长ValuelD 的请求:TAG:R,<ValueID 或ValueName>,vTimeBegin>,vTimeEnd>[,vSQL_clause>][,vTimeStep>]其中:ValuelD :过程值归档变量的唯一标识符。
WinCC Professional V15 VBS脚本读取变量记录到EXCEL
WinCC Professional V15 VBS脚本读取变量记录到EXCEL本文介绍如何在WinCC Protal 环境中使用VBS脚本读取变量记录,并把数据保存成新的Excel文件。
文中示例代码仅适用于本地服务器绝对时间间隔方式访问。
软件环境:Windows Server 2016 ,WinCC Protal Professional V15,Microsoft office Excel 2010组态步骤:1. 创建WinCC Professional项目,创建变量2.组态变量记录3.新建画面并定义为启始画面,画面中拖放4个IO域(分别关联“归档变量,起始时间,结束时间,步长”),一个查询按钮和一个表格视图。
表格输入属性设置4.在C盘根目录下创建Project文件夹,Project下创建名为abc的Excel文档。
5.添加VB脚本GetLocalDate和VBRead 在SQL数据库中归档时间为UTC时间,与北京东八区差8小时,GetLocalDate用于时区修正,用于时间修正显示。
VBRead用于数据库的连接查询及Excel的数据填充。
GetLocalDate 填入下面代码完整代码:VBRead添加以下代码,图中代码没有全部截图,完整代码请参考随后的图片。
完整代码:6.选中画面中读取变量归档按钮,在单击事件中调用VBRead函数。
7.双击运行系统设置,勾选变量记录运行系统8.启动仿真WinCC Protal 项目。
9.给定归档变量值,输入查询时间及步长(时间格式yyyy/mm/dd hh:mm:ss),点击查询按钮。
打开C:\Project\下生产的Excel文件查看数据。
使用VBS读取变量归档数据到EXCEL中(含全脚本)
使用VBS读取变量归档数据到EXCEL1、创建变量。
过程归档变量、查询时间变量(一个起始时间、一个结束时间、时间间隔)过程变量为模拟量,其实时间和结束时间是文本变量8位字符集(时间的格式是XXXX-XX-XX XX:XX:XX),时间间隔位10进制数(单位秒)2、创建归档。
变量记录中选择好要记录的过程变量,设置好归档的时间等。
3、创建EXCEL表格模版,XXX.XLSX.4、界面上3个输入输入输出域(一个起始时间,一个结束时间,一个时间间隔),一个查询并生成EXCEL表格的按钮5、脚本主要分2块。
1是时间的转换,WINCC归档使用的时间是UTC(国际协调时间),所以需要进行时间的转换。
2是查询并生成EXCEL表格的脚本。
6、过程值归档的记录结构如下:脚本见文本文档'查询按钮中的代码Sub OnLButtonUp(ByVal Item, ByVal Flags, ByVal x, ByVal y)Dim sPro,sDsn,sSer,sCon,conn,sSql,oRs,oComDim tagDSNNameDim m,iDim LocalBeginTime, LocalEndTime,UTCBeginTime, UTCEndTime,sValDim objExcelApp,objExcelBook,objExcelSheet,sheetnameitem.Enabled = FalseOn Error Resume Nextsheetname="Sheet1"Set objExcelApp = CreateObject("Excel.Application")objExcelApp.Visible = FalseobjExcelApp.Workbooks.Open "D:\WinCCWriteExcel\abc.xlsx"objExcelApp.Worksheets(sheetname).ActivateSet 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 & vbCrLf Set sVal = HMIRuntime.Tags("sVal")sVal.ReadsPro = "Provider=WinCCOLEDBProvider.1;"sDsn = "Catalog=" &tagDSNName.Value& ";"sSer = "Data Source=.\WinCC"sCon = sPro + sDsn + sSerSet conn = CreateObject("ADODB.Connection")conn.ConnectionString = sConconn.CursorLocation = 3conn.OpensSql = "Tag:R,('PVArchive\NewTag'),'" & UTCBeginTime & "','" & UTCEndTime & "',"sSql=sSql+"'order by Timestamp ASC','TimeStep=" & sVal.Value & ",1'"MsgBox sSqlSet oRs = CreateObject("ADODB.Recordset")Set oCom = CreateObject("mand")mandType = 1Set oCom.ActiveConnection = connmandText = sSqlSet oRs = oCom.Executem = oRs.RecordCountIf (m > 0) ThenobjExcelApp.Worksheets(sheetname).cells(2,1).value=oRs.Field s(0).NameobjExcelApp.Worksheets(sheetname).cells(2,2).value=oRs.Field s(1).NameobjExcelApp.Worksheets(sheetname).cells(2,3).value=oRs.Field s(2).NameobjExcelApp.Worksheets(sheetname).cells(2,4).value=oRs.Field s(3).NameobjExcelApp.Worksheets(sheetname).cells(2,5).value=oRs.Field s(4).NameoRs.MoveFirsti=3Do While Not oRs.EOFobjExcelApp.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 IfSet oRs = Nothingconn.CloseSet conn = NothingDim patch,filenamefilename=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 patchobjExcelApp.Workbooks.CloseobjExcelApp.QuitSet objExcelApp= NothingMsgBox "成功生成数据文件!"item.Enabled = TrueEnd Sub'此为全局脚本中的时间转换代码Function GetLocalDate(vtDate)Dim DoYDim dsoDim dwiDim strComputer, objWMIService, colItems, objItemDim TimeZoneDim vtDateLocalDatestrComputer = "."Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")Set colItems = objWMIService.ExecQuery("Select * from Win32_TimeZone") For Each objItem In colItemsTimeZone = objItem.Bias / 60NextIf IsDate(vtDate) <> True ThenIS_GetLocalDate = FalseExit FunctionEnd IfDoY = DatePart("y", vtDate)dso = DatePart("y", "31.03") - DatePart("w", "31.03") + 1 dwi = DatePart("y", "31.10") - DatePart("w", "31.10") + 1 If DoY >= dso And DoY < dwi ThenTimeZone = TimeZone + 1End IfvtDateLocalDate = DateAdd("h", 1 * TimeZone, vtDate) GetLocalDate = vtDateLocalDateEnd Function。
wincc 通过VBS读取归档数据到EXCEL
1.建立变量strBeginTime和strEndTime为文本变量8位字符集,添加一个IO域,实际运行以后,无法输入格式如:2014-02-2512:00:00,怎么办?
2.手册里说需要添加一个GetLocalDate函数,如何添加呢?
2、用“year(now)&”-”&month(now)&”-”&day(now)”取当前的日期
3、直接复制里面的内容到脚本编辑器中。
我按照手册上的打开VBS编辑器,新建一个项目模块,然后把程序复制过去,,编译就出错,可见附件.怎么回事呢?
3.这个A0579指南提供的程序是TXT格式的,需要自己移植到WINCC里,我试了很多遍,都没成功,求指导一下,
图片说明:1,项目模块报错了2,如何添加GetLocalDate函数
最佳答案
1、你的io域的数据格式改成字符串就可以输入了
如何通过vbs在wincc的画面中写入excel中r1c1位的字符串
如何通过vbs在wincc的画面中写入excel中r1c1位的字符串在wincc画面中建立一个i/o域,如何用vbs脚本写入(读出)excel中的数值,只要有一个位置r1c1的数值就可以了。
新手,一点方向都没有请问:1、脚本是在全局脚本写还是在对象属性写2、脚本的基本例子给一个,越详细越好3、链接的文本看了不少,没有方向最佳答案本人做的源代码:SubOnClick(ByValItem)Dimfso,myfileSetfso=CreateObject(“scripting.FileSystemObject”)SetMyFile=fso.GetFile(“d:\data.xlsx”)DimObjExcelAppSetobjExcelApp=CreateObject(“Excel.Application”)”objExcelApp.Visible=TrueobjExcelApp.Workbooks.OpenMyFile”上面的程序段是为了打开d盘excel文件Dimaa_dataobjExcelApp.worksheets(“sheet1”).Cells(2,9).V Alue=HMIRunti me.Tags(“aa”).readDimi,jIfobjExcelApp.worksheets(“sheet1”).Cells(2,9).V Alue>1.0Then i=2j=6EndIfIfobjExcelApp.worksheets(“sheet1”).Cells(2,9).V Alue>0.8Ando bjExcelApp.worksheets(“sheet1”).Cells(2,9).V Alue0.6AndobjE xcelApp.worksheets(“sheet1”).Cells(2,9).V Alue<0.8Then i=12j=16EndIfIfobjExcelApp.worksheets(“sheet1”).Cells(2,9).V Alue<0.6Then i=17j=21EndIf”判断数据保存位置DoWhilei<jobjExcelApp.worksheets(“sheet1”).Cells(i,1).V Alue=objExcelA pp.worksheets(“sheet1”).Cells(i+1,1).V AlueobjExcelApp.worksheets(“sheet1”).Cells(i,2).V Alue=objExcelA pp.worksheets(“sheet1”).Cells(i+1,2).V Aluei=i+1LoopobjExcelApp.worksh eets(“sheet1”).Cells(i,1).VAlue=HMIRunti me.Tags(“yy”).readobjExcelApp.worksheets(“sheet1”).Cells(i,2).V Alue=HMIRunti me.Tags(“xx”).read”写数据到excel表格objExcelApp.ActiveWorkbook.Save”保存表格Dimcons_data,ax1_data,ax2_data,ax3_data,ax4_data,ax5_data,ax6_dataSetcons_data=HMIRuntime.Tags(“cons”)Setax1_data=HMIRuntime.Tags(“ax1”)Setax2_data=HMIRuntime.Tags(“ax2”)Setax3_data=HMIRuntime.Tags(“ax3”)Setax4_data=HMIRuntime.Tags(“ax4”)Setax5_data=HMIRuntime.Tags(“ax5”)Seta x6_data=HMIRuntime.Tags(“ax6”)cons_data.Value=objExcelApp.worksheets(“sheet1”).Cells(23,7) .valueax1_data.Value=objExcelApp.worksheets(“sheet1”).Cells(23,6). valueax2_data.Value=objExcelApp.worksheets(“sheet1”).Cells(23,5). valueax3_data.V alue=objExcelApp.worksheets(“sheet1”).Cells(23,4). valueax4_data.Value=objExcelApp.worksheets(“sheet1”).Cells(23,3). valueax5_data.Value=objExcelApp.worksheets(“sheet1”).Cells(23,2). valueax6_data.Value=objExcelApp.worksheets(“sheet1”).Cells(23,1). value”上面的作用是将Excel表格中的数据读到wincc,存到临时变量里面objExcelApp.Workbooks.CloseobjExcelApp.QuitSetObjEXceLapp=Nothing”到这里为止,关闭刚才打开的excel程序了cons_data.Writeax1_data.Writeax2_data.Writeax3_data.Writeax4_data.Writeax5_data.Writeax6_data.Write”最后是把读到的excel值从临时变量中写入它对应的wincc变量中EndSub。
wincc读取归档数据
读取wincc归档数据到Excel表格的VBS脚本:Dim fnamefname="d:\baobiao\report.xls"Dim ObjExcelAppSet objExcelApp = CreateObject("Excel.Application")objExcelApp.Workbooks.Open fnameDim cnn As Stringcnn = "provider=WinCCOLEDBProvider.1;catalog=CC_gz_food_09_07_14_14_54_22R;data source=wincc01\WinCC"dim cc1 as objectSet cc1 = CreateObject("adodb.connection")cc1.ConnectionString = cnncc1.CursorLocation = 3cc1.OpenDim rst As ObjectSet rst = CreateObject("adodb.recordset")Dim time1Dim time2Time1=” 2009-09-24 00:00:00.000”Time2=” 2009-09-24 23:59:00.000”Dim ssql As Stringssql ="Tag:R,'LNGArchive\shuishi','" & time1 & "','" & time2 & "','timestep=3600,258'"rst.Open ssql, cc1rst.MoveFirsti=2do until rst.EofobjExcelApp.worksheets ("sheet1").Cells(2, i).V Alue = rst.fields(2).valuei=i+1loopobjExcelApp.ActiveWorkbook.SaveobjExcelApp.Workbooks.ClosEobjExcelApp.QuiTcc1.CloseSet cc1 = NothingSet rst = Nothingend if注:1)以上脚本为读取Wincc归档(LNGArchive)中的变量(shuishi)到Excel中,每小时读取一个数据写在Excel第二行,第二列开始。
vbs将wincc数据写入数据库+导入到excel
WinCC V6.0 VBS 脚本在自动汽车检测与识别系统中的应用钟时(西门子工厂自动化工程有限公司工程部北京)摘要:本文描述了如何运用西门子上位监控软件WinCC V6.0集成的VBS脚本在自动汽车检测与识别系统中将实时车体信息记录到数据库中,并最终通过用户查询,以报表的形式打印出来。
关键词:WinCC V6.0,VBS,AVIAbstractThis paper introduces that how to store and query the datum by using VBScript -Editor integrating SIEMENS HMI software WinCC V6, then output datum as report style auto-matically.Key Words:WinCC V6.0,VBS,AVI一、项目简介项目的所在地位于山东省烟台市经济技术开发区内的上海通用东岳汽车有限公司。
其油漆车间新上的一套AVI(自动汽车识别)系统通过采用安装在车体滑撬上的西门子MOBY传感器将实时车体信息传递到主控PLC中,再由上位监控计算机采集存入数据库并最终由用户有选择的以报表形式将信息打印输出。
各AVI信息采集站除装有MOBY自动读写头外,还各有一套ET200S远程站和操作员面板采集现场其它信号。
整套AVI系统的现场级均采用西门子PROFIBUS-DP总线来传递信息,PLC与上位监控计算机采用工业以太网进行实时通讯。
二、系统介绍2.1 工艺需求由于油漆车间有其自身的生产工艺,诸如:电泳,喷漆,烘房等,因此各车辆的车体信息会在其进入油漆车间之前被自动存储在车体所对应的滑撬上的MOBY存储单元中。
当车体到达首个固定的AVI读写站时,自动条码扫描枪会读取贴在车体上的条形码信息,同时,MOBY读写头会自动从滑撬上的MOBY存储单元中读出车体信息并与扫描枪扫到的信息进行比对,如果两者比较结果一致,则主控PLC会返回机运线放行信号将此车辆放行。
Wincc V7.3 vbs 读取多个变量归档数据到excel
Wincc V7.3vbs读取多个变量归档数据到excel前面的一篇博客记录了如何读取多个变量归档数据到mshgrid控件,根据的是西门子官网的教学。
有网友询问为什么他照着官网方法就是无法导出到excel。
我自己也做了一遍,没有问题。
本篇主要记录导出按钮的脚本。
前面的准备工作与上一篇一致,导出按钮的vbs脚本如下:Sub OnClick(ByVal Item)Dim myCatalog,myDS,PCName,cnstr,sqlstr1,sqlstr2Dim xlapp,BTime,ETime,utcbtime,utcetime,utcbtstr,utcetstrDim conobj,rsobj1,comobj1Dim rsobj2,comobj2Dim rscount,i,curRowDim filenamemyCatalog=HMIRuntime.Tags("@DatasourceNameRT").ReadPCName=HMIRuntime.Tags("@LocalMachineName").ReadmyDS=PCName & "\Wincc"Set BTime=HMIRuntime.Tags("btime")Set ETime=HMIRuntime.Tags("etime")'北京时间时区修正utcbtime=Dateadd("h",-8,BTime.Read) '起始时间utcetime=Dateadd("h",-8,ETime.Read) '结束时间'日期时间格式修正utcbtstr = Year(utcbtime) & "-" & Month(utcbtime) & "-" & Day(utcbtime) & " " & Hour(utcbtime) & ":" & Minute(utcbtime) & ":" & Second(utcbtime)utcetstr = Year(utcetime) & "-" & Month(utcetime) & "-" & Day(utcetime) & " " & Hour(utcetime) & ":" & Minute(utcetime) & ":" & Second(utcetime)'连接字符串cnstr="Provider=WinCCOLEDBProvider.1; Catalog=" & myCatalog & "; Data Source=" &myDS'创建连接对象Set conobj=CreateObject("ADODB.Connection")conobj.connectionstring=cnstrconobj.CursorLocation = 3conobj.Open'查询字符串'sqlstr = "Tag:R,('VA\flow1';'VA\flow2'),'" & utcbtstr & "','" & utcetstr & "'," & "'order by Timestamp ASC','TimeStep=1,1'" sqlstr1 = "Tag:R,('VA\flow1'),'" & utcbtstr & "','" & utcetstr & "'," & "'order by Timestamp ASC','TimeStep=1,1'"sqlstr2 = "Tag:R,('VA\flow2'),'" & utcbtstr & "','" & utcetstr & "'," & "'order by Timestamp ASC','TimeStep=1,1'"'进行查询Set rsobj1 = CreateObject("ADODB.Recordset")Set comobj1 = CreateObject("mand")mandType = 1Set comobj1.ActiveConnection = conobjmandText = sqlstr1Set rsobj1 = comobj1.ExecuteSet rsobj2 = CreateObject("ADODB.Recordset")Set comobj2 = CreateObject("mand")mandType = 1Set comobj2.ActiveConnection = conobjmandText = sqlstr2Set rsobj2 = comobj2.Executerscount=rsobj1.recordcountrsobj1.movefirstrsobj2.movefirstif rscount=0 thenmsgbox "没有记录"exit subend ifSet xlapp=CreateObject("Excel.Application")xlapp.visible=Falsexlapp.workbooks.add'初始化excelxlapp.worksheets(1).cells(1,1)="编号:"xlapp.worksheets(1).cells(1,2)="QB-2017.001"xlapp.worksheets(1).range("a2:c2").mergecells=True '合并单元格xlapp.worksheets(1).cells(2,1)="这是一个测试"xlapp.worksheets(1).cells(2,1).HorizontalAlignment = 3 '文字居中xlapp.worksheets(1).cells(3,1)="日期时间"xlapp.worksheets(1).cells(3,2)="flow1"xlapp.worksheets(1).cells(3,3)="flow2"'导出到excelFor i=1 To rscountxlapp.worksheets(1).cells(3+i,1)=Dateadd("h",+8,rsobj1.fields(1).value)xlapp.worksheets(1).cells(3+i,2)=rsobj1.fields(2).valuexlapp.worksheets(1).cells(3+i,3)=rsobj2.fields(2).valuersobj1.movenextrsobj2.movenextNext'释放资源Set rsobj1 = NothingSet rsobj2 = Nothingconobj.CloseSet conobj = Nothing'画边框xlapp.worksheets(1).range("a3:c" & CStr(3+rscount)).borders(1).linestyle=9xlapp.worksheets(1).range("a3:c" & CStr(2+rscount)).borders(1).weight=2xlapp.worksheets(1).range("a3:c" & CStr(2+rscount)).borders(2).linestyle=9xlapp.worksheets(1).range("a3:c" & CStr(2+rscount)).borders(2).weight=2xlapp.worksheets(1).range("a3:c" & CStr(2+rscount)).borders(3).linestyle=9xlapp.worksheets(1).range("a3:c" & CStr(2+rscount)).borders(3).weight=2xlapp.worksheets(1).range("a3:c" & CStr(2+rscount)).borders(4).linestyle=9xlapp.worksheets(1).range("a3:c" & CStr(2+rscount)).borders(4).weight=2'保存文件filename= "c:\" & Year(Now) & "年" & Month(Now) & "月" & Day(Now) & "日-" & Hour(Now) & "点" & Minute(Now) & "分" & Second(Now) & "秒生成生产报表.xlsx"xlapp.Activeworkbook.saveas (filename)xlapp.workbooks.closexlapp.quitMsgbox "成功导出到C:\"End Sub无法导出数据的朋友,检查一下官网提示的那个连接包是否安装了。
(完整word版)在WinCC中如何使用VBS读取变量归档数据到EXCEL
文档类型常问问题, 条目ID:77940055, 文档发布日期2013年7月23日4)(评估在WinCC中如何使用VBS读取变量归档数据到EXCEL推荐文档: 西门子工程师推荐本文档!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”。
3.1 查询语句格式数据的查询语句的格式要求如下:8 字节长ValueID 的请求:TAG_LLVID:R,<ValueID或ValueName>,<TimeBegin>,<TimeEnd>[,<SQL_clause>][,<TimeStep>]4 字节长ValueID 的请求:TAG:R,<ValueID 或ValueName>,<TimeBegin>,<TimeEnd>[,<SQL_clause>][,<TimeStep>]其中:ValueID:过程值归档变量的唯一标识符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文档类型常问问题, 条目ID:77940055, 文档发布日期2013年7月23日4)(评估在WinCC中如何使用VBS读取变量归档数据到EXCEL推荐文档: 西门子工程师推荐本文档!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”。
3.1 查询语句格式数据的查询语句的格式要求如下:8 字节长ValueID 的请求:TAG_LLVID:R,<ValueID或ValueName>,<TimeBegin>,<TimeEnd>[,<SQL_clause>][,<TimeStep>]4 字节长ValueID 的请求:TAG:R,<ValueID 或ValueName>,<TimeBegin>,<TimeEnd>[,<SQL_clause>][,<TimeStep>]其中:ValueID:过程值归档变量的唯一标识符。
ValueName:过程值归档变量的名称,格式为“ArchiveName\Value_Name”,可以使用多个名称。
TimeBegin,TimeEnd:时间范围,格式“YYYY-MM-DD hh:mm:ss.msc”。
SQL_Clause:SQL 语法中的过滤标准。
TimeStep:时间间隔。
使用<TimeStep> 时,必须将<TimeBegin> 指定为绝对时间。
禁止使用相对语句“0000-00-00 00:00:00.000”。
其中ValueID和ValueName的对应关系如下图所示:图1 ValueID和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文件。
如下图所示:图4 Excel模板4.2组态查询界面画面上新建三个输入/输出域,分别用于输入开始时间、结束时间和间隔时间。
按钮中执行用于访问变量归档数据的VBS脚本。
图5 查询界面4.3关键脚本介绍1)打开Excel模板以后台方式打开之前创建好的Excel模板。
其中sheetname作为变量可以定义Excel中Sheet的名字。
Set objExcelApp = CreateObject("Excel.Application")objExcelApp.Visible = FalseobjExcelApp.Workbooks.Open "D:\WinCCWriteExcel\abc.xlsx"objExcelApp.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=.\WinCC"sCon = sPro + sDsn + sSerSet conn = CreateObject("ADODB.Connection")conn.ConnectionString = sConconn.CursorLocation = 3conn.Open'定义查询的命令文本SQLsSql = "Tag:R,('PVArchive\NewTag'),'" & UTCBeginTime & "','" & UTCEndTime & "',"sSql=sSql+"'order by Timestamp ASC','TimeStep=" & sVal.Value & ",1'"Set oRs = CreateObject("ADODB.Recordset")Set oCom = CreateObject("mand")mandType = 1Set oCom.ActiveConnection = connmandText = 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函数就是实现这样的功能。