如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_时间控件JZGKCHINA工控技术分享平台


1

概述

本文主要介绍如何通过 VBS 操作 WINCC 在线数据表格控件。

  • 开发环境:PCS7 V8.2 SP1 / WINCC 7.4 SP1
  • 使用限制:

1) 时间间隔最多至 1 分钟2) 时间范围太长,数据加载可能会比较慢3) 导出文件 EXCEL 没有置顶,导出后要切换到 EXCEL 程序。


  • 扩展性:可扩展选择参数、保存导出文件、生成 PDF 等功能。

本例采用将参数提前组态在控件内,运行中通过复选框来实现选择。也可完全使用脚本实现参数添加。

  • 详见附加信息>通过脚本新增参数


2

运行效果

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_时间控件_02

图 1  根据选择查询数据

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_复选框_03

图 2  导出数据成功

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_时间控件_04

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

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_数据_05

图 4  在 EXCEL 中查看导出的数据文件(选择部分列)


3

项目组态

3.1

画面部件说明

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_时间控件_06

图 5 测试画面部件说明

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_复选框_07


3.1.1 添加时间控件

添加 WINCC Activex 控件 Date and time picker,如下图:

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_复选框_08

图 6 添加时间控件


3.1.2 设置导出模板

本例设置的 excel 文件模板路径:"\\"+ServerName +"\Export\Export.xlsx",可根据项目情况采用其它导出路径和模板。如果更换了模板或路径,必须修改导出脚本内的路径。

模板内主要设置了字体、数据格式、显示的小数点位数和列宽,也可再增加页眉、页脚、LOGO 等,以达到更好的显示效果。


3.2

画面打开

在画面打开事件内,设置如下脚本,用于初始化画面内各控件:

Sub OnOpen() 
Dim ioTimeFactor,tbl1,dtpStart,dtpEnd
Set tbl1=ScreenItems("tbl1")
Set ioTimeFactor = ScreenItems("ioTimeFactor")
Set dtpStart = ScreenItems("dtpStart")
Set dtpEnd = ScreenItems("dtpEnd")
'将实际设置的系数显示在设定值上
ioTimeFactor. OutputValue = tbl1.TimeStepFactor
'设置时间系数设置 IO 域类型为输入
ioTimeFactor.BoxType =1
'设定表格为开始-结束时间范围
tbl1.TimeColumnRangeType=1
'设置时间控件显示格式
dtpStart.Format=3
dtpStart.CustomFormat= "yyyy/MM/dd HH:mm:ss"
dtpEnd.Format=3
dtpEnd.CustomFormat= "yyyy/MM/dd HH:mm:ss"
'设置默认时间范围为当天
dtpStart.Value=FormatDateTime(Year(Now) & "/" & Month(Now) & "/" & Day (Now),1)'当天 0 点
dtpEnd.Value=Now'当前时间
End Sub



如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_复选框_09

图 7 画面打开事件脚本


3.3

选择数值参数版设计

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_复选框_10

图 8 添加参数选择复选框


设置复选框,在复选框更改事件下添加脚本:

Sub Process_OnPropertyChanged(Byval Item, Byval value) 
Dim i,j,tbl1
Set tbl1 = ScreenItems("tbl1")
For i = 0 To item.BoxCount-1
tbl1.ValueColumnIndex= i
'判断筛选框是否被选中,如果是,则设置曲线可见
If (value And 2^i) > 0 Then
tbl1.ValueColumnVisible = 1
Else
tbl1.ValueColumnVisible = 0
End If
Next
End Sub


如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_时间控件_11


图 9 数据参数显示隐藏设置脚本

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_时间控件_12

图 10 脚本与控件属性对应关系


3.4

设置时间系数

属性:TimeStepFactor

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_时间控件_13

图 11 修改时间间隔脚本


Sub InputValue_OnPropertyChanged(ByVal Item, ByVal value) 
Dim tbl1
Set tbl1 = screenitems("tbl1")
tbl1.TimeStepFactor=value
End Sub


如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_时间控件_14

图 12 修改时间系数


