文章目录

编码器AB相信号倍频的PLC程序实现

发布于 2026-03-31 11:11:08 · 浏览 3 次 · 评论 0 条

编码器 AB 相信号倍频的 PLC 程序实现

增量式编码器输出 A、B 两路相位差为 90 度的方波信号。PLC 通过检测这两路信号的边沿变化来判断旋转方向和计算脉冲数量。倍频技术旨在利用 A、B 相信号的多个边沿(上升沿和下降沿)来增加计数分辨率,从而提高位置控制的精度。


1. 理解倍频原理与模式

编码器信号倍频分为 1 倍频、2 倍频和 4 倍频三种模式。不同模式对应不同的信号边沿检测策略,直接决定计数精度。

1 倍频仅检测 A 相的上升沿。2 倍频检测 A 相的上升沿和下降沿。4 倍频检测 A 相和 B 相的上升沿及下降沿。假设编码器线数为 $N$,机械旋转一圈产生的脉冲数 $P$ 计算公式如下:

$$ P = N \times \text{倍频系数} $$

若编码器线数为 1000,使用 4 倍频模式时,PLC 计数寄存器每转增加 4000 个计数值。选择倍频模式需根据控制精度要求和 PLC 高速计数器性能决定。


2. 配置 PLC 高速计数器(硬件方式)

大多数现代 PLC(如西门子 S7-1200/1500、三菱 FX5U)内置硬件高速计数器(HSC),可直接在硬件组态中设置倍频,无需编写复杂逻辑。以下以西门子 S7-1200 为例说明配置步骤。

  1. 打开 编程软件项目树中的“设备组态”页面。
  2. 双击 CPU 图标进入设备视图,点击 属性标签页。
  3. 展开 “常规”目录,找到 “高速计数器 (HSC)"选项。
  4. 启用 需要使用的计数器通道(如 HSC1)。
  5. 选择 计数器模式为“频率测量”或“周期测量”,若用于定位则选择“单相计数”或“双相计数”。
  6. 设置 输入类型为“双相输入 (A/B)"。
  7. 修改 倍频系数参数。在“基本参数”或“工作模式”下,找到 “评估”或“倍频”选项。
  8. 选择 4 倍频 (4x) 以获得最高精度。
  9. 点击 “编译”按钮,保存 硬件组态配置。
  10. 下载 项目至 PLC 设备,重启 CPU 使配置生效。

配置完成后,PLC 会自动在后台硬件层面处理信号边沿,用户程序只需读取当前的计数值地址(如 %ID1000)即可。


3. 软件逻辑实现(通用算法)

若 PLC 不支持硬件倍频或需处理低速信号,可通过程序逻辑实现 4 倍频计数。核心逻辑是判断 A、B 相信号的当前状态与上一状态的变化组合。

定义两个布尔变量 A_PhaseB_Phase 分别读取输入点。定义一个整数变量 Pre_State 存储上一扫描周期的状态,Current_Count 存储累计脉冲。状态编码规则为:State = A * 2 + B

// 初始化变量
VAR
    A_Phase : Bool; // A 相输入
    B_Phase : Bool; // B 相输入
    Pre_State : Int := 0; // 上一周期状态
    Current_State : Int; // 当前周期状态
    Count_Value : DInt := 0; // 计数值
END_VAR

// 读取输入状态
A_Phase := %IX0.0;
B_Phase := %IX0.1;

// 计算当前状态编码 (0-3)
Current_State := WORD_TO_INT(A_Phase) * 2 + WORD_TO_INT(B_Phase);

// 判断方向并计数
IF Pre_State = 0 AND Current_State = 1 THEN
    // 00 -> 01, 正转
    Count_Value := Count_Value + 1;
ELSIF Pre_State = 1 AND Current_State = 3 THEN
    // 01 -> 11, 正转
    Count_Value := Count_Value + 1;
ELSIF Pre_State = 3 AND Current_State = 2 THEN
    // 11 -> 10, 正转
    Count_Value := Count_Value + 1;
