1概述本文主要介绍如何通过VBS操作WINCC在线数据表控件。开发环境:PC S7 v 8.2使用限制:SP1/WINCC 7.4 SP1 1)时间间隔最长1分钟2)时间范围过长,数据加载可能较慢3)导出文件EXCEL不封顶,导出后要切换到EXCEL程序。扩展性:可以扩展选择参数、保存导出文件、生成PDF等功能。在本例中,参数是预先在控件中配置好的,操作时通过复选框实现选择。也可以完全使用脚本来添加参数。有关详细信息,请参见通过脚本添加参数的附加信息。
2操作效果图1根据选择查询数据
图2成功导出数据
图3查看EXCEL中导出的数据文件
图4在EXCEL中查看导出的数据文件(选择一些列)
3项目配置3.1屏幕部件描述
图5测试屏幕组件说明
3.1.1 添加时间控件
添加WINCC Activex控件日期和时间选择器,如下图所示:
图6添加时间控制
3.1.2 设置导出模板
本例中设置的excel文件模板路径为' \ \ ' servername ' \ export \ export . xlsx ',根据项目情况可以采用其他导出路径和模板。如果模板或路径发生更改,则必须修改导出脚本中的路径。模板中主要设置字体、数据格式、显示的小数位数、列宽,以及页眉、页脚、LOGO等。也可以加入以达到更好的显示效果。
3.2屏幕打开
在screen opening事件中,设置以下脚本来初始化屏幕中的控件:
Sub OnOpen() Dim ioTimeFactor,tbl1,dtpStart,dtpEndSet TBL 1=screen items(' TBL 1 ')Set iotime factor=screen items(' iotime factor ')Set DTP start=screen items(' DTP start ')Set dt pend=screen items(' dt pend ')显示设定值' IOTIMEFFACTOR '上的实际设定系数。输出值=TBL1。' TIMESTEPFACTOR '设置时间系数,设置IO字段类型为input IOTIMEFFACTOR。' BOXTYPE=1 '将表格设置为起止时间范围TBL1。TimeColumnRangType=1 '当设置控制显示格式DTP start . format=3d ptstart . custom format=' yyyy/mm/ddhh 3360mm 3360 ss ' dt pend . format=3d ptpend . custom format=' yyyy/mm/hh 3360mm 3360 ss ' '时,将默认时间范围设置为当天DTP开始。value=format datetime(year(now)'/' month(now)'/' day(now),1)'当前日期的0点dtpEnd。值=现在'当前时间结束sub数字
3.3选择
数值参数版设计图 8 添加参数选择复选框
设置复选框,在复选框更改事件下添加脚本:
Sub Process_OnPropertyChanged(Byval Item, Byval value) Dim i,j,tbl1Set tbl1 = ScreenItems("tbl1")For i = 0 To item.BoxCount-1tbl1.ValueColumnIndex= i'判断筛选框是否被选中,如果是,则设置曲线可见If (value And 2^i) > 0 Thentbl1.ValueColumnVisible = 1Elsetbl1.ValueColumnVisible = 0End IfNext End Sub
图 9 数据参数显示隐藏设置脚本
图 10 脚本与控件属性对应关系
3.4设置时间系数
属性:TimeStepFactor
图 11 修改时间间隔脚本
Sub InputValue_OnPropertyChanged(ByVal Item, ByVal value) Dim tbl1Set tbl1 = screenitems("tbl1")tbl1.TimeStepFactor=valueEnd Sub图 12 修改时间系数
3.5 设定时间范围
图 13 添加时间控件
在查询按钮释放左键事件里:
Sub OnLButtonUp(Byval Item, Byval Flags, Byval x, Byval y) Dim tbl1,dtpStart,dtpEndSet tbl1 = ScreenItems("tbl1")Set dtpStart = ScreenItems("dtpStart")Set dtpEnd = ScreenItems("dtpEnd")'设置表格的时间范围tbl1.TimeColumnIndex=0If dtpStart.Value < dtpEnd.Value Thentbl1.TimeColumnBeginTime=dtpStart.Valuetbl1.TimeColumnEndTime =dtpEnd.ValueElseMsgbox "开始时间小于结束时间,请正确设置!",vbOKonly+vbExclamationEnd IfEnd Sub图 14 时间范围查询按钮事件
图 15 修改起始时间范围
3.6导出
在导出按钮释放左键事件里:
Sub OnLButtonUp(Byval Item, Byval Flags, Byval x, Byval y) Dim objExcelApp,objExcelSheet,sheetname,ServerName,DataFirstRow,TagValueTagValue=1DataFirstRow=1sheetname="sheet1"ServerName = HMIRuntime.Tags("@ServerName").Read'获取表格内数据Dim tbl1,col,RowCount,rowDim Value()Dim i,j,kSet tbl1 = ScreenItems("tbl1")Set row = tbl1.GetRowCollection'行RowCount=row.countRedim Value(RowCount+1,tbl1.ValueColumnCount+2)'重定义数值数组,存储时间、数值。行:记录,列:参数Set col = tbl1.GetValueColumnCollection'数值列'序号Value(0,0)="序号"For j = 1 To RowCountValue(j,0)=jNext'时间列名称tbl1.TimeColumnIndex=0Value(0,1)=tbl1.TimeColumnNamek=1For i = 1 To tbl1.ValueColumnCount + 1'列可见时写数,否则跳出tbl1.ValueColumnIndex= i-2If tbl1.ValueColumnVisible Or (i = 1) Then '时间列,或数值列显示'数值列名称If i > 1 Thentbl1.ValueColumnIndex= i-2Value(0,k)=tbl1.ValueColumnNameEnd IfFor j = 1 To RowCountValue(j,k)=tbl1.GetRow(j).celltext(i)'注意:celltext()指向数据列(不考虑是否隐藏),当 celltext()指向隐藏的列时,数据为空。cellNextk=k+1End IfNext'打开 Excel 模板Set objExcelApp = CreateObject("Excel.Application")objExcelApp.Visible = TrueSet objExcelSheet = objExcelApp.Workbooks.Open("\\"+ServerName +"\Export\Export.xlsx") '模板文件存放位置objExcelSheet.Activate'写数据至 EXCELWith objExcelApp.Worksheets(sheetname).Range(.Cells(1,1),.Cells(RowCount+1,tbl1.ValueColumnCount+2))= Value.Cells(RowCount+2,1)="导出人:".Cells(RowCount+2,2)=HMIRuntime.Tags("@CurrentUserName").Read.Cells(RowCount+3,1)="导出位置:".Cells(RowCount+3,2)=HMIRuntime.Tags("@LocalMachineName").Read.Cells(RowCount+4,1)="导出时间:".Cells(RowCount+4,2)=Now.Cells(RowCount+5,1)="数据库:".Cells(RowCount+5,2)=HMIRuntime.Tags("@DatasourceNameRT").Read.Cells(RowCount+6,1)="软件版本:".Cells(RowCount+6,2)=HMIRuntime.Tags("@ServerVersion").ReadEnd With'Msgbox "导出成功,请在 EXCEL 中查看数据",vbOKonly+vbInformation'生成新的文件,关闭 ExcelDim path1,path2,fso,filenameSet fso=CreateObject("Scripting.FileSystemObject")filename= CStr(Year(Now)) & CStr(Month(Now)) & CStr(Day(Now))& CStr(Hour(Now))& CStr(Minute(Now))& CStr(Second(Now))path1= "C:\Users\wq_07\Documents\Export\"&filename&".xlsx"If fso.FileExists(path1) Then '删除重复文件fso.DeleteFile(path1)End If'objExcelSheet.ExportAsFixedFormat 0,path1 '0-xlTypePDF ,1-xlTypeXPS,直接另存发现PDF 软件不能打开文件,因此改用导出 PDF'CreateReport_RH=path1objExcelApp.Worksheets(sheetname).SaveAs path1objExcelSheet.close False'关闭 EXCEL,不保存objExcelApp.Quit'打开导出文件所在的文件夹Dim objShell,strFolderstrFolder=fso.GetParentFolderName(path1)Set objShell=CreateObject("Wscript.Shell")objshell.Run strFolderEnd Sub图 16 导出按钮脚本
图 17 导出后自动打开文件夹
4附加信息
4.1通过脚本新增参数
Sub OnLButtonUp(ByVal Item, ByVal Flags, ByVal x, ByVal y) Dim tbl1,colSet tbl1 = ScreenItems("tbl1") '新增参数Set col = tbl1.GetValueColumnCollection.AddItem("R1-Script")'参数列名col.Caption = "R1-Script" '归档变量col.Provider = 1'归档变量名称col.TagName = "TBL\R1" '时间轴col.TimeColumn = "时间"End Sub图 18 新增参数脚本
图 19 新增参数运行效果