简介:Intouch报警数据库配置是一份面向工业自动化工程师、组态软件学习者和考试备考人群的PDF资料,重点梳理Wonderware InTouch报警系统中报警数据库从连接到查询的完整配置流程。文档围绕Alarm DB Logger展开,先说明SQL Server必须设为混合模式身份验证的注意事项,再逐步演示服务器名、数据库名、用户名、口令等连接项填写,详细/合并两种记录模式的选择,以及记录间隔、报警优先级范围和查询语句的配置方法;同时介绍通过Alarm DB Logger Manager配置向导测试连接、创建数据库,以及以管理员身份将记录器设置为Windows服务的操作要点。资源为单个PDF文档,约12KB,内容紧凑、要点明确,适合考前速览、项目部署时对照查阅或作为故障排查手册。目前已有317人学习下载,对有InTouch报警系统维护与组态需求的技术人员具有直接参考价值。
1. Intouch报警数据库配置:为什么报警要落进SQL而不是留在HMI里
值班电话晚上十一点响,接起来是白班班长:“加热炉那条高温报警,我在HMI报警列表里翻了半天没找到,你们到底记没记?”这种场面的根源,多半是Intouch报警数据库配置没做到位。把Intouch报警数据库配置想清楚,就是让Intouch运行时里每一条报警/事件稳定落地到SQL Server这类关系库,而不是留在HMI报警列表里等着被翻页翻丢。它解决的是三件具体事:交接班查历史报警不用再去逐页翻、事故复盘能拿到可靠的时间线、故障统计报表能从数据库取数而不是靠人肉抄录。这套配置适合仪表、自控、SCADA运维和系统集成工程师,尤其适合手头有一堆设备报警但至今还躺在HMI页面里的项目。
2. 先选型再动手:Alarm DB Logger与Historian,Intouch报警数据库配置该走哪条路
现场问得最多的一个问题是:Intouch报警数据库配置到底该走Alarm DB Logger,还是上Historian?很多工程师把这两者当二选一,其实两条路线解决的是不同层面的问题。Intouch自带的Alarm DB Logger走的是“ODBC加关系库”这条路,配置直接,数据落到SQL Server里,后续报表、交接班查询都方便;System Platform Historian走的是“统一历史数据平台”的路,报警和实时数据在同一套存储里,适合已经上了System Platform的新项目,或者多套Intouch集中管理的场景。做选择之前,先看现状:手里是存量单机Intouch,还是新建设的多节点系统。
2.1 两条路线怎么选:单机存量项目用Alarm DB Logger,接System Platform用Historian
Alarm DB Logger适合存量项目,原因是配置改动最小。Intouch单独跑在一台工业PC机上,SQL Server也在这台机器或同一网段,通过ODBC数据源连接,报警流一出站就写进库。常见版本的Intouch安装后都会带Alarm DB Logger Manager这个管理工具,数据表结构由管理器自动生成,不用DBA手工建模。缺点也明显:它是独立的一份报警存储,和实时数据库、历史数据库各自分开;系统一多,每套Intouch都要维护一份报警库,查询起来还得串联。
Historian路线适合已经有System Platform的厂。报警数据落进Historian之后,能通过统一的数据服务查询,还可以把报警事件和过程量放在同一条时间轴上做关联分析,设备故障复盘时不需要先关联报警库和实时库。代价是部署和运维门槛高,Historian本身要作为平台服务来管理,底层存储也不太方便用通用SQL直接翻。对大多数只有一个中控室、几台Intouch节点的工厂,上Historian属于杀鸡用牛刀。
| 对比维度 | Alarm DB Logger | System Platform Historian |
|---|---|---|
| 适用形态 | Intouch独立版、存量单机项目 | 已接入System Platform的新项目 |
| 数据落地方式 | ODBC写入SQL Server等关系库 | Historian专有存储 |
| 配置复杂度 | 低,DSN加管理器配置即可 | 高,需要部署和维护Historian |
| 查询方式 | 直接写SQL | Historian API或报表服务 |
| 多系统集中管理 | 需各自配置 | 可统一管理 |
我一般这样判断:项目已经上了System Platform体系,报警和工艺量需要在同一平台里关联,就顺着Historian走;如果只是老的Intouch节点,报警异常发生后需要快速翻历史、出报表、配合交接班复查,Alarm DB Logger更实际。尤其不少存量项目里这套组件已经稳定运行很多年,没必要为了“新架构”去折腾一套实时库平台。
2.2 配置前先确认三件事:ODBC数据源位数、SQL账号权限、Windows启动模式
第一件是ODBC数据源位数。Intouch本身常见的是32位进程,64位Windows上打开“ODBC数据源管理器”时,如果不小心用了控制面板里的64位版本,建出来的系统DSN在Intouch运行时根本看不到。正确做法是用C:\Windows\SysWOW64\odbcad32.exe启动32位ODBC管理器,在这个界面里建系统DSN。
提示:32位ODBC管理器和64位ODBC管理器各维护一套DSN列表,你在这个里建的DSN,另一个里看不到。这是Intouch报警数据库配置里最常见的翻车点,没有之一。
第二件是SQL账号权限。不要直接拿sa给Alarm DB Logger用,生产库用sa一旦被运维扫描扫出来就是大事故。常见做法是单独建一个账号,只授予这个报警库的读写权限:
USE [master]; GO CREATE LOGIN intouch_alarm WITH PASSWORD = N'Jx4!ks2#Qp9'; GO USE IntouchAlarmDB; GO CREATE USER intouch_alarm FOR LOGIN intouch_alarm; GO ALTER ROLE db_datareader ADD MEMBER intouch_alarm; ALTER ROLE db_datawriter ADD MEMBER intouch_alarm; GO这段脚本的逻辑是:先在SQL Server实例级建登录账号,再在报警库里建对应的数据库用户,最后把它加进db_datareader和db_datawriter两个角色。db_datareader负责Alarm DB Logger Manager建表后读取结构,db_datawriter负责把报警写入事件表,两个角色加起来正好覆盖运行和连接测试两个场景。密码里的特殊字符别省,报警库虽然不像业务库那么敏感,但数据库端口暴露在工控网里被扫描也不是稀罕事。
第三件是Windows启动模式。Alarm DB Logger运行时是跟着Windows登录会话走的,如果Intouch运行节点设置了自动登录,那这个自动登录账号必须对ODBC DSN和SQL Server都有访问权;如果用了运行服务账号,还要确认该账号能读到64位注册表里的DSN配置。很多现场把工控机设成开机自动登录,但账号密码被IT改了之后,ODBC连接静默失败,报警写入就悄悄断了。配置前把这几个前置条件一次性确认完,后面才不会反复折腾。
3. 建库、建DSN、配Alarm DB Logger:Intouch报警数据库配置的最小可跑通流程
前置条件确认完之后,就可以进入Intouch报警数据库配置的正式流程。这里按“建库、建DSN、配管理器、挂运行时、验证落地”五步走。先说明一点:Alarm DB Logger Manager第一次配置时通常会自动生成需要的表结构,所以建库这一步只需要把数据库外壳建好,不需要手工建表。手工建表反而容易和Manager的表结构定义不一致,后面查询时对不上字段。
3.1 第一步:在SQL Server里为Intouch报警数据库建库
打开SSMS或者用sqlcmd,执行下面的建库脚本:
USE [master]; GO IF DB_ID(N'IntouchAlarmDB') IS NULL BEGIN CREATE DATABASE IntouchAlarmDB ON PRIMARY ( NAME = N'IntouchAlarmDB', FILENAME = N'D:\AlarmDB\IntouchAlarmDB.mdf', SIZE = 512MB, FILEGROWTH = 256MB ) LOG ON ( NAME = N'IntouchAlarmDB_Log', FILENAME = N'D:\AlarmDB\IntouchAlarmDB_log.ldf', SIZE = 128MB, FILEGROWTH = 128MB ); END; GOFILENAME里的路径要根据现场数据盘实际位置改,不要在C盘里建报警库,工控机系统盘稳定性和空间都不适合放长期增长的报警历史。SIZE和FILEGROWTH这两个参数值得多说两句:数据库初始512MB、日志初始128MB是按“日报警量几千条、至少跑半年”的余量给的预分配,避免一开始自动增长频繁触发;FILEGROWTH设成固定值256MB而不是百分比,是因为百分比增长在文件变大后一次可能要分配好几个GB,统计等待时间会明显拉长,极端情况下报警写入会跟着抖动。
建完库之后,Alarm DB Logger Manager会在配置数据库时自动创建报警表、事件表这些结构。如果自动建表失败,先回到上一章的账号权限检查,最常见原因是当前连接账号没有CREATE TABLE权限。
3.2 第二步:配置系统DSN并打通Alarm DB Logger Manager
打开32位ODBC管理器,添加“系统DSN”。驱动选“ODBC Driver 17 for SQL Server”或“SQL Server Native Client 11.0”,以现场实际安装的驱动为准。填服务器地址时,本地可以用localhost或实例机器名,远程就填IP加实例名,例如192.168.1.10\SQLEXPRESS。认证方式建议用SQL Server认证,填上一步建的intouch_alarm账号;默认数据库下拉框里选IntouchAlarmDB,然后测试连接。
DSN建好后,从开始菜单里找到Alarm DB Logger Manager并打开。管理器的操作逻辑不复杂,常见做法是新建一个数据库配置,DSN下拉框里选刚建的IntouchAlarmDSN,填上账号密码,再选择要记录的报警类型。这里的报警类型一般有报警Alarm、事件Event、消息Message三类,至少把Alarm和Event都勾上。字段选择上,TagName、AlarmGroup、Priority、OccurrenceTime、EventValue这几项是后续查询和报表的必选字段,尽量都保留。
配置完成后先做一次“测试连接”,确认Manager能正常读写数据库。测试通过后保存配置。有些版本的Manager会弹窗问是否自动创建表结构,选“是”。这一步做完,报警数据库的“后端”就绪,接下来要把它挂进Intouch运行时。
3.3 第三步:把报警流挂进运行时并验证数据落地
Alarm DB Logger的挂接方式,常见做法是在WindowMaker里打开一个需要长期驻留的窗口,从控件列表里找到Alarm DB Logger控件拖到窗口上,保存后运行Viewer时它会自动装载配置并开始写库。如果你的项目里不想动画面,也有把Alarm DB Logger配置成随系统启动的独立方式,具体看现场用的是哪个版本的Intouch,但无论哪种方式,核心目标都是让它在WindowViewer运行时自动起来,而不是每次手动去点。
挂接完成后,先在Intouch上手动触发一两条报警,然后回到SQL Server里验证数据真的进去了。不要急着看业务数据,先让数据库告诉你表结构是什么样的:
USE IntouchAlarmDB; SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'; -- 得到实际的报警事件表名,不同版本命名不同,以查询结果为准这条SQL的作用是把库里的所有基表列出来。Alarm DB Logger Manager自动建的表名在不同版本里会有差异,有叫报警事件主表的,也有带日期后缀的,所以先查出来再针对操作。拿到实际表名后,再查最近写入的报警:
SELECT TOP 10 TagName, AlarmGroup, Priority, OccurrenceTime FROM [上一步查到的实际表名] ORDER BY OccurrenceTime DESC;代码里方括号不是让你照抄,是要替换成上一步查到的实际表名。如果这个查询能返回刚才手动触发的报警记录,说明Intouch报警数据库配置已经通了。如果查询返回空,而Intouch确实报警了,优先检查ODBC连接测试能否通过、账号有没有写权限;如果表都没建出来,回到3.1去看自动建表是否失败。
4. 报警库查询得好用才叫配好:分表策略、索引与报表账号
报警能写进库只是及格,查询好用才算配置到位。很多项目报警库跑半年后查询越来越慢,SSMS里一条统计SQL能转几十秒,问题基本都出在单表数据量过大、索引缺失、报表账号直接查生产表这三个地方。这一章把分表、索引、账号权限一次说清。
4.1 报警库单表能撑多久:容量估算与分表信号
先做一个保守的容量估算。一条报警记录按512字节算,里面包含了标签名、报警组、优先级、时间戳、报警值等字段,再加上索引页的开销,实际可能比这个大,但512字节足够做规划。一个日报警量3000条的中型装置,一年大概产生550MB数据;日报警量一万条的现场,一年就是接近2GB。SQL Server单表存几百万行其实还能工作,配合上合理索引,查询并不会立刻崩,但超过千万行之后,统计类查询延迟会明显上升。
| 日均报警量 | 年存储量估算 | 建议方案 |
|---|---|---|
| 1000条 | 约200MB | 单表加索引即可 |
| 5000条 | 约1GB | 单表可接受,考虑半年归档一次 |
| 20000条 | 约4GB | 按年分表或分区,配置定期归档 |
分表策略上,常见做法有两种:一种是在Alarm DB Logger配置里看是否支持按天或按月生成表名,如果支持,让它自动按时间周期建新表;另一种是配置SQL Server Agent作业,每周或每月把生产表里超过保留期限的数据搬到历史表。无论哪种,目的都是让生产报警表保持在一个可控的数据量级,查询快,备份也快。我不建议一开始就上特别复杂的分区方案,先按年分表或者定期归档,等数据量真的到千万级再评估分区表。
4.2 查询SQL:按报警组、优先级和时间段取数
报警数据库配好后,最常用的查询就是按报警组、优先级和时间段统计。Intouch里报警组是用户在标记名字典里配置的分组,通常按装置或工艺区域划分,比如Heating_Furnace、Compressor_Area;优先级范围是1到999,数值越大越紧急,999为最高。下面的SQL按报警组和优先级统计某个月的报警次数:
SELECT AlarmGroup, Priority, COUNT(*) AS AlarmCount FROM [实际表名] WHERE OccurrenceTime >= '2025-01-01 00:00:00' AND OccurrenceTime < '2025-02-01 00:00:00' AND Priority >= 500 GROUP BY AlarmGroup, Priority ORDER BY AlarmCount DESC;这个查询的逻辑是先把时间窗口卡死,再按报警组和优先级维度聚合,最后按数量倒序排列。时间窗口用>=和<而不是BETWEEN,是为了避免边界误差,这也是写时间查询的一个习惯。Priority >= 500这个条件是过滤阈值,现场需要看哪些级别的报警,按自己的报警分级习惯调整。如果查询结果里报警组名和Intouch画面上的不一致,回去检查标记名字典里的报警组配置,查询库里的是全名,画面上显示的可能有简化后缀。
4.3 索引怎么加才不拖累报警写入
报警表是典型的“高写入、中查询”场景,索引加得太多会直接拖慢报警写入,因为每条报警插入时都要同步更新索引。所以索引宁缺毋滥,只给最常用的查询路径建复合索引。如果你们现场的固定查询是“查某段时间内高优先级的报警”,就建时间和优先级的复合索引:
USE IntouchAlarmDB; CREATE NONCLUSTERED INDEX IX_Alarm_Time_Priority ON [实际表名] (OccurrenceTime DESC, Priority DESC); GOOccurrenceTime DESC放在第一列,是因为所有报警查询几乎都会带上时间范围,时间列做前导列能让索引落到最小数据区间,再配合Priority DESC过滤高优先级报警,查询代价会大幅下降。索引数量建议控制在两三个以内,除了这个复合索引外,最多再建一个报警组相关的索引;如果已经做了按天分表,表的规模小,甚至只需要这一个复合索引就够了。报表查询不要直接连生产库跑大统计,把第2章的只读账号拿来给报表工具用,权限上只给db_datareader,避免报表里写错条件影响业务。
5. Intouch报警数据库配置常见问题:断录、连不上、时间对不上的五个排查记录
报警数据库配置完,运行三个月内最容易出的问题基本都集中在连接、账号、时区和自动启动这几类。下面这五条是从现场积累下来的高频故障,每条按现象、原因、解决的顺序写,遇到类似情况可以直接照着排查。
5.1 32位/64位ODBC混用:Manager测试通过,Intouch运行时就是不写库
现象:Alarm DB Logger Manager里测试连接成功,甚至手动查询都能看到表结构,但Intouch运行时一报警,数据库里一条记录都没有,HMI端也没有任何报错。
原因:Manager和Intouch运行时进程位数不一致,各自读到的ODBC DSN列表不一样。常见情况是64位系统上同时装了32位和64位ODBC驱动,Manager用64位DSN测试通过,Intouch运行时是32位进程,读的是32位DSN列表,那里根本没有配置。
解决:用C:\Windows\SysWOW64\odbcad32.exe打开32位ODBC管理器,确认系统DSN里确实存在配置;如果Manager里能选到DSN但Intouch里不行,把DSN删掉重建一次,确保两端引用的是同一个DSN名称。
5.2 SQL账号密码过期:某天开始报警静默断录
现象:没有改过任何配置,报警突然从某天开始断录,SQL Server日志里有大量登录失败记录,错误码是18456。
原因:SQL Server启用了密码过期策略,或者IT周期性改密后没有同步到Alarm DB Logger Manager的配置里。报警写入失败是静默的,Intouch画面上不会有任何提示,只有查库才发现断了。
解决:给intouch_alarm账号设置密码永不过期;如果公司安全策略强制定期改密,就把改密和同步Alarm DB Logger配置放进同一个运维变更单,改完密码后在Manager里重新执行测试连接,确认恢复写入。
5.3 报警时间与写库时间差8小时:交接班对不上账
现象:报警表里的OccurrenceTime比现场实际发生时间晚8小时,或者早8小时,交接班对报警记录时两边怎么都对不上。
原因:Intouch运行节点的操作系统不是北京时间,或者SQL Server实例的时区与会话时区不一致。报警写入时,Intouch按本地时间生成时间戳,ODBC驱动和SQL Server再按各自时区做一次转换,中间多了一次偏移。
解决:统一工控机Windows时区为北京时间,并确认SQL Server实例时区一致;如果驱动和连接串支持时区参数,在ODBC连接设置里显式指定。排查时先看两条时间:报警表的写入时间和Intouch画面报警发生时间,两者差值恒定时基本就是时区问题。
5.4 数据库自动增长太小:报警量大时Intouch画面都跟着卡
现象:报警写入高峰时段,Intouch运行时页面操作明显变慢,报警列表刷新一顿一顿的;数据库里看等待统计,文件增长等待时间很高。
原因:建库时如果用了默认配置,数据文件初始大小很小,FILEGROWTH是10%或1MB,每次扩容需要等待SQL Server分配新空间,报警写入被阻塞,进而拖累Intouch进程。
解决:按第3章的建库脚本重建参数,或者对现有库执行ALTER DATABASE把FILEGROWTH改成固定值256MB,初始大小调整到1GB以上。日志文件也一并处理,并尽量保证数据和日志分别放在不同物理磁盘上。
5.5 重启后Alarm DB Logger没有自动运行:多一些断档记录
现象:工控机因为断电或系统补丁重启后,Intouch画面正常,但报警库从重启时刻开始没有新数据,直到人工发现并重新启动Alarm DB Logger才恢复。
原因:Alarm DB Logger没有配置成随系统或随WindowViewer自动启动,之前是现场工程师手动开的,重启后没拉起来。
解决:在Alarm DB Logger Manager里把启动模式改为自动。如果Manager里没有明确的自动启动选项,就把启动入口放到WindowViewer的启动脚本里,或者做成Windows计划任务在登录时执行。确认后手动重启一次工控机,再验证报警是否自动写入。
6. 把报警数据库当成巡检对象:断档SQL、容量估算与恢复习惯
报警数据库配置完不是终点,运行期最怕的是断录了没人发现。我的习惯是把它当一台重要设备纳入日常巡检,每天早班用一条SQL查前一天各小时报警条数,哪个小时是零而且现场肯定有报警的,立刻处理。这条SQL不长,但救过好几次场:
USE IntouchAlarmDB; DECLARE @CheckStart DATETIME = DATEADD(HOUR, -24, GETDATE()); SELECT CONVERT(char(13), OccurrenceTime, 120) AS AlarmHour, COUNT(*) AS Cnt FROM [实际表名] WHERE OccurrenceTime >= @CheckStart GROUP BY CONVERT(char(13), OccurrenceTime, 120) ORDER BY AlarmHour; GOCONVERT(char(13), OccurrenceTime, 120)的作用是把时间截断到小时,例如2025-06-01 08:30:00转成2025-06-01 08:00,然后按这个小时聚合计数。巡检时主要看输出里有没有出现0或明显偏低的时段,一般夜班报警量低可以理解,但连续两小时为0就要警惕。
容量估算我习惯按“日报警量乘以512字节再乘以1.5”来算年增长量,这个系数把索引和碎片都盖进去了。日报警量五千条的项目,一年大概1.4GB,磁盘规划和备份保留周期都按这个数预留。如果某天报警量突然翻倍,先别急着加索引,看看是不是某个点位在高频抖动,先把报警源头压下去再说。
万一报警库真断档了,恢复顺序也有讲究。先确认当前报警流是否已恢复写入;如果Alarm DB Logger有内存缓冲,等它自己flush一段时间;如果断档期间开了Intouch自身的报警历史文件,还能从那里面导出补救报表;如果都没开,这段盲区只能认账,这也是为什么把巡检SQL加进早班习惯比事后补救重要得多。我吃过这个亏,现在每到新项目第一件事就是把这条断档检查SQL交给当班工程师,让他们每天上班顺手跑一遍。希望帮到你。
本文还有配套的精品资源,点击获取