news 2026/10/10 16:16:28

WinCC用户归档从组态到排错:配方管理与批次追溯实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WinCC用户归档从组态到排错:配方管理与批次追溯实战

简介:WinCC用户归档案例资源包服务于工业自动化领域的SCADA工程师和组态技术人员,围绕西门子WinCC用户归档功能,演示如何借助动作与标准模块的配合,实现生产数据的选择性采集、过滤、转换与压缩归档,并据此设计合理的存储周期与保留策略,适合需要基于历史数据进行报表分析、故障追溯和工艺优化的项目场景。压缩包共290个文件,以rpl归档工程文件为主,配合mdf/ldf数据库文件、pdl画面、cfg配置及cvb/h脚本等,涵盖数据定义、界面操作与后台处理各环节,包体大小约36.21MB。目前已有1150人学习下载。包内包含可执行的示例归档工程、模块调用逻辑及配套说明,读者可对照搭建一套完整的用户归档机制,理解动作触发与标准模块复用的工程实践,提升WinCC数据管理的综合能力。

1. 用户归档案例:先从一次“配方调不进去”的现场说起

现场最怕的不是 WinCC 画面卡,而是配方按钮按下去了,配方值却一行都没进 PLC。查历史趋势曲线,数据是有的;查用户归档,里面还是空的。后来才发现,问题出在字段映射和写权限上。

WinCC 用户归档(User Archive)不是普通的历史数据库,它专门用来存结构化业务记录——比如按批次存配方参数、按操作员存交接班记录、按产品存质量抽检结果。和变量记录不同,用户归档里的每条记录有明确的字段含义,可以按时间戳和业务键查询,也能让画面、报表、趋势曲线共用同一套数据。

这篇文章从一套完整案例讲起,从建归档、写记录、显示到排错,把用户归档的落地路径拆开。不管是在 TIA Portal V15.1 里做 Comfort 面板,还是在 WinCC RT Advanced 里做上位,只要想管配方和批次,都适用。

2. 把用户归档建起来:从 TIA Portal 到 WinCC 运行系统的数据链路

2.1 在 TIA Portal 中创建用户归档:归档名、字段类型是第一步

打开 TIA Portal 项目,在左侧项目树里找到 WinCC RT 的组态项,展开后能看到“用户归档”编辑器。对 V15.1 来说,这个入口一般是“HMI → 运行系统设置 → 用户归档”。右键选择“新建用户归档”,先给它一个名字。归档名我强烈建议用英文或拼音,比如 RecipeArchive、TempArchive。中文名不是不能用,但后面在 VBS 脚本、SQL 查询和表达式里会频繁触发编码问题,尤其在 WinCC 内部把字段名拼成查询语句时,一个中文空格就可能让整个脚本静默失败,排查起来非常扎心。

建好归档后,重点在字段定义上。用户归档的字段类型有数值(整数、浮点)、文本和日期时间三大类。以配方场景为例,我一般会建这么几个字段:BatchNo(文本,存批次号)、TempSet(浮点,存设定温度)、Kp、Ti、TimeSlot(日期时间,存记录生成时间)。字段名和归档名一样,统一用无空格、不保留字符的英文。文本字段要指定长度,批次号该 20 字符就写 20,别图省事写默认值;太短会导致从 PLC 侧拼接字符串时被截断,太长又占用数据库存储空间。

字段名类型典型用途
BatchNo文本(20)批次号或配方名
TempSet浮点设定温度/设定值
TimeSlot日期时间记录产生时间
Remark文本(100)操作备注

字段类型一旦建好,后期再改会很麻烦——涉及归档表的列结构变更,运行系统里已有的历史记录可能读不出来。所以第一步宁可多花十分钟,把字段清单和类型设计清楚,也别急着下载到模拟器里试。组态完成后,右键项目编译、下载到运行系统。这里你可能会碰到 V15.1 报“找不到许可证 wincc comfort”的情况,后面避坑段落会细说,先记住:用户归档功能是否可用,跟你的运行系统类型和授权版本强相关,不是组态错了。

