ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

WinCC用户归档实战:历史台账记录比外挂数据库更省心

WinCC用户归档实战:历史台账记录比外挂数据库更省心 简介WinCC用户归档案例是一份面向工业自动化工程师与SCADA初学者的实践型资料包围绕西门子WinCC中的用户归档功能重点讲解动作与标准模块的协同使用以及归档策略设计、数据存储与检索等关键问题。压缩包共290个文件大小36.21MB主要包含rpl过程数据文件、mdf/ldf数据库文件、dum备份文件、pdl画面文件、cfg配置文件及脚本和说明文档等可帮助理解归档数据的生成、存储与调用方式。已有1146人学习浏览适合希望系统掌握用户归档配置与优化的技术人员。通过该案例可学习动作触发条件、标准模块封装逻辑、归档间隔设定、数据保留期限与存储介质选择等实操要点并参考示例项目灵活复用到实际产线中。 用用户归档存历史台账比外挂数据库省心得多最近接了一套WinCC监控系统的项目要记录每台设备的启停时间、操作员信息和关键运行参数方便后续做质量追溯。一开始我脑子里蹦出来的方案是外挂SQL Server但现场就一台工控机再塞一个数据库进去部署和维护成本都不小。后来想起WinCC自带的用户归档功能干脆就用它做了整套台账记录模块。这一套做下来我最大的感受是用户归档这东西平时存在感低但真用到生产数据记录、操作追溯、配方管理这类场景它比变量记录灵活比外部数据库省事。这篇就把整个案例从头到尾拆开讲重点说用户归档怎么建、字段怎么定、脚本怎么联动以及那些说明书里根本不会写的坑。1. 用户归档的定位与选型思路1.1 用户归档到底是什么用户归档User Archive是WinCC项目内嵌的一个数据表模块。你可以把它理解成一个轻量级的、随项目发布的迷你数据库它允许你在项目里定义若干个“表”每个表有固定的字段列和记录行支持增删改查也能和画面控件、脚本顺畅联动。它和WinCC的“变量记录”完全是两种东西。变量记录是把某个变量的历史变化曲线存下来供趋势控件读取用户归档则是存结构化的事件型数据比如“某年某月某日某操作员完成了某个操作”每条记录就是一行字段明确查询方便。归档文件会跟着项目一起保存和发布不需要单独安装数据库服务运行时WinCC能干活归档就能用。正是因为这种内嵌特性用户归档特别适合单机版的中小型监控项目。1.2 为什么用用户归档而不是普通变量普通变量只能保存当前值想存历史就得上变量记录。但变量记录的存储结构是围绕“变量”组织的你很难把多个不同含义的字段组合成一条完整业务记录。举个例子你要记录“操作员张三在2024年6月1日10点23分启动了A设备”这一条记录里包含了人员、时间、操作类型、设备编号四个信息。如果只用变量记录你得建四个变量然后分别归档查的时候还得自己对齐时间轴非常别扭。用户归档则直接建模成一条记录设备编号、操作员、操作类型、时间戳四个字段排成一排查询时按条件过滤一目了然。尤其是后续做追溯报表用户归档天生就是台账结构。1.3 我的选型决策与实践考量这个项目里我一开始犹豫要不要用外挂数据库。后来发现问题很多现场工控机系统环境杂乱数据库实例和WinCC之间的连通性受防火墙影响数据库进程占内存老工控机会卡最重要的是客户没有专门的IT人员用外挂数据库等于给后续维护埋雷。选用户归档的另一个原因是它和WinCC Runtime深度集成发布画面时归档结构自动带过去不需要额外部署。对于设备启停记录这种量级的轻量应用单机版WinCC跑用户归档绰绰有余。所以最后我在管理器中直接建了三个归档DeviceLog运行记录、OperatorLog操作记录、AlarmLog报警确认记录。2. 用户归档的创建与配置实操2.1 打开用户归档管理器新建归档在WinCC项目树里双击“用户归档”图标打开管理器窗口。左侧是归档列表右键选择“新建归档”起名时建议用英文字母比如DeviceLog。中文归档名在部分脚本和控件绑定场景下容易出现编码问题能用英文就用英文。归档建好之后右侧会有多个页签最核心的是“字段”和“记录”。字段页定义表结构记录页设置数据来源和触发方式。新建归档后系统默认会有一个“自动增量”类型的字段建议保留它能在后续做记录定位时充当唯一标识。2.2 定义字段与数据类型双击“字段”页点“添加字段”逐条建立列。以我的设备运行记录为例字段定义如下字段名数据类型说明RecordID自动增量主键唯一标识记录DeviceID文本设备编号Operator文本操作员姓名Action整数0停止1启动TimeStamp日期时间记录时间字段类型一定要和实际写入的数据匹配尤其是“时间戳”这种不要图省事设成字符串否则后面按时间排序、按时间过滤都会出问题。自动增量字段我一般只用来做唯一标识不会把它显示在画面表格里避免干扰。字段顺序也有讲究。建议把主键字段放第一位查询条件字段放前面显示型字段放后面。这样做的好处是当你在脚本里用SetFieldValue按索引赋值时索引对应关系好记忆不容易搞混。2.3 设置记录触发与变量连接在“记录”页可以给归档设置“记录模式”。这里有多种选择手动记录、变化时记录、周期记录等。我这里启停事件用的是手动记录因为这类操作本身有明确的触发时机手动写更干净。如果你要做连续型数据记录比如每秒钟记录一次温度那用“周期”模式更合适周期时间可以精确到毫秒。但要注意周期模式的数据量增长很快用户归档的分区文件会迅速膨胀这是很多人后期遇到“归档变慢”的根源。我最终在代码里显式调用插入函数而不是依赖自动记录。原因很简单手动模式能精确控制写入时机避免重复触发。自动记录的触发条件如果没设置好很容易因为信号抖动写入多条垃圾记录后期还得手动清。3. 画面组态与脚本联动案例实现3.1 在画面中显示用户归档数据存进归档后需要在画面上展示。WinCC提供了“用户归档表格”控件User Archive Control专门用来显示和操作用户归档数据。在WinCC图形编辑器里拖入控件右键打开属性把“归档名称”指向DeviceLog控件就会自动列出所有字段。如果觉得默认字段名不好看可以在归档管理器的字段编辑中设置“显示名称”画面表格的列标题就会变成中文名称比如“设备编号”“操作员”“操作类型”。这个细节对最终用户很重要直接显示英文列名会被现场操作员嫌难看。控件还支持多种操作模式只读、编辑、删除记录。如果不想让操作员随意删改历史就把控件属性设为只读或者隐藏按钮。安全性方面用户归档表格控件默认允许对数据进行完全操作生产环境必须按角色收权。3.2 用C脚本实现置位、复位与二次确认现场操作员经常误碰按钮所以我在启动和停止按钮上都加了二次确认。C脚本实现起来很直接#include apdefap.h void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { if (MessageBox(NULL, 确认启动设备, 二次确认, MB_YESNO | MB_ICONQUESTION) IDYES) { SetTagBit(StartCmd, 1); SetTagBit(StartCmd, 0); // 置位后复位产生一个脉冲 } }置位后立即复位是为了让下游PLC只识别一次上升沿避免按钮一直按住导致变量长时间为1触发多次动作。这个习惯在自动化逻辑里很常见叫“脉冲置位”。同时用户要求每次操作都能追溯所以我在脚本里把操作记录写入OperatorLog归档。具体做法是用GetTagChar读取画面上输入的“操作员”字符串再用用户归档的InsertRecord和SetFieldValue写入字段值。#include apdefap.h void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { char operatorName[128]; GetTagChar(OperatorInput, operatorName); MyInsertLog(operatorName, 1); }这里的MyInsertLog是我封装的一个公共函数放在全局脚本里这样可以避免每个按钮里重复写一大段插入代码。全局脚本的函数在任意画面都能调用方便统一维护。3.3 插入记录与按钮跳转插入用户归档记录有几种方式最常见的就是用控件对象的InsertRecord方法。下面这段脚本演示如何在用户归档表格控件中插入一条记录并给字段赋值#include apdefap.h void MyInsertLog(char* lpszOperator, int nAction) { OBJECT objArchive; objArchive GetObject(过程画面.用户归档表格1); // 在归档末尾插入新记录 objArchive.InsertRecord(0, OperatorLog); // 设置字段值两个文本字段和一个整数字段 objArchive.SetFieldValue(0, Operator, 0, lpszOperator); objArchive.SetFieldValue(0, Action, 0, nAction); }InsertRecord的第一个参数是记录索引第二个参数是归档名称。注意InsertRecord插入的是空记录真正往里面填内容要靠SetFieldValue。SetFieldValue的参数比较繁琐第一个参数是记录索引第二个是字段名称第三个通常填0第四个是实际值。画面上做按钮跳转更常用VBS脚本一行就够ScreenChange(主监控画面)如果你偏爱在C脚本里操作也可以用OnOpenPicture或SetPictureName函数但日常习惯上页面跳转这种界面逻辑用VBS更顺手C脚本更适合做变量和数据处理。3.4 打印功能实现现场有时候需要把用户归档里的数据导出来打印。最简单的做法是利用用户归档表格控件的导出功能将当前数据保存为CSV再通过ShellExecute调用系统关联程序打开让用户手动打印。#include apdefap.h #pragma option(1,1) void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { OBJECT obj GetObject(过程画面.用户归档表格1); obj.SaveToFile(C:\\Temp\\DeviceLog.csv); ShellExecute(NULL, open, C:\\Temp\\DeviceLog.csv, NULL, NULL, 1); }这里有个很重要的细节SaveToFile的目录必须预先存在否则调用会静默失败脚本不报错但文件就是出不来。我第一次就用直接路径结果怎么调都没反应后来加了一句目录创建才解决。4. 常见问题与排查实录4.1 WinCC安装与授权常见问题从你搜的热词里我知道很多人卡在WinCC安装和授权上。“wincc怎么卸载干净”“sim_ekb_install安装授权报错”这些问题我在实施中也遇到过。WinCC安装务必定顺序先装SQL Server再装WinCC最后装授权。顺序颠倒会有一堆莫名其妙的问题。卸载WinCC千万别图省事直接删文件夹要去控制面板走正规卸载流程卸载后清理安装目录的残留文件、注册表里的相关键值以及临时目录里的缓存文件否则第二次安装极易报错。安装时如果提示“无法启动基本应用程序”十有八九是SQL Server服务没起来。到服务管理器里找到名字类似“WINCC”的SQL服务把它手动启动并设为自动启动问题基本能解决。授权时如果弹出CrypAcquireContext错误基本是系统的加密服务出问题了重启一遍电脑或者修复安装一下再试别死磕授权工具。4.2 用户归档不写入数据这是用户归档模块被问得最多的问题。排查顺序有讲究检查归档“记录”页是否勾选了“可写”权限。如果不勾脚本写入会被拒绝。检查归档字段和变量连接的数据类型是否匹配。文本字段连了整型变量写入必失败。检查触发条件是否真的满足。比如用了“变化时”触发但变量根本没发生变化记录自然不会产生。如果用的是脚本手动插入检查按钮事件有没有执行。我习惯在脚本开头加一句测试代码比如SetTagBit(DebugVar, 1)先确认脚本确实跑了。数据写入了表格却不显示那就不是写入问题是控件数据源没选对。用户归档表格控件默认可能指向了空归档或者别的归档要手动在属性里选回DeviceLog。4.3 画面模拟与全局脚本在WinCC里想调试画面布局和脚本逻辑用的是“仿真实”功能不是“运行”按钮。热搜词里有人问“wincc unified画面模拟点哪个”其实Unified和经典WinCC V7的模拟入口差不多都在工具栏的“开始仿真实”位置快捷键通常是CtrlF5。仿真实模式下变量不会真实读写PLC但脚本逻辑、画面跳转、用户归档写入都会正常执行。这意味着你可以用模拟模式完整测一遍“按钮点击-二次确认-写归档-表格刷新”的流程非常方便。全局脚本Global Script则用来放公共函数。比如我的MyInsertLog函数就放在了全局脚本里所有画面共用。全局脚本可以设置触发条件比如周期触发、变量触发、事件触发。如果你要做定时记录就建一个周期为1秒的动作在里面调用插入函数。4.4 C脚本与VB脚本怎么选我接触过的WinCC项目中脚本混用很正常。我的判断标准是涉及位操作、变量读写、归档操作优先用C脚本因为C在处理数据时更直接涉及窗口跳转、控件属性设置、页面逻辑用VBS更顺手代码更短可读性也好。但有一点必须注意别在同一个按钮的事件里同时写C和VBS逻辑容易打架后续维护也看不懂。要么一个按钮就一个模块要么把公共逻辑拆到全局脚本里。打个比方按钮点击后先用C脚本完成变量置位和归档写入再用VBS的ScreenChange跳页面这是合理的分工。把所有逻辑堆在一个语言里反而会让脚本变得臃肿。最后再补充一个这几年做WinCC项目的体会用户归档虽然好用但它毕竟是单机文件存储数据量到了一定级别比如单个归档超过几十万条记录操作性能就会出现下降。遇到这种情况优先考虑给旧记录做定期导出和清空而不是用外部数据库硬扛。毕竟在工控现场稳定是第一位的功能再强大如果三天两头出问题客户也不会买账。如果你正在上手用户归档建议先做一个小Demo把整个链路跑通建归档、定字段、放控件、写脚本、插入记录、显示查询熟悉一遍流程再去接实际项目会从容很多。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表