
上周五下班前车间主任扔给我一句话明天早会前把上个班次的产量、设备运行时间和故障次数统计出来。接到这种需求很多人的第一反应是打开WinCC的趋势曲线手动拖时间范围眯着眼睛估个数再截图贴到Word里。这不是报表这是遭罪。那一次我没有动一行脚本从晚上八点折腾到深夜把WinCC里所有能“零代码”做报表的路子全部捋了一遍最后交付的是一份每天凌晨自动生成、可以直接发给领导的班次产量Excel表。这篇文章就把这套方案的完整链路摊开讲清楚。先说明一下我理解的“零代码”不写VBS脚本、不写C脚本、不碰WinCC内部的编程接口全部靠PLC逻辑、WinCC组态配置、数据库访问和Excel公式来完成统计。这不代表方案简单而是把统计责任重新分配到正确的位置上。只要责任分配对了报表这件事还真不一定非写代码不可。1. 一张班次报表逼出来的零代码路线动手前先拆需求1.1 报表需求背后的三个隐藏问题车间主任要的那张表表面上就是几行数字产量多少、运行时间多少、故障几次。但稍微一拆就会露出三个平时没人提的问题。第一时间边界怎么定。班组交接是几点晚班跨过零点怎么办白班从早上八点到晚上八点中班从下午四点到凌晨零点这些边界如果不定义清楚Excel里的数据永远对不上。第二累计量的基准是什么。产量是班次内的增量还是设备总表在班次结束时的读数差值如果PLC里已经有一个总累计值报表要的是增量那必须在换班时刻把差值算出来并且锁存住。第三统计对象是过程值还是归档值。过程值是当前值归档值是历史值报表要的是历史就必须在变量归档里留有完整的数据。这些问题如果不在动手前想清楚后面十有八九要返工。我见过太多了报表控件拖上去了数据也有但是一看数值就知道不对——班次产量比实际多了一倍一查是因为把总产量当成班产量导出了。1.2 WinCC报表相关组件的分工WinCC这套软件虽然看着复杂但和报表相关的组件就那几块摸清楚分工之后选型非常快。变量归档Tag Logging负责把过程数据写进SQL Server数据库。这是整个报表体系的地基没有归档就谈不上历史报表。在线表格控件和在线趋势控件负责在画面里展示归档数据纯组态绑定零代码能在画面上实现的主要就是这一层。报表设计器Report Designer负责打印布局可以把归档数据、变量值、报警信息组织成固定格式的打印页面。最后一个是数据库访问这条暗线因为WinCC的归档数据全部落在SQL Server里Excel通过ODBC连过去想怎么统计就怎么统计这是真正灵活度的来源。1.3 为什么纯配置路线在WinCC里完全走得通很多人觉得WinCC不做二次开发就做不出像样的报表这个印象主要来自早期版本和网上那些复杂案例。但实际项目中大概七成的统计需求用配置就能解决。原因很简单WinCC的数据链路是完整的。PLC负责采集和累计WinCC负责归档和显示SQL Server负责存储Excel负责分析和输出。每一层都有标准工具把手唯一的问题是很多人不知道把手在哪。PLC可以做班次累计和快照WinCC的表格控件可以直接绑定归档变量Excel通过ODBC可以把数据库里的归档表整个拉下来再用透视表按班次汇总。代码在哪个环节都不是必须的。2. 数据底座是报表的命根子变量归档参数直接影响统计准不准2.1 采集周期、死区和归档类型的选择逻辑先给一个反直觉的结论报表不准往往不是计算错而是归档参数配错了。采集周期决定数据密度。对产量、流量这类过程值如果设备运行稳定1秒采集一次已经足够但对瞬态过程或者报警联锁前后的状态变化可能需要加到100毫秒。不要盲目追求高密度因为归档数据量会成倍增加查询报表的时候SQL Server的反应速度和画面打开速度都会变慢。死区Deadband是为了过滤微小波动。比如压力在设定值附近小幅抖动如果死区设为0每个抖动都会写入归档数据量大而且没用设了死区只有变化幅度超过设定值才记录。死区设置太大会导致真实波动被吞掉报表上的曲线就会缺角。我的经验是对稳定过程值死区设成量程的0.5%到1%比较合理对需要精算的累计值死区干脆设0避免丢量。归档类型也要分清过程值归档记录的是信号的瞬时值适合画趋势、算平均值累计值归档适合记录产量、流量这类需要持续累加的变量。类型选错了报表的统计口径就会跟着错。2.2 累计量放PLC还是放WinCC这是原则问题我强烈建议凡是和产量、运行时间、故障次数相关的累计量全部在PLC里算WinCC只负责显示和存储。原因有三个。PLC的扫描周期固定累计逻辑按扫描周期执行不依赖上位机的Windows系统时钟WinCC的脚本定时器受系统负载影响高峰时可能延迟几百毫秒甚至更久。PLC的掉电保持区能保证断电后累计值不丢WinCC如果做累计一旦计算机关机重启进程断了累计就得重新开始。PLC的累计逻辑可以用梯形图或SCL写得非常明确现场维护工程师看得懂也改得快WinCC里的VBS累计脚本过半年再看很多人自己都忘了当初为什么这么写。这不是说WinCC做累计绝对不行小型项目、对精度要求不高的场合用WinCC脚本凑合也能用。但凡是正经的班次报表、月度统计我全部优先考虑PLC侧累计。2.3 归档数据落到SQL Server后能直接拿来用吗可以而且这正是零代码方案最核心的底牌。WinCC运行时归档变量会写入项目的SQL Server数据库通常数据落在Windows的“SQL Server实例”对应数据库中。具体表名不同版本有差异但通过SQL Server Management Studio连接数据库之后浏览以“Archive”“PDE”等关键字命名的表基本就能找到。查这些表会看到时间戳、变量ID和数值字段。需要注意WinCC的归档时间戳是UTC还是本地时间视配置而定统计报表一定要先确认时区口径否则早八点的产量会跑到下午八点去。另外SQL直接查归档表适合做离线分析和Excel拉数不适合在WinCC画面里高频刷新因为WinCC运行时自己也同时在写库外部查询太频繁会影响性能。3. 纯组态实现班次报表全程不写脚本的配置路径3.1 PLC侧做好两件事班次累计和交接快照报表要稳定先把PLC侧的统计逻辑设计好。以一条三班倒的生产线为例每班八小时换班时间是零点、八点和十六点。PLC里需要做两件事一是维护本班累计变量二是换班时把累计值锁存到“上一班快照”变量组里然后清零本班累计。换班触发可以用时间条件也可以用WinCC写入一个换班脉冲变量。用时间条件的好处是即使WinCC没开、操作员忘了点按钮PLC自己也会到点换班报表数据不会断。用WinCC写入换班脉冲适合人工干预比较多的场合比如操作员确认交接后才切换。关键点在于快照锁存。如果换班时直接清零报表只能读到“当前正在累计的本班值”上上个班的数据就丢在历史里了。所以要做两级变量本班累计值持续累加和上一班快照值换班瞬间复制本班值。报表画的永远是“上一班快照”而不是本班累计的实时读数。3.2 画面组态在线表格控件绑定归档变量的完整步骤WinCC画面里做零代码报表最常见的方法是拖一个WinCC Online Table Control在线表格控件把归档变量绑上去。具体步骤大概是在画面编辑器里找到在线表格控件拖到画面上。右键打开属性对话框在“变量”页签里选择要显示的归档变量可以多选。设置时间范围可以固定为“昨天八点到今天八点”也可以做成动态表达式。设定更新周期报表画面不要求毫秒级刷新设成60秒足够降低数据库负载。绑定完变量之后控件会自动从归档表里把对应时间段的数据拉出来显示。列宽、排序方式、是否显示时间戳都在属性里配。这一套操作下来连一行VBS都不用写。但这里有一个很多人踩过的坑在线表格控件显示的是原始归档记录不是统计汇总。也就是说它能把一个班次里每一秒的流量都列出来但不会自动告诉你这个班次总产量是多少。所以在线表格控件适合做明细查看不适合直接当统计报表交差。3.3 班次切换与时间卡控用动态对话框实现“上一班”要真正实现“上一个班次自动出现在报表里”需要给时间范围配一个动态表达式。WinCC的动态对话框Dynamic Dialog允许用户用图形化的方式配置表达式不需要写脚本语言。思路是这样的当前时刻减去当前时间在班次内的偏移量就得到本班开始时间。再往前推一个班次时长就得到上一班开始时间。上一班结束时间就是本班开始时间。这一组表达式配置在表格控件的时间范围属性里画面每刷新一次自动计算时间窗口报表永远显示上一个完整班次。动态对话框虽然不用写脚本但它是个小型的表达式编辑器第一次用会有点绕。我建议先在纸上把公式写清楚再去表达式编辑器里拖变量拼公式。实际配置时我还会额外做两个显示框把“报表开始时间”和“报表结束时间”显示在画面上方便操作员核对当前看到的是哪个班次的数据这个习惯帮我避免过好几次误判。3.4 报表落地的三种输出方式画面上的表格控件只是第一步真正交到领导手里的还得是Excel、打印件或者PDF。最省事的输出方式是画面打印。WinCC画面支持直接发送到打印机把表格控件所在窗口调成适合打印的尺寸操作员一键打印或者设置定时打印任务就能输出纸质报表。这种方式适合车间内部存档和交接班使用。第二种是Excel导出。WinCC自带的功能可以把表格控件内容导出为CSV或Excel格式。在控件属性里配置允许导出运行画面上会多出导出按钮操作员点一下就能把当前时间范围的数据存成文件。这个导出动作本身是组态配置的仍然不需要脚本。第三种是把数据链路直接打通到Excel用ODBC连接数据库定时刷新。这种方式已经不是“导出一份文件”而是“报表本身就是Excel”。我会在下一节详细展开因为这才是“灵活数据统计”的真正答案。4. 标准报表控件不够用的时候Excel加数据库才是灵活统计的天花板4.1 用ODBC把WinCC归档数据拉到Excel里当表格控件满足不了复杂的汇总需求时换一条路绕开WinCC画面直接用Excel连WinCC的SQL Server数据库。操作步骤也很简单。第一步在运行WinCC的电脑上打开ODBC数据源管理器新建一个“SQL Server Native Client”数据源服务器地址填WinCC对应的SQL Server实例名数据库选择WinCC项目对应的数据库。第二步在Excel里选择“数据→获取外部数据→从其他来源→从SQL Server”填上刚才配置好的数据源名称就能看到数据库里的表。第三步找到归档变量表导入。导入时只选时间戳、变量值和变量ID这几个字段数据量大的时候可以先加筛选条件只拉最近一个月。这一步做完Excel里就躺着WinCC记录的全部历史数据了。“灵活”二字到这里才算真正落地——因为Excel的透视表、SUMIFS、图表全都是现成的统计工具想按班次、按天、按产品型号汇总无非是拖几个字段的事。4.2 透视表搞定产量、运行率和故障分布举一个实际例子。某设备有三个归档变量班产量、运行状态、故障代码。导出到Excel之后把班产量字段拖到透视表的“值”区域汇总方式选“求和”再把时间戳字段拖到“行”区域按小时或者按天分组。一分钟就能得到一条日产量趋势线。设备运行率的算法稍微绕一点运行状态这个变量只有0和1两种值在透视表里算平均值得到的就是一个班次内运行时间的占比。比如平均值是0.79就意味着设备在该班次内79%的时间处于运行状态。再乘上班次时长就是实际运行小时数。故障分布统计就更直观了把故障代码放到透视表行区域把故障发生次数放到值区域按“计数”汇总哪类故障最多一眼就能看出来。我在实际项目里甚至把这段Excel公式做成了模板换一个项目只需要重新配置ODBC数据源和列名模板直接复用。4.3 定时刷新、SQL视图和连接数限制的注意事项Excel拉数默认是一次性导入数据不会自动更新。要让报表每天自动刷新可以在Excel的“连接属性”里勾选“刷新频率”比如每10分钟刷新一次或者用“数据→全部刷新”手动控制。更高级一点可以用Windows任务计划程序定时打开Excel并执行刷新再把文件另存为PDF发送到指定文件夹这套流程完全可以脱离人工。还有两个性能上的坑需要提前避开。第一Excel直接连原始归档表数据量一大查询就慢。解决办法是在SQL Server里创建一个视图把表名、字段名、筛选逻辑都封装好比如只保留“最近7天的班次产量”Excel连接的视图速度会快很多。第二SQL Server的连接数有限WinCC运行时刻本身占用着数据库外部查询频繁容易造成连接等待。我的处理办法是控制刷新频率报表查询尽量不要短于5分钟一次同时把Excel的连接超时时间调大避免偶尔数据库繁忙导致查询失败。5. 现场排查实录许可证、通讯中断和“无显示”的真实处理过程5.1 WinCC V15.1/V8.x许可证报错的定位思路热词里出现“V15.1找不到许可证WinCC Comfort”和“V8.1激活”说明不少人在安装激活这块吃过亏。先帮大家捋一下产品线WinCC V7.x和V8.x是SCADA系统平时做大型上位机项目用的就是它们WinCC Comfort是TIA Portal里集成的面向精简面板的组态软件包含在博途的框架里WinCC Flexible则是更早的独立HMI组态工具。三者许可证体系完全不同报错原因不能混在一起查。“找不到许可证”这个问题我排查过多次最常见的原因是自动化许可管理器中没有正确注册许可证。打开Automation License Manager查看已安装的许可证列表确认对应版本的许可证是否显示绿色可用状态。如果许可证存在但软件不认多半是许可证服务未启动或者软件版本与许可证版本不匹配。V15.1如果用的是升级包还需要确认基础版本是否先装好了。WinCC V8.1激活时要特别注意许可证传输方向。把USB授权盘里的许可证传到电脑时建议选择“复制”而不是“移动”保留授权盘上的备份万一电脑系统重装还能再传一次。激活完成后重启一下许可证服务再启动WinCC基本就能解决。5.2 KepwareEX与WinCC通讯中断导致报表数据断档KepwareEX作为OPC服务器负责把PLC数据转发给WinCC。一旦中间链路抖动WinCC侧看到的是一段“坏值”或“无数据”归档表里就会出现时间戳断档。报表上的表现是某个时段曲线是平的汇总值明显偏低。排查顺序先看KepwareEX的通道状态通道是否连接质量戳是否为Good。再看WinCC的OPC客户端连接确认变量状态显示的是“质量良好”。如果质量戳变差检查PLC侧通讯模块是否掉线、以太网物理链路是否闪断。日常维护上我有两个建议一是归档变量启用质量戳过滤质量不是Good的数据不写入归档避免坏值污染统计二是在KepwareEX里对关键变量开启死区和数据变化触发减少不必要的数据传输降低链路负载。这两条做好之后通讯中断引起的报表数据异常会少很多。5.3 在线表格控件打开一片空白的排查顺序画面上的表格控件“无显示”或“无数据”我遇到过不下十次。排查顺序一般是固定的先检查控件属性里有没有正确绑定变量变量名拼写错误是最低级的坑。再检查对应的变量是否真的在归档有些变量忘了添加到归档组里表格控件自然查不到历史数据。然后看时间范围如果设置的时间段里没有归档数据界面自然是空的。最后检查控件刷新周期和Windows控件运行环境WinCC画面需要管理员权限才能正常加载ActiveX控件权限不够时控件会一片空白。这一套查下来八成的问题都能定位。剩下两成通常和软件补丁版本有关系升级到最新的Service Pack基本能解决。5.4 WinCC Flexible工程打开无显示的修复经验WinCC Flexible打开工程正常但图形界面显示不出来这个我修过一次。问题出在显卡兼容性上——老版本的WinCC Flexible在Win10、Win11系统上默认使用旧版渲染模式高分辨率屏或新显卡驱动下容易黑屏或花屏。处理办法是右键WinCC Flexible的启动图标在“兼容性”选项卡里把“替代高DPI缩放行为”打开并尝试兼容模式运行。如果还不行更新显卡驱动或者在显示设置里把缩放比例调成100%再打开工程。还有一个容易忽略的点工程路径不能含中文字符和特殊符号以前接过一个项目工程放在“D:\报表\上位机\”下面WinCC Flexible打开就黑屏改到“D:\HMI\Project1”之后再打开就正常了。这些坑说大不大但每一个都能耗掉半天时间。做报表项目的朋友建议把这五条当成环境检查清单新现场上线之前先过一遍能省掉很多临时救火的麻烦。最后补一句我的个人体会。零代码做WinCC报表关键不在于“有没有写脚本”而在于把统计逻辑放到正确的地方——PLC管累计和快照WinCC管归档和展示数据库管存储Excel管分析。这四个环节各司其职大部分统计需求都不需要碰代码。真遇到非写脚本不可的复杂场景也建议先回头看看是不是数据底座没设计好因为底座对了很多问题根本不会出现。