尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

InTouch历史报警查询ActiveX控件V4.0设计与部署实战解析

InTouch历史报警查询ActiveX控件V4.0设计与部署实战解析 搞InTouch上位机开发的朋友应该都有同感项目现场跑起来之后最头疼的不是画面做得多炫而是客户一句把上个月三号夜班那台泵的报警记录导出来看看。系统自带的历史报警查询功能勉强能用但查询速度慢、过滤条件少、导出的Excel格式乱碰上几千条记录直接卡到怀疑人生。这个V4.0查询控件就是冲着这个问题去的。我自己在几个水处理和制药项目中反复改了好几版把查询引擎、数据缓存、权限联动、导出模块统统重写了一遍最终打包成一个注册即用的ActiveX控件嵌入InTouch画面后直接调用不用改InTouch内核也不用装额外运行时。这篇文章把整个控件的设计思路、部署步骤、脚本调用方式和踩过的坑全部摊开来讲适合正在被历史报警查询折磨的InTouch工程师也适合准备做自定义控件的朋友参考。1. 项目概述为什么非要做这个查询控件1.1 系统自带报警查询的痛点先说说我为什么放着现成功能不用非要自己写一个。InTouch自带的Alarm Viewer控件和历史报警查询确实能用但有几个很现实的问题做项目的都懂。第一是查询性能。现场运行时间一长历史报警表里几十万条记录很正常。自带的查询控件在数据量大的时候翻页和筛选都有明显延迟尤其是客户喜欢用工业平板或者老掉牙的工控机那体验简直灾难。我做过的某个水厂项目两年多的报警记录攒了四十多万条用自带控件按时间范围查询第一次筛选要等十几秒客户当场脸色就变了。第二是过滤维度太少。自带控件的过滤条件基本就是时间范围和报警优先级想按变量名查、按操作员查、按报警状态查对不起做不到。但现场需求恰恰是最细的客户会问昨天张师傅确认过哪几条报警3号水解池的温度高报警出现过几次这种需求用自带控件根本没法实现。第三是导出格式没法看。自带控件导出的Excel列宽混乱、中文乱码、时间格式错乱是家常便饭。我见过最离谱的导出之后报警时间和确认时间全变成数字串客户自己都看不懂最后还得我用脚本重新处理一遍才敢交出去。第四是界面风格和项目整体不搭。工业项目的上位机界面一般都会定制皮肤系统自带的控件是经典Windows风格放在深色工业组态画面里非常突兀。有些客户很在意这个验收的时候能挑出一堆毛病。1.2 V4.0控件的核心定位这个V4.0控件解决的就是上面四类问题。它的定位不是做一个花哨的超级控件而是把查得准、查得快、导得出去、看着顺眼这四个基本盘做扎实。先说查询性能。这一版把查询引擎全部重写了核心改动是改为分段加载机制。以前是一次性把所有记录全部读进内存再处理现在改成按批次从历史库拉数据配合UI虚拟滚动只渲染当前可视区域的行。实测下来四十万条报警记录按时间范围筛选首屏出数据不到一秒钟翻页跟手老工控机也能流畅跑。再说过滤条件。这个版本支持多条件组合筛选时间范围、变量名支持模糊匹配、报警类型、报警优先级、确认状态、操作员姓名六个维度可以自由组合。操作记录模块也支持按操作员、按操作类型、按时间范围筛选基本覆盖了现场能想到的所有查询场景。导出功能是我最下功夫的地方。V4.0内置了独立的Excel导出引擎列宽、表头、时间格式全是预设好的导出来就能直接用。时间格式统一为yyyy-MM-dd HH:mm:ss.fff客户拿到手不用做任何后处理。导出大文件时用后台线程处理UI不卡死导完自动弹出提示。界面方面控件支持自定义配色可以设置背景色、表头颜色、选中行颜色、字体大小。默认做了一套深蓝配色和大多数工控画面都能协调省去了改皮肤的麻烦。2. 控件架构与核心功能拆解2.1 V4.0的功能清单与运行环境先把这个控件能干什么完整列一遍方便各位判断适不适合直接拿去用。查询模块支持两类数据一类是历史报警记录一类是操作记录。历史报警记录包括报警产生时间、恢复时间、确认时间、确认操作员、报警变量名、报警描述、报警类型、报警优先级、报警状态九项内容。操作记录包括操作时间、操作员、操作内容、操作结果、操作来源IP五项内容。查询方式上除了前面说的六维组合过滤还支持模糊查询和通配符查询。比如客户只记得报警描述里有水位两个字直接输入水位就能把相关记录全部捞出来不限制字段位置。通配符支持星号和问号水位*上限这种写法也能识别。结果展示方面支持按任意列排序升序降序点击表头切换、分页显示每页行数可配置默认50行、行数统计满足条件的总记录数直接显示在状态栏。双击某一条报警记录可以联动弹出该报警关联变量的实时趋势画面这个功能在排查问题时非常实用。导出功能支持导出当前筛选结果全部数据和只导出当前页数据两种模式。导出格式为Excel 2007及以上版本文件名为历史报警_导出时间.xlsx这种格式避免乱码。从运行环境来说这个控件是标准的ActiveX控件兼容Windows 7到Windows 1132位和64位系统都做了适配。InTouch版本方面支持2012 R2、2014、2017、2020以及最新的2023版本实际上只要系统支持ActiveX控件嵌入就能用。控件本身不依赖InTouch内部接口它直接读取InTouch的历史报警数据库文件.aaLog文件和系统日志数据库所以在InTouch之外独立测试也可以。2.2 数据链路与查询引擎的工作原理理解这个控件怎么工作对后续自己排查问题有帮助。我先画个简单的逻辑链自己脑补的流程图把数据从产生到显示走一遍。InTouch运行时会把报警记录实时写入历史报警文件这个文件就是控件的数据源。控件启动时首先通过InTouch的HistData接口我自己封装了一层扫描历史报警文件所在的目录读取文件列表和每个文件的时间跨度建立索引。查询时先在索引中定位到可能包含目标数据的时间段再从对应文件中按批次读取记录。这个过程类似查字典先查偏旁部首而不是从头翻到尾速度自然快很多。操作记录的数据源稍有不同。InTouch自身的操作记录默认写入系统的应用程序日志这个日志刷新频率不固定而且格式不统一。所以这个控件做了一个轻量级的数据库文件专门存放操作记录。InTouch端通过一个自定义脚本函数在每次操作发生时同步把记录写入这个数据库相当于在应用层做了一个操作审计模块。这样的设计有个好处即使InTouch系统重启或异常崩溃已经写入的操作记录不会丢失下次启动控件可以直接从数据库读取。而且数据库文件是独立存放的备份和迁移都很方便重装系统也不会影响历史操作记录。3. 一键部署与集成实战3.1 环境准备与安装步骤我说的一键下载即用不是夸张。整个安装过程就是三步解压缩安装包、运行注册脚本、在InTouch窗口里拖控件。但这三步都有需要注意的地方踩过的坑我一个个说。第一步是解压安装包。安装包解压后会有三个文件或者类似结构控件本体.ocx文件通常是64位和32位两个版本、注册脚本.bat文件、示例工程文件夹包含一个做好的示例画面。建议先把整个文件夹复制到C盘根目录下路径不要太深中文路径一定要避免因为ActiveX控件注册时遇到中文路径容易出现莫名其妙的注册失败。第二步是注册控件。这一步很关键InTouch使用ActiveX控件前必须先把控件注册到Windows注册表中。运行注册脚本时注意一定要以管理员身份运行。右键选择以管理员身份运行否则权限不足注册会失败。注册成功的标志是命令行窗口会显示DllRegisterServer in xxxx.ocx succeeded这一行。注册完成后需要验证一下是否成功。打开文件资源管理器进入系统目录下的SysWOW64或System32文件夹找到cmd.exe输入regsvr32 控件完整路径再回车执行一次。如果弹出注册成功的提示框说明控件已经正确注册了。第三步是确认InTouch授权路径。InTouch安装时默认授权路径一般是C:\Program Files (x86)\Common Files\ArchestrA\但不同版本的InTouch授权路径可能有差异。如果控件在运行时提示无法获取授权信息或无法读取历史数据优先检查InTouch的授权路径设置。打开InTouch的WindowMaker在Special菜单下找到Configure选项确认Historian和Alarm Logger的运行路径设置正确然后再重新启动InTouch并打开画面。3.2 嵌入WindowMaker画面的具体操作控件注册完成后嵌入InTouch画面是常规操作但细节决定体验。打开WindowMaker在菜单栏找到Wizard或工具箱点击打开ActiveX控件列表。正常情况下列表中会出现V4.0历史报警查询控件具体名称可能因版本命名而异。如果没有出现在列表里试试关闭WindowMaker重新打开再不行就检查控件是否注册成功。把控件从工具箱拖到画面上之后会自动弹出控件属性设置对话框。需要重点设置的属性有三个一个是连接参数指定历史报警文件的路径一个是显示模式控制控件的显示尺寸和初始加载条数一个是样式设置配置控件的配色方案和字体大小。连接参数的设置尤为关键。如果历史报警文件存放在默认路径下通常是InTouch安装目录下的AlarmLogger子目录控件会自动识别不需要手动填写。但如果现场把历史报警文件迁移到了其他磁盘就要手动指定路径。建议在项目的配置设置中提前声明这个参数避免将来磁盘空间不足需要迁移数据时的手动修改工作。显示模式里有个初始加载最近记录数参数默认值是200条。这个参数控制控件首次运行时显示多少条最近的报警记录建议不要调太大否则首次加载会有等待感。200条足够客户看到最近数据了通过筛选和翻页再加载更多。样式设置就比较直接根据项目画面配色调整就行。默认参数已经做过优化直接使用也没有问题看起来会很协调。4. 脚本调用与功能联动实操4.1 查询参数配置与常用方法调用控件嵌入画面只是第一步真正用起来要靠脚本调用。InTouch脚本里调用ActiveX控件方法的标准语法是控件名.方法名(参数列表)这个控件的调用方式保持了这个习惯。最常用的是查询方法。在按钮的鼠标点击脚本里写下QueryControl.QueryRecords(2025-01-01 00:00:00, 2025-01-31 23:59:59, , , , 全部, 全部, );这一行调用会按指定时间范围查询全部报警记录。八个参数依次是开始时间、结束时间、变量名过滤、描述过滤、报警类型过滤、优先级过滤、状态过滤、操作员过滤。空字符串表示不过滤完全不用输入太多条件。实际操作中需要把文本框内容和下拉框选择映射到这些参数上。比如客户界面上有开始时间选择器结束时间选择器变量名输入框脚本里就要把这些控件的值读出来拼接成参数的格式。时间格式统一是yyyy-MM-dd HH:mm:ss.fff毫秒部分可以留空前两位时间戳也会被正确解析。查询完成后控件会触发一个事件相当于告诉画面查询完成了脚本里可以在事件响应中更新状态栏或弹窗提示。示例代码QueryControl_QueryCompleted() { StatusLabel.Text 查询完成共 QueryControl.RecordCount 条记录; }4.2 操作记录联动与权限管理配置操作记录查询和报警查询在配置上有一点不同操作记录写入需要InTouch端有一个数据采集脚本保持运行。这个脚本在控件安装包里已经提供只需把它拷贝到InTouch的应用脚本中。采集脚本的核心逻辑是监控InTouch的$Operator变量当操作员登录或登出时自动把操作时间、操作员名称、操作类型登录/登出、操作来源IP写入控件对应的数据库文件。另外对于画面切换、参数修改这类关键操作需要在对应脚本中手动调用一行写操作记录的函数。这个设计的好处是操作记录完全受控不会像系统自带功能那样产生大量冗余记录。比如操作员频繁打开关闭画面如果每次切换画面都记录数据库会很快膨胀。所以我在这个版本中对操作类型做了分级普通画面切换只在调试模式下记录正式运行时只记录登录登出、报警确认、参数修改、导出数据这四类关键操作既保证了审计完整性又控制了数据量。权限联动这块控件自身不单独做用户管理直接读取InTouch的登录用户信息。控件有一个当前用户属性脚本里可以直接获取当前登录的InTouch操作员名称导出记录时会把当前操作员一并记录到导出日志里。这样出了任何数据泄露或者误操作的问题都能追溯到人在制药行业审计追踪需求下尤其实用。4.3 Web发布场景下的使用说明最后说一下热词里提到的InTouch Web发布场景。如果你的项目用了InTouch Web发布也就是通过浏览器访问画面这个控件在Web端有两种适配情况。第一种情况是Web端只做数据展示不要求完整查询功能。这种情况下控件在Web发布后可以正常显示查询结果基于数据快照但由于ActiveX在浏览器端的限制控件内部的实时刷新和文件读取功能在Web端不完整。所以我建议在Web发布画面中使用控件提供的一个只读模式该模式隐藏查询条件输入框仅展示数据列表和导出按钮客户在浏览器上也能方便地查看和导出数据。第二种情况是Web端需要完整查询功能。ActiveX方案在如今的主流浏览器中已经很难用建议直接放弃在Web端用ActiveX改为通过控件的服务端接口把查询能力暴露成HTTP接口Web画面的脚本通过Ajax请求调用。这个方案在V4.0里做了实现安装包里附带了一个独立的数据服务模块部署在InTouch服务器上即可对外提供查询REST API同时返回JSON格式数据前端自己拼表格。5. 常见问题与排查技巧实录5.1 控件注册失败与查询乱码等问题开发过程中各种报错也遇见过许多总结下来常见的就那几类下面整理成表格方便直接对照排查。问题现象可能原因排查方法解决方案注册时报模块未找到或加载失败未安装运行库或路径包含中文/空格检查控件是否放在纯英文路径下安装VC运行库或.NET Framework 4.7.2控件拖入画面后不显示控件未正确注册或文件损坏运行regsvr32重新注册检查返回值用管理员权限重新注册必要时重装控件查询结果乱码系统区域设置不匹配查看系统区域和代码页是否符合将系统区域改为中文简体中国重启InTouch查询速度慢历史报警文件碎片化或索引丢失检查历史报警文件大小和数量对历史报警文件执行碎片整理设置索引重建导出Excel为空查询结果集太大超出Excel行数限制查看导出日志确认实际导出行数分批导出或使用CSV格式导出Web端无法显示控件浏览器安全策略阻止ActiveX检查浏览器兼容性设置和站点白名单使用兼容模式或改用只读模式/接口模式其中查询乱码的问题是跑不掉的。控件默认按UTF-8编码读取历史报警文件如果InTouch报警记录本身的编码不是UTF-8比如中文Windows下用系统默认的GB2312编码读取时就会出现乱码。解决方式是在控件属性中设置数据编码为系统默认控件会改用系统代码页来解析文件中文就能正常显示了。还有一个很多人问的问题查询的时候把时间范围设置得特别大比如查询全年的记录结果等了很久没反应。这不是卡死了而是数据量太大在正常加载。控件默认有超时限制观察右下角状态栏如果还在加载中就等等。如果超过5分钟没有响应建议用诊断模式跑一遍输出详细的加载日志看卡在哪个时间点的文件上再决定是否要缩小时间范围。5.2 授权路径配置与安装问题授权问题是另一个高发区。I nTouch授权路径设置不对会导致控件能加载但无法读取历史数据。具体的排查流程是这样的。打开控件的属性面板找到运行状态标签页查看授权信息一栏是否显示正常。如果显示授权路径无效或无法找到授权文件需要检查InTouch安装后的授权路径。InTouch的授权路径在安装时就确定了通常位于系统盘:\Program Files\Common Files\ArchestrA\license目录下但不同版本和安装方式可能有差异。可以打开InTouch的License Manager工具查看当前授权文件的存放路径然后在控件属性中把授权路径指向该目录。还有一个小技巧直接把授权文件复制到控件安装目录下控件会优先使用本地授权文件不需要额外配置路径部署时比较省事。关于InTouch安装这个问题顺便说一句。重新安装InTouch时如果之前装过旧版本要先彻底卸载干净并把系统目录下的ArchestrA文件夹手动清理掉否则新装环境容易出现授权读取异常。装完之后第一件事是启动Historian服务在系统服务中找到ArchestrA Logger相关服务确认它在正常运行。如果这个服务没启动控件能注册、能嵌入画面但是查询结果永远是空表。5.3 历史数据不更新与文件锁死问题还有一种常见情况控件一切正常但查询不到最新的报警记录。这种问题多半不是控件的问题而是InTouch历史报警写入机制导致的。InTouch历史报警文件默认是一个固定大小的环形文件比如100MB满了之后会循环覆盖最早的记录。如果文件刚好处于写满待切换的状态新报警会暂时缓存在内存中控件按时间范围查询时可能会漏掉最近几十条数据。解决方式是在InTouch的报警记录配置里调大单个文件容量同时设置自动切换时间比如每天零点切换一个文件确保文件切换有时间窗口不会因为容量达到上限而暂停写入。另外Windows系统的文件锁机制偶尔会阻碍控件的文件读取操作。特别是当InTouch运行时正在写入某个历史报警文件控件去读取这个文件时会收到文件被占用的错误。V4.0内部分文件访问重试机制来解决这个问题但如果重试次数过多仍然失败建议检查历史报警文件所在磁盘的写入缓存策略确保没有开启关闭设备时刷新写入缓存以外的无关设置。我见过一个比较特殊的案例客户的报警记录在每天凌晨三点左右有一段一小时的空窗期。排查了半天发现是Windows系统更新在那个时间点自动重启了InTouch服务重启过程中有一段时间无法正常记录报警。解决方法也很简单把系统更新策略改为手动安装即可顺便检查一下系统计划任务里有没有非预期的定时任务在执行。6. 扩展方向与Web发布和系统集成的更多玩法6.1 把查询能力嵌入手机端和车间大屏控件在InTouch画面里用已经很顺手了但这不代表它的能力只能局限在InTouch内部。我最近在几个项目中把控件的数据服务模块独立拆出来用效果意外地好。数据服务模块是V4.0附带的一个独立程序核心功能是把控件的查询引擎封装成HTTP接口对外提供REST风格的数据查询API。接口返回JSON格式数据前端只要会拼表格就能展示。这意味着同一个数据服务的接口接在InTouch Web发布页面上可以接到手机端企业内部系统上可以接到厂区车间大屏的网页上也可以。比如客户想在半挂车间门口的LED大屏上滚动显示最新的高优先级报警最简单的做法就是在大屏系统里定时调用数据服务接口拉取最近一小时内优先级为紧急的报警记录格式化后滚动播放。整个过程不需要跟InTouch发生直接关系完全解耦对现场实施人员要求很低。做这样的扩展时要留意跨域访问的问题。车间大屏和InTouch服务器不在同一台机器网页请求就可能遇到跨域拦截。数据服务模块默认开启了CORS策略并允许自定义域名白名单部署时把大屏系统的地址加进白名单就可以。6.2 数据导出和审计报告的自动化最后一个我想重点说的扩展是导出功能的自动化。很多客户不只是手动点按钮导出他们想要的其实是定期自动生成一份报警记录报表直接发到管理人员的邮箱里。V4.0的导出接口可以被外部脚本调用配合Windows计划任务完全可以实现Every day凌晨两点自动导出昨日的全部报警记录、生成PDF或Excel、发送邮件这样一个全自动流程。我在一个制药项目中就搭了这么一套凌晨1点通过计划任务调用数据服务接口的导出功能生成前一天零点到二十四点的全部报警记录报表1点10分自动把报表发送给质量部负责人。搭建这个功能不复杂核心思路是用数据服务模块的导出接口配合命令行参数调用窗口。数据服务模块接收参数后异步生成文件生成完成后回调通知调用方。把这个流程和客户现有的报表系统对接后每天省掉了一个操作员半小时的人工整理时间客户非常满意。要注意的是自动导出任务开始前务必确保InTouch历史报警文件已完成当天文件的切换归档否则导出的数据会缺最后一段时间。最好的方式是设置InTouch历史报警文件每天23点59分切换导出任务放在凌晨1点执行这样就能避免数据遗漏。如果报警数据量较大的项目建议在凌晨3点或者4点执行导出任务留足归档时间。实操总结与避坑心得从最初只想解决现场查询慢的小问题到最终把查询、导出、Web发布、自动报表一套流程全部跑通这个V4.0控件在我手上迭代了快两年。回看整个过程最大的心得是不要总觉得系统自带的东西改不了也不要一上来就想着大动干戈换平台。搞清楚数据是怎么产生的、存在哪里、以什么格式读取往往一个轻量级控件就能解决看似复杂的问题。几个小技巧再啰嗦一遍。第一控件部署到现场前一定先在一台干净的虚拟机里完整走一遍安装注册流程能避开90%的路径和权限问题。第二导出Excel前检查目标机器的Office运行库版本导出失败的报告里有一半是系统缺少相应组件导致Excel模块初始化失败。第三历史报警文件的备份策略一定要提前设计环形文件一旦写满覆盖旧记录就永远找不回来了。最后再分享一个让我印象深刻的小事。有一次客户打电话来说报警查询卡死了我远程一看原来是操作员把时间范围选成了从1990年到2099年直接触发了一次全量全历史扫描。虽然控件做了分批加载但几十万条记录一次性读出来还是需要几秒的等待。后来我在界面上加了一个时间范围校验的提示如果跨度超过300天就弹窗提醒数据量较大请确认这个问题就再也没有出现过。类似这种很小但很实用的设计才是做工业软件真正有意思的地方。
返回列表