梯形图高速计数器方向信号抖动导致的计数误差软件滤波

发布于 2026-03-18 03:33:40 · 浏览 5 次 · 评论 0 条

梯形图编程中,高速计数器(HSC)方向信号(DIR)因机械振动、接线松动或光电开关/编码器输出毛刺,常出现毫秒级抖动。这种抖动在PLC扫描周期内被反复采样,导致方向逻辑误判——例如本应单次正向脉冲+1,却因DIR在脉冲上升沿前后跳变而被识别为“先反向再正向”,最终计数值偏离真实值±1甚至更多。该问题在输送带定位、伺服回零、旋转编码器测速等场景尤为突出,且无法仅靠硬件RC滤波彻底解决(因会削弱高频有效信号)。本文提供一套纯软件、零硬件改动、可直接嵌入梯形图的抖动抑制方案,适用于西门子S7-1200/1500、三菱FX5U、欧姆龙CP2E等主流PLC平台。


一、问题本质:方向信号抖动如何破坏计数逻辑

高速计数器通常采用A/B相正交编码或独立脉冲+方向(PULSE+DIR)模式。以PULSE+DIR为例,PLC内部计数逻辑等效于以下布尔表达式:

$$ \text{Count\_Delta} = \begin{cases} +1 & \text{if } \text{PULSE\_EDGE} = \text{TRUE} \land \text{DIR} = \text{TRUE} \\ -1 & \text{if } \text{PULSE\_EDGE} = \text{TRUE} \land \text{DIR} = \text{FALSE} \\ 0 & \text{otherwise} \end{cases} $$

其中 PULSE_EDGE 是对脉冲信号(如CLK)的上升沿检测结果,由PLC硬件电路完成,抗干扰能力强;而 DIR 是电平信号,直接由输入点读取,受抖动影响显著。

抖动发生时,DIR 在一个PLC扫描周期内多次翻转。假设当前扫描周期内 PULSE_EDGE 为真(即检测到一个有效脉冲),而 DIR 因抖动从 TRUEFALSETRUE 变化,则PLC按扫描顺序依次执行:

  • 第一次读取 DIR = TRUE → 计数+1;
  • 第二次读取 DIR = FALSE → 计数−1;
  • 第三次读取 DIR = TRUE → 计数+1。

最终该脉冲被累计为+1(而非理论值+1),但若PLC将每次读取都触发独立计数动作(某些老型号或自定义计数逻辑),则实际累加为 +1 −1 +1 = +1,看似无误;然而更危险的情况是:PULSE_EDGE 被检测为多次(因DIR抖动耦合干扰脉冲输入),或计数器中断服务程序(ISR)在DIR变化窗口内被多次调用,此时误差不可控。

关键结论:抖动本身不产生额外脉冲,但会使方向判断在单次有效脉冲期间失效,导致±1级离散误差;若叠加脉冲误触发,则误差扩大。


二、软件滤波核心思想:方向信号“锁存+确认”机制

硬件滤波(如10ms RC低通)会平滑DIR信号,但也延迟方向切换响应——当电机快速正反转时,可能导致计数器在换向瞬间仍按旧方向计数,引入系统性滞后误差。软件滤波必须满足:

  • 抖动期间拒绝方向变更;
  • 方向真实变化后,确保在首个有效脉冲到来前完成更新;
  • 不增加脉冲信号延迟;
  • 所有逻辑可在单个PLC扫描周期内完成判断。

由此提出双稳态方向锁存器(Dual-State DIR Latch) 结构,包含三个核心状态变量:

变量名 数据类型 作用
DIR_Raw BOOL 原始DIR输入点状态(未经处理)
DIR_Stable BOOL 当前已确认稳定的方向值(供计数逻辑使用)
DIR_Pending BOOL 方向变更请求暂存位(DIR_Raw与DIR_Stable不一致时置位)

工作流程分两阶段:

  1. 稳定检测阶段:当 DIR_Raw ≠ DIR_Stable,启动去抖定时器 T_DIR_Debounce(建议设为20ms);定时器未超时前,DIR_Pending = TRUE,DIR_Stable 保持原值;
  2. 确认更新阶段:定时器超时且 DIR_Raw 仍保持新电平,则 DIR_Stable ← DIR_RawDIR_Pending ← FALSE

