WINCC水电气能源报表案例将每天的水电气用量计算出来存到WINCC自带的数据库。 并自动生产EXECL报表。 报表的方式就是每天的水电气用量。

最近在做一个工业自动化项目,客户要求把厂区水电气用量统计做成日报表。用WINCC自带的数据库存数据,每天自动生成带折线图的Excel文件。折腾了几天终于跑通整个流程,这里分享几个关键代码片段。

先上数据库操作的核心部分。WINCC的数据库其实是个SQL Anywhere,用ODBC连接。我在全局脚本里写了段定时存储的VBScript:
vbscript
Dim conn, cmd, strSQL
Set conn = CreateObject("ADODB.Connection")
conn.Open "DSN=CC_UserDB_01;UID=sa;PWD=12345678"
strSQL = "INSERT INTO EnergyData (Timestamp, Water, Electricity, Gas) VALUES ('" & Now & "', " & HMIRuntime.Tags("WaterFlow").Read & ", " & HMIRuntime.Tags("PowerMeter").Read & ", " & HMIRuntime.Tags("GasFlow").Read & ")"
Set cmd = conn.Execute(strSQL)
If conn.State = 1 Then conn.Close
这段代码每小时执行一次,把实时量值存进数据库。注意时间戳用了NOW函数,实际项目中最好用WINCC内部时间同步,避免服务器和现场设备时间不一致。

日报表生成的关键在于SQL查询。每天凌晨1点触发的脚本里这样处理:
vbscript
' 计算昨日总量
Dim yesterday
yesterday = DateAdd("d", -1, Date)
strSQL = "SELECT SUM(Water) as TotalWater, SUM(Electricity) as TotalElec, SUM(Gas) as TotalGas " & _
"FROM EnergyData WHERE Timestamp BETWEEN '" & FormatDateTime(yesterday, 2) & " 00:00:00' AND '" & FormatDateTime(yesterday, 2) & " 23:59:59'"
Set rs = conn.Execute(strSQL)
If Not rs.EOF Then
dayTotalWater = rs("TotalWater").Value
dayTotalElec = rs("TotalElec").Value
dayTotalGas = rs("TotalGas").Value
End If
这里有个坑:WINCC的时间字段带毫秒,直接用BETWEEN可能漏数据。后来改成时间戳>=开始时间 AND 时间戳<次日零点才稳定。

生成Excel用了个骚操作------直接调用WINCC自带的报表模板。在画面里藏了个静态的Report控件:
vbscript
Dim objReport
Set objReport = ScreenItems("DailyReport")
objReport.ReportName = "EnergyDaily.rpl"
objReport.TimeRangeType = 4 ' 自定义时间范围
objReport.StartTime = yesterday
objReport.EndTime = DateAdd("d", 1, yesterday)
objReport.ExportFormat = 1 ' Excel格式
objReport.ExportFileName = "D:\EnergyReports\" & FormatDateTime(yesterday, 2) & ".xlsx"
objReport.Export
模板里预置了数据绑定和柱状图,导出的Excel自动带样式。不过要注意文件路径权限问题,遇到过几次因目录不存在导致脚本卡死的状况,后来加了个自动创建文件夹的校验:
vbscript
Function CreateFolderIfNotExists(path)
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(path) Then
fso.CreateFolder path
End If
End Function
实测这套方案每天生成300KB左右的Excel文件,半年数据用WPS打开也不卡。客户后来追加需求要邮件自动发送,用CDO.Message配合WinRAR命令行压缩附件又折腾了一晚上...不过那就是另一个故事了。
最后提醒:WINCC的VBScript不支持后期绑定,操作Excel时如果用CreateObject("Excel.Application")记得在全局脚本设置"Microsoft Excel对象库"引用,否则在有的工控机上会报神奇的错误码。