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

台达专营服务商    

变频器、PLC、触摸屏、伺服驱动器

联系方式
  • 联系人:吴经理
  • 电话:18576370666
  • 邮件:18576370666@163.com
新闻分类
  • 暂无分类
站内搜索
 
首页 > 新闻中心 > 如何实现编码器控制DA(0-10V)比例输出!
新闻中心
如何实现编码器控制DA(0-10V)比例输出!
发布时间:2025-12-24        浏览次数:1        返回列表

编码器控制 DA(0-10V)比例输出的核心逻辑是:编码器采集位置 / 转速信号→PLC 计算比例系数→DA 模块输出对应 0-10V 模拟量,可用于变频器给定、阀门调节、伺服控制等场景。以下是完整实现流程,包含硬件选型、参数配置、程序编写及校准方法。

一、系统整体架构

plaintext

编码器(增量式/绝对值)→ S7-1200 PLC(高速计数/通讯)→ SM 1232 AO模块 → 0-10V模拟量输出(至被控设备)

核心规则:

  • 编码器的测量范围(如 0-1000 脉冲)对应 DA 输出的 0-10V;

  • 实时计算编码器当前值占总范围的比例,转换为 0-10V 的对应值;

  • 支持量程自定义、线性校准、滤波防抖,保证输出稳定。

二、硬件选型与接线

1. 核心硬件清单

设备型号 / 规格作用关键参数
S7-1200 PLC1214C/1215C核心控制,高速计数 + 数据计算自带高速计数器(HSC),支持编码器信号
编码器增量式(NPN/PNP)/ 绝对值采集位置 / 转速信号示例:增量式,1000 脉冲 / 转(PPR),5V 供电
DA 模块SM 1232 AO(6ES7 232-4HD32-0XB0)输出 0-10V 模拟量2 通道,16 位精度,0-10V/4-20mA 可选
电源DC24V给编码器 / PLC/DA 模块供电稳定输出,纹波 < 5%
屏蔽电缆RVSP 2×0.75(编码器)/RVV 2×1.0(DA 输出)减少干扰编码器电缆需双绞屏蔽

2. 硬件接线

(1)编码器 → S7-1200 高速计数接口

增量式 NPN 编码器为例(最常用):

编码器引脚S7-1200 引脚说明
VCCDC5V(PLC 自带)编码器供电(若编码器为 24V,需外接电源)
GNDPLC GND电源地,需共地
A 相PLC 高速计数输入(如 I0.0)脉冲信号 A,接 PLC 数字输入点(支持高速计数)
B 相PLC 高速计数输入(如 I0.1)脉冲信号 B,用于方向判断(可选,单方向可省略)
Z 相PLC 高速计数输入(如 I0.2)零点信号(可选,复位用)

注意:

  • PNP 编码器需将信号引脚串 2KΩ 电阻接 GND,转换为 NPN 电平;

  • 编码器屏蔽层单端接地(接 PLC 接地端),避免干扰。

(2)SM 1232 AO 模块 → 被控设备

SM 1232 AO 引脚被控设备引脚说明
AO0.0+被控设备信号正(如变频器 AI+)0-10V 输出正极
AO0.0-被控设备信号负(如变频器 AI-)0-10V 输出负极
模块电源DC24V+/-模块供电,与 PLC 共地

三、核心参数定义(PLC 变量表)

在 TIA Portal 中定义以下变量,统一管理参数,便于程序编写:

变量地址变量名类型说明示例值
VW100Enc_CurrentINT编码器当前计数值0-1000
VW102Enc_MinINT编码器量程最小值0
VW104Enc_MaxINT编码器量程最大值1000
VW106DA_Out_RawINTDA 输出原始值(0-27648)0=0V,27648=10V
VW108DA_Out_VoltREALDA 输出目标电压(V)0-10.0
VW110Filter_CountINT滤波次数(滑动平均)5
VW112Enc_Buffer[5]INT 数组编码器值缓存(滤波用)-

四、程序编写核心步骤(TIA Portal)

步骤 1:高速计数器(HSC)组态(编码器信号采集)