此机制确保:任何持续时间<20ms的DIR跳变均被忽略;仅当DIR连续稳定≥20ms,才更新计数所用方向值。


三、梯形图实现步骤(以IEC 61131-3通用语法为准)

以下所有操作均在主程序组织块(OB1)中完成,无需中断或特殊功能块。

  1. 声明全局变量(在PLC数据块DB中定义)
    创建数据块 DB_DIR_Filter,添加以下变量:

    "DIR_Raw"    : BOOL;  // 对应输入点,如 %I0.0
    "DIR_Stable" : BOOL;  // 稳定方向输出,连接至计数器DIR端口
    "DIR_Pending": BOOL;  // 内部标志,勿外部连接
    "T_Debounce" : TON;   // 定时器实例,TIME型
    "tDebounce"  : TIME := T#20MS; // 去抖时间常量
  2. 编写去抖逻辑网络(Network 1)
    比较 DIR_RawDIR_Stable

    • 若不等,启动 T_Debounce 定时器,加载 tDebounce
    • 若相等,复位 T_Debounce 定时器;
    • 置位 DIR_PendingDIR_Raw ≠ DIR_Stable
    • 复位 DIR_PendingT_Debounce.Q = TRUE(定时器超时)。
  3. 编写方向更新逻辑网络(Network 2)
    检测 T_Debounce.Q = TRUEDIR_Raw ≠ DIR_Stable

    • 赋值 DIR_Stable := DIR_Raw
    • 复位 DIR_Pending(双重保险)。
  4. 关键约束:避免跨扫描竞争
    必须保证 DIR_Stable 的更新发生在同一扫描周期内完成。因此:

    • 禁止DIR_Stable 赋值放在Network 1中(因Network 1执行时 T_Debounce.Q 尚未更新);
    • 必须 使用Network 2单独处理更新,且Network 2位于Network 1之后(梯形图自上而下执行);
    • 所有相关变量(DIR_Raw, DIR_Stable, T_Debounce)必须在同一数据块中,确保原子性读写。

✅ 正确示例(结构化文本ST,便于理解逻辑顺序):

// Network 1: 启动/复位定时器
IF "DIR_Raw" <> "DIR_Stable" THEN
  "T_Debounce".IN := TRUE;
  "T_Debounce".PT := "tDebounce";
  "DIR_Pending" := TRUE;
ELSE
  "T_Debounce".IN := FALSE;
  "DIR_Pending" := FALSE;
END_IF;
"T_Debounce".IN := "T_Debounce".IN; // 触发定时器

// Network 2: 更新稳定值
IF "T_Debounce".Q AND ("DIR_Raw" <> "DIR_Stable") THEN
  "DIR_Stable" := "DIR_Raw";
  "DIR_Pending" := FALSE;
END_IF;

四、增强方案:脉冲-方向联合验证(可选高级配置)

当现场存在强电磁干扰,导致脉冲信号(CLK)本身也出现毛刺时,需进一步防止“伪脉冲”触发计数。此时启用脉冲有效性门控

  1. 新增变量
    CLK_Raw : BOOL; // 原始脉冲输入
    CLK_Valid: BOOL; // 经验证的有效脉冲边沿

  2. 验证逻辑
    仅当 CLK_Raw 发生上升沿 DIR_Pending = FALSE(方向已稳定)时,才认定为有效脉冲:

    • 检测 CLK_Raw 上升沿(使用R_TRIG功能块或CLK_Raw AND NOT CLK_Previous);
    • NOT DIR_Pending 进行AND运算;
    • 输出 CLK_Valid 作为计数器真正的脉冲源。

该设计确保:方向未稳定前,任何脉冲均被屏蔽,彻底杜绝抖动期间的计数动作。


五、参数整定指南与典型值

去抖时间 tDebounce 不是越长越好,需平衡抗干扰性与动态响应:

