Skip to main content


 

引言

在工业现场的生产运行中,设备报警系统就像设备的“眼睛”和“耳朵”,既要第一时间把故障信息传递给操作人员,又要区分故障的紧急程度,避免小故障干扰正常生产。很多 PLC 工程师在开发项目时,每次都要重复编写报警逻辑,不仅效率低,还容易出现优先级混乱、蜂鸣器无法静音等问题。今天给大家分享一个符合 IEC 61131-3 标准、开箱即用的多优先级报警指示功能块,帮你快速搞定工业现场的声光报警需求。

1

   

功能块代码及核心逻辑介绍

1.1

   

变量说明

这个功能块分为输入变量、输出变量和内部变量三部分,所有变量命名都贴合工业现场的实际需求,一眼就能看懂:

变量类型

变量名

含义

输入

alarm1~alarm4

4 路报警输入,alarm1 为最高优先级,alarm4 为最低优先级

输入

acknowledge

报警确认按钮输入

输入

testIndicator

测试指示灯按钮,按一次进入测试模式,再按一次退出

输入

muteBuzzer

蜂鸣器静音开关

输入

indicatorEnabled

报警指示器总使能,关闭时所有报警输出失效

输入

resetAll

全局复位按钮,复位后所有报警状态清零

输出

redLight/yellowLight/greenLight

红/黄/绿三色灯输出

输出

buzzer

蜂鸣器输出

输出

alarmActive

报警激活标志,有任意报警触发时为真

输出

alarmAcknowledged

报警已确认标志,所有激活报警都被确认时为真

输出

activeAlarmCode

当前最高优先级报警的代码(1~4,无报警时为 0)

内部变量

alarmState/alarmAck

分别存储 4 路报警的激活状态、确认状态

内部变量

flashTimer/flashState

闪烁定时器和闪烁状态,用于实现灯的闪烁效果

内部变量

buzzerTimer

4 级报警的蜂鸣间隔定时器

1.2

   

完整功能块代码

下面是完整的 PLC 程序代码(代码基于 CodeSys 平台的 ST 语言):

FUNCTION_BLOCK FB_AlarmIndicator
VAR_INPUT    
    alarm1 : BOOL;              // 报警1(最高优先级)    
    alarm2 : BOOL;              // 报警2    
    alarm3 : BOOL;              // 报警3    
    alarm4 : BOOL;              // 报警4(最低优先级)    
    acknowledge : BOOL;         // 报警确认    
    testIndicator : BOOL;       // 测试指示灯    
    muteBuzzer : BOOL;          // 静音蜂鸣器    
    vindicatorEnabled : BOOL;    // 指示器使能    
    resetAll : BOOL;            // 复位所有报警
END_VAR
VAR_OUTPUT    
    redLight : BOOL;            // 红灯输出    
    yellowLight : BOOL;         // 黄灯输出    
    greenLight : BOOL;          // 绿灯输出    
    buzzer : BOOL;              // 蜂鸣器输出   
    alarmActive : BOOL;         // 报警激活    
    alarmAcknowledged : BOOL;   // 报警已确认    
    activeAlarmCode : INT;      // 激活的报警代码
END_VAR
VAR    
    i : INT;    
    alarmState : ARRAY[1..4] OF BOOL;    
    alarmAck : ARRAY[1..4] OF BOOL;    
    lastAcknowledge : BOOL;    
    buzzerTimer : TIME;    
    flashTimer : TIME;    
    flashState : BOOL;    
    testMode : BOOL;    
    lastTest : BOOL;    
    anyAlarmActive, anyAlarmUnacked : BOOL;    
    highestPriorityAlarm : INT;
END_VAR
// 全局复位逻辑:复位后所有报警状态、输出清零
IF resetAll THEN    
    FOR i := 1 TO 4 DO        
        alarmState[i] := FALSE;        
        alarmAck[i] := FALSE;    
    END_FOR;    
    alarmActive := FALSE;    
    alarmAcknowledged := FALSE;    
    activeAlarmCode := 0;    
    RETURN;
END_IF;
// 指示器总使能判断:关闭时所有输出强制关闭,方便调试或停机时禁用
IF NOT indicatorEnabled THEN    
    redLight := FALSE;    
    yellowLight := FALSE;    
    greenLight := FALSE;    
    buzzer := FALSE;    
    alarmActive := FALSE;    
    RETURN;
END_IF;
// 测试模式逻辑:按一次testIndicator进入测试,所有灯、蜂鸣器全亮,验证硬件好坏
IF testIndicator AND NOT lastTest THEN    
    testMode := NOT testMode;
