返回主站|会员中心|保存桌面

AB罗克韦尔服务商    

PLC、变频器、人机界面、传感器

联系方式
  • 联系人:吴经理
  • 电话:18576370666
新闻分类
  • 暂无分类
首页 > 新闻中心 > 如何实现两个编码器输入控制!
新闻中心
如何实现两个编码器输入控制!
发布时间:2025-12-03        浏览次数:3        返回列表

实现两个编码器输入控制,核心是 “硬件选型接线 + 信号采集 + 软件逻辑处理”,需根据编码器类型(增量式 / 绝对式)、控制器型号(PLC / 单片机 / 运动控制器)和控制需求(计数、测速、定位、联动等)设计方案。以下是通用实现步骤、分场景案例及关键注意事项,新手可直接参考落地:

一、前期准备:明确核心参数(避免选型 / 接线错误)

1. 编码器关键参数确认

参数选型 / 确认要点
类型增量式(常用,输出 A/B/Z 三相脉冲,需计数;成本低)或绝对式(输出位置编码,断电保位;成本高)
信号形式集电极开路(NPN/PNP)、差分信号(RS422,抗干扰强,长距离)、推挽输出
分辨率每转脉冲数(PPR),如 1024PPR(转 1 圈输出 1024 个 A/B 脉冲),影响控制精度
电源电压通常 5V/12V/24V,需与控制器 IO 口兼容

2. 控制器选择(主流方案)

  • 优先选 带高速计数器(HSC)的 PLC(如西门子 S7-1200/1500、三菱 FX3U/FX5U、欧姆龙 CP1H):HSC 可硬件计数(响应速度快,支持 10kHz~1MHz 脉冲),适合高频编码器;

  • 单片机(如 STM32、Arduino):需用定时器中断或外部中断采集脉冲,适合低成本、低频率(≤10kHz)场景;

  • 运动控制器(如松下 MAD、汇川 IT600):专为多轴运动设计,支持编码器反馈闭环控制(如定位、同步)。

3. 控制需求明确

  • 基础需求:计数(累计脉冲数)、测速(计算转速 r/min);

  • 进阶需求:双编码器定位(如 X/Y 轴联动)、差值计算(如张力控制中两个编码器的速度差)、冗余备份(一个故障时切换另一个)。

二、通用实现步骤(以 “PLC + 增量式编码器” 为例,最常用场景)

步骤 1:硬件选型与接线(核心!避免信号丢失 / 干扰)

以 三菱 FX5U PLC(带 2 路高速计数器)+ 2 个 NPN 集电极开路增量式编码器(5V 供电,A/B 相) 为例:

(1)接线原则
  • 编码器电源:需独立供电(避免与 PLC 电源共地干扰),5V 编码器建议配线性电源,24V 可直接用 PLC 输出电源;

  • 信号接线:A/B 相接 PLC 高速计数器输入端子(需对应 PLC 的 HSC 通道,不可接普通 IO 口),Z 相(零位信号)可选接(用于复位计数 / 定位参考点);

  • 共地处理:编码器 GND 与 PLC GND 必须短接(共地),否则信号漂移导致计数错误;

  • 抗干扰措施:编码器线缆用屏蔽线(屏蔽层单端接地),远离变频器、电机等强电磁干扰源,线缆长度≤10 米(差分信号可延长至 50 米)。

(2)具体接线表(FX5U PLC)
编码器 1(X 轴)编码器 2(Y 轴)PLC 高速计数器端子功能说明
VCC(5V)VCC(5V)外部 5V 电源 +编码器电源正极
GNDGND外部 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 端子定义不同:

  • 西门子 S7-1200:高速计数器端子为 I0.0~I0.3(HSC1)、I0.4~I0.7(HSC2),需在 TIA Portal 中配置 HSC 通道;

  • 欧姆龙 CP1H:高速计数器端子为 0.00~0.03(CH0)、0.04~0.07(CH1),支持差分信号输入。

步骤 2:控制器参数配置(以 S7-1200 PLC 为例,TIA Portal 软件)

需在 PLC 中启用 2 路高速计数器,配置计数模式(A/B 相正交计数,支持正反转识别):

(1)配置高速计数器(HSC)
  1. 打开 TIA Portal,进入「设备配置」→ 双击「PLC_1」→ 「属性」→ 「高速计数器」;

  2. 启用「HSC1」和「HSC2」,分别对应编码器 1 和编码器 2;

  3. 每路 HSC 配置:

    • 计数类型:「正交计数(A/B 相)」(可识别电机正反转,计数更精准);

    • 信号类型:「漏型输入」(NPN 编码器)或「源型输入」(PNP 编码器);

    • 初始值:0(默认),可自定义(如定位起始值);

    • 复位方式:可选「Z 相复位」(触发 Z 相时计数清零)或「软件复位」(通过程序指令清零)。

(2)创建数据块存储计数 / 速度值

新建全局数据块「DB_Encoder」,定义变量:

变量名数据类型说明
Count1DINT编码器 1 累计脉冲数(32 位,避免溢出)
Count2DINT编码器 2 累计脉冲数
Speed1REAL编码器 1 转速(r/min)
Speed2REAL编码器 2 转速(r/min)
Dir1BOOL编码器 1 方向(TRUE = 正转)
Dir2BOOL编码器 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;

三、其他场景实现要点

1. 绝对式编码器(多圈 RS485 接口)

  • 接线:VCC、GND、A+、A-(RS485 差分信号),接 PLC 的 RS485 通信端口(如 S7-1200 的 CM1241 模块);

  • 编程:通过 Modbus-RTU 协议读取编码器的位置寄存器(需查询编码器手册的寄存器地址),无需高速计数器,示例:

    st

  • // 读取绝对式编码器1位置(Modbus地址40001)
    MODBUS_RTU_Master(
        EN := TRUE,
        MODE := 0, // 读保持寄存器
        ADDR := 1, // 编码器从站地址
        REG_ADDR := 40001, // 位置寄存器地址
        REG_NUM := 2, // 读取2个寄存器(32位位置值)
        DATA := P#DB_Encoder.DBX20.0 WORD 2, // 存储位置值
        DONE => M1.0,
        ERROR => M1.1
    );

2. 单片机实现(STM32 为例)

  • 接线:编码器 A/B 相接 STM32 的定时器通道(如 TIM2_CH1、TIM2_CH2 对应编码器 1,TIM3_CH1、TIM3_CH2 对应编码器 2);

  • 配置:启用定时器的「编码器模式」(自动处理 A/B 相正交计数);

  • 编程:通过TIM_GetCounter(TIM2)读取编码器 1 计数,TIM_GetCounter(TIM3)读取编码器 2 计数,测速逻辑与 PLC 一致。

3. 双编码器冗余备份(容错控制)

  • 逻辑:同时读取两个编码器的计数 / 速度值,判断两者差值是否在允许范围(如 ±5%);

  • 容错:若差值超出范围,判定其中一个故障,切换到另一个编码器控制,同时触发报警(如 Q0.2 亮红灯):

    st

  • VAR
      Error_Flag: BOOL; // 故障标志
      Speed_Diff: REAL; // 转速差值。
收缩
  • 电话咨询

  • 18576370666
  • 添加微信客服