WinCC + Excel + VBS = 定时自动打印报表

转载请注明: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)每时:每整点的瞬时值
TAG COMMENTTotal FlowGas FlowAir Flow
TAG NOFI-123FI-456PIA-789
UNITNm3/hNm3/hkPa
06:00999999999999-9.99
07:00999999999999-9.99
08:00999999999999-9.99
09:00999999999999-9.99
10:00999999999999-9.99
11:00999999999999-9.99
12:00999999999999-9.99
13:00999999999999-9.99
AVE999999999999-9.99
MAX999999999999-9.99
MIN999999999999-9.99


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.BaseScreenName = "Newpdl"

切换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

分列TextToColumns在VBS下做了几次都不成功,干脆放到excel宏里面做,这样层次也很清晰。

分列后,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完成各种格式要求、简单的运算、打印;自动定时打印报表就这么实现了。









  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值