END_IF;
lastTest := testIndicator;
IF testMode THEN    
    redLight := TRUE;    
    yellowLight := TRUE;    
    greenLight := TRUE;    
    buzzer := TRUE;    
    alarmActive := FALSE;    
    RETURN;
END_IF;
// 更新报警状态:把输入的4路报警信号存入内部数组
alarmState[1] := alarm1;
alarmState[2] := alarm2;
alarmState[3] := alarm3;
alarmState[4] := alarm4;
// 报警确认逻辑:仅当确认按钮按下(上升沿触发)时,确认所有当前激活的报警,避免长按重复确认
IF acknowledge AND NOT lastAcknowledge THEN    
    FOR i := 1 TO 4 DO        
        IF alarmState[i] THEN            
            alarmAck[i] := TRUE;        
        END_IF;    
    END_FOR;
END_IF;
lastAcknowledge := acknowledge;
// 核心优先级判定:遍历所有报警,找到最高优先级的未确认报警
anyAlarmActive := FALSE;
anyAlarmUnacked := FALSE;
highestPriorityAlarm := 0;
FOR i := 1 TO 4 DO    
    IF alarmState[i] THEN        
        anyAlarmActive := TRUE;        
        IF NOT alarmAck[i] THEN            
            anyAlarmUnacked := TRUE;            
            // 编号越小优先级越高,第一次找到的未确认报警就是最高优先级            
            IF highestPriorityAlarm = 0 THEN                
                highestPriorityAlarm := i;            
            END_IF;       
        END_IF;    
    END_IF;
END_FOR;
alarmActive := anyAlarmActive;
activeAlarmCode := highestPriorityAlarm;
alarmAcknowledged := NOT anyAlarmUnacked;
// 闪烁定时器:每100ms更新一次,500ms为一个闪烁周期
flashTimer := flashTimer + T#100ms;
IF flashTimer >= T#500ms THEN    
    flashState := NOT flashState;    
    flashTimer := T#0s;
