1. WinCC报表想要“灵活”,先得换成配置思维
前阵子一个产线改造项目里,对方生产部提了个很典型的需求:想统计每班产量、每台设备的运行时长,还要能让班组长自己选历史日期,随时查之前某几天或某个班次的数据。他们副厂长补了一句话:“最好别每次都请你们改程序,我们自己也能用。”这句话基本定调了:项目只能用 WinCC 标准思路去做报表,避开C脚本、VBS和一键导Excel这类看着很“硬核”的做法。最后这套报表从变量准备到画面上线,一行代码没写,靠的是WinCC自身提供的变量记录、用户归档再加上表格控件的组合。
很多人一听“WinCC报表”,第一反应是“用脚本读数据库”。如果只是做一个固定的一次性报表,脚本确实最快;但要满足生产人员隔三差五改口径、换时间范围、加一列少一列的诉求,脚本反而最慢。因为每个改动都要动工程,要重新下装,搞不好还得停机。而WinCC标准组件搭出来的报表,操作工自己在运行画面上就能选时间、选设备,管理员也能通过组态改表格列,完全不需要在代码里翻逻辑。
这篇主要针对WinCC V7.x和WinCC Professional这类常见的SCADA组态环境,讲清楚一条不写代码也能实现灵活统计报表的路径。核心思路一句话:统计口径尽量在设计时配置,展示交给WinCC标准控件,报表要做成“能选、能筛、能导出”的东西,而不是一次性的快照。
1.1 报表灵活与否,关键看数据的组织方式
做报表之前先问三个问题:数据从哪来?数据怎么存?展示给谁看?
很多报表最后做死了,问题就出在第一步。比如有人直接想在WinCC里把某个累计量在交接班时做差值,再算一个班产,这属于在报表层做统计。如果这个统计逻辑将来要调整,报表本身就得跟着改。更稳的办法是把统计粒度推到采集层:PLC能累好的就让PLC累,PLC不方便就靠变量记录的触发方式,让WinCC只负责把已经成型的值按时段查出来。
这里说的“灵活”不是指什么都能算,而是指使用方能够自由选择时间范围、数据源和展示形式。要做到这一点,必须在创建报表画面之前,把报表背后的数据对象理清楚。数据对象不应该是一个个孤立的原始点,而应该是“某台设备某班累计合格数”“某条产线某日运行秒数”这种带业务含义的统计项。
1.2 WinCC自带的报表能力,别只盯着数据库
WinCC在报表方面常常被低估。大家印象里它就是个组态监控软件,习惯性把报表功能交给第三方BI工具,或者直接让程序员后台连SQL Server去查。其实标准WinCC里已经能承载日常百分之七八十的报表需求,而且不写代码的方式主要有三种:
第一,用在线表格控件直接展示归档变量,操作员可改起止时间;第二,用用户归档存放班次、批次、班组等基本资料,实现按条件过滤;第三,用画面打印或标准布局输出PDF和Excel,完成报表分发保存。这三种方式互相组合,覆盖日常统计足够了。
真正的难点不是不会用控件,而是很多人不知道WinCC的表格可以那么配。报表画面拉一个在线表格控件,很多人只会把它当趋势表看,实际上它还能设置归档选择、时间范围和刷新方式。把时间范围输入框、设备下拉列表和表格放在同一个画面,运行时数据流就完整了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 底层数据准备:这一步做不好,报表再漂亮也白搭
报表画面是最后一步,数据准备才是大头。在做画面之前,先把“什么变量要记录”“记录成什么样”“记录多长时间”这三件事定了。数据准备不是拼积木,而是要考虑到报表将来的时间跨度、统计精度和查询速度。
2.1 归档变量的记录周期和触发方式怎么选
过程值归档是WinCC里最常用的数据来源。比如要查一台电机从几点开到几点,最直接的办法是给运行状态做一个1秒周期的归档,报表里看到“1”的时间就是运行时长。这个用法直观,但有一个隐患:如果设备状态频繁变化,1秒周期会产生大量重复数据,历史库膨胀很快。
更合理的做法是用“变化时记录”或“位触发”。打开WinCC变量管理里的相关归档设置,可以把记录方式设成变化时归档,或者按变量位状态变化触发记录。这样设备状态一改,系统记录一行;状态不变,就不产生冗余数据。报表取数时用时间范围一卡,数据量小,查询也快。
再就是统计值的粒度问题。要做一个班次的产量报表,最省事的做法是让PLC在每个班次结束时把整班累计值写到某个变量里,WinCC再用定时记录或变化记录把这个最终值记下来。如果PLC里没有班次累计功能,WinCC也能退而求其次用秒级或分钟级记录保存瞬时值,但这些瞬时值在报表端做“累计差”就得用到计算列,零代码的边界会变薄。
2.2 别把统计口径埋进代码里,用变量命名和归档组来固化
报表做到后期,最怕发生的事:某一天生产人员问“A线晚班产量怎么比昨天低20%”,你打开报表工程,发现那个值是一长串脚本从五个变量里算出来的,一时半会根本说不清口径。
零代码项目的额外收益是“口径看得见”。推荐的做法是:在WinCC变量管理里,把需要上报的统计值单独建一个分组,命名规则包含线别和班次,比如LineA_Output_NightShift、LineA_Output_DayShift。这些变量本身不参与控制逻辑,只做采集和报表展示,读起来一目了然。
有条件的话,把这些变量加到一个独立的“报表归档”组,而不是分散在默认分组里。归档组的好处是能统一设置采集周期、存储期限和导出范围。到报表里选择数据源时,只要选这个组,表格自动把组内所有统计项都带出来,后续新增设备也只需要往组里加变量,报表不用改。
2.3 用户归档:放统计字典,不是放流水账
WinCC用户归档最容易被忽略。它像个轻量数据库表,可以存班组名单、产品型号、设定温度区间、质量判断标准这类静态资料。报表要做筛选,靠的就是这些静态维度。
举个例子,现场有十条产线,每条线上报的数据都带一个产线编号,但操作员看报表时显然不想看到数字代码,希望看到“一号线”“二号线”这样的名字。把产线编号和产线名称的对应关系放进用户归档,在线表格里用条件列关联一下,展示出来就能变成可读的名称。
用户归档的更新可以在画面上做,也可以定时从外部导入,不需要重启WinCC。这点在零代码方案里很有用,因为生产调整设备名称和班组是常事,操作员权限允许的话,他们自己就能维护这份统计字典,不用请工程师改程序。
2.4 给历史数据留出足够的存储空间
灵活报表有一个容易被忽视的坑:归档存储时间不够。想做一年内的任意历史查询,但如果过程值归档只配置了30天存储期,那么第61天去看第31天的数据就已经空了。报表做出来,看着历史记录“断档”,十有八九是这个问题。
配置时不要只看WinCC默认参数。建议按月需求评估:至少把存储周期设置成需求时长的两倍,比如客户要求半年内能查,归档就留一年。如果现场硬盘紧张,可以做两层:过程值归档短期精度保存一个月,月底由标准作业把当月统计结果以报表文件形式归档到专门目录。长期查询靠“统计报表文件库”,短期明细查询靠WinCC实时归档,这样既控制存储成本,又能兼顾灵活度。
3. 实操示例:从变量组到班产量统计报表上线
原理说完,放到一个具体的“班产量统计表”例子里看操作路径。这个案例不追求覆盖所有WinCC版本,核心步骤在V7.4、V7.5以及TIA Portal WinCC Professional图形编辑器里都能找到对应入口,就是菜单名称会略有差异。
3.1 先画出报表数据链路
假设现场有三条装配线,每条线有一个班产量变量和一个当日运行时间变量。需求是生产部每天早会要看前一天的班产汇总,最好能自己输入日期,还能比较三个班的数据。数据链路可以这样设计:
PLC侧每条线在换班时产生两个值:当班产量和当班运行秒数。WinCC侧建立六个归档变量,每个变量都采用“变化时记录”,确保换班瞬间把最终值写进历史库。报表画面上放一个起止时间选择控件,再放一个在线表格控件,选择这六个归档变量做列。运行时操作员选好昨天的起止时间,表格就能显示这段时间内每次换班记录的具体数值。
实际操作中不必严格要求PLC换班时点写入,也可以直接在WinCC变量管理里建六个“内存变量”,把产量、运行时间作为数值变量记录,用系统内部定时器触发记录。但这样做有个缺点:WinCC电脑重启期间数据会丢。从项目抗风险角度,我通常建议统计累计逻辑放在控制器,WinCC只做记录和展示。
3.2 WinCC图形编辑器里配置表格列
报表画面不用做得太花哨,关键是把表格控件用好。从控件工具栏拖入“WinCC Online Table Control”之后,先改控件属性里的数据源。大多数新手会忽略这个属性,以为拖进来之后表就会自动显示所有变量,结果运行起来是空表。
正确的配置顺序是:打开控件属性对话框,找到“Archive”相关页签,添加归档连接;然后在“选择”里勾选需要显示的变量列。如果你已经按上面的建议建好了独立归档组,操作会更快,一次把整组变量带进来。列的顺序当场可以调整,字段标题也可以改成“一班产量”“二班产量”“一班运行时长”这类中文名称。
这些列配置存储在画面里,意思是将来想看某个新变量,进组态编辑画面,在控件属性里勾上就行。不需要重新编译,不需要写任何逻辑,所以它天然适合反复调整的场景。
3.3 让操作员自己选日期和时间段
很多人做报表习惯把时间范围写死在画面里,或者用固定脚本取系统当天日期。想做到真正的“灵活”,要把时间选择权交给使用者。
WinCC图形编辑器自带的时间选择控件可以直接绑定在线表格控件的时间属性。操作员运行报表时,点开日历控件选一个起始日期和时间,再点“刷新”,表格就自动加载对应时间段的数据。这个操作完全是标准控件联动,不需要代码参与。如果现场操作员习惯直接输入时间,也能在画面上放两个输入域,分别绑定开始时间和结束时间变量,按钮的作用只是把时间变量传给表格控件。
建议默认起始时间设为当天0点,结束时间设为当前时刻,这样操作员一打开报表看到的是今天实时数据,点开报表不用先填一堆条件。
3.4 画面打印与PDF导出配置
报表只有在能被保存和分发时才有价值,总不能让人抄到Excel里。WinCC画面里可以放置一个“打印”按钮并绑定系统打印功能,直接把整个画面保存成PDF。如果还需要Excel格式,可以把在线表格控件另存为CSV或Excel,这个也属于控件自带功能。
在运行属性里设置好默认保存路径,比如按日期命名文件夹,一天一个文件,PDF文件命名带上时间戳。这一套下来,日报就能自动落盘。后需要补一份纸质版,打印也只是一键的事。
整体看,案例里的核心工作是什么?是建变量、配归档、拉控件、设时间范围。这些工作不需要软件开发能力,但需要工程师对业务需求有理解。你有没有把“班产”这个统计口径提前设计好,直接决定了后续报表画面的简洁程度。
4. 让报表再进一步:按设备、班次、报警类别做筛选
第一个版本的表可能只解决了一个问题:看历史。但现场报表的需求很少只有一张表,通常还需要在不同条件之间切换。这一节说的“灵活”是更高级的灵活:不是换一个时间范围,而是能够换一个观察角度。
4.1 用下拉列表做设备维度的切换
设备数量少的时候,每个设备单独一张报表画面勉强能接受。产线一多,十台设备十个画面,维护起来很痛苦。更好的做法是同一张画面,设备列表作为变量,表格控件里通过筛选条件只显示当前选中设备的数据。
在WinCC画面里放一个下拉列表组合框,选项是设备名称,运行时选中哪台设备,就触发一个内部变量变化。在线表格控件的数据源可以按照这个内部变量做条件过滤,于是表格里自动只显示这台设备的数据。这套联动是WinCC组态属性层面的能力,不需要脚本,只要把控件属性里的过滤条件配置好。
实际项目中我最推荐这种“一个画面、一个模型、一个设备参数”的思路。以后新增设备,用户只需要扩展下拉列表选项,报表画面不用复制十份。
4.2 借助用户归档扩展自定义维度
如果想要“按班组”筛选,还能继续沿用这个思路。把班组名单放在用户归档里,报表画面上的下拉框数据源直接指向用户归档的某个字段,表格过滤条件对应上。这样一来,操作员选择“甲班”,看到的就是甲班在不同设备上的数据;选择“乙班”,表格内容随之刷新。
这种扩展有一个前提:每条历史数据必须带班组标签,否则数据根本无从筛选。因此在建变量阶段,班次、产线、设备这三个字段要作为关键属性,要么体现在变量名里,要么显示在表格列中。变量命名规范在零代码报表里的价值,这时候会体现得非常彻底。
4.3 做“可追溯的日报表”而不是“当天的趋势图”
很多人以为有趋势图就够了,打印出来在底下写几句话就算报表。但传统日报表需求的往往是一张表格:某一时刻的数值、某一段的累计、变化前后的差异。信息要能追溯、能复核,而不是一条平滑曲线。
在WinCC里做这种追溯性表格,可以用归档控件加筛选条件,把关键点的值写成一行。例如早班换班时记录一次产量,中班换班时再记录一次,一天结束就有了三个点。报表里每个点独立成行,操作员一眼能看到是从零点几增加到几点几,中间有没有异常跳变。配合“变化时记录”的归档方式,这些点不会丢失,也便于追溯当时的上下文。
5. 不写代码方案的实际边界与排错经验
零代码不等于万能,把它用在哪一段、不用在哪一段,心里要有数。最后把我在项目里反复踩过的边界和坑总结一下。
5.1 哪些场景零代码够用,哪些场景必须留后门
操作类报表、历史数据查看、交接班统计、设备运行记录,这些用在线表格加筛选基本都能覆盖。但如果要做很复杂的多表关联计算,或者每个月底要生成几十页带自定义公式的报表,WinCC标准控件就有点吃力了。遇到这种情况,我一般建议把WinCC的职责限定在数据采集和初步归档阶段,后端用独立的商业报表工具或者数据中间表来接。这不算否定零代码,而是把工具用在对的位置。
零代码方案最适合的,是那些需要频繁小步调整的产线报表。因为大家改动的时候不需要重新编译程序,组态调整一下,保存运行就完事。现场班组长自己都会操作,这种感觉是脚本方案给不了的。
5.2 几个高频问题:数据不显示、时区不对、时间格式看着难受
报表画面配置完,运行起来最常见的问题是“表格空白”。不要急着怀疑数据采集,先按顺序排查:第一,变量是否启用了归档;第二,时间范围是否选对,尤其是跨天时开始时间晚于结束时间;第三,归档变量是否真的产生了数据,如果PLC侧没有变化,变化时记录就不会有数据点。
第二个高频问题是时间格式。WinCC报表里显示的数据时间经常是英文格式,跟车间习惯的中文年月日不一致。这个问题大多数不是WinCC本身设置,而是操作系统区域语言不一致。WinCC 7.5里如果运行画面的显示文字用的英文系统,报表时间格式会自然跟着变成英文。解决方式是把工程和运行环境的时间格式统一,在系统区域里设置成北京时间格式,同时WinCC项目管理器的语言设置保持一致,重启运行系统后格式就正常了。
第三个问题是跨客户端报表时间错乱。WinCC服务器和客户端如果系统时间差了十几秒,报表里看起来没什么问题,但做精确到秒的设备动作追溯时会导致记录“跳到未来”。SCADA环境里建议服务器和客户端统一做时间同步,这是一个看似无关但实际影响历史数据完整性的基础项。
5.3 做好归档管理,防止报表越跑越慢
零代码做的报表如果在运行半年后开始变卡,问题几乎都在归档数据量。不控制归档点数、不设置合理的存储周期、所有变量都按一秒周期记录,数据库再大也会被拖垮。
建议每个项目周期做一次归档体检:哪些变量已经不上报表了,哪些记录周期可以放长,哪些变量从PLC侧已经废掉。WinCC的归档管理工具里可以调整存储周期,也可以停用不用的归档变量,给历史库“减肥”。灵活报表不是堆数据,而是要保证要查的数据还在、不要的数据能及时清出去。当你把数据治理做得足够好,报表控件会一直保持流畅,和刚上线时差不多。
5.4 文档和口径说明一定要留在画面旁边
零代码报表最大的隐患不是做不出来,而是做出来以后没人知道统计口径是什么。比如这个累计值是零点开始清零,还是从开机到当前一直累计?当月报表“月产量”是自然月累加,还是盘点周期累加?不留说明,后面换个人维护,很容易理解错。
我习惯在报表画面上加一个“查看口径”按钮,点开是一个文本窗口,写清楚每个关键字段的定义、归档方式和清零策略。这个文本窗口就是页面属性里的文本对象,不写代码,纯组态。别看这个动作简单,实际运行中大部分需求变更都是因为新来的人看着数字不对,想知道“你到底统计的是啥”。有口径说明,能省掉很多沟通成本。
WinCC报表这件事,做到最后会发现,零代码带来的直接好处是灵活,间接好处是安全和可维护。现在每次有新报表需求,我们第一反应不是打开脚本编辑器,而是先去问数据源、问口径、问使用场景,然后把组件一节一节搭起来。这套方式不一定适合所有复杂分析场景,但在绝大多数车间级的“历史数据查询和班次统计”需求里,已经够用且可靠。你在自己的项目里也可以从小范围开始试,先拿一张班产量报表验证流程,再逐步往设备利用率、报警统计这些方向拓展,走通的概率很高。
