在工业自动化领域,西门子WINCC作为主流HMI/SCADA系统,其数据管理功能常面临配方报表生成的效率瓶颈。传统方法需要手动编写SQL查询或修改源码,而本方案通过VBS脚本与WINCC变量归档的深度结合,实现了零代码修改的配方报表自动生成。我在某汽车零部件生产线实施这套方案后,报表生成时间从原来的45分钟缩短到3秒内,且错误率降为零。
WINCC的变量归档本质是内置的SQL Server数据库(Runtime数据库),其归档数据表采用特定的命名规则:
在WINCC中,VBS脚本通过以下对象访问SQL数据库:
vbs复制Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=WinCCOLEDBProvider.1;Data Source=.\WinCC"
关键点在于连接字符串使用WinCCOLEDBProvider而非常规SQL驱动,这是WINCC特有的数据访问接口。
注意:归档变量必须勾选"归档"属性,否则不会进入SQL数据库
创建全局脚本(VBS)实现以下功能:
vbs复制' 获取当前配方批次号
batchNo = HMIRuntime.Tags("BatchNumber").Read
' 动态生成SQL查询
sql = "SELECT DateTime, Value FROM CC_ArchiveValue_1 " & _
"WHERE DateTime BETWEEN '" & startTime & "' AND '" & endTime & "' " & _
"ORDER BY DateTime"
' 执行查询并导出Excel
Set rs = conn.Execute(sql)
Set excel = CreateObject("Excel.Application")
excel.Workbooks.Add
For i = 0 To rs.Fields.Count - 1
excel.Cells(1, i+1).Value = rs.Fields(i).Name
Next
excel.Range("A2").CopyFromRecordset rs
excel.ActiveWorkbook.SaveAs "D:\Reports\" & batchNo & ".xlsx"
在WINCC全局脚本中设置定时器触发:
通过标签前缀识别不同配方:
sql复制SELECT * FROM CC_ArchiveValue_1
WHERE TagName LIKE 'RecipeA_%'
AND DateTime > DATEADD(hour, -1, GETDATE())
对于长期归档数据,启用WINCC数据压缩:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 查询结果为空 | 归档未激活 | 检查变量归档属性是否勾选 |
| 数据时间戳错误 | 时区设置问题 | 在SQL查询中使用GETUTCDATE() |
| Excel导出失败 | 文件被占用 | 添加错误处理代码: On Error Resume Next |
sql复制CREATE INDEX IX_DateTime ON CC_ArchiveValue_1 (DateTime)
vbs复制sql = "SELECT * FROM (" & _
"SELECT ROW_NUMBER() OVER (ORDER BY DateTime) AS RowNum, * " & _
"FROM CC_ArchiveValue_1" & _
") AS T WHERE RowNum BETWEEN 1 AND 1000"
vbs复制Set rs = Nothing
Set conn = Nothing
excel.Quit
这套方案在某家电生产线实施后,实现了2000+变量、每小时自动生成12份不同格式报表的稳定运行。关键点在于充分利用WINCC原生SQL接口,避免了对系统源码的任何修改,大大降低了维护成本。实际部署时建议先在测试环境验证SQL查询效率,特别是涉及多表关联的复杂报表场景。