ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

WinCC与Excel自动化报表实战:VBS脚本实现工业数据高效处理

WinCC与Excel自动化报表实战:VBS脚本实现工业数据高效处理 1. 为什么WinCC与Excel报表结合如此重要在工业自动化领域WinCC作为西门子旗下的经典SCADA系统每天要处理海量的设备运行数据。而Excel则是工程师们最熟悉的数据分析工具。将两者结合可以解决以下典型痛点数据孤岛问题WinCC的变量归档数据通常封闭在系统内部生产部门的同事需要手动导出CSV再加工报表定制困难WinCC内置报表功能灵活性有限难以满足各部门的个性化格式需求自动化程度低传统方式需要人工定期导出数据在交接班或月末统计时尤其耗时我曾在某汽车焊装车间项目中遇到质检部门需要每小时统计焊点合格率报表的情况。最初采用手动导出方式一个班次要重复操作6-8次不仅效率低下还容易出错。后来开发了自动化脚本方案将人力成本降低了70%这就是本文要分享的实战经验。2. 脚本方案的技术选型与原理2.1 主流技术路线对比方案类型实现方式优点缺点VBS脚本WinCC内置脚本编辑器无需额外环境执行稳定功能有限调试困难C#应用程序通过OPC接口读取数据功能强大可扩展性好需要部署运行时环境Python自动化结合pywin32库操作Excel语法简洁生态丰富需安装Python解释器直接ODBC导出配置WinCC ODBC数据源配置简单实时性差无法处理复杂逻辑经过多次实践验证我最终选择了VBS脚本Excel VBA的组合方案。虽然技术看起来老旧但具有以下不可替代的优势零环境依赖 - 所有Windows系统自带所需组件执行可靠 - 作为WinCC原生支持的脚本语言不会出现兼容性问题权限完整 - 可以访问WinCC对象模型的所有接口2.2 核心工作原理该方案的数据流如下图所示文字描述触发机制通过WinCC的定时器或事件触发VBS脚本执行数据获取脚本通过WinCC OLE接口读取变量归档数据格式转换在内存中对数据进行分组、聚合计算Excel交互利用Excel.Application对象实现无界面操作模板应用将处理后的数据填充到预设的Excel模板中输出保存自动生成带时间戳的报表文件并存储到指定路径关键提示务必在脚本中加入错误重试机制。我在实际项目中遇到过因Excel进程卡顿导致的脚本超时问题通过三次重试延迟检测完美解决。3. 手把手实现基础报表功能3.1 环境准备在开始编码前需要确保WinCC项目中已启用变量归档功能并正常记录数据在计算机管理→组件服务中配置DCOM权限具体步骤打开dcomcnfg.exe找到Microsoft Excel应用程序在安全选项卡中赋予WinCC运行账户启动和激活权限准备Excel模板文件建议包含数据透视表框架预设的图表样式公司LOGO等固定元素3.2 核心VBS脚本实现以下是一个读取最近8小时温度数据的示例脚本 获取WinCC运行时对象 Dim objRuntime Set objRuntime CreateObject(WinCC.Runtime.1) 创建Excel应用实例 Dim objExcel, objWorkbook Set objExcel CreateObject(Excel.Application) objExcel.DisplayAlerts False 禁用警告提示 打开模板文件 Set objWorkbook objExcel.Workbooks.Open(D:\Templates\TemperatureReport.xltx) 查询变量归档数据 Dim strSQL, objRecordset strSQL SELECT DateTime, Value FROM Archive WHERE _ TagNameTemperature AND _ DateTime DateAdd(h, -8, Now) Set objRecordset objRuntime.AccessArchive(strSQL) 将数据写入Excel Dim iRow iRow 5 从第5行开始写入 Do Until objRecordset.EOF objWorkbook.Sheets(1).Cells(iRow, 1).Value objRecordset.Fields(DateTime).Value objWorkbook.Sheets(1).Cells(iRow, 2).Value objRecordset.Fields(Value).Value iRow iRow 1 objRecordset.MoveNext Loop 保存报表并退出 objWorkbook.SaveAs D:\Reports\TempReport_ FormatDateTime(Now, 2) .xlsx objWorkbook.Close objExcel.Quit 释放对象 Set objRecordset Nothing Set objWorkbook Nothing Set objExcel Nothing Set objRuntime Nothing3.3 典型问题排查指南问题现象1脚本执行时报ActiveX部件不能创建对象检查步骤确认WinCC Runtime版本是否匹配在管理员命令行运行regsvr32 C:\Program Files\Siemens\WinCC\bin\CCProject.ocx重新注册Excel组件regsvr32 C:\Program Files\Microsoft Office\Office16\EXCEL.EXE问题现象2生成的Excel文件内容为空排查路径在脚本中加入MsgBox输出SQL语句验证查询条件手动执行SQL语句测试使用WinCC DataMonitor检查变量归档是否实际记录了数据问题现象3脚本运行后Excel进程残留解决方案 在脚本最后添加进程清理代码 On Error Resume Next objExcel.Quit Set objExcel Nothing WScript.Sleep 2000 等待2秒 强制结束可能残留的进程 Dim objWMI, colProcesses Set objWMI GetObject(winmgmts:\\.\root\cimv2) Set colProcesses objWMI.ExecQuery(Select * From Win32_Process Where Name EXCEL.EXE) Dim objProcess For Each objProcess in colProcesses objProcess.Terminate() Next4. 高级应用技巧4.1 动态参数传递通过WinCC内部变量控制脚本行为Dim strReportType strReportType objRuntime.GetVariable(ReportType) Select Case strReportType Case Daily strSQL SELECT ... WHERE DateTime Date() Case Shift 根据班次时间动态计算查询区间 Dim iShift iShift objRuntime.GetVariable(CurrentShift) ...班次时间计算逻辑... End Select4.2 多Sheet报表生成在模板中预设多个工作表脚本控制内容填充 汇总表 objWorkbook.Sheets(Summary).Range(B2).Value 生产日报 objWorkbook.Sheets(Summary).Range(B3).Value FormatDateTime(Now, 1) 明细表 With objWorkbook.Sheets(Detail) .Cells(1, 1).Value 时间 .Cells(1, 2).Value 设备1 .Cells(1, 3).Value 设备2 填充数据... End With 图表自动更新 objWorkbook.Sheets(Chart).ChartObjects(1).Chart.Refresh4.3 性能优化实践批量写入技术避免逐个单元格操作 传统方式慢 For i 1 To 1000 objSheet.Cells(i, 1).Value arrData(i) Next 优化方式快100倍 objSheet.Range(A1:A1000).Value Application.Transpose(arrData)内存缓存机制对频繁访问的变量归档数据可以先读取到数组再处理异步执行策略对耗时操作采用后台任务模式 通过WScript.Shell启动异步任务 Dim objShell Set objShell CreateObject(WScript.Shell) objShell.Run wscript.exe D:\Scripts\ReportAsync.vbs, 0, False5. 安全增强方案5.1 文件访问控制 生成带签名的文件名 Dim strSignature strSignature objRuntime.GetVariable(CurrentUser) _ _ FormatDateTime(Now, 0) _ _ Right(CreateObject(Scriptlet.TypeLib).GUID, 4) strReportPath D:\Reports\ strSignature .xlsx 设置文件权限需调用CACLS命令 objShell.Run cacls strReportPath /E /P _ objRuntime.GetVariable(ReportGroup) :R, 0, True5.2 操作审计日志Sub WriteLog(strMessage) Dim objFSO, objLogFile Set objFSO CreateObject(Scripting.FileSystemObject) 按日期分日志文件 strLogPath D:\Logs\Report_ FormatDateTime(Date, 2) .log If objFSO.FileExists(strLogPath) Then Set objLogFile objFSO.OpenTextFile(strLogPath, 8) 8追加 Else Set objLogFile objFSO.CreateTextFile(strLogPath) End If objLogFile.WriteLine FormatDateTime(Now, 0) - strMessage objLogFile.Close End Sub 在关键节点调用 WriteLog 报表生成开始模板 strTemplatePath6. 实际项目案例分享在某化工厂DCS系统升级项目中我们实现了以下高级报表功能智能分班统计 根据时间自动判断班次 Function GetCurrentShift() Dim iHour iHour Hour(Now) If iHour 8 And iHour 16 Then GetCurrentShift A班 ElseIf iHour 16 And iHour 24 Then GetCurrentShift B班 Else GetCurrentShift C班 End If End Function 在SQL中应用班次过滤 strSQL strSQL AND DateTime BETWEEN # GetShiftStartTime() _ # AND # GetShiftEndTime() #异常数据标注 在Excel中设置条件格式 With objWorkbook.Sheets(1).Range(B5:B100) .FormatConditions.Add Type:xlCellValue, Operator:xlGreater, _ Formula1:100 .FormatConditions(1).Interior.Color RGB(255, 200, 200) End With自动邮件发送Dim objOutlook, objMail Set objOutlook CreateObject(Outlook.Application) Set objMail objOutlook.CreateItem(0) With objMail .To productioncompany.com .Subject 生产日报_ FormatDateTime(Date, 2) .Body 请查收附件中的自动生成报表。 .Attachments.Add strReportPath .Send End With这个方案实施后该工厂的报表处理时间从原来的平均45分钟/次缩短到完全自动化运行每年节省人工成本约15万元。更重要的是消除了人为错误导致的数据不一致问题使生产决策更加精准可靠。
返回列表