本文主要介绍如何通过VBS操作WINCC在线数据表格控件。开发环境:/使用限制:1)时间间隔最多至1分钟2)时间范围太长,数据加载可能会比较慢3)导出文件EXCEL没有置顶,导出后要切换到EXCEL程序。扩展性:可扩展选择参数、保存导出文件、生成PDF等功能。本例采用将参数提前组态在控件内,运行中通过复选框来实现选择。也可完全使用脚本实现参数添加。详见附加信息通过脚本新增参数
2运行效果
图1根据选择查询数据

图2导出数据成功

图3在EXCEL中查看导出的数据文件

图4在EXCEL中查看导出的数据文件(选择部分列)
3项目组态3.1画面部件说明

图5测试画面部件说明

3.1.1添加时间控件
添加WINCCActivex控件Dateandtimepicker,如下图:

图6添加时间控件
3.1.2设置导出模板
本例设置的excel文件模板路径:"\\"+ServerName+"\Export\",可根据项目情况采用其它导出路径和模板。如果更换了模板或路径,必须修改导出脚本内的路径。模板内主要设置了字体、数据格式、显示的小数点位数和列宽,也可再增加页眉、页脚、LOGO等,以达到更好的显示效果。
3.2画面打开
在画面打开事件内,设置如下脚本,用于初始化画面内各控件:
SubOnOpen()DimioTimeFactor,tbl1,dtpStart,dtpSettbl1=ScreenItems("tbl1")SetioTimeFactor=ScreenItems("ioTimeFactor")SetdtpStart=ScreenItems("dtpStart")Setdtp=ScreenItems("dtp")'将实际设置的系数显示在设定值上='设置时间系数设置IO域类型为输入=1'设定表格为开始-结束时间范围=1'设置时间控件显示格式=3="yyyy/MM/ddHH:mm:ss"=3="yyyy/MM/ddHH:mm:ss"'设置默认时间范围为当天=FormatDateTime(Year(Now)"/"Month(Now)"/"Day(Now),1)'当天0点=Now'当前时间Sub
图7画面打开事件脚本
3.3选择数值参数版设计

图8添加参数选择复选框
设置复选框,在复选框更改事件下添加脚本:
SubProcess_OnPropertyChanged(ByvalItem,Byvalvalue)Dimi,j,tbl1Settbl1=ScreenItems("tbl1")Fori=0=i'判断筛选框是否被选中,如果是,则设置曲线可见If(valueAnd2^i)0=1=0IfNextSub
图9数据参数显示隐藏设置脚本

图10脚本与控件属性对应关系
3.4设置时间系数
属性:TimeStepFactor

图11修改时间间隔脚本
SubInputValue_OnPropertyChanged(ByValItem,ByValvalue)Dimtbl1Settbl1=screenitems("tbl1")=valueSub
图12修改时间系数
3.5设定时间范围

图13添加时间控件
在查询按钮释放左键事件里:
SubOnLButtonUp(ByvalItem,ByvalFlags,Byvalx,Byvaly)Dimtbl1,dtpStart,dtpSettbl1=ScreenItems("tbl1")SetdtpStart=ScreenItems("dtpStart")Setdtp=ScreenItems("dtp")'设置表格的时间范围=0=="开始时间小于结束时间,请正确设置!",vbOKonly+vbExclamationIfSub
图14时间范围查询按钮事件

图15修改起始时间范围
3.6导出
在导出按钮释放左键事件里:
SubOnLButtonUp(ByvalItem,ByvalFlags,Byvalx,Byvaly)DimobjExcelApp,objExcelSheet,sheetname,ServerName,DataFirstRow,TagValueTagValue=1DataFirstRow=1sheetname="sheet1"ServerName=("@ServerName").Read'获取表格内数据Dimtbl1,col,RowCount,rowDimValue()Dimi,j,kSettbl1=ScreenItems("tbl1")Setrow='行RowCount=(RowCount+1,+2)'重定义数值数组,存储时间、数值。行:记录,列:参数Setcol='数值列'序号Value(0,0)="序号"Forj=1ToRowCountValue(j,0)=jNext'时间列名称=0Value(0,1)==1Fori=1+1'列可见时写数,否则跳出=(i=1)Then'时间列,或数值列显示'数值列名称=i-2Value(0,k)==1ToRowCountValue(j,k)=(j).celltext(i)'注意:celltext()指向数据列(不考虑是否隐藏),当celltext()指向隐藏的列时,数据为空。cellNextk=k+1IfNext'打开Excel模板SetobjExcelApp=CreateObject("")=TrueSetobjExcelSheet=("\\"+ServerName+"\Export\")'模板文件存放位置'写数据至(sheetname).Range(.Cells(1,1),.Cells(RowCount+1,+2))=(RowCount+2,1)="导出人:".Cells(RowCount+2,2)=("@CurrentUserName").(RowCount+3,1)="导出位置:".Cells(RowCount+3,2)=("@LocalMachineName").(RowCount+4,1)="导出时间:".Cells(RowCount+4,2)=(RowCount+5,1)="数据库:".Cells(RowCount+5,2)=("@DatasourceNameRT").(RowCount+6,1)="软件版本:".Cells(RowCount+6,2)=("@ServerVersion").ReadWith'Msgbox"导出成功,请在EXCEL中查看数据",vbOKonly+vbInformation'生成新的文件,关闭ExcelDimpath1,path2,fso,filenameSetfso=CreateObject("")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"(path1)Then'删除重复文件(path1)If',path1'0-xlTypePDF,1-xlTypeXPS,直接另存发现PDF软件不能打开文件,因此改用导出PDF'CreateReport_RH=(sheetname).'关闭EXCEL,不保存'打开导出文件所在的文件夹DimobjShell,strFolderstrFolder=(path1)SetobjShell=CreateObject("")
图16导出按钮脚本

图17导出后自动打开文件夹
4附加信息4.1通过脚本新增参数
SubOnLButtonUp(ByValItem,ByValFlags,ByValx,ByValy)Dimtbl1,colSettbl1=ScreenItems("tbl1")'新增参数Setcol=("R1-Script")'参数列名="R1-Script"'归档变量=1'归档变量名称="TBL\R1"'时间轴="时间"Sub
图18新增参数脚本
图19新增参数运行效果