S7-1200 通过 HSC 指令采集编码器脉冲,以增量式编码器为例:

  1. 打开 TIA Portal,在 PLC 硬件组态中,双击 CPU→属性→高速计数器

  2. 选择 HSC1(对应 I0.0/I0.1),配置参数:

    • 计数器类型:增量计数器

    • 计数模式:双向计数(A/B 相正交)或单向计数(仅 A 相);

    • 初始值:0,预设值:Enc_Max(1000);

    • 触发方式:硬件触发(编码器脉冲);

  3. 启用 HSC,生成背景数据块(如 DB1),用于读取当前计数值。

伪代码(读取编码器当前值):

plaintext

// 从HSC背景数据块读取编码器当前值
Enc_Current := "DB1_HSC".CV; // CV=Current Value(当前计数值)
// 限制计数值在量程内(防止溢出)
IF Enc_Current < Enc_Min THEN
   Enc_Current := Enc_Min;
ELSIF Enc_Current > Enc_Max THEN
   Enc_Current := Enc_Max;
END_IF;

步骤 2:编码器值→电压值比例转换

核心公式:

plaintext

电压值 = (编码器当前值 - 编码器最小值) / (编码器最大值 - 编码器最小值) × 10.0
DA原始值 = 电压值 / 10.0 × 27648 (SM1232 AO模块:0-10V对应0-27648)

伪代码(比例转换):

plaintext

// 计算比例系数(0-1)
Ratio := REAL_TO_LREAL(Enc_Current - Enc_Min) / REAL_TO_LREAL(Enc_Max - Enc_Min);
// 转换为目标电压(0-10V)
DA_Out_Volt := Ratio × 10.0;
// 电压值→DA原始值(0-27648)
DA_Out_Raw := INT(DA_Out_Volt / 10.0 × 27648);
// 限幅(避免超出0-10V范围)
IF DA_Out_Raw < 0 THEN
   DA_Out_Raw := 0;
ELSIF DA_Out_Raw > 27648 THEN
   DA_Out_Raw := 27648;
END_IF;

步骤 3:滤波处理(可选,消除抖动)

编码器机械抖动会导致 DA 输出波动,需增加滑动平均值滤波

plaintext

// 滑动平均滤波(取最近5次编码器值的平均)
// 缓存数组移位
Enc_Buffer[4] := Enc_Buffer[3];
Enc_Buffer[3] := Enc_Buffer[2];
Enc_Buffer[2] := Enc_Buffer[1];
Enc_Buffer[1] := Enc_Buffer[0];
Enc_Buffer[0] := Enc_Current;
// 计算平均值
Enc_Avg := (Enc_Buffer[0]+Enc_Buffer[1]+Enc_Buffer[2]+Enc_Buffer[3]+Enc_Buffer[4])/5;
// 用平均值替代原始值参与比例转换
Ratio := REAL_TO_LREAL(Enc_Avg - Enc_Min) / REAL_TO_LREAL(Enc_Max - Enc_Min);

步骤 4:DA 模块输出(0-10V)

SM 1232 AO 模块需将计算后的 DA_Out_Raw 写入输出寄存器,步骤:

  1. 硬件组态:双击 SM 1232 模块→属性→通道组态,将 AO0.0 设为0-10V

  2. 程序编写:将 DA_Out_Raw 写入 AO 模块的输出地址(如 QW100)。

伪代码(DA 输出):

plaintext

// 将DA原始值写入AO模块输出寄存器
"SM1232 AO".AQW0 := DA_Out_Raw; // AQW0对应AO0.0通道

完整程序逻辑示例(OB1 中)

plaintext

// 步骤1:读取编码器当前值(HSC)
Enc_Current := "DB1_HSC".CV;

