WinCC使用VBS读取报警记录数据到EXCEL
- 格式:doc
- 大小:317.00 KB
- 文档页数:13
1 功能说明在Microsoft office Excel中访问WinCC的历史数据,实现如下图所示的报表:图1: Excel中访问WinCC的历史数据生成报表选择日期后,可以生成当天的风机参数日报表(报表数据来自WinCC)。
2 软件环境本地计算机:Windows XP SP3英文版、WinCC7.0 SP2 ASIA、Microsoft office Excel 2003 远程计算机:Windows XP SP3英文版、WinCC7.0 SP2 ASIA、Microsoft office Excel 20033 WinCC/Connectivity Pack 介绍WinCC变量归档数据是以压缩的形式存储在数据库中,需要通过WinCC/Connectivity Pack提供的OLE-DB接口才能够解压并读取这些数据。
3.1 连接字符串“Provider=WinCCOLEDBProvider.1; Catalog= ***; Data Source= ***;“其中:Catalog:WinCC运行数据库的名称注意:当修改项目名称或在其它计算机上打开原项目时, Catalog会发生变化。
建议使用WinCC系统变量“@DatasourceNameRT” 获得当前的Catalog。
Data Source :服务器名称本地:“.\WinCC” 或者“<计算机名称>\WinCC”远程:“<计算机名称>\WinCC”3.2 查询语句“TAG:R,<ValueID or ValueName>,<TimeBegin>,<TimeEnd>[,<SQL_clause>][,<TimeStep>]”其中:ValueName:格式为“ArchiveName\Value_Name”,可以使用多个名称。
TimeBegin,TimeEnd:时间范围,格式“YYYY-MM-DD hh:mm:ss.msc”。
如何在Excel中访问WinCC变量归档数据————————————————————————————————作者:————————————————————————————————日期:1 功能说明在Microsoft office Excel中访问WinCC的历史数据,实现如下图所示的报表:图1: Excel中访问WinCC的历史数据生成报表选择日期后,可以生成当天的风机参数日报表(报表数据来自WinCC)。
2 软件环境本地计算机:Windows XP SP3英文版、WinCC7.0 SP2 ASIA、Microsoft office Excel 2003 远程计算机:Windows XP SP3英文版、WinCC7.0 SP2 ASIA、Microsoft office Excel 20033 WinCC/Connectivity Pack 介绍WinCC变量归档数据是以压缩的形式存储在数据库中,需要通过WinCC/Connectivity Pack提供的OLE-DB接口才能够解压并读取这些数据。
3.1 连接字符串“Provider=WinCCOLEDBProvider.1; Catalog= ***; Data Source= ***;“其中:Catalog:WinCC运行数据库的名称注意:当修改项目名称或在其它计算机上打开原项目时, Catalog会发生变化。
建议使用WinCC系统变量“@DatasourceNameRT” 获得当前的Catalog。
Data Source :服务器名称本地:“.\WinCC” 或者“<计算机名称>\WinCC”远程:“<计算机名称>\WinCC”3.2 查询语句“TAG:R,<ValueID or ValueName>,<TimeBegin>,<TimeEnd>[,<SQL_clause>][,<TimeStep>]”其中:ValueName:格式为“ArchiveName\V alue_Name”,可以使用多个名称。
VBS连接EXCEL及其操作VBS(Visual Basic Script)是一种Microsoft基于Visual Basic所开发的一种脚本编程语言。
通过VBS可以连接Excel,并对Excel进行各种操作,包括读取、修改、创建和删除Excel文件,读取和修改Excel中的数据,设置单元格样式和格式等。
要连接Excel文件,需要先创建一个Excel对象,然后通过Excel对象打开指定的Excel文件。
以下是一个连接Excel并读取数据的示例代码:```Set excelApp = CreateObject("Excel.Application")Set excelWorkbook =excelApp.Workbooks.Open("C:\Path\To\ExcelFile.xlsx")Set excelWorksheet = excelWorkbook.Worksheets("Sheet1")rowCount = edRange.Rows.CountcolumnCount = edRange.Columns.CountFor i = 1 To rowCountFor j = 1 To columnCountvalue = excelWorksheet.Cells(i, j).ValueMsgBox "Cell (" & i & ", " & j & "): " & valueNextNextexcelWorkbook.CloseexcelApp.Quit```上述代码首先创建了一个Excel应用程序对象excelApp,并调用Open方法打开指定的Excel文件。
然后,获取指定的工作表对象excelWorksheet,并通过UsedRange属性获取数据的有效范围。
wincc vbs模块方法WinCC VBScript模块方法是用于编程和自动化WinCC项目的一种功能强大的工具。
它可以帮助用户在WinCC界面中实现各种功能和任务,包括数据处理、图表生成、报警处理等等。
在本文中,我们将一步一步回答关于WinCC VBScript模块方法的主题。
1. 什么是WinCC VBScript模块方法?WinCC VBScript模块方法是一种用于编程和自动化WinCC项目的工具。
它基于Visual Basic Scripting语言(VBScript),可以让用户通过编写脚本来实现各种功能和任务。
这些功能包括数据处理、图表生成、报警处理等等。
2. 如何使用WinCC VBScript模块方法?使用WinCC VBScript模块方法需要以下几个步骤:- 打开WinCC开发环境:首先,您需要打开WinCC开发环境,启动WinCC Explorer和VBScript编辑器。
- 创建VBScript模块:在VBScript编辑器中,您可以创建一个新的VBScript模块。
这个模块将成为您编写脚本的地方。
- 编写脚本:在VBScript模块中,您可以使用VBScript语法编写脚本。
您可以利用WinCC提供的函数和方法来实现各种功能和任务。
- 脚本调用:一旦您编写完脚本,您可以在WinCC项目的各个部分中调用脚本。
您可以在按钮的点击事件或某个对象的属性变化事件中调用脚本。
3. WinCC VBScript模块方法的应用场景有哪些?WinCC VBScript模块方法可以应用于各种场景和任务,包括但不限于以下几个方面:- 数据处理:您可以使用VBScript模块方法来处理和计算在WinCC项目中采集到的数据。
例如,您可以编写一个脚本来实现数据的加工、过滤和处理等操作。
- 图表生成:使用VBScript模块方法,您可以生成各种类型的图表,例如曲线图、柱状图和饼图等。
这些图表可以帮助您更好地可视化和分析数据。
利用WINCC 6.0自带的SQL SERVER制定数据存储与查询且将结果导出到EXCEL作者: 张宝田三达膜集团有限公司关键词:WINCC6.0 、VBS、SQL SERVER、 EXCEL、C#一、 前言在WINCC5.0中利用的是Sybase数据库,表结构相对简单,导出到EXCEL也相对方便;同时也有采用在全局C脚本中编写程序把变量值写入到固定的一个EXCEL文件中。
以上两种方式在运行时间长后文件非常大,打开非常缓慢,想提取其中的有用部分相对较难。
而在WINCC6.0中利用的是SQLSERVER数据库,其表结构设计相对复杂,且经过压缩处理,要直接导出运行数据也非常困难,用其报表打印机打出的表单是.mdi格式(类似图片)要二次处理分析数据也非常不容易。
本文重点介绍了如何利用WINCC自带的VBS脚本语言将需要的生产数据送到WINCC自带的SQL SERVER数据库中,同时利用基于.NET平台C#计算机高级语言编写一个通用的数据库查询与导出工具,将需要的数据导出到EXCEL中,从而弥补WINCC6.0数据导出难的问题。
其整个数据链如下图所示:二、 建立数据库打开SQL SERVER数据库新建一数据库名为:xlpdb1.1创建表根据生产或工艺进行分类,分别创建表名为YCLTable(预处理)、 UFTable(超滤)、ROTable(反渗透)、 JYTable(加药间)、如下图所示:表中字段的类型分别为:datetime(存放日期时间)、text(存放wincc当前操作人员信息)、float(存放生产运行数据)。
备注:为了方便查看,字段名称最好直接使用PI&D图上的仪表编号。
1.2 创建用户配置数据库用户名为:sinomem 密码为:6778100 设置相应权限如下图所示:三、 编写VBS脚本程序2.1 用VBS脚本与WINCC变量数据交换方法要用VBS脚本进行数据处理,首先得知道与WINCC变量的数据交换方法,其源代码如下:2.2 用VBS脚本将数据写入SQL SERVER利用WINCC的全局VBS脚本,触发周期为1分钟即每1分钟向SQL SERVER写入一条数据。
1、安装WINCC时选择“组态工具”(若已安装过,重新运行安装文件)
2、打开或新建一个EXCEL表格,此时表格菜单多一个WINCC
3、点击WINCC菜单,选择第一个(创建工程文件),弹出一对话框。
选择第三个(和已存在的工程建立连接),确定!若有打开的WINCC工程,则自动完成;若没有打开,则弹出一个选择工程项目的对话框,浏览找到路径,确定。
1WinCC 作为DDE的服务器,Excel 作为DDE客户端1)打开WinCC项目,在WinCC Explorer 中“计算机属性->启动”中添加应用程序: DdeServ.exe ,同时添加命令行参数:/v /n 。
2)激活WinCC 后,会弹出WinCC DDE-Server 对话框,点击Tag List 按钮:在列表中选择想要访问的变量,点击“确定”,这样该变量的连接信息就被拷贝到Windows剪贴板。
3) 打开Excel ,随便(双击)选中一个单元格,将Windows剪贴板的内容拷贝到该单元格中,然后在第一个字符前添加“=”,这样就完成对单元格的输入。
这时在Excel 中就能够得到WinCC的内部和外部过程数据了。
4) 如果要访问多个变量,请重复步骤2)和3)。
Wincc用VBS控制excelSub OnClick(Byval Item)Dim fso,folderDim type1Dim patch,filenameDimtestposition,testnumber,startdate,printdate,brand,tyremodel ,rim,tread,condition,load,speed,pres sure,statusSet testposition=HMIRuntime.tags("T estPosition_2")Set testnumber=HMIRuntime.tags("T estNumber_2")Set startdate=HMIRuntime.tags("StartDate_2")Set printdate=HMIRuntime.tags("PrintDate_2")Set brand=HMIRuntime.tags("TypeBrand_2")Set tyremodel=HMIRuntime.tags("TyreType_2")Set rim=HMIRuntime.tags("RimStandard_2")Set tread=HMIRuntime.tags("TyreTread_2")Set condition=HMIRuntime.tags("TestConditionFile_2")Set load=HMIRuntime.tags("StandardLoad_2")Set speed=HMIRuntime.tags("SpeedSymbol_2")Set pressure=HMIRuntime.tags("StandardPressure_2")Set status=HMIRuntime.tags("FinalStatus_2")'***********************check tyre type*******************tyremodel.Readtype1=tyremodel.ValueIf type1="" ThenMsgBox "Please check tire type" , ,"Info"Exit SubElseEnd If'***********************check Report folder****************Set fso=CreateObject("Scripting.FileSystemObject")If (fso.FolderExists("E:\Report")) ThenElseSet folder=fso.CreateFolder("E:\Report")End If'***********************close report************************* Dim objExcelApp,objExcelBook,objExcelSheetOn Error Resume NextDim ExcelApp,ExcelBookSet ExcelApp = GetObject(,"Excel.Application")If TypeName(ExcleApp) = "Application" ThenFor Each ExcelBook In ExcelApp.WorkBooksIf ExcelBook.FullName = "D:\TTM-Monitor 2STA. ver.1.2\TTM-Monitor\Report\Report.xls" Then ExcelApp.ActiveWorkbook.SaveExcelApp.Workbooks.CloseExcelApp.QuitSet ExcelApp= NothingExit ForEnd IfNextEnd If'************************Report waiting massgae***************************Dim waittingbitSet waittingbit = HMIRuntime.Tags("waittingbit")waittingbit.Readwaittingbit.write 1'************************creat connect report_2archive********************Dim sConDim sSqlDim connDim oRsDim oComDim m,nDim DSNDSN = HMIRuntime.Tags("@DatasourceNameRT").ReadsCon="Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;Persist Security Info=False;Data Source=.\WINCC;Initial Catalog='" & DSN & "';"sSql = "Select * from UA#Report_2"Set conn = CreateObject("ADODB.Connection")conn.ConnectionString = sConconn.CursorLocation = 3conn.OpenSet oRs = CreateObject("ADODB.Recordset")Set oCom = CreateObject("/doc/8416257995.html,ma nd")/doc/8416257995.html,mandType = 1 Set oCom.ActiveConnection = conn/doc/8416257995.html,mandT ext = sSqlSet oRs = oCom.Executem = oRs.Fields.Count'************************* write datas to report.xls**********************Set objExcelApp =CreateObject("Excel.Application")objExcelApp.Visible=FalseobjExcelApp.Workbooks.Open"D:\TTM-Monitor 2STA. ver.1.2\TTM-Monitor\Report\Report.xls"objExcelApp.Worksheets(ReportDatas).Activate'****************************report wating message*************************************************** Set waittingbit = HMIRuntime.Tags("waittingbit")waittingbit.Readwaittingbit.write 1'************************************************************** **************** **If (m > 0) ThenoRs.MoveFirstn = 11testposition.ReadobjExcelApp.cells(5,3).value=testposition.valuetestnumber.ReadobjExcelApp.cells(4,3).value=testnumber.valuestartdate.ReadobjExcelApp.cells(6,3).value=startdate.valueprintdate=NowobjExcelApp.cells(7,3).value=printdatebrand.ReadobjExcelApp.cells(8,3).value=brand.valuetyremodel.ReadobjExcelApp.cells(9,3).value=tyremodel.valuerim.ReadobjExcelApp.cells(3,10).value=rim.valuetread.ReadobjExcelApp.cells(4,10).value=tread.valuecondition.ReadobjExcelApp.cells(5,10).value=condition.value load.ReadobjExcelApp.cells(6,10).value=load.value speed.readobjExcelApp.cells(7,10).value=speed.value pressure.ReadobjExcelApp.cells(8,10).value=pressure.value status.ReadobjExcelApp.cells(9,10).value=status.valueDo While Not oRs.EOFn = n + 1objExcelApp.Cells(n,1).Value=oRs.Fields(1).Value objExcelApp.Cells(n,2).Value=oRs.Fields(2).Value objExcelApp.Cells(n,3).Value=oRs.Fields(3).Value objExcelApp.Cells(n,4).Value=oRs.Fields(4).Value objExcelApp.Cells(n,5).Value=oRs.Fields(5).Value objExcelApp.Cells(n,6).Value=oRs.Fields(6).Value objExcelApp.Cells(n,7).Value=oRs.Fields(7).Value objExcelApp.Cells(n,8).Value=oRs.Fields(8).Value objExcelApp.Cells(n,9).Value=oRs.Fields(9).Value objExcelApp.Cells(n,10).Value=oRs.Fields(10).Value objExcelApp.Cells(n,11).Value=oRs.Fields(11).Value objExcelApp.Cells(n,12).Value=oRs.Fields(12).Value objExcelApp.Cells(n,13).Value=oRs.Fields(13).Value objExcelApp.Cells(n,14).Value=oRs.Fields(14).Value objExcelApp.Cells(n,15).Value=oRs.Fields(15).Value objExcelApp.Cells(n,16).Value=oRs.Fields(16).Value objExcelApp.Cells(n,17).Value=oRs.Fields(17).Value oRs.MoveNextLoopfilename=CStr(Year(Now))&"-"&CStr(Month(Now))&"-"&CStr(Day(Now))&"_"&CStr(Hour(Now))&"."&CStr(Minute(Now))&"_"&"STA2"patch= "E:\Report\"&filename&"_"&type1&".xls"objExcelApp.ActiveWorkbook.SaveAs patchobjExcelApp.Workbooks.CloseobjExcelApp.QuitSet objExcelApp= NothingEnd IfoRs.CloseSet oRs = Nothingconn.CloseSet conn = Nothing'**************************************closemessage************************* MsgBox "报表保存成功,路径:E:\Report\"Set waittingbit = HMIRuntime.Tags("waittingbit")waittingbit.Readwaittingbit.write 0'***************************close save as report*********************************** End Sub。
使用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报警控件、在线趋势表格控件数据查询1.报警控件数据查询在WinCC报警记录组态时,我们可以给报警消息定义不同的类别、类型、用户文本块等(图1),有了以上的组态,我们就可以自定义过滤条件,在报警控件中查询或显示分类的报警信息。
图 11.1 报警控件手动查询在组态报警控件时,可直接设置报警控件过滤条件。
双击报警控件,在“WinCC报警控制属性”对话框中选择“消息列表”,然后单击“数据准备”区域中的“选择”按钮,在“指定选择”对话框中,通过对左边列表中复选框的选择,可以任意组合过滤条件(图2)。
图例中给出了查询错误点“设备A”的“停机故障”类报警的组态。
保存组态后,此报警控件在运行时直接显示过滤后的查询结果。
点击“删除选择”按钮,可删除已组态的过滤条件,然后重新设置。
图2报警控件在系统运行过程中,也可使用工具栏来设置过滤条件。
在组态报警控件时双击控件,在“WinCC报警控制属性”对话框中选择“工具栏”,把“选择对话框”勾选上(图3),保存设置。
图3系统运行时在报警控件工具栏上,点击“打开选择对话框”按钮,在“指定选择”对话框中,通过对左边列表中复选框的选择,也可以任意组合过滤条件(图4)。
图4图中区域A中参数选项的含义请参考(表1)设置含义无设置下次切换画面时,所做组态将丢失。
“在CS和RT中保持”即使关闭和重启系统,所做的组态仍然保持。
“在RT中保持”所作组态一直保持到系统终止运行。
表11.2 使用脚本对报警控件做查询在WinCC所提供的VBS、C脚本中,可以把相对应的SQL查询语句,赋值给报警控件的“MsgFilterSQL”属性来设置消息的过滤。
有一个简单方法可以获得查询SQL语句。
在控件中手动设置查询条件,在“删除选择”按钮左边(图4)的输出框内,就是此查询条件的SQL语句,可以直接把此语句拷贝到脚本中使用。
图5、图6给出了查询错误点“设备A”的“停机故障”类报警消息的脚本例程“Control1”:报警控件的对象名称“CLASS IN(2)”:“停机故障”的消息类别编号2“TEXT2 LILE ‘设备A’”:错误点(文本块编号2)中文本匹配‘设备A’图5 -- C脚本图6 -- VBS脚本关于使用查询SQL语句的更多详细信息请参考:WinCC 信息系统 > 使用WinCC > 建立消息系统 > 在运行系统中显示消息 > 用于过滤报警控件的消息的SQL语句2.在线趋势/表格控件数据查询在线趋势/表格控件可用来显示归档数据,用户可自定义开始时间/结束时间,做时间范围内的归档数据查询。
【WinCC】使用VBS读取报警记录数据到EXCEL 1、概述 介绍如何在WinCC项目中使用VBS脚本读取报警记录归档数据,并把获取的数据保存成新的Excel文件。 2、软件环境 Windows XP SP3中文版、WinCC7.0 SP2 ASIA、Microsoft office Excel 2007 3、访问原理 WinCC报警记录数据是以压缩的形式存储在数据库中,需要通过 WinCC连通性软件包提供的OLE-DB接口才能够解压并读取这些数据。 当使用 OLE-DB方式访问数据库时关键需要注意连接字符串的写法和查询语句的格式。 连接字符串格式为“Provider=WinCCOLEDBProvider.1; Catalog= ***; Data Source= ***;”,其中:Catalog为WinCC运行数据库的名称, 当修改项目名称或在其它计算机上打开原项目时, Catalog会发生变化。 建议使用WinCC内部变量 “@DatasourceNameRT” 获得当前项目的Catalog。Data Source 为服务器名称,格式为“称>\WinCC”。 3.1 查询语句格式 查询语句的格式要求如下: AlARMVIEW:SELECT * FROM [ WHERE……optional ] 其中参数信息如下所示: ViewName:数据库表名。必须用需要的语言指定该表。 比如:中文字符表名为:ALGVIEWCHT,英文字符表明为:ALGVIEWENU等。Condition:为过滤标准。 详细说明请参见下表:
表1查询参数表 3.2查询结果 查询结果作为记录集返回。可以根据需要有选择的返回特定的数据集。例如:oRs.Fields(0).Value返回的是消息的编号;oRs.Fields(2).Value返回的是消息的时间戳;oRs.Fields(37).Value返回的是消息文本的内容。 记录集的结构如下表所示:
表2记录集结构 表3记录集结构 (续表) 注意:WinCC的归档数据是使用UTC(协调世界时)时间保存的。
本例中所采用的时间均为UTC时间,如果需要实现在本地时间和UTC时间之间的转换,请参考下列连接: 如何计算本地时间和 UTC 时间的时间差,如何转换 UTC 时间成 SQL 语句格式? 22115636 如何将本地计算机时间的时间戳(日期时间)转换成协调世界时 (UTC)? 24201113 4、组态介绍 4.1准备工作 1)创建变量:其中AlmTagA、AlmTagB和AlmTagC用于组态报警,MySqlStr用于动态化查询条件。如下图所示:
图1变量
2)组态报警:在报警记录中组态如下报警:
图2报警信息
图3单个消息组态界面 3)创建Excel模板:在特定的路径下预先创建一个Excel文件作为模板,这样可以很好的控制输出格式。本例中在D:\WinCCWriteExcel下创建一个名称为abc.xlsx的Excel文件。如下图所示:
图4EXCEL模板 4.2组态查询界面:画面上新建五个按钮,上面的四个按钮分别用于
设置不同的查询条件。按钮下方的静态文本用于显示查询条件。最下方的按钮用于执行查询报警记录的VBS脚本。其中查询条件的设定是通过按钮的直接连接方式实现。
图5 查询界面 在按钮属性对话框的鼠标动作中选择直接连接打开如下界面,配
置查询条件。其中来源部分为查询字符串,目标部分为存储查询条件的变量。 图6按钮直接连接配置 4.3详细脚本介绍
1)打开Excel模板 以后台方式打开之前创建好的Excel模板。其中sheetname作为变量可以定义Excel中Sheet的名字。需要注意模板文件的存储路径。 Set objExcelApp = CreateObject("Excel.Application") objExcelApp.Visible = False objExcelApp.Workbooks.Open "D:\WinCCWriteExcel\abc.xlsx" objExcelApp.Worksheets(sheetname).Activate 2)准备查询条件 主要是确定和格式化Catalog和查询条件。关键脚本如下: '准备查询条件 Catalog Set tagDSNName = HMIRuntime.Tags("@DatasourceNameRT") tagDSNName.Read ‘拼接查询条件 MySqlStr.Read sSql = "ALARMVIEW:Select * FROM AlgViewCHT "&MySqlStr.Value 其中MySqlStr为定义的内部字符串类型的变量,当点击查询条件中的按钮时 ,就会把相应的查询条件字符串传给该变量(需要根据项目的实际情况调整查询条件)。本例中的四条查询条件的完整语句如下图所示:
图7查询条件 3)完整的代码 '变量定义和初始化 Dim sPro,sDsn,sSer,sCon,conn,sSql,oRs,oCom Dim tagDSNName Dim m,i Dim objExcelApp,objExcelBook,objExcelSheet,sheetname Dim MySqlStr Set MySqlStr = HMIRuntime.Tags("MySqlStr") item.Enabled = False 'On Error Resume Next sheetname="Sheet1" '打开Excel模板 Set objExcelApp = CreateObject("Excel.Application") objExcelApp.Visible = False objExcelApp.Workbooks.Open "D:\WinCCWriteExcel\abc.xlsx" objExcelApp.Worksheets(sheetname).Activate '准备查询条件 Catalog Set tagDSNName = HMIRuntime.Tags("@DatasourceNameRT") tagDSNName.Read '创建数据库联接 sPro = "Provider=WinCCOLEDBProvider.1;" sDsn = "Catalog=" &tagDSNName.Value& ";" sSer = "Data Source=.\WinCC" sCon = sPro + sDsn + sSer Set conn = CreateObject("ADODB.Connection") conn.ConnectionString = sCon conn.CursorLocation = 3 conn.Open '定义查询的命令文本 SQL MySqlStr.Read sSql = "ALARMVIEW:Select * FROM AlgViewCHT "&MySqlStr.Value HMIRuntime.Trace "Sql is: " & sSql & vbCrLf Set oRs = CreateObject("ADODB.Recordset") Set oCom = CreateObject("ADODB.Command") oCom.CommandType = 1 Set oCom.ActiveConnection = conn oCom.CommandText = sSql '填充数据到Excel中 Set oRs = oCom.Execute m = oRs.RecordCount If (m > 0) Then oRs.MoveFirst i=3 Do While Not oRs.EOF '是否到记录末尾,循环填写表格 objExcelApp.Worksheets(sheetname).cells(i,1).value= CStr(oRs.Fields(0).Value) objExcelApp.Worksheets(sheetname).cells(i,2).value= CStr(oRs.Fields(1).Value) objExcelApp.Worksheets(sheetname).cells(i,3).value= CStr(oRs.Fields(2).Value) objExcelApp.Worksheets(sheetname).cells(i,4).value= CStr(oRs.Fields(37).Value) oRs.MoveNext i=i+1 Loop oRs.Close Else MsgBox "没有所需数据……" item.Enabled = True Set oRs = Nothing conn.Close Set conn = Nothing objExcelApp.Workbooks.Close objExcelApp.Quit Set objExcelApp= Nothing Exit Sub End If '释放资源 Set oRs = Nothing conn.Close Set conn = Nothing '生成新的文件,关闭Excel Dim patch,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.SaveAs patch