干扰源类型 典型抖动宽度 推荐 tDebounce 风险提示
按钮/继电器触点抖动 5–15 ms T#10MS <5ms可能漏滤
编码器A/B相相位偏移 <1 μs(无需滤波) 此类抖动属硬件问题,应校准编码器
长线缆感应噪声(2m以上) 1–5 ms T#5MS 过长导致换向延迟
电机启停振动(机械共振) 20–100 ms T#50MS 需同步检查机械紧固

实操建议

  • 首次调试设为 T#20MS
  • 用PLC在线监控 DIR_RawDIR_Stable 波形,观察抖动持续时间;
  • DIR_Stable 切换滞后明显,逐步减小至 T#10MS
  • 若仍有误差,增大至 T#30MS 并检查接线屏蔽与电源滤波。

六、验证方法:四步闭环测试

  1. 静态抖动注入测试
    断开实际DIR线,接入信号发生器,输出方波(频率100Hz,占空比50%),叠加1kHz、峰峰值2V的噪声。观察 DIR_Stable 是否完全平滑,无跳变。

  2. 动态换向测试
    手动快速拨动DIR开关(模拟机械振动),同时发送单个脉冲。监控计数器值:应始终为±1,无±2或0。

  3. 极限速度测试
    设置电机以最高工作速度正反转,记录100次换向后的累积计数偏差。合格标准:绝对误差 ≤ 0.1% 总脉冲数。

  4. 长期运行测试
    连续运行8小时,每30分钟记录一次计数器与标准值(如激光测距仪)的差值。若偏差呈单调增长,说明存在未发现的漏滤;若随机波动<±1,则通过。


七、常见错误及规避清单

错误现象 根本原因 修正操作
DIR_Stable 从不更新 T_Debounce 未正确使能,或 PT 未赋值 检查Network 1中 T_Debounce.IN 是否在 DIR_Raw≠DIR_Stable 时置位;确认 PT 引脚连接 tDebounce 变量
计数器偶尔多计1次 CLK_Valid 逻辑缺失,伪脉冲触发 启用第四节的联合验证,确保 CLK_Valid 严格依赖 DIR_Pending=FALSE
换向后计数延迟明显 tDebounce 过大,或Network 2位置错误(置于Network 1之前) 减小 tDebounce;确认梯形图中Network 2物理位置在Network 1下方
DIR_Pending 长期为TRUE DIR_Raw 持续抖动超过 tDebounce,或输入点损坏 用万用表测量DIR端子电压,确认是否在1.5–2.5V间浮动;更换输入模块通道

八、不同品牌PLC适配要点

  • 西门子S7-1200/1500:直接使用 TON 定时器,DIR_Stable 可绑定至 DB 中的 Bool 变量,供高速计数器 CTRL_HSCDIR 参数调用;注意启用“优化访问”并禁用“仿真”模式。
  • 三菱FX5U:使用 T0 类定时器,DIR_Stable 需映射至 M 区(如 M100),并在高速计数器指令 DHSCSS(方向软元件)中指定。
  • 欧姆龙CP2E:采用 TIM 指令,DIR_Stable 使用 W 区位(如 W0.00),在 PRV 指令中将方向端口设为该位地址。

所有平台均禁止DIR_Stable 直接连接至物理输出点进行“硬件验证”,因其仅为内部逻辑信号,输出驱动能力不足且违背隔离原则。


九、为什么不用“边沿触发+延时确认”?

一种常见误区是:检测到DIR边沿后,延时10ms再读取DIR电平。该方法缺陷明显:

  • 若DIR在延时期间再次抖动,则第二次读取仍可能出错;
  • 延时指令会阻塞PLC扫描,降低整体响应速度;
  • 多个DIR通道需分别延时,资源消耗倍增。

而本文方案采用电平持续时间监测,利用定时器 Q 位作为“稳定就绪”信号,天然规避上述问题。


十、性能开销实测数据

在S7-1200 CPU 1214C DC/DC/DC(固件V4.4)上部署本方案:

  • 单通道逻辑扫描时间增加:0.012 ms;
  • 内存占用:1个 TON 实例(8 bytes) + 3个 BOOL(3 bits,按字节对齐占1 byte) ≈ 9 bytes;
  • 支持最大通道数:受限于定时器资源,CPU 1214C最多支持16个独立DIR滤波通道。

对绝大多数应用,此开销可忽略。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文