2.2 用变量连接把过程值映射到归档字段,省掉脚本的常规做法

用户归档写入数据有两种路径:变量连接和脚本。变量连接适合“周期记录”的场景,比如每 5 秒归档一条温度值。配置方式不复杂:在用户归档编辑器的“变量连接”区域,新增一条连接,左侧选源变量(内部变量或 PLC 变量),右侧选目标归档字段,然后设置触发周期。运行后 WinCC 会按照周期自动把变量当前值写入对应字段,不需要任何脚本。

这里有个关键参数容易踩坑:变量连接到底是“追加新记录”还是“更新当前记录”。WinCC 用户归档的变量连接默认会修改当前活动记录,也就是说,如果你的批次流程没有先创建一条新记录,那每个周期都是往同一条记录里反复覆盖字段值,归档里永远只有一行数据。很多工程师第一次用用户归档做温度趋势,发现表格里就一行数据,就是因为把变量连接当成了变量记录来用。

常见做法是:在批次开始时,先用脚本创建一条新的空记录;之后变量连接负责把实时过程值写进这条记录的字段里。这样脚本只管“开行”,数据灌入交给系统自动执行。如果你不想写脚本,也可以在变量连接属性里勾选“每个周期创建新记录”,但那样每条记录只有当前周期的一个快照,字段之间的业务关联会变得很松散。所以我的习惯是:业务型归档用脚本开记录 + 变量连接填数据,纯底层采样用系统变量记录,两个别混。

2.3 用 VBS 写一条记录:最小可运行的归档写入脚本

无论变量连接多方便,总归有需要脚本写数据的时候——比如操作员点“确认配方”按钮,才把这一行配方参数写入归档。这时候最常用的是 VBS 全局脚本或画面按钮事件。下面是一个最小可运行的例子:

' 画面按钮事件:向用户归档写入一条新的配方记录 Dim archive Set archive = HMIRuntime.UserArchives.OpenArchive("RecipeArchive") ' 打开归档 archive.ConnectActive = False ' 仅手动写入:断开自动变量连接,避免覆盖 archive.Recordset.AddNew ' 新建一条空记录 archive.Recordset.Fields("BatchNo").Value = "B20260701-001" archive.Recordset.Fields("TempSet").Value = 85.5 archive.Recordset.Fields("TimeSlot").Value = Now() archive.Recordset.Update ' 提交记录,不调用则不落库 archive.CloseArchive ' 关闭归档,释放连接

这段脚本的逻辑顺序是有讲究的。OpenArchive打开归档后,系统会返回一个记录集对象,Recordset就是这个记录集。ConnectActive = False必须先执行,因为默认情况下归档可能与画面上的变量连接处于联动状态,你不主动断开,手动AddNew之后字段值可能被周期连接立即覆盖,等于白写。AddNew只是把记录集的当前行切成“新增模式”,真正的写入发生在Update调用——很多新手漏了这行,脚本不报错,归档里就是没数据。最后CloseArchive一定要调用,不然长时间占用归档句柄会导致后续其他客户端脚本或表格控件读不到更新,这是 WinCC 用户归档并发控制里的一个经典坑。

如果你用的 WinCC 版本里HMIRuntime.UserArchives.OpenArchive方法不可用,可以换成HMIRuntime.UserArchives("RecipeArchive"),然后直接操作RecordSet对象。不同版本的 API 命名有细微差别,但核心的 AddNew、Fields、Update 这套 ADO 风格接口是通用的。脚本里再加个错误处理会更稳妥,捕获归档打开失败的场景,别让按钮点了没反应。

3. 把归档内容展示到画面:表格控件、下拉选择与趋势曲线联动

3.1 UserArchive 表格控件:不用写代码就能看数据

在 WinCC 画面编辑器里,控件列表中可以找到“用户归档控件”,有些版本显示为“WinCC User Archive Control”。把它拖到画面上,打开控件属性对话框,指定它要绑定的归档名,再勾选需要在表格里显示的字段。运行后这个控件会直接把归档内容渲染成一张表格,支持按列排序、选中等基本操作,连脚本都不用写。

