使用两个脉冲式按钮切换布尔值的JavaScript实现需求(用于HMI控制实体按钮)
RS触发器逻辑JavaScript实现(HMI按钮控制场景)
需求说明
- 定义三个布尔变量
a、b、c a、b为实体按钮采集的脉冲信号:常态为false,仅按钮被触发的瞬间为true- 逻辑规则:
a触发后,c变为true并持续保持,直到b被触发b触发后,c变为false并持续保持,直到a再次被触发
基础实现代码
该逻辑为典型的置位复位(RS)触发器,基础实现如下:
// 全局变量存储输出状态,HMI运行期间持续保存 let outputC = false; /** * 每个HMI扫描周期调用该函数更新输出状态 * @param {boolean} triggerA 当前周期采集到的a按钮脉冲状态 * @param {boolean} triggerB 当前周期采集到的b按钮脉冲状态 * @returns {boolean} 最新的c状态值 */ function updateOutput(triggerA, triggerB) { // 此处默认复位信号b优先级更高,如需置位优先可调换两个判断的顺序 if (triggerB) { outputC = false; } else if (triggerA) { outputC = true; } // 无有效触发时保持原有状态不变 return outputC; }
适配实体按钮的防抖优化版本
实体按钮存在物理抖动,一般需要添加防抖逻辑避免误触发,参考实现:
let outputC = false; // 防抖计数器 let aDebounceCount = 0; let bDebounceCount = 0; // 防抖阈值:连续N个扫描周期检测到高电平判定为有效触发,可按需调整 const DEBOUNCE_CYCLE = 2; /** * HMI扫描周期执行函数,每次采集到按钮状态后调用 * @param {boolean} rawA 直接采集到的a按钮原始状态 * @param {boolean} rawB 直接采集到的b按钮原始状态 * @returns {boolean} 最新的c状态值 */ function hmiCycleExec(rawA, rawB) { // a按钮防抖处理 aDebounceCount = rawA ? aDebounceCount + 1 : 0; const validA = aDebounceCount >= DEBOUNCE_CYCLE; // b按钮防抖处理 bDebounceCount = rawB ? bDebounceCount + 1 : 0; const validB = bDebounceCount >= DEBOUNCE_CYCLE; // 执行RS逻辑更新输出 if (validB) { outputC = false; } else if (validA) { outputC = true; } // 可在此处添加outputC到实体控制点位的输出逻辑 return outputC; }
内容的提问来源于stack exchange,提问作者Rajmund Januszewski
相关产品推荐
相关产品推荐

