实现两个编码器输入控制,核心是 “硬件选型接线 + 信号采集 + 软件逻辑处理”,需根据编码器类型(增量式 / 绝对式)、控制器型号(PLC / 单片机 / 运动控制器)和控制需求(计数、测速、定位、联动等)设计方案。以下是通用实现步骤、分场景案例及关键注意事项,新手可直接参考落地:
一、前期准备:明确核心参数(避免选型 / 接线错误)
1. 编码器关键参数确认
| 参数 | 选型 / 确认要点 |
|---|---|
| 类型 | 增量式(常用,输出 A/B/Z 三相脉冲,需计数;成本低)或绝对式(输出位置编码,断电保位;成本高) |
| 信号形式 | 集电极开路(NPN/PNP)、差分信号(RS422,抗干扰强,长距离)、推挽输出 |
| 分辨率 | 每转脉冲数(PPR),如 1024PPR(转 1 圈输出 1024 个 A/B 脉冲),影响控制精度 |
| 电源电压 | 通常 5V/12V/24V,需与控制器 IO 口兼容 |
2. 控制器选择(主流方案)
3. 控制需求明确
二、通用实现步骤(以 “PLC + 增量式编码器” 为例,最常用场景)
步骤 1:硬件选型与接线(核心!避免信号丢失 / 干扰)
以 三菱 FX5U PLC(带 2 路高速计数器)+ 2 个 NPN 集电极开路增量式编码器(5V 供电,A/B 相) 为例:
(1)接线原则
(2)具体接线表(FX5U PLC)
| 编码器 1(X 轴) | 编码器 2(Y 轴) | PLC 高速计数器端子 | 功能说明 |
|---|---|---|---|
| VCC(5V) | VCC(5V) | 外部 5V 电源 + | 编码器电源正极 |
| GND | GND | 外部 5V 电源 - + PLC GND | 共地(关键!) |
| A 相 | A 相 | X0(HSC1_A) | 高速计数器 1 A 相输入 |
| B 相 | B 相 | X1(HSC1_B) | 高速计数器 1 B 相输入 |
| Z 相(可选) | Z 相(可选) | X2(HSC1_Z) | 高速计数器 1 零位信号 |
| - | - | X3(HSC2_A) | 高速计数器 2 A 相输入(编码器 2 A 相) |
| - | - | X4(HSC2_B) | 高速计数器 2 B 相输入(编码器 2 B 相) |
| - | - | X5(HSC2_Z) | 高速计数器 2 零位信号(编码器 2 Z 相) |
✅ 不同 PLC 端子定义不同:
步骤 2:控制器参数配置(以 S7-1200 PLC 为例,TIA Portal 软件)
需在 PLC 中启用 2 路高速计数器,配置计数模式(A/B 相正交计数,支持正反转识别):
(1)配置高速计数器(HSC)
(2)创建数据块存储计数 / 速度值
新建全局数据块「DB_Encoder」,定义变量:
| 变量名 | 数据类型 | 说明 |
|---|---|---|
| Count1 | DINT | 编码器 1 累计脉冲数(32 位,避免溢出) |
| Count2 | DINT | 编码器 2 累计脉冲数 |
| Speed1 | REAL | 编码器 1 转速(r/min) |
| Speed2 | REAL | 编码器 2 转速(r/min) |
| Dir1 | BOOL | 编码器 1 方向(TRUE = 正转) |
| Dir2 | BOOL | 编码器 2 方向(TRUE = 正转) |
步骤 3:软件逻辑编程(核心功能实现)
根据控制需求编写程序,以下是最常用的 3 个功能示例(S7-1200 ST 语言):
(1)功能 1:双编码器脉冲计数(正交模式)
S7-1200 的 HSC 会自动采集 A/B 相脉冲并计数,程序中直接读取计数寄存器即可:
st
// 读取编码器1计数(HSC1的计数寄存器地址为ID1000,需在HSC配置中确认) DB_Encoder.Count1 := "HSC1_CounterValue"; // 读取编码器2计数(HSC2的计数寄存器地址为ID1010) DB_Encoder.Count2 := "HSC2_CounterValue"; // 方向判断(正交计数时,HSC状态字的第0位表示方向,需参考PLC手册) DB_Encoder.Dir1 := "HSC1_StatusWord".X0; DB_Encoder.Dir2 := "HSC2_StatusWord".X0; // 软件复位计数(当I0.0按下时,计数清零) IF "I0.0" THEN "HSC1_Clear" := TRUE; // HSC1清零指令 "HSC2_Clear" := TRUE; // HSC2清零指令 ELSE "HSC1_Clear" := FALSE; "HSC2_Clear" := FALSE; END_IF;
(2)功能 2:双编码器测速(M 法测速,适合中高速)
通过固定时间内的脉冲数计算转速,公式:转速(r/min)= (单位时间脉冲数 × 60) / 编码器 PPR
st
VAR Timer1: TON; // 测速定时器(100ms采样一次) Pulse1_Temp: DINT; // 编码器1临时脉冲数 Pulse2_Temp: DINT; // 编码器2临时脉冲数 END_VAR // 100ms定时采样 Timer1(IN := TRUE, PT := T#100MS); IF Timer1.Q THEN // 计算编码器1转速(PPR=1024为例) DB_Encoder.Speed1 := (DB_Encoder.Count1 - Pulse1_Temp) * 600 / 1024; // 计算编码器2转速 DB_Encoder.Speed2 := (DB_Encoder.Count2 - Pulse2_Temp) * 600 / 1024; // 更新临时脉冲数 Pulse1_Temp := DB_Encoder.Count1; Pulse2_Temp := DB_Encoder.Count2; // 定时器复位 Timer1 := FALSE; END_IF;
✅ 说明:100ms=0.1s,60/0.1=600,公式简化为 “脉冲差 ×600/PPR”;低速场景用 T 法测速(固定脉冲数求时间),精度更高。
(3)功能 3:双编码器联动控制(如 X/Y 轴定位)
通过两个编码器的计数反馈,控制执行器(如电机)联动,示例:X 轴移动到指定脉冲数后,Y 轴启动:
st
VAR X_Target: DINT := 10000; // X轴目标脉冲数(1024PPR×10圈≈10000脉冲) Y_Target: DINT := 5000; // Y轴目标脉冲数 X_Done: BOOL; // X轴到位标志 Y_Done: BOOL; // Y轴到位标志 END_VAR // X轴到位判断(误差±10脉冲,避免抖动) X_Done := ABS(DB_Encoder.Count1 - X_Target) <= 10; // Y轴到位判断 Y_Done := ABS(DB_Encoder.Count2 - Y_Target) <= 10; // 控制逻辑:X轴到位后,Y轴启动(假设Q0.0控制X轴电机,Q0.1控制Y轴电机) IF NOT X_Done THEN "Q0.0" := TRUE; // X轴电机运行 ELSE "Q0.0" := FALSE; // X轴停止 "Q0.1" := TRUE; // Y轴启动 IF Y_Done THEN "Q0.1" := FALSE; // Y轴停止 END_IF; END_IF;