这里值得注意的细节是控件的刷新模式。默认情况下,用户归档控件只在画面初次打开时读一次数据,之后你通过脚本或者变量连接往归档里写了新记录,表格画面不会自动更新。需要在控件属性里把“刷新周期”从“不刷新”改成一个固定间隔(比如 1 秒),或者勾选“自动刷新”。如果你想要“操作员一点按钮立刻看到新行”,可以在按钮脚本里调用控件对象的刷新方法,而不是苦等周期刷新。另外,控件显示的行数可以设置上限,防止归档表膨胀到几十万行时画面卡死。

3.2 用脚本把归档字段读到内部变量,驱动历史趋势曲线

用户归档和 WinCC 自带的历史趋势曲线控件之间没有直接的“字段绑定”关系。趋势曲线控件只能读取变量(PLC 变量或内部变量),所以如果你想用趋势曲线展示归档里的历史温度数据,就必须通过脚本把归档字段的值转存到内部变量,再让趋势控件绑定这个内部变量。

下面这段脚本解决的是“根据当前选中批次,把该批次温度字段写入趋势变量”的桥接问题:

' 按钮事件:按批次号读取归档温度值,更新趋势曲线用的内部变量 Dim archive, batchNo batchNo = HMIRuntime.Tags("CurBatch").Read Set archive = HMIRuntime.UserArchives.OpenArchive("TempArchive") archive.Recordset.Filter = "BatchNo = '" & batchNo & "'" archive.Recordset.MoveFirst If Not archive.Recordset.EOF Then ' 把第一批匹配记录的温度值写到趋势控件绑定的变量上 HMIRuntime.Tags("TempFromArchive").Write archive.Recordset.Fields("Temp").Value End If archive.CloseArchive

其中Filter是记录集的筛选属性,写法类似 SQL 的 where 条件。注意字符串条件要用单引号包裹,如果批次号变量本身包含中文或单引号,脚本会直接报语法错误,这点具体避坑放在后面。MoveFirst把指针移到筛选结果的第一行,再用EOF判断是否存在匹配记录。趋势曲线控件绑定了TempFromArchive这个内部变量后,数值变化就会反映到曲线上。

不过要提醒一句:这种读法只能展示当前筛选出的单条记录。如果你要画一条完整的历史趋势曲线,最好还是用 WinCC 的变量记录归档去存采样值,然后让趋势控件读变量记录。用户归档更适合做“业务事件快照”,不是高频采样的主力。

3.3 排序、筛选和时间戳:三个显示参数决定报表好不好用

做了这么多项目,我发现用户归档表格控件的显示效果,90% 取决于三个参数:排序字段、筛选条件、时间戳格式。排序字段如果不选,默认按数据库写入顺序排列,这和按时间排序结果可能完全不一样。我在批次追溯页面里通常把TimeSlot设置为默认排序字段,并且选降序,这样最新记录永远排在最上面,不用翻页。

时间戳的显示格式也是个容易翻车的地方。WinCC 用户归档的时间字段在库里不是常规的yyyy-mm-dd hh:mm:ss字符串,而是浮点型日期序列。表格控件默认能显示成可读格式,但你在脚本里读出来再写到别的变量时,很可能会得到一串小数。这时候要用FormatDateTime转换一下再显示。至于筛选条件,如果你只关心今天的批次,在控件的“筛选表达式”属性里写Year(TimeSlot) = Year(Now())这种表达式不一定被支持,最好用 Recordset.Filter 在脚本里做,或者通过下拉框联动设置归档表的显示范围。总之,想让归档控件真正好用,这三样必须逐项验证过,别只拉一个没配置的控件糊上去。

4. 配方切换与批次追溯:两个最常见的用户归档业务场景

4.1 一键配方切换:从归档行读出参数并写入控制回路

配方管理是用户归档最典型的应用。把多套配方参数存成多条记录,操作员在画面上选中配方名,点“下发”按钮,脚本读取该行字段并写入 PLC 相关变量,完成整组参数切换。这样可以避免在画面里堆几十个输入框,也便于后续修改配方。

