转载请注明:http://write.blog.csdn.net/postedit/13044767
1 任务描述
1.1 报表生成时间
0时10分
1.2 打印时间
打印机自动打印
1.3 报表格式
标记说明:
(1)AVE:每时DATA的平均值
(2)MAX:每时DATA的最大值
(3)MIN:每时DATA的最小值
(4)每时:每整点的瞬时值
|
2 运行环境
Windows XP Sp3 英文版;WinCC Runtime V7.0 Sp2; Excel 2003
3 结构说明
WinCC的OnlineTableControl负责数据采集和导出,Excel负责处理格式和计算,VBS负责自动化。
4 代码
4.1 自动定时导出数据,得到csv文件
不难发现Bill Gates超喜欢Basic。
Tag的归档周期设为1h,OnlineTableControl的时间范围选2 - Number of measurement points填8个点。控件中Export标签的“Show Dialogue Window”去掉,不然自动过程会被弹出框打断。
WinCC中写下如下VBS全局脚本,Tigger设定为Cyclic 1s:
Option Explicit
Function action
If Hour(Now)= 13 And Minute(Now)= 10 Then
Dim objScrWindow
Dim objTable
'shift to wanTest.pdl
If Second(Now)= 0 Then
Set objScrWindow = HMIRuntime.Screens("main").ScreenItems("workspace")
objScrWindow.ScreenName= "wanTest"
End If
'export to csv
If Second(Now)= 5 Then
Set objTable= HMIRuntime.Screens("main.workspace:wanTest").ScreenItems("Control1")
objTable.ExportFilename= Year(Now)&"-"&Month(Now)&"-"&Day(Now)
objTable.Export()
End If
'realse OnlineTableControl stop button
If Second(Now)= 10 Then
Set objTable= HMIRuntime.Screens("main.workspace:wanTest").ScreenItems("Control1")
objTable.StartStopUpdate()
End If
'run vbs
If Second(Now)= 12 Then
Dim objWScript
Set objWScript = CreateObject("WScript.Shell")
objWScript.Run "C:\Export\OnlineTableControl\excelVbs.vbs"
End If
End IfEnd Function
实际应用后,定时自动切画面这个功能新奇但略显诡异,于是将OnlineTableControl控件窗口缩小到指甲壳大小,藏在main画面的另一个控件之后,实现完全的后台运行,由于脚本并没有调用.Activate方法,所以画面的正常操作与报表后台打印之间并不影响,实际测试也验证了这一点。
4.1.1 VBS切换WinCC画面
切换WinCC画面中某窗口画面:HMIRuntime.Screens(BaseScreenName.ScreenWindow:ScreenName).ScreenName = "Newpdl"
4.1.2 VBS时间
Now:2013/10/28 21:47:39
Hour(Now):21 Minute(Now):47 ...
4.1.3 VBS操作WinCC控件
’wanTest中OnlineTableControl的名称为Control1
'WinCC的VBS函数和方法可以从其自带的帮助文档中查到
导出数据:Control1.Export()
更改导出文件名称:Control.ExportFilename = "string"
'在导出操作时,stop按钮会自动按钮,若不松开切画面不切换,下次导出的数据仍是老的数据
启停:Control.StartStopUpdate()
4.2 VBS操作Excel,不同文件间剪切数据,自动分列,自动打印
文件间的动作通过VBS来实现,单个文件内的动作通过VBS调用VBA宏来实现。
录制宏真是一个了不起的创意。其实程序粗浅来理解,不就是人的一连串动作的实现及其自动化吗?
Excel文件,工具-选项-安全性-个人信息选项:保存时从文件属性中删除个人信息,勾选去掉,不然自动化过程会被弹框打断。VBA使用MS Office中的“VBA项目数字证书”(推荐)或将宏安全级别设为低,不然宏不能执行。
分列宏:
Sub Macro3()
'
' Macro3 Macro
' Macro recorded 28-10-2013 by admin
'
'
Sheets("Sheet1").Select
Columns("B:F").Select
Selection.ClearContents
Columns("A:A").Select
Application.CutCopyMode = False
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1)), _
TrailingMinusNumbers:=True
End Sub
打印宏:
Sub Macro6()
'
' Macro6 Macro
' Macro recorded 28-10-2013 by admin
'
'
Sheets("Sheet2").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
Sheets("Sheet1").Select
ActiveWorkbook.Save
End Sub
VBS源码:
dim csvPath,csvName
csvPath = "C:\Export\OnlineTableControl\"
csvName = Year(now) & "-" & Month(now) & "-" & Day(now) & ".csv"
'copy data from csv
Dim objExcel
Set objExcel = CreateObject("Excel.Application")
objExcel.WorkBooks.Open(csvPath + csvName)
objExcel.Windows(csvName).Activate
objExcel.Range("A1 : A9").Select
objExcel.Selection.Copy
objExcel.ActiveWindow.Close
'paste to xls, TextToColumns, print out, save
objExcel.WorkBooks.Open(csvPath + "wan.xls")
objExcel.Windows("wan.xls").Activate
objExcel.Sheets("Sheet1").Select
objExcel.Range("A1 : A9").Select
objExcel.ActiveSheet.Paste
objExcel.Run "Macro3"
WScript.Sleep 1000
objExcel.Sheets("Sheet2").Select
objExcel.Run "Macro6"
objExcel.ActiveWindow.Close
objExcel.WorkBooks.Close
分列后,wan.csv的sheet1得到便于处理的数据,sheet2中可以任意编辑报表格式,框的大小、字体等等,数据格
link到sheet1的指定位置,例如:sheet2某个格子需要取sheet1中B2的数据,则填=Sheet1!B2。若link其他excel的格子则:='new.csv'!$B$2。
最大值的计算对于excel更是轻松了,如=MAX(B4:B11),稍微研究一下,就发现自己以前完全没有真正认识到excel的威力。
5 小结
各自做各自擅长的事:WinCC采集原始数据,定时触发,导出到文件;VBS协调一切,在WinCC全局脚本、Windows、Excel中都有其身影;Excel完成各种格式要求、简单的运算、打印;自动定时打印报表就这么实现了。