
只要你的WinCC项目跑过三个月一定躲不开一个需求把历史数据整理成一份像样的报表。WinCC高级报表就是这套数据分析与输出工具的标准答案但默认功能往往不够用需要自己动手做布局、配数据源、定时输出。我在几个过程控制项目里被报表折腾过不少次这篇就把WinCC高级报表从原理到实操讲透包括那些文档里不会写的坑。适合用过WinCC基础功能、打算自己做报表的工程师也适合正在评估WinCC报表够不够用的项目负责人。文章围绕WinCC V7系列展开不同版本菜单名称可能略有差异但整体思路都是通的。我会先讲清楚报表背后的数据流再给出一套可以直接照着做的日报配置流程最后把统计分析、脚本集成和大数据量排坑的经验一并放进来。1. 为什么报表会成为WinCC项目的分水岭1.1 传统报表方式的三个痛点现场很多工程师做报表的方式我见得太多了。第一种等操作员下班之前手动打开WinCC画面用在线表格把数据复制到Excel里再自己拉公式做汇总。这种方式的问题在于数据记录的时间间隔、量程换算一旦错了整张表的数据就没法用。而且人一忙就会漏做连续三个月每天下午五点半手动折腾一次谁都坚持不下来。第二种直接从SQL Server数据库里导出历史归档表原始数据是有了但领导要的是“这台设备今天运行了多久、故障了三次、平均温度是多少”不是几万行原始记录。自己拿原始表去透视、筛选效率低还容易算错。第三种请IT部门写一套独立的报表程序和WinCC各跑各的。我在某个化工项目里见过这种方案表面上很“正规”实际上要维护两套系统数据口径还不一定对得上。WinCC侧停机检修报表系统拿不到数据那边就打出一堆零值反过来IT系统升级数据库报表程序也一起趴窝。这种模式一旦上线后续维护成本高到让人头疼。这三种方式我全都试过说实话都走不远。手动导出依赖人数据库直查依赖对内部表结构的理解独立系统依赖跨团队协作任何一个环节松动报表就不可信了。而报表这个东西最怕的就是不可信。数据错了哪怕只有一次后面所有人都会怀疑你的报表就再也不看了。1.2 WinCC高级报表为什么能解决这些问题WinCC报表系统的基本思路是把“数据的获取”和“展示的样式”分开。你只需要在一个叫布局Layout的设计器里搭好表格框架、页眉页脚然后插入一个叫数据源DataSource的对象告诉它“从哪个归档变量、哪个时间段取什么值”WinCC会在打印或预览时自动从归档数据库里把数据填进去。这个过程完全自动化不依赖操作员临时操作也不要求谁去手工整理数据的一致性和及时性就有保障。它最实用的两个特点一个是定时输出一个是统计能力。定时输出靠打印作业实现你可以配置每天固定时间、每周固定时间甚至用变量或事件触发自动生成报表并送到指定打印机或导出为文件。统计能力则体现在数据源里可以直接配置最大值、最小值、平均值、总和等统计行班报、日报、月报常用的汇总指标不用自己在Excel里写公式。另外还有一个不太起眼但很重要的优势WinCC报表直接基于归档数据库取数和画面、报警用的是同一套数据源。报表数据和操作员看到的趋势、报警记录是一致的口径统一对日后的质量追溯和审计很有价值。我在项目验收时最怕两种数据对不上一个是报表和趋势不一致另一个是报表和上位机历史报警对不上。用WinCC报表系统至少这类问题从根源上就被堵住了。2. 报表系统的核心组件与数据基础2.1 布局与数据源的组合逻辑报表可以理解成一个“模板套数据”的模型。布局就是模板它决定了报表长什么样子公司Logo放在右上角、标题栏用什么文字、表格有几列几行、页脚是否显示页码。布局里所有固定的内容比如表头、说明文字、边框线都是静态元素你画上去什么样打印出来就是什么样。数据源则是报表里会变动的部分。一个报表可以只有一个数据源也可以有多个。比如一份设备日报可以先放一个过程值数据源显示温度、压力、流量的整点值再放一个报警数据源显示当天发生的报警列表甚至可以再加一个统计数据源计算平均值和最大值。把这些数据源按顺序摆放到布局里它们会在预览和打印时依次填充数据每个数据源可以有自己的表格样式和显示范围。这一套组合的思路很值得多说一句因为它解决了“不同岗位看不同报表”的需求。同一个项目里给操作员看的报表和给管理层看的报表完全可以基于同一批归档数据做两份不同的布局。操作员报表只要当班关键参数管理层报表要的则是趋势和汇总指标。只要数据源配置正确两套报表不需要额外的数据准备工作改版也互不干扰。2.2 过程值归档与报警归档没有归档就没有报表这个部分是最多人忽略的。报表不是从画面里抓数据而是从归档数据库里取数。WinCC的数据归档分为两大类一类是过程值归档把采集到的变量值按一定周期或变化阈值保存下来比如温度变量每30秒存一条或值变化超过0.5度时存一条。另一类是消息归档保存报警和事件记录比如某电机过载、某阀门打开、操作员登录等。如果没有配置好这两类归档变量和报警的历史不存在报表里自然什么都查不出来。这里的实操要点是在设计项目初期就要想清楚哪些变量需要出报表为它们配置合适的采集周期和归档周期。采集周期过密一年下来数据库动不动几十GB周期过疏出报表的时间维度和精度就不够。我个人的习惯是报表需要的趋势数据用小周期归档仅用于汇总统计的变量用大周期归档。比如温度、压力这些关键过程量如果需要看瞬时波动30秒甚至10秒归档如果只是用来算平均值、最大最小值5分钟归档完全够用还能显著减少数据库压力。还有一个容易踩的坑WinCC变量记录中可以设置“采集周期”和“归档周期”两个概念。采集周期是变量从PLC读上来的频率归档周期是数据写入数据库的频率。有些人只改了采集周期没改归档周期或者反过来最后报表数据还是不符合预期。你在做报表之前务必先到变量记录里确认每个需要出报表的变量归档周期是设置好的而且要估算一下一天的记录条数。用“时间范围除以归档周期”就能估算出报表的数据量比如一天1440分钟除以5分钟归档就是288条记录这个数量级对报表系统来说非常轻松。2.3 打印作业与时间调度机制打印作业是这个系统里连接“布局”和“实际输出”的桥梁。一个打印作业至少要指定三样东西用哪个布局、输出到哪里、什么时候触发。触发方式可以选几种固定时间触发比如每天08:00生成昨天的日报周期性触发比如每周一早上生成上周的周报变量触发比如某个“报表生成请求”信号从0变1时打印还有手工触发操作员在画面上点按钮立即生成一份当前数据报表。很多项目里操作员对报表的要求往往是“我要看前一个班的报表”。这里建议在画面上做一个“报表预览”按钮调用脚本触发对应的打印作业并把输出目标指向屏幕预览或PDF文件而不是直接把几十页纸打出来。管理层报表则适合用每日自动打印或者发送到指定共享文件夹。搞清谁看报表、什么时候看、看电子版还是纸版再决定打印作业怎么配这是做报表设计的第一步。有一个细节很关键打印作业一旦创建需要项目被激活后才会按照时间表触发。如果你修改了时间设置要重新激活项目或确认打印作业的状态是“已启用”。我遇到过不少次改了触发时间但忘了重新激活第二天报表还是按旧时间跑了或者压根没跑。这种问题在现场排查时最让人头疼因为它不报错只是静默地按错误逻辑执行。3. 手把手配置一个日报系统3.1 新建布局静态框架怎么搭以最实用的日报为例我们目标是每天上午8点自动打印前一天的日报内容包括关键变量的整点值、当天最大值、最小值和平均值以及当天报警统计。第一步在WinCC项目管理器左侧的“报表编辑器”里右键“布局”选择新建布局。默认会打开一个空白的布局编辑窗口。先把页面大小和页边距设好一般选A4横向因为表格列多竖向容易挤。再从工具箱拖入静态文本写好报表标题比如“1号生产线日报”字体大小设置为18到22号加粗居中对齐。页眉处放公司名称和报表编号页脚放当前时间和页码这些在布局编辑器里都可以插入动态文本或页码占位符来自动填充。静态框架的关键是提前规划好每个数据源区域的位置。比如第一块放“整点值表”从左到右依次是时间、变量1、变量2、变量3第二块放“统计分析表”三行分别是平均值、最大值、最小值第三块放“报警汇总表”。把这些区域的框架用表格对象画出来每个数据源都有自己的表格框不能混在一起否则数据源填充时会发生串位。我第一次做报表就犯过这个错把两个数据源拖进了同一个表格框结果数据互相覆盖调试了整整一下午。3.2 配置数据源时间区间和变量的设置第二步把一个过程值归档数据源拖到布局的第一个表格区域。双击数据源进入属性设置。这里最重要的就是时间范围。可以选固定日期时间区间适合测试可以选“最近一天”“昨天”“本周”“本月”等相对时间适合实际运行也可以选“变量绑定”通过某个变量来动态指定开始和结束时间适合做“上一班”这种自定义班次报表。日报的配置通常把开始时间设为“昨天00:00:00”结束时间设为“昨天23:59:59”。之后在“选择”页里从归档变量列表里把你需要出报表的变量勾选进来。这里要说明一下不是变量列表里的全部变量都能选只有配置了过程值归档的变量才会出现在可用列表里。如果你找不到某个变量大概率是它没有归档配置回到变量记录里补上就行。接着设置表格显示格式。每一行显示一个变量的值列可以设置为时间戳、值、单位等。一般日报的整点值报表我习惯每两小时出一个值可以通过“行计数/时间间隔”的设置来控制显示密度。比如归档周期是5分钟你要在报表上每两小时显示一个整点值就要在数据源属性里设置按“2小时”的间隔抽样或者按整点时刻取记录。这样一张A4横向的报表只显示12行数据阅读体验好很多。3.3 配置统计分析行第三步还是在同一个数据源或新建的统计数据源里把平均值、最大值、最小值行加进去。WinCC报表的数据源一般会提供“统计值”的选项你可以选择为每个变量追加最大值、最小值、平均值等统计行这些统计行会作为表格的额外行打印出来。设置的时候最好给统计行单独加一个浅色底纹或者加粗字体让看报表的人第一眼就能抓到重点。这里有个值得注意的地方统计值的计算范围也是基于你设定的时间范围。如果你按“昨天”整一天来统计算出来的平均值就是24小时的平均值。如果你要的是一天三班各自的数据就需要在数据源里按时间段拆出三个统计结果或者做三个打印作业分别设置早班、中班、夜班的时间区间。我做过某个过程控制项目领导要求的是“每日8点到次日8点”的跨天日报而不是自然日。这种情况下时间范围就必须写“从昨天08:00:00到今天08:00:00”。WinCC完全支持这种自定义时间范围只不过你需要想清楚是直接写死在打印作业里还是通过变量或对话框让操作员每次生成前确认时间区间。写死的好处是省事坏处是如果某天报表没跑想补之前的报表就比较麻烦。如果需要补打通常的做法是用手工触发的预览把时间范围临时改一下再打印。3.4 创建打印作业并测试输出布局保存好之后右键“打印作业”新建一个打印作业。选择刚才做好的布局选择目标打印机。很多项目现场没有专用打印机我建议在调试阶段选择“预览”作为输出目标先在电脑上确认报表内容正确再改成真实打印机。先把流程跑通再追求自动化这一步能省掉很多来回改布局的时间。触发时间设置成每天08:00。如果需要在指定日期开始执行设置好开始日期和有效周期。测试环节不能省。我会在把时间范围改成“今天00:00到今天当前时刻”之后先手工触发一次打印作业确认表格布局不串位、统计行数值合理、单位正确再把它改回“昨天”的固定区间。这里还建议检查一下数据源里是否有“数据为空时打印空表”的选项。如果某天凌晨整个工厂停电归档数据断档报表应该正常打印一张带“无数据”说明的表而不是报错退出或者干脆不打印。这个细节在现场支持时特别重要因为停电这种事总会在某个月份突然发生一次。最后再检查一下打印作业的名称是否唯一。很多工程师习惯用“PrintJob1”这种默认名项目里如果还有别的报表很容易搞混。我建议就用“日报_1号线_08点”这种命名方式后面做周报、月报按同样的规则排下来一眼就能看出哪个作业是干什么的。4. 数据分析层面的一些高级玩法4.1 用统计行做生产指标汇总把报表从“数据记录”升级成“数据分析”关键在统计行的使用和组合。日报里的平均值可以用来判断工艺是否稳定最大值和最小值可以看出有没有超限报警行数可以反映设备健康度。把这些基础指标组合起来你就能得到生产部门真正关心的指标。比如设备运行率找一个反映设备运行的变量运行状态为1在统计行里看它的平均值再乘以时间就能折算成运行时长。再比如报警次数TOP排序在报警数据源里按报警文本或触发变量分组统计可以得到高频报警排名这个报表对设备维护部门非常实用能直接暴露哪台设备总在报警。我在某个项目里就做过一张“周报”把一周七天的日均温度、最大温差、设备运行时长、报警次数放在一张表里运维人员再也不用翻趋势曲线猜问题。这种报表做出来以后维护工程师每周一上班先看报表哪台设备不对劲一目了然。这才是报表真正的价值不是数据堆砌而是在数据之上给出可执行的判断依据。4.2 脚本与SQL查询突破默认报表边界默认的数据源能解决七八成需求但总有报表要超出标准格式。比如要按产品批次查数据批次号存在PLC里归档表里只有变量值没有批次维度的结构又比如要把十几个变量按“每台设备一行”的形式整理成横向表格默认数据源做不到这种转置。这时候就需要脚本介入了。WinCC报表布局里可以插入VBS脚本脚本里通过WinCC提供的OLEDB接口去查询归档数据库把查询结果逐行写入报表中的一个表格对象。我举个最简单的思路先在布局里放一个表格对象脚本里用一个连接对象连接WinCC数据库执行类似“按时间范围查询变量值”的SQL语句然后循环把每一行的值写到表格的对应单元格里。这里要提醒两点第一不要直接操作物理表结构WinCC归档数据库的表结构复杂而且会按时间段归档成多段直接写SQL很容易漏数据最好使用WinCC官方提供的OLEDB接口它会在查询时自动处理归档段的切换你只用关心业务条件第二脚本在报表里的执行时机要选对得把“连接数据库”和“填充表格”的代码放到正确的脚本事件里不然会出现表格已经打印但数据还没写完的情况。说实话脚本方案的学习曲线比默认数据源陡一些但一旦会了报表的灵活度会提高很多。我建议维护工程师至少会照着官方例程改一个查询语句很多定制报表就能自己搞定不用每次求人。尤其是一些临时性报表比如“上个批次三个小时的温度曲线”用脚本五分钟改出来比在布局里重新搭数据源快得多。4.3 与Excel模板联动输出还有一种很常见的需求把WinCC的数据交到一张已经设计好的Excel模板里再由Excel的公式和图表完成最后一步分析。比如财务部门要求的标准格式、每天都要发给客户的能耗统计表用Excel模板来承接数据是最稳妥的。实现方式通常有两种。一种是在现场电脑上使用OLE自动化在WinCC脚本里打开一个Excel模板文件把数据从归档里查出来后写到指定单元格保存并关闭。另一种是WinCC报表本身支持导出为Excel文件在报表预览界面或打印作业的“导出”选项里直接把当前报表另存为Excel再由Excel里的宏或者透视表做二次加工。我个人的建议是如果报表格式相对固定首先考虑在WinCC报表里直接做好因为报表本身是定时触发的稳定可靠。只有格式非常复杂、需要大量公式联动或者最终接收方是外部单位时才走Excel模板联动这条路。走Excel这条路要注意版本兼容问题现场电脑上安装的Office版本和开发用的版本最好一致否则OLE接口的调用方式可能有细微差别脚本运行一半报错的情况并不罕见。5. 常见问题与排坑实录5.1 中文乱码和字体问题这个问题遇到过太多次了。布局里默认字体如果是西文字体中文打印出来就是一个个方框。解决办法是在布局属性或者每个文本对象里把字体明确设为“宋体”“微软雅黑”或“SimSun”这类中文字体。还有一个相关坑在开发电脑上显示正常的报表换到现场操作员站上打印中文却变成乱码。这通常是因为现场电脑上没有安装报表布局里用到的那个字体。解决方法是把字体统一成Windows全系列都自带的“宋体”和“Arial”或者在做项目部署时把自定义字体打到操作员站上。导出PDF时对字体更敏感很多字体在PDF虚拟打印机里不支持嵌入中文就会丢字。我现在只要是做PDF报表字体首选“SimSun”页面字体基本上不会出问题。这个经验是踩过几次坑之后才总结出来的一开始用默认字体导出PDF拿到的文件里中文全是方框客户那边直接打回来重做非常狼狈。5.2 跨班跨月报表的时间范围容易搞错新手最容易犯的错是以为“日报”等于“今天00:00到现在”。实际生产中班次往往不是自然日。有夜班跨天的有中班从下午四点到半夜十二点的。设置时间范围时必须精确到分钟而且要理解“从/到”的边界规则一般选择开始时间含在区间内结束时间可能不含这会导致最后一个数据点可能在或不在报表里。排查这个问题的建议是先在报表里加一个“最后一条记录时间”的汇总行或页脚文本打印出来就知道时间边界对不对。或者用预览功能导出一份Excel看最后一行的时间戳和结束时间是否贴合。我在做跨月报表时还经常遇到“本月1号”的写法问题如果直接用“今天减一个月”的脚本函数月底月初容易差一天建议明确用日期函数指定“本月第一天的零点”到“昨天最后一秒”这类边界条件一定要测试几遍。5.3 打印任务不触发或重复打印不触发的原因十有八九是项目没有重新激活。改完打印作业时间表之后只保存了布局和作业配置没有激活项目新的时间表不会生效。另一个原因是打印作业被置成了“已禁用”状态需要回到WinCC项目管理器中右键打印作业选择“启用”。这两点排查完多半就能解决。重复打印这个问题常见于项目反复激活和停止。某些版本的WinCC在项目停止再启动时会把已经存在的打印作业再自动注册一遍结果打印两份。排查时先看打印作业列表里是不是存在重复项删除多余项再检查是否配置了“运行期间自动激活”。这个问题出现一次之后建议同类项目都固定只在一个站上配置打印作业避免多客户端同时触发否则同一张日报可能在两个操作员站上各打一次。5.4 大数据量报表生成太慢跨几个月的日报汇总或者一分钟一条数据的一年趋势表打印一次可能要等很久慢到以为电脑死了。这里有几个优化思路。第一控制查询范围能按周查的不要按年查。第二在数据源里设置抽样方式趋势值可以每10分钟取一条代表值而不必每5秒钟一条全带上。第三把报表拆成多个小报表分别打印而不是一个大报表塞十几张数据表。第四尽量在项目运行时间较长后清理归档分段或做数据库维护归档表过大会拖慢查询。如果报表要长期保留建议输出为PDF或Excel存档不要每次都在线预览大数据量报表。屏幕预览时需要实时渲染全部数据比直接打印还要慢。我在某个项目里做过一张按年度汇总的报表一开始直接预览等了将近十分钟没反应后来改成定时打印并输出PDF运行一年多都很稳定。5.5 报表数据为空的排查思路数据源没数据先按顺序排查归档配置、时间范围和打印作业三个环节。第一个变量是否真的配了过程值归档归档是否已经启动打开变量记录看看“过程值归档”页签里是否有这个变量归档周期是否合理。第二个时间范围是否落在数据实际存在的时间段如果项目昨天才部署完成你设置报表时间范围为“上周”那自然是空表。第三个打印作业是否选择了正确的布局布局里的数据源是否真的被选中了变量而不是只画了个空表格框。我调试时最常用的一招把打印作业的目标临时改成“屏幕预览”把时间范围改成“今天00:00至今”。如果预览有数据说明配置基本没问题只是时间范围不对如果预览还是空的那就回到变量记录去查归档。这一招能快速把问题定位范围缩小到一半不必从头排查。再配合前面说的“最后一条记录时间”页脚基本上一两张报表就能锁定症结。写在最后报表这个东西我个人的体会有两点。第一它不是一个“开发完就结束了”的东西现场的需求会在生产稳定后不断变化今天要加一个变量明天要调整统计口径。所以布局和数据源命名规范一点时间范围尽量用相对时间或少量的写死参数后面对着自己几个月前做的东西才不会一头雾水。第二做报表一定要站在看报表的人的角度想。给操作员看的是当班实时情况给车间看的是班组对比给领导看的是趋势和异常。同一套数据拆成几份不同布局才是真正的“高级报表”。如果大家在做WinCC报表时被某个问题卡住了上面这些排坑思路大多都能用得上。多花点时间把这几步走一遍比翻手册效率高得多。