' 配方下发:从归档读选中配方,写入 PID 和温度设定变量 Dim archive, recipeName recipeName = HMIRuntime.Tags("SelRecipe").Read Set archive = HMIRuntime.UserArchives.OpenArchive("RecipeArchive") archive.Recordset.Filter = "RecipeName = '" & recipeName & "'" archive.Recordset.MoveFirst If Not archive.Recordset.EOF Then HMIRuntime.Tags("PID_Kp").Write archive.Recordset.Fields("Kp").Value HMIRuntime.Tags("PID_Ti").Write archive.Recordset.Fields("Ti").Value HMIRuntime.Tags("PID_Td").Write archive.Recordset.Fields("Td").Value HMIRuntime.Tags("TempSet").Write archive.Recordset.Fields("TempSet").Value End If archive.CloseArchive

这里有个在实际项目中容易忽略的点:写入多个 PLC 变量的顺序和时机。如果你用的是 S7 通信,多个变量逐个Write时,PLC 可能在第一个变量到位后就开始执行 PID 运算,导致中间状态短暂混乱。常见做法是在脚本里先写一个“配方下发开始”的置位变量,PLC 收到后暂停控制,等所有参数写完,再写“下发完成”信号,PLC 再启动新参数。这个协调逻辑不在用户归档范围内,但做配方切换时一定要配合时序,不然用户归档只能帮你存参数,不能帮你安全生产。

4.2 按批次号追溯:用时间戳和批次字段定位记录

批次追溯要求的是“给定一个批号或时间段,把所有关联记录调出来”。用户归档的 Filter 可以组合多个条件,例如按批次号加时间范围锁记录。下面是一个倒推昨天 24 小时记录的写法:

' 查询昨日批次记录,导出到画面列表或报表 Dim archive, startTime, endTime startTime = FormatDateTime(DateAdd("d", -1, Date), 0) & " 00:00:00" endTime = FormatDateTime(Date, 0) & " 00:00:00" Set archive = HMIRuntime.UserArchives.OpenArchive("ProdArchive") archive.Recordset.Filter = "TimeSlot >= #" & startTime & "# AND TimeSlot <= #" & endTime & "#" archive.Recordset.MoveFirst Do While Not archive.Recordset.EOF ' 这里把每条记录的字段值写入报表表格或内部变量 HMIRuntime.Tags("Report_Batch").Write archive.Recordset.Fields("BatchNo").Value ' 业务处理逻辑,比如累加产量、记录首条时间 archive.Recordset.MoveNext Loop archive.CloseArchive

注意日期条件用了#包裹,这是 VBS + 内部 SQL 的标准写法。如果漏写#,Filter 字符串会被当成纯文本比较,永远匹配不到记录。时间范围也要算清楚,DateAdd("d", -1, Date)返回的是日期类型,再用FormatDateTime(..., 0)转成yyyy-mm-dd格式并与时间字符串拼接。这种追溯脚本跑完,你还需要把结果展示出来,常见做法是写到内部变量后触发报表画面刷新,或者直接输出到 CSV 文件供车间存档。

4.3 多客户端并发:归档写锁与刷新策略

WinCC 项目经常有多个操作员站同时在线。如果两块画面都打开了同一个用户归档,并且其中一块通过脚本写数据,另一块通过表格控件读数据,你会遇到典型的“读旧写新”问题——写的那端能看到新记录,读的那端表格不刷新,甚至出现“文件被占用”的脚本报错。原因是用户归档在 WinCC 内部有自己的连接池和缓存,多个客户端共享同一个归档数据库时,锁粒度不一定是行级,也可能是表级。

我的处理经验是:写数据的脚本必须“短连接”——打开、操作、立即关闭,不要用全局变量长期保持归档对象。读取表格的控件刷新周期设到 1~2 秒,而不是依赖手动刷新。如果项目里有多台操作员站同时高频写归档,最好在逻辑上分时段分站写入,避免同一秒内两个脚本同时 Update。对于极端的并发冲突,脚本加上重试机制:写失败后延时 200ms 再试一次,能解决不少偶发报错。别迷信 WinCC 文档里说的“支持并发”,实际项目里还是要做好锁和刷新的设计。

