报警管理
报警是运行期出现异常后的标准化提醒,不是 throw 异常。Darra 内置一套完整报警系统。

定义报警
项目浏览器 → 报警组 → 新建报警,填写:
| 字段 | 说明 |
|---|---|
| 编号 | 唯一 ID,如 A001 |
| 类别 | 紧急 / 故障 / 警告 / 信息 |
| 触发变量 | 布尔变量,为 TRUE 时报警 |
| 描述 | 中文描述,会显示在 HMI 和记录 |
| 处理建议 | 操作员提示 |
| 确认要求 | 是否需要人工按键确认 |
分类
按严重度分 4 级:
| 级别 | 颜色 | 典型用途 |
|---|---|---|
| 紧急 | 红 | 急停、人身安全、重大事故 |
| 故障 | 橙 | 设备故障,需停机处理 |
| 警告 | 黄 | 可继续运行,但需关注(接近阈值) |
| 信息 | 蓝 | 提示性,不影响运行(换班、开机) |
在线查看
Ribbon → PLC → 报警面板,或 HMI 里放 报警控件:
- 实时报警列表(按时间倒序)
- 未确认的加粗显示
- 双击跳到触发变量
- 右键 → 确认 / 全部确认
历史记录
每次报警自动存历史,可查:
- 触发时间
- 恢复时间
- 确认时间和确认人

