编码器 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 为例说明配置步骤。
- 打开 编程软件项目树中的“设备组态”页面。
- 双击 CPU 图标进入设备视图,点击 属性标签页。
- 展开 “常规”目录,找到 “高速计数器 (HSC)"选项。
- 启用 需要使用的计数器通道(如 HSC1)。
- 选择 计数器模式为“频率测量”或“周期测量”,若用于定位则选择“单相计数”或“双相计数”。
- 设置 输入类型为“双相输入 (A/B)"。
- 修改 倍频系数参数。在“基本参数”或“工作模式”下,找到 “评估”或“倍频”选项。
- 选择
4 倍频(4x) 以获得最高精度。 - 点击 “编译”按钮,保存 硬件组态配置。
- 下载 项目至 PLC 设备,重启 CPU 使配置生效。
配置完成后,PLC 会自动在后台硬件层面处理信号边沿,用户程序只需读取当前的计数值地址(如 %ID1000)即可。
3. 软件逻辑实现(通用算法)
若 PLC 不支持硬件倍频或需处理低速信号,可通过程序逻辑实现 4 倍频计数。核心逻辑是判断 A、B 相信号的当前状态与上一状态的变化组合。
定义两个布尔变量 A_Phase 和 B_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 倍频计数本质是一个状态机。以下流程图展示了正转时的状态跳转逻辑。反转时路径相反。
该逻辑确保在任意一个信号边沿变化时都能准确捕捉并更新计数值。编程时需确保状态判断的互斥性,防止同一周期内重复计数。
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. 调试与故障排查
程序下载后需进行实时监控,确保计数值与实际机械位置一致。
- 连接 PLC 编程软件在线监控模式。
- 添加 计数值变量
Count_Value到监视表。 - 手动 缓慢旋转编码器轴,观察 数值变化。
- 确认 正转时数值增加,反转时数值减少。
- 检查 数值变化量。旋转一圈,验证 计数值增量是否等于
$N \times 4$。 - 监测 输入信号波形。若发现计数丢失,检查 接线是否松动或信号干扰。
- 增加 滤波时间。若信号抖动导致误计数,在硬件属性中启用 输入滤波功能,设置 滤波时间为
0.2ms至1.0ms。 - 排查 扫描周期。若使用软件计数,测量 PLC 任务周期时间。确保信号频率
$f$满足$f < 1 / (2 \times T_{cycle})$。 - 复位 计数值。编写复位逻辑,使用 机械原点信号将
Count_Value清零。 - 保存 调试后的程序版本,标注 修改日期及参数说明。

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