5. 用户归档避坑手册:5 个一次性学会的排查经验

5.1 脚本写不进数据:归档不是数据表,而是被两个连接抢着占

现象:按钮脚本执行后没有报错,归档表格里却没有新增记录。

原因:最常见的有三个。一是变量连接处的ConnectActive仍为 True,脚本执行AddNew后,周期连接立即把当前活动记录覆盖掉;二是漏写了Recordset.Update,数据还在内存缓冲区里;三是脚本打开归档后没有CloseArchive,上一次操作残留的句柄让新写入被拒绝。

解决:写入前先执行archive.ConnectActive = False,写入后立即archive.Update,最后一定要archive.CloseArchive。如果你同时开了变量连接做周期填数,那么脚本只负责创建空记录并设置批次号等业务键字段,之后变量连接负责填充数值字段,这是最不容易打架的分配方式。

5.2 中文列名乱码:WinCC 用户归档字段编码的取舍

现象:用户归档表格控件里显示的列标题是乱码,或者脚本中用字段名字符串访问字段时返回 Empty。

原因:WinCC 归档字段的底层 SQL 语句和 VBS 脚本字符串之间的默认编码不完全一致。中文列名在组态界面里看着正常,但脚本运行时拼接的 WHERE 或字段引用一旦经过系统内部转换,就可能匹配不上。

解决:归档字段名从设计阶段就统一用英文,显示标题放在画面上用多语言文本对象单独做映射。如果项目已经用中文建了字段并且数据量不大,把归档删了重建是更快的方式,比写脚本替换字段名靠谱。我见过有人写脚本逐条复制旧数据到新归档,费时费力,不如一开始按规范来。

5.3 表格控件看不到新记录:刷新模式与连接缓冲

现象:脚本成功写入归档,画面上的用户归档表格控件还是显示旧数据,重启画面才恢复。

原因:控件的刷新周期没有设置,默认只在画面打开时读取一次,或者刷新周期设成了 10 分钟。另外,如果脚本和控件连接的不是同一个归档实例名,也会出现“看着是同一个,实际是两个不同连接”的情况。

解决:在控件属性里把刷新周期改成 1 秒,或者在按钮脚本里调用控件的刷新方法。对大多数 WinCC 画面,用户归档控件提供Refresh或更新连接的方法,具体名称在帮助里搜 UserArchive Control。注意:如果脚本把归档写完了,你马上切画面再切回来,表格控件会重新加载,这时能看到新数据——这是验证“到底是没写进去还是没刷新”的最快方法。

5.4 和 WinCC“找不到许可证”混在一起的事:Comfort 与 Runtime Advanced

现象:TIA Portal V15.1 在编译或下载运行时提示“找不到许可证 wincc comfort”,用户归档编辑器里按钮是灰的,或者运行系统画面打开后控件不显示任何数据。

原因:WinCC 用户归档功能在 Runtime Advanced 和 Runtime Professional 中的授权逻辑不一样。你的项目组态选的是 Comfort 面板,但安装的许可证是 WinCC Runtime Advanced;反之亦然。这不是归档配置问题,是授权的系统类型和项目类型没对齐。

解决:先在 TIA 项目树的“运行系统”属性里确认目标类型是 Comfort 还是 Advanced 或 Professional。再用 WinCC 的许可证管理器检查已经激活的版本。如果许可证类型与项目不匹配,要么改项目运行系统类型,要么按实际运行环境装对应授权。这个问题在初学者项目里出现频率极高,和用户归档本身无关,但一出现就会拦住你,必须单独排查。

5.5 停机后归档丢记录:同步机制与断电保护

现象:生产期间归档有数据,突然停电重启后,最近几条记录找不到了,历史趋势曲线也缺了一段。