3.5 

设定时间范围

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_时间控件_15

图 13 添加时间控件


在查询按钮释放左键事件里:

Sub OnLButtonUp(Byval Item, Byval Flags, Byval x, Byval y) 
Dim tbl1,dtpStart,dtpEnd
Set tbl1 = ScreenItems("tbl1")
Set dtpStart = ScreenItems("dtpStart")
Set dtpEnd = ScreenItems("dtpEnd")
'设置表格的时间范围
tbl1.TimeColumnIndex=0
If dtpStart.Value < dtpEnd.Value Then
tbl1.TimeColumnBeginTime=dtpStart.Value
tbl1.TimeColumnEndTime =dtpEnd.Value
Else
Msgbox "开始时间小于结束时间,请正确设置!",vbOKonly+vbExclamation
End If
End Sub



如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_数据_16图 14 时间范围查询按钮事件

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_数据_17图 15 修改起始时间范围


3.6

导出

在导出按钮释放左键事件里:

Sub OnLButtonUp(Byval Item, Byval Flags, Byval x, Byval y) 
Dim objExcelApp,objExcelSheet,sheetname,ServerName,DataFirstRow,TagValue
TagValue=1
DataFirstRow=1
sheetname="sheet1"
ServerName = HMIRuntime.Tags("@ServerName").Read

'获取表格内数据
Dim tbl1,col,RowCount,row
Dim Value()
Dim i,j,k
Set tbl1 = ScreenItems("tbl1")
Set row = tbl1.GetRowCollection'行
RowCount=row.count
Redim Value(RowCount+1,tbl1.ValueColumnCount+2)'重定义数值数组,存储时间、数值。行:记
录,列:参数
Set col = tbl1.GetValueColumnCollection'数值列
'序号
Value(0,0)="序号"
For j = 1 To RowCount
Value(j,0)=j
Next
'时间列名称
tbl1.TimeColumnIndex=0
Value(0,1)=tbl1.TimeColumnName

k=1
For i = 1 To tbl1.ValueColumnCount + 1
'列可见时写数,否则跳出
tbl1.ValueColumnIndex= i-2
If tbl1.ValueColumnVisible Or (i = 1) Then '时间列,或数值列显示
'数值列名称
If i > 1 Then
tbl1.ValueColumnIndex= i-2
Value(0,k)=tbl1.ValueColumnName
End If

For j = 1 To RowCount
Value(j,k)=tbl1.GetRow(j).celltext(i)'注意:celltext()指向数据列(不考虑是否隐藏),
当 celltext()指向隐藏的列时,数据为空。cell
Next
k=k+1
End If
Next

'打开 Excel 模板
Set objExcelApp = CreateObject("Excel.Application")
objExcelApp.Visible = True
Set objExcelSheet = objExcelApp.Workbooks.Open("\\"+ServerName +"\Export\Export.xlsx")
'模板文件存放位置
objExcelSheet.Activate

'写数据至 EXCEL
With 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").Read
End With

'Msgbox "导出成功,请在 EXCEL 中查看数据",vbOKonly+vbInformation

'生成新的文件,关闭 Excel
Dim path1,path2,fso,filename
Set 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=path1
objExcelApp.Worksheets(sheetname).SaveAs path1
objExcelSheet.close False'关闭 EXCEL,不保存
objExcelApp.Quit
'打开导出文件所在的文件夹
Dim objShell,strFolder
strFolder=fso.GetParentFolderName(path1)
Set objShell=CreateObject("Wscript.Shell")
objshell.Run strFolder
End Sub



如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_数据_18

图 16 导出按钮脚本

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_时间控件_19

图 17 导出后自动打开文件夹


4

附加信息


4.1

通过脚本新增参数

Sub OnLButtonUp(ByVal Item, ByVal Flags, ByVal x, ByVal y) 
Dim tbl1,col
Set 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



如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_数据_20

图 18 新增参数脚本

如何通过 VBS 操作 WINCC 在线数据控件并导出至 EXCEL(附带程序)_复选框_21

图 19 新增参数运行效果