WINCC水电气能源报表案例:每日用量计算与自动存储至WINCC数据库并生成EXECL报表

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对象库"引用,否则在有的工控机上会报神奇的错误码。

相关推荐
咨询qq 87622396515 小时前
深度学习python项目--垃圾图像分类识别 关键模型:VGG19DenseNet121Res...
游戏美术
da_vinci_x4 天前
PS 神经滤镜:一张夏天变雪景?场景美术的“季节魔术”
人工智能·3d·aigc·建模·游戏美术·pbr·场景美术
top_designer7 天前
PS 样式参考:3D 白模直接出原画?概念美术的“光影魔术手”
游戏·3d·prompt·aigc·技术美术·建模·游戏美术
da_vinci_x7 天前
PS 图案预览 + Sampler:告别“修接缝”,AI 量产 4K 无缝 PBR
人工智能·游戏·aigc·贴图·技术美术·游戏美术·法线贴图
da_vinci_x9 天前
PS 3D Viewer:3D模型直接拖进画布?宣发美工的“降维打击”
游戏·3d·prompt·aigc·技术美术·建模·游戏美术
da_vinci_x11 天前
PS 生成式扩展:从 iPad 到带鱼屏,游戏立绘“全终端”适配流
前端·人工智能·游戏·ui·aigc·技术美术·游戏美术
da_vinci_x12 天前
Sampler AI + 滤波算法:解决 AIGC 贴图“噪点过剩”,构建风格化 PBR 工业管线
人工智能·算法·aigc·材质·贴图·技术美术·游戏美术
da_vinci_x12 天前
PS 3D Viewer + AI 生成:灰盒(Greybox)一键变“3A”概念图
人工智能·游戏·数学建模·3d·prompt·aigc·游戏美术
da_vinci_x13 天前
Sampler 风格化滤镜:拒绝“写实”,AI 一键生成“塞尔达”风草地
人工智能·游戏·aigc·材质·技术美术·游戏美术·pbr