ELSIF Pre_State = 2 AND Current_State = 0 THEN
    // 10 -> 00, 正转
    Count_Value := Count_Value + 1;
ELSIF Pre_State = 0 AND Current_State = 2 THEN
    // 00 -> 10, 反转
    Count_Value := Count_Value - 1;
ELSIF Pre_State = 2 AND Current_State = 3 THEN
    // 10 -> 11, 反转
    Count_Value := Count_Value - 1;
ELSIF Pre_State = 3 AND Current_State = 1 THEN
    // 11 -> 01, 反转
    Count_Value := Count_Value - 1;
ELSIF Pre_State = 1 AND Current_State = 0 THEN
    // 01 -> 00, 反转
    Count_Value := Count_Value - 1;
END_IF;

// 更新上一周期状态
Pre_State := Current_State;

上述代码在每个扫描周期执行。注意输入信号频率不能超过 PLC 扫描频率的一半,否则会出现漏脉冲。对于高频信号,必须使用硬件高速计数器。


4. 信号状态流转逻辑图

4 倍频计数本质是一个状态机。以下流程图展示了正转时的状态跳转逻辑。反转时路径相反。

graph TD S0["状态 0: A=0, B=0"] S1["状态 1: A=0, B=1"] S2["状态 2: A=1, B=0"] S3["状态 3: A=1, B=1"] S0 -- "B 相上升沿 +1" --> S1 S1 -- "A 相上升沿 +1" --> S3 S3 -- "B 相下降沿 +1" --> S2 S2 -- "A 相下降沿 +1" --> S0 S0 -- "A 相上升沿 -1" --> S2 S2 -- "B 相上升沿 -1" --> S3 S3 -- "A 相下降沿 -1" --> S1 S1 -- "B 相下降沿 -1" --> S0

该逻辑确保在任意一个信号边沿变化时都能准确捕捉并更新计数值。编程时需确保状态判断的互斥性,防止同一周期内重复计数。


5. 信号状态与计数动作对照表

为了便于调试,以下表格列出了所有可能的状态变迁及其对应的计数动作。编程时可参考此表编写 CASE 语句或 IF 逻辑。

上一状态 (Pre) 当前状态 (Cur) A 相变化 B 相变化 旋转方向 计数动作
0 (00) 1 (01) 不变 上升沿 正转 +1
1 (01) 3 (11) 上升沿 不变 正转 +1
3 (11) 2 (10) 不变 下降沿 正转 +1
2 (10) 0 (00) 下降沿 不变 正转 +1
0 (00) 2 (10) 上升沿 不变 反转 -1
2 (10) 3 (11) 不变 上升沿 反转 -1
3 (11) 1 (01) 下降沿 不变 反转 -1
1 (01) 0 (00) 不变 下降沿 反转 -1
其他组合 其他组合 无效跳变 无效跳变 未知 0

6. 调试与故障排查

程序下载后需进行实时监控,确保计数值与实际机械位置一致。

  1. 连接 PLC 编程软件在线监控模式。
  2. 添加 计数值变量 Count_Value 到监视表。
  3. 手动 缓慢旋转编码器轴,观察 数值变化。
  4. 确认 正转时数值增加,反转时数值减少。
  5. 检查 数值变化量。旋转一圈,验证 计数值增量是否等于 $N \times 4$
  6. 监测 输入信号波形。若发现计数丢失,检查 接线是否松动或信号干扰。
  7. 增加 滤波时间。若信号抖动导致误计数,在硬件属性中启用 输入滤波功能,设置 滤波时间为 0.2ms1.0ms
  8. 排查 扫描周期。若使用软件计数,测量 PLC 任务周期时间。确保信号频率 $f$ 满足 $f < 1 / (2 \times T_{cycle})$
  9. 复位 计数值。编写复位逻辑,使用 机械原点信号将 Count_Value 清零。
  10. 保存 调试后的程序版本,标注 修改日期及参数说明。

评论 (0)

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

扫一扫,手机查看

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