- 持续时长
- 报警频率统计
通知
报警可触发外部通知(设置 → 报警通知):
- 邮件
- MQTT 消息
- Webhook(HTTP POST)
- 短信(需配短信网关)
报警屏蔽
调试或维护时可屏蔽某些报警:
- 右键报警定义 → 暂时屏蔽 N 分钟
- 屏蔽期过后自动恢复
- Ribbon 顶部图标会提示「N 个报警被屏蔽」
注意
屏蔽不能代替排查。报警屏蔽清单定期审计。
报警等级详解
4 级报警分类的详细行为:
| 等级 | 颜色 | 声音 | 行为 | 示例 |
|---|---|---|---|---|
| 紧急 (Fatal) | 红闪 | 警铃 | 立即停机 + 全线停 + 弹窗阻塞 | 急停、门未关、安全限位 |
| 故障 (Error) | 红 | 蜂鸣 | 停当前工序 + 弹窗 | 电机过载、通讯中断 |
| 警告 (Warn) | 橙 | 嘟嘟 | 继续运行 + 顶部提示 | 接近温度阈值、电池低 |
| 信息 (Info) | 蓝 | 静音 | 仅记录 | 换班、启动完成、配方切换 |
每级的默认行为可在设置 → 报警策略中调整。
报警定义的变量类型
布尔触发 (最常见)
// 变量为 TRUE 时触发
报警: A001_Overheat
触发: rTemp > 80.0
等级: 警告
描述: '炉温过高 (${rTemp}°C)'
建议: '检查冷却系统'
多级阈值触发
同一个变量在不同阈值触发不同等级:
rTemp > 70.0 → A001_HighTemp_Warn (警告)
rTemp > 80.0 → A002_HighTemp_Error (故障)
rTemp > 100.0 → A003_HighTemp_Fatal (紧急)
状态变化触发
// 正常 → 非正常
R_TRIG(bFault) → 触发故障报警
F_TRIG(bCommOK) → 触发通讯断开报警
超时触发
// 某步骤超过预期时间
S_Homing.T > T#30s → A010_HomeTimeout
复合条件
bMotorRunning AND rCurrent > 10.0 AND tonDurration.Q
→ A020_MotorOverload
报警消息模板
报警描述支持变量替换:
模板: '炉温过高: 当前 ${rTemp}°C, 上限 ${rTempLimit}°C, 工位 ${iStation}'
实时替换后:
'炉温过高: 当前 85.3°C, 上限 80.0°C, 工位 3'
支持的变量:
${变量名}— 直接替换变量值${变量名:N}— 浮点保留 N 位小数 (如${rTemp:2}=85.30)${变量名:X}— 十六进制 (如${wStatus:X}=05F3)${TIME()}— 当前时间${USER()}— 当前登录用户
确认机制
自动确认 vs 人工确认
| 类型 | 说明 | 适用 |
|---|---|---|
| 自动确认 | 触发条件恢复后自动消失 | 临时超限 (如启动冲击) |
| 人工确认 | 必须点"确认"按钮才消失 | 故障 / 紧急 |
事件序列 (人工确认):
1. 触发: rTemp > 80.0, 报警"炉温过高"激活
2. 用户看到: 红色弹窗, 铃响
3. 条件恢复: rTemp = 70.0, 报警状态变 "已复位, 待确认"
4. 用户点"确认": 报警消失, 写入历史
批量确认
- 全部确认: 一键清除所有待确认报警
- 按等级确认: 只确认
Info / Warn, 保留Error / Fatal待追究 - 按组确认: 只确认某一设备的全部报警
确认权限
| 等级 | 确认权限 |
|---|---|
| Info | 操作员 / 工程师 / 管理员 |
| Warn | 操作员 / 工程师 / 管理员 |
| Error | 工程师 / 管理员 |
| Fatal | 管理员 (需双重确认 + 原因) |
报警历史详细字段
每条历史记录包含:
| 字段 | 说明 |
|---|---|
| 报警号 | A001, A002 ... |
| 等级 | Info / Warn / Error / Fatal |
| 描述 | 报警文字 (含变量替换) |
| 触发时间 | 精确到毫秒 |
| 触发变量值 | 快照当时的相关变量 |
| 恢复时间 | 条件恢复时刻 |
| 确认时间 | 用户确认时刻 |
| 确认人 | 登录账号 |
| 持续时长 | 恢复 - 触发 |
| 处理备注 | 用户输入的处理说明 |
| 关联工单 | MES 工单号 |
查询与筛选
报警历史面板提供强大的筛选:
- 按时间范围
- 按等级
- 按设备 / 工位
- 按触发变量
- 按文字关键字搜索
- 按确认状态
报警统计
自动生成统计报表:
| 统计 | 说明 |
|---|---|
| 频率排行 | 最常触发的报警 Top 10 |
| 累计时间 | 每个报警累计停机时间 |
| MTBF | 相邻报警的平均间隔 (Mean Time Between Failures) |
| MTTR | 平均处理时间 (Mean Time To Repair) |
| 班组对比 | 不同班次的报警数对比 |
用于发现隐藏的系统性问题: "每周三 14:00 总有 A005 报警, 查对应工艺" 。
通知渠道
邮件
配置 SMTP 服务器, 指定等级触发邮件:
SMTP:
server: smtp.company.com
port: 465
user: [email protected]
password: xxx (加密)
Rules:
- level: Fatal
to: [[email protected], [email protected]]
subject: '[紧急] ${AlarmName}'
- level: Error
to: [[email protected]]
subject: '[故障] ${AlarmName}'
短信
接入短信网关 (阿里云 / 腾讯云), 按模板发送:
【车间一号线】紧急报警 A001: 炉温过高 95°C. 请立即到场处理.
MQTT 推送
推送到 MES / 云平台:
Topic: factory/plc1/alarm
Payload: {
"id": "A001",
"level": "Fatal",
"message": "炉温过高 95°C",
"timestamp": "2026-04-18T14:32:05.123Z",
"station": 3,
"variables": {"rTemp": 95.0, "rLimit": 80.0}
}
Webhook (HTTP POST)
集成第三方系统 (Slack / 钉钉 / 飞书 / 企业微信):
POST https://api.slack.com/bot/xxx
Body: {"text": "【紧急】炉温过高 95°C @frontline"}
语音电话 (可选)
接入电话网关, 拨打运维工程师:
Fatal 报警 → 自动呼叫 3 人 → 第一个接听后停止
报警组与层级
按设备分组管理:
设备层级:
车间
├── 生产线 1
│ ├── 工位 1 (焊接)
│ │ ├── A001_SpindleFault
│ │ ├── A002_Overtemp
│ │ └── A003_CommLost
│ └── 工位 2 (装配)
│ ├── B001_GripperFault
│ └── B002_CycleTimeout
└── 生产线 2
└── ...
操作:
- 整个工位的报警一键屏蔽 (调试该工位时)
- 整条线的报警导出日志 (审计)
- 按工位分发通知: 工位 1 报警只通知工位 1 维修工
屏蔽管理
时间屏蔽
屏蔽 N 分钟自动恢复:
A001_Overheat [已屏蔽 23:45] 剩余 15 分钟
条件屏蔽
仅在特定条件下屏蔽:
IF bMaintenanceMode THEN
SuppressAlarm('A001') // 维护模式下不触发
SuppressAlarm('A002')
END_IF;
屏蔽审计
所有屏蔽操作写审计日志:
2026-04-18 09:00 [USER=wang] SUPPRESS A001 for 60min reason='调试冷却系统'
2026-04-18 10:00 [SYSTEM] UNSUPPRESS A001 (timeout)
屏蔽清单每日早上自动发邮件给管理员审核。
排错表
| 问题 | 原因 | 解决 |
|---|---|---|
| 报警不触发 | 触发条件写错 | 在监视表看触发变量 |
| 确认按钮灰显 | 权限不足 | 管理员授权 |
| 邮件未收到 | SMTP 配置错 | 测试邮件, 查日志 |
| 屏蔽不生效 | 屏蔽列表未应用 | 重启报警服务 |
| 历史报警丢失 | 数据库磁盘满 | 定期归档 + 清理 |
| 同一报警刷屏 | 未加防抖 | 设置最小触发间隔 |
最佳实践
- 等级分明: Fatal 只留真正人命关天的, 别滥用
- 描述带变量值:
炉温${rTemp}°C比温度过高有用 - 处理建议必填: 每个报警都要告诉操作员怎么办
- 防抖动: 同一报警最小间隔 1 秒, 避免高频抖动刷屏
- 定期审计屏蔽清单: 每周清理过期/不合理的屏蔽
- 演练报警链路: 每月人为触发 1 次 Fatal, 验证通知是否到达
- 报警归档: 每月导出历史备份, 满足审计
- 统计看板: HMI 常驻显示 MTBF / MTTR, 驱动改善