原因:用户归档的写入机制带有缓冲,系统每隔一定时间才把内存中的记录同步到数据库文件。断电瞬间,缓存里未落盘的数据直接丢失。这和 WinCC 变量记录默认的存储周期是两回事,变量记录的采集循环也可能丢数,但用户归档因为是业务记录,往往更让人在意。

解决:对关键记录(比如批次结束确认)不要只依赖周期变量连接,应该在确认按钮脚本里同步执行一次写入并立即Update,这样能缩短缓存窗口。此外可以定期把用户归档导出为 CSV 文件作为业务备份,毕竟数据库文件损坏时,手工恢复的成本远高于导出的成本。现场如果有条件,给工控机配 UPS 是治本的办法,但程序上做好同步写入和导出,至少能保证记录不因断电全丢。

6. 进阶技巧:操作用户归档时,字符串、时间和空值的三个细节

用户归档的读写代码写多了,你会发现真正折磨人的不是归档建得好不好,而是数据类型细节。

先说字符串。VBS 写入文本字段时,WinCC 会把字符串按字段定义长度补满空白,比如字段长度 20,你存了 “B001”,读出来可能是 “B001 ”。直接用If value = "B001"比较永远不成立。我习惯在写入时做Trim,读取时也做Trim,双保险:

archive.Recordset.Fields("BatchNo").Value = Trim(HMIRuntime.Tags("CurBatch").Read)

时间字段的坑是脚本里返回的是浮点日期序列,不是字符串。我用FormatDateTime统一格式后做比较,避免“同一时刻”判断失败的玄学问题。空值处理更关键:一条新记录如果没给某个字段赋值,读取返回的是空字符串还是 0,取决于字段类型。数值字段返回 0,文本字段返回空字符串,日期字段可能是 0 日期。做算术或逻辑判断前,必须用IsNull或IsEmpty兜底,否则一个空值直接让整个批次追溯功能崩掉。

这三个细节我都是在项目现场用血泪经验换来的。用户归档本身不复杂,复杂的是你永远不知道下一批数据里会出现什么样的空值和边界。写脚本时把 Trim、FormatDateTime、IsNull 养成肌肉记忆,归档这条线基本就能稳稳跑住。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 16:14:04

返利佣金什么时候结算、多久能提现?

咻拜返利不是下单当场到账。标准路径是&#xff1a;下单产生预估 → 确认收货后进入待结算 → 每月 25 日结算上月有效订单 → 结算金额进入可提现余额后&#xff0c;再按 App 内提现规则发起提现。预估金额可能因退货、售后或活动规则变化&#xff0c;最终以结算结果为准。 背…

作者头像 李华
网站建设 2026/10/10 16:10:17

Xcode编译Metal着色器报错排查:CompileMetalFile failed解决指南

先别被标题里的 MacOS 26.3 吓到&#xff0c;不管这个数字对应的是系统版本、Xcode 版本还是 SDK 编号&#xff0c;CompileMetalFile这个 Build Phase 在近几年的 Xcode 里都长一个样&#xff0c;报错形式也是同一套。这不是只在某个新系统上才会出现的稀有问题&#xff0c;而是…

作者头像 李华
网站建设 2026/10/10 16:09:31

远程开发必备:cmux轻量终端复用器上手与避坑指南

做远程开发这些年&#xff0c;我最怕的不是代码写得烂&#xff0c;而是训练任务跑了两小时&#xff0c;因为一次网络抖动&#xff0c;所有进度白费。后来我养成了一个习惯&#xff1a;不管在哪个环境干活&#xff0c;第一件事就是打开终端复用器把会话挂起来&#xff0c;这样本…

作者头像 李华
网站建设 2026/10/10 16:05:14

YOLOv5行人检测实战:高质量VOC数据集与训练避坑指南

简介&#xff1a;本资源是面向计算机视觉与深度学习初学者及进阶研究者的高质量行人检测专用数据集&#xff0c;专为YOLOv5等目标检测模型训练优化设计&#xff0c;解决真实场景下行人识别泛化能力不足、标注质量参差等核心问题。压缩包共35258个文件&#xff0c;含17629张JPG格…

作者头像 李华