编码器控制 DA(0-10V)比例输出的核心逻辑是:编码器采集位置 / 转速信号→PLC 计算比例系数→DA 模块输出对应 0-10V 模拟量,可用于变频器给定、阀门调节、伺服控制等场景。以下是完整实现流程,包含硬件选型、参数配置、程序编写及校准方法。
一、系统整体架构
plaintext
编码器(增量式/绝对值)→ S7-1200 PLC(高速计数/通讯)→ SM 1232 AO模块 → 0-10V模拟量输出(至被控设备)
核心规则:
二、硬件选型与接线
1. 核心硬件清单
| 设备 | 型号 / 规格 | 作用 | 关键参数 |
|---|---|---|---|
| S7-1200 PLC | 1214C/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 引脚 | 说明 |
|---|---|---|
| VCC | DC5V(PLC 自带) | 编码器供电(若编码器为 24V,需外接电源) |
| GND | PLC GND | 电源地,需共地 |
| A 相 | PLC 高速计数输入(如 I0.0) | 脉冲信号 A,接 PLC 数字输入点(支持高速计数) |
| B 相 | PLC 高速计数输入(如 I0.1) | 脉冲信号 B,用于方向判断(可选,单方向可省略) |
| Z 相 | PLC 高速计数输入(如 I0.2) | 零点信号(可选,复位用) |
(2)SM 1232 AO 模块 → 被控设备
| SM 1232 AO 引脚 | 被控设备引脚 | 说明 |
|---|---|---|
| AO0.0+ | 被控设备信号正(如变频器 AI+) | 0-10V 输出正极 |
| AO0.0- | 被控设备信号负(如变频器 AI-) | 0-10V 输出负极 |
| 模块电源 | DC24V+/- | 模块供电,与 PLC 共地 |
三、核心参数定义(PLC 变量表)
在 TIA Portal 中定义以下变量,统一管理参数,便于程序编写:
| 变量地址 | 变量名 | 类型 | 说明 | 示例值 |
|---|---|---|---|---|
| VW100 | Enc_Current | INT | 编码器当前计数值 | 0-1000 |
| VW102 | Enc_Min | INT | 编码器量程最小值 | 0 |
| VW104 | Enc_Max | INT | 编码器量程最大值 | 1000 |
| VW106 | DA_Out_Raw | INT | DA 输出原始值(0-27648) | 0=0V,27648=10V |
| VW108 | DA_Out_Volt | REAL | DA 输出目标电压(V) | 0-10.0 |
| VW110 | Filter_Count | INT | 滤波次数(滑动平均) | 5 |
| VW112 | Enc_Buffer[5] | INT 数组 | 编码器值缓存(滤波用) | - |
四、程序编写核心步骤(TIA Portal)
步骤 1:高速计数器(HSC)组态(编码器信号采集)
S7-1200 通过 HSC 指令采集编码器脉冲,以增量式编码器为例:
伪代码(读取编码器当前值):
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 写入输出寄存器,步骤:
伪代码(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 模块偏移,需手动校准输出线性度:
2. 调试要点
六、特殊场景适配
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 预设值复位 |


