多独立布尔变量触发报警场景下的单定时器替代多定时器最优方案咨询
单个定时器实现多变量持续触发报警方案
当然可以用单个定时器搞定这个需求!核心是跟踪单一变量的持续触发状态,而不是简单将所有变量逻辑或后接入定时器(后者会因变量切换/重叠导致误触发)。下面是基于结构化文本(ST)的最优实现,扩展性拉满,不管变量数量多少都不用新增定时器:
变量定义
VAR tSetDelay: TIME := T#1S; // 设定的触发延迟时长 Alarm: BOOL; // 报警输出 bVars: ARRAY[1..10] OF BOOL; // 多个布尔输入变量(可按需调整数组长度) TriggerTimer: TON; // 唯一的定时器 nLastActiveVar: INT := 0; // 记录上一周期激活的变量索引(0=无激活) nCurrentActiveVar: INT; // 当前周期激活的变量索引 END_VAR
核心逻辑
// 1. 找出当前激活的变量:仅当单个变量触发时记录索引,多变量同时触发则重置为0 nCurrentActiveVar := 0; FOR i := 1 TO 10 DO IF bVars[i] THEN IF nCurrentActiveVar <> 0 THEN // 多个变量同时触发,标记为无效 nCurrentActiveVar := 0; EXIT; END_IF; nCurrentActiveVar := i; END_IF; END_FOR; // 2. 控制定时器:只有当前激活变量和上一周期相同时,才让定时器计时 TriggerTimer(IN := (nCurrentActiveVar <> 0) AND (nCurrentActiveVar = nLastActiveVar), PT := tSetDelay); // 3. 更新上一周期的激活变量记录 nLastActiveVar := nCurrentActiveVar; // 4. 触发报警 Alarm := TriggerTimer.Q;
逻辑说明
- 避免误触发:只有当同一个变量连续触发时,定时器才会持续计时;如果变量切换、多变量同时触发,定时器会立即停止计时并重置,确保只有单个变量触发时长达标才会报警。
- 扩展性强:新增变量只需修改数组长度
ARRAY[1..N],无需添加任何新的定时器或逻辑分支。 - 特殊场景处理:如果存在多变量同时触发的情况,逻辑会判定为非有效持续触发,完全符合需求中“至少一个变量持续触发”的定义。
内容的提问来源于stack exchange,提问作者asys
相关产品推荐
相关产品推荐

