You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用两个脉冲式按钮切换布尔值的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:54:00