梯形图编程中,高速计数器(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 因抖动从 TRUE→FALSE→TRUE 变化,则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不一致时置位) |
工作流程分两阶段:
- 稳定检测阶段:当
DIR_Raw ≠ DIR_Stable,启动去抖定时器T_DIR_Debounce(建议设为20ms);定时器未超时前,DIR_Pending= TRUE,DIR_Stable保持原值; - 确认更新阶段:定时器超时且
DIR_Raw仍保持新电平,则DIR_Stable ← DIR_Raw,DIR_Pending ← FALSE。
此机制确保:任何持续时间<20ms的DIR跳变均被忽略;仅当DIR连续稳定≥20ms,才更新计数所用方向值。
三、梯形图实现步骤(以IEC 61131-3通用语法为准)
以下所有操作均在主程序组织块(OB1)中完成,无需中断或特殊功能块。
-
声明全局变量(在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; // 去抖时间常量 -
编写去抖逻辑网络(Network 1)
比较DIR_Raw与DIR_Stable:- 若不等,启动
T_Debounce定时器,加载tDebounce; - 若相等,复位
T_Debounce定时器; - 置位
DIR_Pending当DIR_Raw ≠ DIR_Stable; - 复位
DIR_Pending当T_Debounce.Q = TRUE(定时器超时)。
- 若不等,启动
-
编写方向更新逻辑网络(Network 2)
检测T_Debounce.Q = TRUE且DIR_Raw ≠ DIR_Stable:- 赋值
DIR_Stable := DIR_Raw; - 复位
DIR_Pending(双重保险)。
- 赋值
-
关键约束:避免跨扫描竞争
必须保证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)本身也出现毛刺时,需进一步防止“伪脉冲”触发计数。此时启用脉冲有效性门控:
-
新增变量:
CLK_Raw: BOOL; // 原始脉冲输入
CLK_Valid: BOOL; // 经验证的有效脉冲边沿 -
验证逻辑:
仅当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_Raw和DIR_Stable波形,观察抖动持续时间; - 若
DIR_Stable切换滞后明显,逐步减小至T#10MS; - 若仍有误差,增大至
T#30MS并检查接线屏蔽与电源滤波。
六、验证方法:四步闭环测试
-
静态抖动注入测试
断开实际DIR线,接入信号发生器,输出方波(频率100Hz,占空比50%),叠加1kHz、峰峰值2V的噪声。观察DIR_Stable是否完全平滑,无跳变。 -
动态换向测试
手动快速拨动DIR开关(模拟机械振动),同时发送单个脉冲。监控计数器值:应始终为±1,无±2或0。 -
极限速度测试
设置电机以最高工作速度正反转,记录100次换向后的累积计数偏差。合格标准:绝对误差 ≤ 0.1% 总脉冲数。 -
长期运行测试
连续运行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_HSC的DIR参数调用;注意启用“优化访问”并禁用“仿真”模式。 - 三菱FX5U:使用
T0类定时器,DIR_Stable需映射至M区(如M100),并在高速计数器指令DHSCS的S(方向软元件)中指定。 - 欧姆龙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滤波通道。
对绝大多数应用,此开销可忽略。

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