一、先明确两个关键值
单圈分辨率(一圈多少个数)例:17 位单圈 = 131072
过零区间(靠近 0 的一小段)通常设:0 ± 5% 一圈
二、标准过零判断逻辑(最稳)
条件 1:当前位置在 接近 0 的区域
0 ≤ 当前位置 ≤ 过零窗口值例:一圈 131072 → 窗口设 0~5000
条件 2:上一次扫描位置 在圈尾区域
上一位置 ≥ 一圈最大值 - 过零窗口例:≥131072 - 5000 = 126072
最终过零触发:
上一位置在圈尾AND当前位置在圈头→ 输出 过零脉冲(OneShot)
三、PLC 通用程序逻辑(文字版)
plaintext
// 定义 SingleTurnMax = 一圈最大值 ZeroWindow = 5000 // 过零窗口,可调 NowPos = 绝对值单圈值 LastPos = 上周期位置 // 圈头区:接近0 Zone_Head := (NowPos >= 0) AND (NowPos <= ZeroWindow); // 圈尾区:接近最大值 Zone_Tail := (LastPos >= SingleTurnMax - ZeroWindow) AND (LastPos <= SingleTurnMax); // 过零检测(上升沿一次) Cross_Zero := Zone_Tail AND Zone_Head;
只要 Cross_Zero = ON 一次,就是刚跨过零点。
四、反向转动(倒转)过零也能检测
倒转过零:
上一位置在圈头
当前位置跳到圈尾
逻辑:
plaintext
Zone_Head_Last := (LastPos >=0) AND (LastPos <= ZeroWindow); Zone_Tail_Now := (NowPos >= SingleTurnMax - ZeroWindow); Cross_Zero_Reverse := Zone_Head_Last AND Zone_Tail_Now;
五、为什么不能直接判断 ==0?
因为:
编码器不一定正好经过 0
高速转动会跳过 0
干扰会导致抖动必须用区间判断,才可靠
六、实际应用场景
计圈数每过零一次,圈数 +1 /-1
找原点过零视为 Z 相信号使用
防止位置跳变避免从最大值突然变 0 导致计算错误
同步、飞剪、套色以过零作为相位基准
七、你告诉我两点,我直接给你写完整 PLC 程序
编码器单圈位数(13bit/16bit/17bit/20bit?)
PLC 品牌:三菱 / 西门子 / 台达 / 欧姆龙。