// 步骤2:限幅+滤波
IF Enc_Current < Enc_Min THEN Enc_Current := Enc_Min; END_IF;
IF Enc_Current > Enc_Max THEN Enc_Current := Enc_Max; END_IF;
Enc_Buffer[4] := Enc_Buffer[3];
Enc_Buffer[3] := Enc_Buffer[2];
Enc_Buffer[2] := Enc_Buffer[1];
Enc_Buffer[1] := Enc_Buffer[0];
Enc_Buffer[0] := Enc_Current;
Enc_Avg := (Enc_Buffer[0]+Enc_Buffer[1]+Enc_Buffer[2]+Enc_Buffer[3]+Enc_Buffer[4])/5;

五、校准与调试

1. 线性校准(关键)

由于编码器精度、DA 模块偏移,需手动校准输出线性度:

  1. 零点校准:将编码器转到最小值(Enc_Current=0),测量 DA 输出电压,若≠0V,调整偏移量:

    plaintext

  2. DA_Out_Volt := Ratio × 10.0 + Offset; // Offset为偏移补偿(如-0.1V)
  3. 满量程校准:将编码器转到最大值(Enc_Current=1000),测量 DA 输出电压,若≠10V,调整比例系数:

    plaintext

  4. DA_Out_Volt := Ratio × 10.0 × Gain; // Gain为增益补偿(如1.02)
  5. 多点校准:取编码器 50% 位置(500 脉冲),验证 DA 输出是否为 5V,微调 Gain/Offset。

2. 调试要点

  • 用万用表测量 DA 输出电压,对比理论值(如编码器 500 脉冲→5V);

  • 观察编码器转动时,DA 电压是否线性变化,无跳变 / 抖动;

  • 若输出波动大,增加滤波次数(如 Filter_Count=10),或检查编码器接线屏蔽。

六、特殊场景适配

1. 绝对值编码器(通讯型)

若使用 Profinet/Modbus 绝对值编码器,无需 HSC,直接读取编码器的位置值:

plaintext

// Modbus读取绝对值编码器位置
CALL "MB_CLIENT", "Read_Encoder";
REQ := TRUE;
ADDR := 2; // 编码器站地址
MODE := 0; // 读
DATA_LEN := 1;
DATA_PTR := &Enc_Current;
PORT := 1;

2. 转速控制(编码器测转速→DA 输出)

若需编码器测转速(如 0-3000rpm→0-10V),需计算转速:

plaintext

// 计算转速(rpm):脉冲数/PPR × 60 / 采样时间(s)
RPM := (Enc_Current / 1000.0) × 60 / 1.0; // 采样时间1s,1000PPR
// 转速→电压转换(0-3000rpm→0-10V)
DA_Out_Volt := (RPM / 3000.0) × 10.0;

3. 反向输出(编码器增大→电压减小)

修改比例公式即可:

plaintext

DA_Out_Volt := 10.0 - (Ratio × 10.0); // 0脉冲→10V,1000脉冲→0V

七、常见问题及解决方法

故障现象原因解决方法
DA 输出无电压1. AO 通道未设为 0-10V;2. DA_Out_Raw=0;3. 模块未供电1. 检查硬件组态;2. 监控 Enc_Current 是否 > 0;3. 确认模块 24V 供电
输出电压波动大1. 编码器接线无屏蔽;2. 无滤波;3. 计数干扰1. 更换屏蔽电缆,单端接地;2. 增加滑动滤波;3. 编码器信号串 1KΩ 电阻
比例不准1. 量程设置错误;2. DA 模块校准偏差;3. 编码器 PPR 错误1. 核对 Enc_Min/Enc_Max;2. 重新校准 Gain/Offset;3. 确认编码器参数
计数溢出编码器计数值超出 Enc_Max增加计数值限幅逻辑,或启用 HSC 预设值复位

八、优化建议

  1. 采样周期:将核心计算逻辑放在 OB35(定时中断,如 100ms),避免 OB1 周期波动影响输出;

  2. 参数可配置:通过 HMI 设置 Enc_Min/Enc_Max、Gain/Offset,无需修改程序;

  3. 故障检测:检测编码器无脉冲(超时)、DA 输出超限,触发报警;

  4. 精度提升:使用 REAL/LREAL 类型计算比例,避免整数运算丢失精度。

收缩
  • QQ咨询

  • 电话咨询

  • 18576370666
  • 添加微信客服