END_IF;
// 声光输出控制逻辑
IF anyAlarmActive THEN    
    IF anyAlarmUnacked THEN        
        // 情况1:有未确认报警 → 按优先级闪烁+对应蜂鸣模式        
        CASE highestPriorityAlarm OF            
            1: // 1级最高优先级:红灯快闪+连续蜂鸣(最紧急,必须立刻处理)                   
                redLight := flashState;                
                yellowLight := FALSE;                
                greenLight := FALSE;            
            2: // 2级优先级:红灯慢闪+快速蜂鸣(次紧急,需尽快处理)                
                redLight := (flashTimer < T#250ms);                
                yellowLight := FALSE;                
                greenLight := FALSE;            
            3: // 3级优先级:黄灯快闪+慢速蜂鸣(一般提醒,巡检时关注)                
                redLight := FALSE;                
                yellowLight := flashState;               
                greenLight := FALSE;            
             4: // 4级最低优先级:黄灯慢闪+每5秒单次蜂鸣(提示性信息,不影响生产可延后处理)                   redLight := FALSE;                
                 yellowLight := (flashTimer < T#250ms);                
                 greenLight := FALSE;       
        END_CASE;  
        // 蜂鸣器控制:静音时强制关闭,否则按优先级响铃        
        IF NOT muteBuzzer THEN            
            CASE highestPriorityAlarm OF                
                1: buzzer := TRUE; // 1级连续响,无法忽略                
                2: buzzer := flashState; // 2级快闪快响                
                3: buzzer := (flashTimer < T#250ms); // 3级慢闪慢响                
                4: // 4级每5秒响一次,不打扰生产                    
                    IF buzzerTimer = T#0s THEN                        
                        buzzer := TRUE;                        
                        buzzerTimer := T#100ms;                    
                    ELSIF buzzerTimer > T#0s THEN                        
                        buzzerTimer := buzzerTimer - T#100ms;                   
                        IF buzzerTimer <= T#0s THEN                            
                            buzzer := FALSE;                            
                            buzzerTimer := T#5s;                        
                        END_IF;                    
                    END_IF;            
            END_CASE;        
        ELSE            
            buzzer := FALSE;        
        END_IF;    
    ELSE        
        // 情况2:所有报警已确认 → 对应灯常亮,蜂鸣器关闭,提示故障未排除        
        CASE highestPriorityAlarm OF            
            1,2: // 1、2级报警确认后红灯常亮                
                redLight := TRUE;                
                yellowLight := FALSE;                
                greenLight := FALSE;            
            3,4: // 3、4级报警确认后黄灯常亮                
                redLight := FALSE;               
                yellowLight := TRUE;                
                greenLight := FALSE;        
        END_CASE;        
        buzzer := FALSE;    
    END_IF;
ELSE    
    // 情况3:无报警 → 绿灯常亮,代表设备运行正常    
    redLight := FALSE;    
    yellowLight := FALSE;    
    greenLight := TRUE;    
    buzzer := FALSE;
END_IF;
// 4级报警的蜂鸣定时器更新
IF buzzerTimer > T#0s AND NOT muteBuzzer THEN    
    buzzerTimer := buzzerTimer - T#100ms;
END_IF;


 

1.3

   

核心逻辑亮点

这个功能块完全贴合工业现场的实际使用习惯:

  • 优先级逻辑清晰:编号越小优先级越高,高优先级报警会覆盖低优先级报警的显示,不会出现多个报警同时显示导致的混乱;

  • 人性化设计:支持蜂鸣器静音、测试模式,避免深夜或者噪音大的环境下蜂鸣器扰民,也方便运维人员定期检查指示灯和蜂鸣器硬件是否正常;

  • 防误触设计:确认按钮采用上升沿触发,不会因为长按按钮重复确认;全局复位功能可以一键清除所有报警状态,适合设备检修后复位。

2

   

典型应用场景

这个功能块兼容所有支持 IEC 61131-3 标准的 PLC(西门子、汇川、贝加德、三菱等),可以在绝大多数工业场景复用:

2.1

   

离散制造业生产线

在汽车零部件、3C 组装等流水线场景中:

  • 1 级报警(设备过载、安全门打开、急停触发):红快闪+连续蜂鸣,操作员必须立刻到场处理,避免安全事故或批量报废;

  • 2 级报警(物料不足、夹具不到位):红灯慢闪+快蜂鸣,提醒班组长及时补料调整;

  • 3 级报警(加工参数偏差、气压不足):黄灯快闪+慢蜂鸣,巡检人员定期排查即可;

  • 4 级报警(滤网需更换、润滑油余量不足):黄灯慢闪+5 秒响一次,不会影响正常生产,安排维保人员空闲时处理即可。 一条生产线如果有 10 个工位,只需要每个工位调用一次这个功能块,接入对应的报警信号即可,不用重复编写逻辑,开发效率提升 80%以上。

2.2

   

流程工业(水处理/化工/食品饮料)

在水处理厂场景中:

  • 1 级报警(水泵故障、水质超标、管道泄漏):红快响,立刻启动应急预案;

  • 2 级报警(水池液位超高/超低、加药泵故障):红闪,提醒运行人员调整工艺参数;

  • 3 级报警(消毒剂余量不足、滤袋压力偏高):黄闪,安排当班人员处理;

  • 4 级报警(反洗周期到、仪表需校准):黄慢闪,记录到维保计划即可,不用立刻停机。

2.3

   

老旧设备改造

很多老旧设备没有统一的报警系统,故障时只有设备本身的指示灯,操作人员很难及时发现。加装这个功能块时,只需要把设备原有的故障信号接入对应的报警输入,把三色灯和蜂鸣器接到输出端口,不用修改原有设备的控制逻辑,半天就能完成报警系统的升级,成本极低。

3

   

拓展思考与升级方向

这个功能块已经覆盖了 90%以上工业场景的报警需求,如果遇到特殊场景,还可以基于现有逻辑快速扩展:

  1. 扩展报警优先级数量:如果需要超过 4 路报警,只需要把alarmState和alarmAck数组的长度改成需要的数量,优先级判定逻辑不用修改,系统会自动选择编号最小的未确认报警作为最高优先级。

  2. 增加 HMI 文本关联:新增一个STRING类型的输出变量alarmText,在优先级判定后,根据activeAlarmCode赋值对应的报警文本(比如 1 对应“设备过载”,2 对应“物料不足”),直接传到 HMI 上显示,不用操作人员对照报警表查故障原因。

  3. 增加报警记录功能:新增一个报警记录数组,当报警激活、确认、复位时,记录当前时间、报警代码、操作类型,上传到 SCADA 或 MES 系统,方便后续故障追溯和工艺优化。

  4. 增加报警屏蔽与延时:新增一路报警屏蔽输入,设备调试时可以屏蔽非关键报警,避免误报干扰;给报警输入增加延时功能(比如报警持续 2 秒才触发),避免传感器抖动导致的瞬时误报。

  5. 自定义声光规则:把灯的闪烁规则、蜂鸣模式改成配置数组,不同项目可以根据现场需求调整,不用修改核心逻辑,比如有的现场需要 1 级报警时红黄灯同时快闪,只需要修改配置即可。


 

总结

这个多优先级报警指示功能块的设计思路非常贴合工业现场的实际需求:没有花里胡哨的功能,所有逻辑都是围绕“快速传递故障信息、区分故障优先级、降低运维成本”三个核心目标设计。模块化的结构也让它可以快速复用在不同项目中,哪怕后续需要升级,也可以基于现有逻辑快速扩展,是 PLC 工程师项目开发中非常实用的“积木块”。 好的 PLC 程序从来不是越复杂越好,而是稳定、易维护、符合工艺需求,这个功能块就是典型的实用型代码,不仅能提升开发效率,还能减少现场调试的麻烦,建议所有做工业自动化开发的工程师都收藏一份,用到的时候直接调用即可。

图片

你来出题 我来答图片图片图片

欢迎大家在评论区提一些标准功能块的需求,如果合适,我们会在以后的文章中与大家分享。

图片

往期回顾


 

每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比

每周一个编程小例子:记录设备运行时间

每周一个编程小例子:基于长按检测的启动控制系统

每周一个编程小例子:探秘 PLC 数据记录功能块

每周一个编程小例子:心跳检测与 PLC 应用

每周一个编程小例子:斜坡发生器

每周一个编程小例子:旋转速度计算

每周一个编程小例子:计算 PLC 循环周期|例程需求征集!

每周一个编程小例子:如何优雅的分割字符串

每周一个编程小例子:带反馈的阀门控制程序

每周一个编程小例子:西门子 LGF 库中的脉冲继电器功能块

每周一个编程小例子:曲线加减速的控制应用

每周一个编程小例子:轻松去除字符串前导字符

每周一个编程小例子:根据阈值更新输入

每周一个编程小例子:官方模拟量输入处理模块

每周一个编程小例子:主从电机的时序控制

每周一个编程小例子:基于一阶滞后滤波的优化方案

每周一个编程小例子:16 进制到浮点数的神奇转换

每周一个编程小例子:PLC 长按控制程序

每周一个编程小例子:PLC 程序实现多位整数拆分

每周一个编程小例子:流量累积计算器

每周一个编程小例子:用于连锁的电机标准控制模块

每周一个编程小例子:PID 控制算法在 PLC 系统中的实现与应用

每周一个编程小例子:自定义种子生成随机数

每周一个编程小例子:可调时间的脉冲生成器

每周一个编程小例子:带滤波的标准模拟量输入功能块

每周一个编程小例子:使用 PLC 将字符串转换为日期格式

每周一个编程小例子:PLC 配方管理

每周一个编程小例子:比较两个 DB 块(STL)

每周一个编程小例子:如何使用 PLC 实现数组逆序

每周一个编程小例子:流量累计与批次控制

每周一个编程小例子:自定义循环执行控制程序

每周一个编程小例子:步进控制功能块

每周一个编程小例子:PLC 权重比例分配器

每周一个编程小例子:数字量输入组监控

每周一个编程小例子:实时数据分析

每周一个编程小例子:PLC 多轴同步控制的理解与应用

每周一个编程小例子:PLC 波形生成器 (正弦 方波 三角波)

每周一个编程小例子:模拟量信号报警

每周一个编程小例子:组合数概率的实现

每周一个编程小例子:多传感器信号融合与优化方案

每周一个编程小例子:监控模拟信号的健康状态

每周一个编程小例子:PLC 程序实现模拟信号的线性校准

每周一个编程小例子:智能报警过滤器:优化报警系统的 PLC 程序

每周一个编程小例子:使用 PLC 程序让灯光呼吸

每周一个编程小例子:自适应性滤波器:动态调整以平衡响应与稳定性

每周一个编程小例子:卡尔曼滤波器在自动化中的简单应用

每周一个编程小例子:多模式定时器

每周一个编程小例子:基于 PLC 的编码器速度计算器

每周一个编程小例子:电机顺序启动与停止程序

每周一个编程小例子:电梯控制程序

每周一个编程小例子:自动门控制系统

每周一个编程小例子:智能停车场计数系统

每周一个编程小例子:智能照明控制系统

每周一个编程小例子:变频器控制

每周一个编程小例子:比例阀控制

每周一个编程小例子:脉冲输出的灵活控制

每周一个编程小例子:计算移动平均值

每周一个编程小例子:速率限制器

每周一个编程小例子:线性插值法线性化传感器

每周一个编程小例子:数据转换的魔力

每周一个编程小例子:PLC 安全监控功能块

每周一个编程小例子:「看门狗」功能块

每周一个编程小例子:实现工业数据轻量压缩

每周一个编程小例子:PLC 消抖功能块

每周一个编程小例子:CRC 校验计算器

图片

2026年11月

 

 


 

Tags