值班室的LED大屏需要每天按固定节奏自动切换显示各工段的关键画面,车间主任要在办公室通过网页远程查看实时趋势,而月底的产量报表还要能按班组自动统计、导出Excel——这三个需求单独拎出来都不算难,但当它们同时出现在一套WinCC 7.0-7.5的画面上时,细节问题就一个接一个地冒出来了。
这篇文章把我在实际项目里做的这套“报表+全屏轮播+WEB发布”组合方案完整拆开讲,包括脚本怎么写、全屏怎么做到“真全屏”、Web Navigator发布要踩哪些坑,以及没有Web授权时的替代思路。整套方案适合有WinCC基础、正在做监控大屏或远程浏览项目的工程师参考,看完可以直接拿去用。
1. 项目整体设计与方案定位
1.1 这个方案到底要解决什么问题
很多厂里的WinCC项目最开始只有一两台操作员站,画面自己看、报表月底手工从变量记录里导出。但做到第二期就变了:领导要看大屏,车间要看远程,班次要对比产量,这些都是很现实的需求。
具体到我这个项目,需求可以拆成三条独立的线:
- 报表线:把WinCC采集到的变量历史数据按日/周/月汇总,自动生成表格,支持导出Excel,最好能进一步写入外部数据库供MES调用。
- 大屏线:在控制室或展厅的大屏上,WinCC运行系统启动后自动全屏,多个画面按设定时间循环切换,不需要人干预。
- 远程线:通过局域网或互联网,让其他电脑用网页浏览器直接打开WinCC画面和报表,不安装完整WinCC客户端。
这三条线在技术上是相对独立的,但都要挂在同一套WinCC 7.x项目上,所以规划时要统一架构,避免后面反复返工。
1.2 为什么选WinCC 7.0-7.5而不是其他方案
选型的时候我也考虑过用组态软件自带的冗余功能、单独开发Web系统、或者直接用第三方报表工具,但最终都否掉了,原因很直接:
- WinCC 7.x的归档系统本身就是一个SQL Server数据库(7.0-7.4是内置的SQL Server,7.5使用SQL Server 2019/2022),数据基础已经具备,做报表不需要额外建库。
- 画面轮播用WinCC自身的VBS脚本就能实现,不需要外部调度软件,可靠性足够,不依赖第三方服务。
- Web发布用官方Web Navigator是最稳妥的路径,画面和变量直接复用,不需要重做网页前端。
相比之下,如果另起炉灶做一套B/S系统,画面要重新画、变量要重新对接,工期至少翻一倍,而且跟WinCC原生画面的一致性很难保证。对于大多数工厂场景,在WinCC基础上扩展是性价比最高的路线。
1.3 版本差异与授权问题的提前确认
这里要先把丑话说在前面:WinCC 7.0到7.5跨越了非常多版本,7.0和7.5的Web Navigator在安装方式、授权类型和浏览器兼容性上有明显差异。
我做项目时用的主力版本是WinCC 7.4 SP2和7.5 SP2,这两个版本在功能上比较接近,下面的方案也是基于这两个版本写的。如果你还在用7.0或7.2,整体思路一致,但有些菜单位置、脚本API会有区别。
授权方面,Web Navigator是需要单独授权的,而且授权是按连接数算的,比如Web Navigator 5客户端、10客户端。这一点投标和采购的时候要提前讲清楚,不然后期交付时会非常被动。报表和全屏轮播不需要额外授权,只用WinCC的标准功能就能实现。
2. 报表系统的设计与实现
2.1 数据归档链路:从变量采集到数据库落地
要做报表,先得有历史数据。WinCC里的变量分为原始变量和归档变量两类。原始变量就是你在变量管理里建的连接变量,它只有当前值;要形成历史趋势、能查过去某一天的数据,必须给变量创建“过程值归档”。
归档的本质是往SQL Server数据库里持续写入数据。以WinCC 7.5为例,数据库名一般是项目名+WinCC,例如CC_ProjectName_24_01_01_01_01_01这样的格式。过程值归档的存储方式有两种:
- 周期性归档:按固定时间间隔采样存储。
- 变化归档:只在数值变化时存储。
做报表常用的产量、温度、压力、流量这类变量,我一般建议用周期性归档,采集周期根据工艺要求定,比如1秒、5秒或1分钟。这里有个经验:积累的归档数据会越来越大,WinCC默认的数据库存储上限大约是2GB(老版本)或更多(新版本),超了之后旧的归档段会被自动覆盖。如果要做月度报表,建议至少每季度做一次归档数据导出备份,否则数据丢了找不回来。
2.2 报表设计:用控件还是用外部Excel
WinCC自带报表能力比较尴尬:它有一个“报表编辑器”(Report Editor),但在7.x里主要用来生成项目文档和数据库报表,做运营类的数据报表并不是它的强项。我实测下来,运营报表最好用的有两种实现方式。
第一种是在画面上放WinCC的在线表格控件(WinCC TableControl)或趋势控件(WinCC OnlineTrendControl),直接显示实时/归档数据,操作员在屏幕上就能看。这种方式适合做日查询面板,比如选择起始时间和结束时间,表格控件会自动查归档数据显示出来。
第二种是把数据导出到Excel,用Excel做二次汇总和图表。这需要在VBS脚本里用ADODB连接WinCC的归档数据库,把查询结果写到一个临时CSV或直接操作Excel对象。这第二种方式我后面会给一个简化的代码示例。
两种方式各有用处:画面控件适合日常点选查看,Excel导出适合月度统计和汇报材料。如果厂里要求自动生成PDF报表并定时发送邮件,那就要再加第三方工具了,比如VBS调用PDF打印机或对接邮件服务,这个不在本文展开。
2.3 用VBS把归档数据导出到Excel
先声明一下,这个方法是基于我自己的项目实践总结的:WinCC 7.x的VBS可以通过ADODB组件直接查询数据库,查到的数据再写入Excel。
核心步骤如下:
- 获取当前项目的数据库连接字符串。通常可以在WinCC的“文档/数据库”信息里看到,格式大致是
Provider=SQLOLEDB;Data Source=计算机名\WINCC;Initial Catalog=CC_项目名_xxx;Integrated Security=SSPI。 - 在VBS里创建ADODB.Connection和ADODB.Recordset。
- 用SQL语句从
AIM_Archive相关视图中查询归档数据。WinCC归档数据的底层视图名在不同版本里略有出入,比较常用的是AIM_xxx系列视图和RTE_xxx系列表。
举一个简化示例(请在WinCC VBS编辑器中视情况调整):
Dim conn, rs, sql, fso, ts Set conn = CreateObject("ADODB.Connection") conn.ConnectionString = "Provider=SQLOLEDB;Data Source=" & ComputerName & "\WINCC;Initial Catalog=" & DBName & ";Integrated Security=SSPI" conn.Open sql = "SELECT ValueDateTime, RealValue FROM ArchiveTable WHERE ValueName='产量1' AND ValueDateTime >= '" & startTime & "' AND ValueDateTime <= '" & endTime & "'" Set rs = conn.Execute(sql) Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.CreateTextFile("D:\Report\data.csv", True) Do While Not rs.EOF ts.WriteLine rs.Fields(0).Value & "," & rs.Fields(1).Value rs.MoveNext Loop ts.Close conn.Close这里有几个坑:
- 直接查WinCC的归档库时,表结构比较复杂,我建议先通过SQL Server Management Studio连接上去查看确认表名和字段名。不同项目的变量ID对应的实际表记录可能不同,需要根据
ValueName或变量ID来过滤。 - 查询时间范围不能太长,几个月的数据一次性查出来很容易超时,建议按月查询或者按批次查询。
- Excel写入如果数据量大,用CSV格式再导入Excel比直接操作Excel对象快一个数量级。
2.4 与Access/MySQL外部数据库交互的补充思路
有些场景要求把WinCC的数据同步到外部数据库,比如Access、MySQL,给MES或报表系统用。WinCC本身不直接提供MySQL连接器,但可以通过VBS的ADODB或ODBC驱动实现。
我做过一个项目是把产量数据每班结束写入Access数据库,用的是类似下面这个思路:
Dim conn2 Set conn2 = CreateObject("ADODB.Connection") conn2.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\DB\report.mdb" conn2.Open conn2.Execute "INSERT INTO 产量表(班次, 产量, 日期) VALUES('甲班', " & totalValue & ", '" & Now() & "')" conn2.CloseMySQL也可以,只要装了MySQL的ODBC驱动,连接字符串换成Driver={MySQL ODBC 8.0 Unicode Driver};Server=xxx;Database=yyy;User=root;Password=***就行。需要注意的是:Windows服务运行环境下,32位和64位ODBC驱动要装对版本,VBS在WinCC里默认可能是32位环境,如果你只装了64位ODBC驱动,连接会直接报错。
3. 画面自动全屏轮播的实现
3.1 轮播逻辑:用全局脚本定时切换画面
画面轮播在WinCC里实现方式不止一种,最省事、最稳定的是用全局脚本(Global Script)配合时间触发器,定时调用SetPictureName或OpenPicture函数切换画面。
先说整体思路:新建一个全局VBS脚本,在里面维护一个当前画面索引,每次执行时判断当前时间,然后切换到下一个画面。同时用一个触发周期为几十秒的触发器(如10秒、30秒)周期触发这个脚本。
以两张画面循环为例:
Dim screenIndex If screenIndex >= 1 Then screenIndex = 0 Else screenIndex = screenIndex + 1 Select Case screenIndex Case 0 SetPictureName "NewPdl0.pdl", "画面窗口1", "画面1.PDL" Case 1 SetPictureName "NewPdl0.pdl", "画面窗口1", "画面2.PDL" End Select这里用画面窗口(Picture Window)承载要轮播的画面,外层有一个固定的框架画面(比如带标题栏、时间显示),框架画面里只放一个画面窗口控件,运行时切换画面窗口的PictureName属性即可。
这个方案的好处是:外层框架可以一直显示当前时间、日期、报警指示灯等公共信息,不管画面怎么轮播,值班员都能看到统一的信息。如果要整屏完全切换,可以直接用OpenPicture打开独立画面,但这样公共信息每张画面都要做一遍,维护成本高,我不推荐。
3.2 全屏的实现:真全屏和假全屏的区别
标题里特别强调“是全屏哦”,说明很多人在全屏这里栽过跟头。WinCC运行系统全屏分为两种情况:
- 假全屏:窗口标题栏还在,或者任务栏还露出来,画面看似放大了但没铺满整个显示器。
- 真全屏:整个显示器只显示WinCC画面,没有任何系统窗口元素,操作员无法通过Alt+Tab或任务栏切走。
真全屏的实现通常有两种做法:
第一种做法是在WinCC项目的“计算机属性” -> “图形运行系统”里设置窗口属性:关闭标题栏、关闭边框、设置窗口大小为显示器分辨率。这种方法对单台显示器比较有效,但遇到多屏大屏或分辨率不一致时容易出错。
第二种做法是用运行系统的全屏参数。在“计算机属性” -> “启动”里设置运行参数,或者在图形运行系统的启动命令行中加入/F参数(不同版本有差异),强制全屏运行。我实测7.4版本可以通过在运行系统启动对象的属性里设置“全屏幕”选项来实现。
另外还有一个很实用的小技巧:用VBS在画面加载时调用HMIRuntime.Window相关的属性控制窗口状态,比如:
Dim Wnd Set Wnd = HMIRuntime.Window Wnd.Height = Screen.Height Wnd.Width = Screen.Width Wnd.Top = 0 Wnd.Left = 0这样可以在运行系统启动的第一张画面里执行一次,强制把窗口铺满屏幕。不过不同版本的属性名略有差异,要根据实际环境微调。
3.3 轮播时间与刷新策略的取舍
轮播间隔设置多少合适,取决于具体场景。如果是展厅大屏,30秒或60秒切换一次比较合适;如果是控制室值班大屏,建议10-20秒,太慢了操作员觉得卡,太快了看不清。我一般把切换时间设置成可配置的,放在一个文本变量里,这样现场调试时可以随时改,不用重新编译脚本。
这里有个容易忽略的问题:WinCC的脚本触发器和画面刷新是两套机制。即使脚本每10秒触发一次切换画面,画面里的变量刷新周期是另外设置的。如果归档变量的采集周期是5秒,而画面3秒就刷新一次,那画面上看到的数据其实是没有变化的,给人以“系统卡了”的错觉。实际调试时可以把画面刷新周期和轮播周期对齐,或者稍微错开,避免视觉误导。
另外,画面切换时会重新加载画面的所有对象,如果某张画面包含大量历史曲线查询,加载会比较慢,甚至出现闪白。解决办法是把历史查询放在画面加载完成事件里异步执行,或者把查询逻辑放到画面窗口中的子画面里,切换时先显示框架,子画面数据逐步加载。
3.4 模板画面与变量管理:让轮播画面维护更轻松
随着轮播画面越来越多,维护成本会明显上升。如果10张画面每张都独立做,后面修改公共布局就要改10遍。我建议用“模板画面+变量前缀替换”的方式。
具体做法是在框架画面中放一个画面窗口,轮播的画面都基于同一个模板复制生成。模板里只放各种趋势控件、表格控件,控件的变量连接使用相对变量名而不是绝对变量名。这样新建一张车间的画面时,只需要复制模板、改显示标题和变量前缀即可。
WinCC里变量前缀可以在画面窗口的“变量前缀”属性中设置,例如框架画面里画面窗口的TagPrefix设为车间1_,那么画面窗口内的所有相对变量都会自动加上这个前缀,访问车间1_温度1。这个功能在轮播场景下特别好用,因为我只需要维护一组控件模板,然后为每个车间设置不同的变量前缀和显示名称,就能快速生成大量轮播画面。
实际部署的时候要注意:变量前缀是运行时动态添加的,如果变量不存在或者连接断了,画面上的控件会显示########或无效,调试时要用WinCC的变量模拟器(Variable Simulator)提前验证前缀是否正确。
4. WEB发布与远程浏览
4.1 Web Navigator安装与授权
WinCC的Web发布官方组件叫Web Navigator(也叫WebUX或Web Navigator Client)。它的原理是:在服务器端安装Web Navigator Server,通过IIS(Internet Information Services)把WinCC项目发布成Web应用;客户端不需要安装WinCC,只要浏览器访问服务器地址就能看到并操作画面。
安装时有几个前置条件容易出错:
- 服务器上必须安装并启动IIS功能(在Windows“启用或关闭Windows功能”里勾选IIS相关选项,包含IIS 6 Management Compatibility、ASP.NET等)。
- Web Navigator的版本要和WinCC主版本严格对应,比如WinCC 7.4配Web Navigator 7.4,尽量不要跨版本用。
- 服务器上必须安装Web Navigator Server授权,并且客户端连接数量不能超过授权数量。
- 如果服务器开着防火墙,要放行80端口或443端口(如果启用HTTPS)。
这里我要特别提一句:Web Navigator配置过程中最麻烦的不是软件本身,而是IIS与WinCC之间的权限问题。Web Navigator的应用程序池默认使用Windows身份验证,如果当前用户没有WinCC项目的访问权限,网页打开就是空白页或登录失败。建议在IIS中把Web Navigator应用池的标识设置为一个有WinCC权限的域账号或本地账号,并确保该账号在WinCC用户管理器中存在且分配了相应的角色。
4.2 项目发布与客户端访问配置
Web Navigator的使用流程大概是这样的:
- 在服务器上安装并授权Web Navigator Server。
- 在Web Navigator的“Web发布器”工具里选择要发布的WinCC项目。
- 设置发布的起始画面,比如大屏轮播的框架画面。
- 启动IIS站点,确认Web服务正常。
- 客户端通过IE兼容模式或Edge浏览器的IE模式访问
http://服务器IP/WebNavigator/地址。
客户端首次访问时,Web Navigator通常会要求安装一个ActiveX控件或Web组件,这是正常现象,需要在浏览器设置里允许运行ActiveX控件(WinCC 7.x时代主要依赖ActiveX,新版WebUX逐渐转向HTML5,不需要ActiveX)。
有一点要提前跟用户说明:Web Navigator的网页画面和原始WinCC画面在控件渲染上是有差异的。复杂控件(比如某些ActiveX插件、第三方控件)在网页端可能显示不全或无法交互。我做过一个项目,画面上放了一个第三方视频控件,在大屏端正常,但通过Web Navigator浏览时视频区域就是黑块。所以规划画面时,如果确定要Web发布,尽量使用WinCC自带的标准控件。
对于只要看画面、不做操作的用户,可以给Web Navigator客户端配置“只读”权限,需要登录时把用户添加到只读角色中,防止误操作。这在远程监看的场景里非常重要。
4.3 没有Web Navigator授权时的替代思路
Web Navigator授权不便宜,而且有些老项目采购时根本没有预算。如果只是想要“网页能浏览”这个效果,我试过几条替代路径,这里分享一条最靠谱的:
用远程桌面服务(Windows RDP)做中转,或者用第三方的可视化转发工具(如某些支持HTML5的远程桌面网关),把服务器桌面或某个窗口发布到网页上。这种方式的好处是零开发、不需要改WinCC项目,Web端看到的画面和操作员站完全一致。
坏处也很明显:并发用户数多了会卡,而且安全性需要自己把控,不适合作为正式的对外发布方案。另外远程桌面转发方案对屏幕分辨率要求高,如果服务器分辨率是1920x1080,客户端是1366x768,画面会被压缩,体验不佳。
我的建议是:如果是临时给领导展示一下,用远程桌面方案就够了;如果是正式的对外远程监控需求,还是老老实实买Web Navigator授权,别在这个环节省钱,不然后面无数个加班夜会找上你。
4.4 服务器端运行与客户端浏览的分工
Web发布方案落地后,服务器端实际上承担了WinCC运行系统和Web服务双重压力。如果服务器本身还在做数据归档和报表导出,性能很容易成为瓶颈。
我的经验是:如果项目规模小(变量数量在1000以内、同时在线Web用户不超过5个),一台高性能服务器能扛住;如果变量过了5000或者并发用户比较多,建议把Web Navigator单独部署到一台Web服务器上,通过WinCC的C/S架构连接到主服务器获取数据。
这样Web服务器只负责转发画面和数据,主服务器专注采集和归档,稳定性和响应速度都能提升。WinCC的C/S架构本身就支持多客户端会话,这是官方推荐的做法。
5. 常见问题与排查技巧实录
5.1 一个可直接对号入座的问题速查表
做这种综合项目最容易遇到的问题,我整理成了一张表,都是我实际碰见过的:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| WinCC运行系统手动启动正常,但开机不自动运行 | 未设置项目自动启动,或Windows服务被禁用 | 在WinCC项目管理器里设置项目为“自动启动”,或使用Windows计划任务启动运行系统 |
| 报表导出Excel时提示“无法创建对象” | Excel未安装或VBS权限不足 | 在服务器上安装完整版Excel,或改用CSV导出 |
| 查询归档数据结果为空 | 查询时间格式不对,或变量未加归档 | 检查变量是否已创建过程值归档,确认时间格式(WinCC里常用MM/DD/YYYY HH:MM:SS格式) |
| 画面轮播时大屏短暂黑屏 | 画面切换时加载过重 | 使用画面窗口轮播,避免整页OpenPicture |
| 全屏后任务栏还看得到 | 窗口属性未正确设置 | 检查图形运行系统属性中的窗口边框和标题栏设置,或使用VBS强制调整窗口大小 |
| Web网页打开后登录失败 | 用户未在WinCC用户管理中创建,或IIS应用池权限不足 | 在WinCC用户管理中创建同名用户并分配角色;调整IIS应用池标识 |
| Web网页画面中视频控件黑块 | 第三方控件不被Web Navigator支持 | 替换为WinCC标准控件,或独立提供视频Web端 |
| 32位/64位ODBC连接外部数据库失败 | ODBC驱动版本不对 | 分别安装32位和64位ODBC驱动,并在VBS环境中验证 |
| 归档数据量过大导致数据库膨胀 | 未做归档分段或未定期清理 | 在WinCC归档配置中设置合理的分段周期,定期备份清理历史段 |
这张表不能覆盖所有情况,但覆盖的场景已经能解决大多数调试中的“怎么都不行”的绝望时刻。
5.2 几个必须重点留意的细节坑
第一个坑是WinCC 7.5的英文时间格式问题。项目里如果服务器区域设置为英文,WinCC的原始时间和显示时间格式会不一致,报表查询时用YYYY-MM-DD HH:MM:SS可能查不到数据,而WinCC内部记录的是MM/DD/YYYY HH:MM:SS格式。建议在服务器上统一区域为中文(中国),或统一使用ISO 8601格式字符串拼接查询条件。
第二个坑是WinCC运行系统的“无法连接到服务器”。这个报错经常在启动运行系统时出现,原因可能是SQL Server服务未启动、项目文件被占用、或者用户权限不足。排查顺序:先检查Windows服务中的“SQL Server (WINCC)”和“SIMATIC Shell”服务是否正常运行,再确认当前Windows用户是否有WinCC操作权限,最后检查项目管理器打开的项目是否和运行系统一致。
第三个坑是开机自动启动。很多工程师以为把WinCC运行系统快捷方式放到“启动”文件夹就行,但实际运行系统加载需要数据库服务先起来。如果数据库服务还没有完全启动,运行系统会报错。正确做法是在WinCC项目管理器中设置“计算机属性” -> “启动” -> 勾选“运行系统”,这样WinCC会自动等待SQL服务就绪后再启动。或者写一个批处理脚本,先启动SQL服务,再延时30秒,最后启动运行系统。
5.3 调试环境与生产环境的差异
调试时WinCC项目可能跑在自己的笔记本上,环境是Win10 + WinCC 7.5 SP2;但生产环境可能是Windows Server 2019或2022,安装路径、用户名、权限策略都不同。
我强烈建议在项目交付前,按生产环境重新完整走一遍发布流程,特别是Web Navigator的IIS配置。我在一个项目里就踩过这样的坑:笔记本上Web发布一切正常,换到服务器上后,IIS缺少ASP.NET功能角色,网页直接500错误,折腾了一个晚上才定位到原因。
另外,生产环境服务器的Windows更新策略也要注意。有些安全补丁会重置IIS配置或影响SQL Server认证方式,导致WinCC运行系统或Web服务突然中断。建议在服务器上做好例外策略,重要补丁在测试环境验证后再打。
6. 我的一些个人经验补充
项目做下来,最大的感受是:这套方案最值钱的部分不是某个脚本或某个配置,而是“把三条需求统一规划”的思路。如果一开始就只做报表,后面加轮播要改画面结构;如果一开始只做轮播,后面加Web发布又遇到控件兼容问题。我建议任何做WinCC项目的朋友,在项目启动前就先问清楚将来有没有大屏轮播和远程浏览的需求,哪怕这次不做,也在画面设计时用标准控件、变量命名做好前缀规划,这样以后扩展就不至于推倒重来。
最后再分享一个小技巧:如果现场调试轮播画面时经常要改切换时间,可以不用每次都编辑脚本再激活项目,直接把切换时间做成一个WinCC内部变量(比如Screen_Switch_Seconds),然后在全局脚本里通过HMIRuntime.Tags("Screen_Switch_Seconds").Read读取这个变量,然后用Timer或者循环检查变量变化来决定是否切换。这样现场工程师只需要在操作员画面上修改这个数值,就能调整轮播速度,不需要碰任何代码,省了很多沟通成本。
这套组合方案我已经在两个项目里完整落地过,稳定运行超过半年。如果你们的工厂也正好有类似需求,照着这个思路去搭,大概率能把踩坑时间从两周压缩到两三天。