尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

WinCC/博图WinCC通用日月年报表配置化控件制作全攻略

发布时间:2026/9/17 1:07:06

资讯中心
01
ARTICLE

WinCC/博图WinCC通用日月年报表配置化控件制作全攻略

WinCC/博图WinCC通用日月年报表配置化控件制作全攻略
干工控的兄弟应该都有同感报表这东西单看技术含量真没多高可真到了项目交付的时候能把你折腾得够呛。我前前后后用WINCC和博图WINCC做过十几个项目发现十有八九的甲方都会提一个需求——要日月年报表而且不是简单拉一条趋势曲线是要按白班、夜班、按天、按月、按年统计产量、能耗、运行时间、故障次数。这类需求用传统方式做基本就是脚本里一段一段写死SQL换一个项目就要重写一遍变量一多、班次一改维护成本直线上升。后来我把报表功能提炼成了一个配置化的数据分析工具做成WINCC和博图WINCC通用的日月年报表控件配置好变量清单和统计口径日、月、年报自动出数还能通过Web和OPC UA把数据传给上面一层系统配套的视频教程也方便现场维护的人自己翻着看。这篇文章不聊理论就聊这套控件从设计、开发到现场落地的完整过程包括数据库建表、WinCC脚本挂载、聚合逻辑、远程访问以及我在现场遇到的那些坑。1. 先说清楚这个控件到底解决什么问题1.1 传统做法为什么让人头大在WINCC项目里做报表我见过最多的三种土办法。第一种是人工记录。每天零点班组长抄表把产量、电表度数记在Excel里月底再手工汇总。这种办法在设备少、管理松的小厂还能凑合一旦设备超过十台、班次一多数据对不上、漏记错记都是家常便饭领导要数据的时候根本拿不出来。第二种是在WinCC里写死报表脚本。全局脚本里写几十条SQL每查一个变量写一条变量表一变更就得满世界找脚本去改。更麻烦的是很多项目是上一家公司做好交付的后续维护的工程师打开全局脚本看到一堆几十行的INSERT语句根本不敢动。第三种是用历史趋势截图。WinCC自带趋势控件截个图贴到Word里发给领导。这只能看个大概做不了统计更没法分类汇总。这些做法的共性问题是报表逻辑和具体项目绑得太死。报表本身应该是一个可以复用的工具而不是一个项目一套代码。正因为吃够了这些苦我才把报表功能单独拎出来做成了配置化控件。1.2 配置化报表控件提供的解决思路我当时给自己定了几条硬性要求。第一日月年报表要能配置出来变量清单、显示名称、单位、统计方式全部在配置表里维护。现场要加一个变量不用改脚本在配置表里加一行就行。第二要兼容经典WinCC和博图WinCC。经典WinCC跑VBS脚本TIA博图WinCC V16以上也支持VBS这样采集脚本可以做到两套环境通用Unified环境用JavaScript逻辑上迁移也不复杂。第三报表结果要能远程访问。很多项目甲方不在厂里出差的时候也想看产量数据。通过WinCC WebUX发布画面或者把聚合结果通过OPC UA开放给MES系统都能实现。第四交付时必须有视频教程。这不是录个操作演示那么简单要把数据库怎么建、脚本怎么挂、配置表怎么填、报表出不来数怎么查一步步录清楚现场的人跟着视频就能自己维护。1.3 这套方案适合谁参考如果你是做设备运维、工厂信息化、MES对接的工程师或者你正在被甲方追着要产量报表、能耗报表、设备运行率报表这篇文章里的思路和代码可以直接拿去用。即使你用的是别的组态软件这套配置表驱动报表的方法论也是通用的。新手看完能少走很多弯路老手也可以对照检查自己项目里有没有同样的隐患。2. 设计思路拆解配置化是怎么实现的2.1 三层结构到底怎么分工我习惯把整个报表控件拆成三个层采集层、存储层、展示层。采集层负责从WinCC运行系统里读变量周期性地把原始数据写入数据库。这一层在WinCC全局脚本里实现通常是VBS脚本配合定时触发器执行。采集层讲究的是稳定不要用花哨的写法连接串写清楚写入失败要有日志。存储层是SQL Server数据库负责存原始数据和聚合结果。原始数据表记录每个变量的变化值和写入时间日、月、年聚合表则是凌晨算好的结果。为什么要把原始数据和汇总数据分开一是报表打开快二是如果某天报表数据对不上还能从原始数据反查不至于抓瞎。展示层就是报表控件本体我把它做成了一个独立的查询工具也可以是嵌入WinCC画面的ActiveX控件。用户在界面上选日期范围、选变量点生成报表程序自动从聚合表取数生成表格和趋势图并支持导出Excel。查询逻辑统一走配置表不写死任何变量名。2.2 日、月、年报表背后的聚合逻辑很多人以为日月年报表就是查三遍数据库其实不是。我建议把聚合逻辑和查询逻辑分开用预聚合的思路来做。每天凌晨零点5分全局脚本或者SQL Agent任务会自动跑一次日汇总把昨天原始数据表里的数据按变量、按天分类分别做SUM、AVG、MAX、MIN结果写入日聚合表。月报表不用再去扫几十万条原始数据直接从日聚合表里按月求和就行。年报表也从日聚合表或者月聚合表里算。这样报表查询永远很快数据量大也不怕。这里有一个关键点统计口径得可配置。比如有些工厂的一天是早上8点到第二天早上8点不是自然日零点夜班可能是晚上8点到第二天早上8点。我就在配置表里加了一个时间偏移量字段查询的时候把时间窗口整体偏移几个小时后再去做聚合。比如夜班报表查询2025-01-01的数据实际统计的是2024-12-31 20:00到2025-01-01 08:00。这个偏移量必须在界面上可填否则每个项目都要改脚本。2.3 通用的秘密配置表与自动建表配置化控件的灵魂是一张叫TagConfig的配置表。表结构大概是这样字段名说明示例TagNameWinCC内部变量名Line1_OutputDisplayName报表显示名称一号线产量DataType数据类型映射REALAggType聚合方式SUM / AVG / MAX / MINUnit单位件 / kWhPrecision小数位数2TimeOffset时间偏移(小时)-4Enabled是否启用1报表控件启动时自动读取这张表里Enabled1的变量生成下拉列表。用户选定变量后控件的SQL是通过配置动态拼接的类似于SELECT StatDate, Value, Unit FROM DataDay WHERE TagName Line1_Output AND StatDate BETWEEN 2025-01-01 AND 2025-01-31 ORDER BY StatDate;由于所有变量、别名、单位、统计方式都在配置表里新增一个报表项就只是往表里插一条记录完全不用动代码。很多项目用到后期现场工艺员自己都能加统计项了这才是配置化的价值。另外控件内置了自动建表功能。第一次运行时检测到数据库里没有T_DataDay或T_DataMonth自动执行建表SQL。这功能很实用因为很多现场根本没有专门的DBA手动建表容易漏字段。3. 实操落地从数据库到报表跑通一整条链路3.1 版本兼容与基础环境准备先说环境。经典WinCC V7.x和博图WinCC V16以上都跑过这套方案最高验证到V21。WinCC V7.5用VBS全局脚本TIA博图WinCC的RT Professional也可以用VBS脚本主体不用变如果你用的是TIA WinCC Unified那么采集脚本要改成JavaScript但数据库表结构和报表控件本体完全不用动。数据库我建议用SQL Server Express版本就够了报表数据量再大也撑得住。安装的时候注意实例名我常用的是127.0.0.1\SQLEXPRESS这个后面在连接串里要用。博图版本安装这里提醒一句装博图V19的时候很多人卡在端口5111被占用大概率是机器上之前的许可证服务或者SQL相关服务没退干净。装完博图以后再把SQL Server实例装上顺序不要反。另外装完SQL Server以后一定要启动SQL Server Browser服务和TCP/IP协议默认情况WinCC连不上本地SQL八成的坑都在这里。3.2 数据库与表结构搭建打开SQL Server Management Studio新建一个数据库名字我用ReportDB。核心表建议建四张TagConfig变量配置、DataRaw原始数据、DataDay日聚合、DataMonth_Year月/年聚合可以共用一张表加一个PeriodType字段区分。TagConfig建表脚本大概长这样CREATE TABLE TagConfig ( Id INT IDENTITY PRIMARY KEY, TagName NVARCHAR(100) NOT NULL, DisplayName NVARCHAR(100) NOT NULL, DataType NVARCHAR(10) NOT NULL, AggType NVARCHAR(10) NOT NULL, Unit NVARCHAR(20) NULL, Precision INT DEFAULT 2, TimeOffset INT DEFAULT 0, Enabled BIT DEFAULT 1 );原始数据表CREATE TABLE DataRaw ( Id BIGINT IDENTITY PRIMARY KEY, TagName NVARCHAR(100) NOT NULL, Value FLOAT NULL, InsertTime DATETIME NOT NULL );日聚合表CREATE TABLE DataDay ( Id BIGINT IDENTITY PRIMARY KEY, TagName NVARCHAR(100) NOT NULL, StatDate DATE NOT NULL, AggType NVARCHAR(10) NOT NULL, Value FLOAT NOT NULL, UpdateTime DATETIME DEFAULT GETDATE(), UNIQUE(TagName, StatDate, AggType) );DataMonth_Year表把StatDate的类型改成YEAR/MONTH存的值就行其余字段类似。我故意把原始数据和聚合数据分开核心原因是报表页面的查询要快。原始数据可能几十万条每次报表都全表扫描WinCC画面会被拖死预聚合以后报表查询走索引毫秒级返回。3.3 WINCC侧采集脚本怎么挂采集脚本是整套链路最容易断的一环。我最终采用的采集逻辑是在WinCC全局脚本里建一个周期1分钟的VBS动作每分钟把配置表里启用的变量读取一次写入DataRaw表。核心脚本大概是这样Option Explicit Dim conn, tagVal 读取WinCC变量 tagVal HMIRuntime.Tags(Line1_Output).Read 建立数据库连接推荐Windows集成安全 Set conn CreateObject(ADODB.Connection) conn.ConnectionString ProviderSQLOLEDB;Data Source127.0.0.1\SQLEXPRESS;Initial CatalogReportDB;Integrated SecuritySSPI; conn.Open 注意小数点格式德国区域设置经常是逗号 conn.Execute INSERT INTO DataRaw (TagName, Value, InsertTime) VALUES (Line1_Output, Replace(tagVal, ,, .) , GETDATE()) conn.Close Set conn Nothing这里的核心陷阱有两个。第一个是运行账号权限。WINCC Runtime如果以普通服务方式运行默认账号对SQL Server没有访问权限。我建议数据库用Windows集成安全然后把运行WinCC的Windows账号显式加到ReportDB库的db_datareader和db_datawriter角色里。如果在现场不想折腾域账号可以直接用SQL Server混合认证模式单独建一个sa账号给脚本用但密码得存到配置文件里别硬编码在页面脚本中。第二个是区域设置。西门子和欧洲的很多系统小数点分隔符是逗号如果你直接把变量值拼进SQL值会变成12,5SQL Server直接报错。脚本里那句Replace(tagVal, ,, .)就是干这个的别省略。采集周期到底设多少秒我的经验是产量、能耗这类累计型变量1分钟采一次足够了压力、温度这种波动快的看需求通常5到10秒采一次也行。但周期越短DataRaw表的膨胀速度越快建议超过10万条以后做定期清理保留180天就够了日报、月报早就聚合完了原始数据只是一层保险。3.4 报表查询与远程访问报表控件本体是一条独立的查询程序也可以作为ActiveX嵌入WinCC画面。界面不复杂左侧变量列表右侧日期起始和结束一个按日/按月/按年切换点生成按钮后显示DataGridView表格并自动绘制柱状图或折线图。远程访问我提供两种方式项目里可以根据现场条件选。第一种是Web发布。经典WinCC环境用WebUX把运行画面发布出去配置好站点地址以后外部浏览器能直接看到报表页面。这种方式的优点是方便手机也能看缺点是WebUX并发用户数有限要控制访问人数。博图WinCC Unified自带的Web Server也支持类似功能。第二种是OPC UA开放数据。如果报表数据还要给MES或者BI系统用直接在WinCC配置OPC UA服务器把日聚合结果映射成OPC UA节点上层系统定时读取。配置的时候要注意安全策略不要图省事用None至少选Basic256Sha256用户账号单独建一个只读用户不要给超级管理员权限。OPC UA端点端口需要在防火墙放行很多现场远程连不上就是只开了SQL端口忘了OPC UA的4840端口。4. 现场调试遇到的坑与排查技巧4.1 数据链路排查三件套报表数据不对我从来不会先去查报表控件而是沿着链路一层层看。第一步查DataRaw原始表看看有没有数据、数据值对不对、写入时间戳对不对。如果DataRaw里没数据问题在采集脚本如果采集没问题而聚合表不对问题在聚合脚本或者配置表。用SQL直接查一眼比在WinCC画面里猜快得多SELECT TOP 100 * FROM DataRaw ORDER BY Id DESC;如果DataRaw有数据但报表显示为0那十有八九是聚合SQL的时间窗口写错了。我写过一次把DATEADD(day, -1, GETDATE())写成了DATEADD(day, 1, GETDATE())结果聚合任务每天把明天的数据聚合了个寂寞。后来我改成固定用当天日期参数不再用相对时间函数排查起来清楚很多。4.2 弹窗关一次就打不开的真正原因画面弹窗关闭一次就打不开了这个坑博图WinCC项目里特别常见。我遇到一次是报表参数设置弹窗第一次打开正常关闭后再点按钮没反应。排查了很久发现问题出在打开弹窗的脚本里没用对画面窗口对象。很多人的打开脚本是这样写的用一个全局画面窗口每次设置ScreenWindowName为弹窗页面关闭的时候又把这个值清空。第二次打开时脚本从配置里读不到窗口名自然弹不出来。正确做法是打开脚本里每次都先清空再赋值确保画面窗口重新实例化 打开弹窗前先复位 ScreenWindowName ScreenWindowName ReportParam.Pdl关闭弹窗的脚本不要设置ScreenWindowName 只需要把画面窗口的Visible属性设为False或者把弹窗画面自身卸载。这样就避免了窗口对象被清掉以后无法二次创建的问题。4.3 博图HMI仿真按钮无反应怎么办经常有兄弟问博图HMI仿真运行时报表按钮点了没反应。这里有个认知误区——HMI仿真并不是完整版的WinCC Runtime外部数据库连接、ActiveX控件这类依赖系统服务的功能仿真环境下本来就有可能不工作。我排查这个问题的顺序是先在按钮的事件里写一句简单的SetTag或者消息框确认按钮本身能触发如果按钮本身有反应再检查VBS里是不是有报错被仿真环境吞掉了。博图WinCC仿真默认可能不弹出脚本报错需要在运行系统设置里把脚本错误提示打开。如果确实需要在仿真环境里调报表我建议直接把数据库连接串临时改成SQLite或者其他本地文件型数据库仿真调试完再切回正式库。这样不阻塞开发调试也不用在仿真里折腾SQL Server服务。4.4 其他容易被忽略的细节导出Excel打不开是个高频问题。早期我用Excel COM对象生成报表电脑上装了WPS就没反应或者导出多了以后Excel进程没释放文件一直被锁。后来改成用OpenXML直接生成xlsx文件不依赖Office安装稳定多了。日期格式问题也很坑。WinCC系统区域如果是英文或德文日期的格式会是dd.MM.yyyy拼到SQL里经常导致时间范围不对。我的统一规矩是脚本里所有日期都以yyyy-MM-dd的字符串拼SQL数据库字段类型用date/datetime这样无论什么区域设置都不会乱。还有一个细节DataRaw表一定要建索引索引字段是(TagName, InsertTime)。前期数据量小感觉不出来跑了两三个月以后没索引的聚合SQL能把磁盘IO吃满报表页面卡到怀疑人生。5. 常见问题速查与避坑总结5.1 常见问题速查表现象常见原因处理建议报表数据全是0采集脚本没写进DataRaw或聚合时间窗口不对先查DataRaw表数据再查聚合脚本时间条件SQL连接报无法打开登录所请求的数据库WinCC运行账号没有数据库访问权限用Windows集成安全并给运行账号授权博图V19安装报端口5111被占用残留服务占用端口先卸载残留授权服务再装博图日期格式错误导致查询无数据系统区域设置不是中国脚本里统一用yyyy-MM-dd格式画面弹窗第二次打不开画面窗口名被清空后没有重新初始化打开前先清空再赋值窗口名HMI仿真报表按钮无反应仿真不支持外部数据库/ActiveX先确认按钮事件触发再检查脚本报错导出Excel打不开依赖Excel COM对象改用OpenXML生成xlsx文件报表页面越用越卡DataRaw表没建索引或数据膨胀建索引定期清理超过180天的原始数据5.2 多做几个项目后的手感这套日月年报表控件前前后后迭代了三版最大的体会是报表功能越早做成配置化项目后期越省心。你永远不知道现场什么时候会加一台设备、改一个班次、多一个统计口径。与其每次都去翻脚本不如把变的部分交给配置文件把不变的逻辑固化在工具里。最后再分享一个小心得交付的时候录一套完整的视频教程哪怕就40分钟把数据库建立、自动建表、变量配置、脚本挂载、报表生成、远程发布、常见报错都录进去。很多现场问题不用你远程出差维护的人自己翻视频就能解决。报表控件本身是工具配套的视频教程是让工具真正被用起来的关键一步。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。