5.3 模拟量输出控制
本节将介绍模拟量输出的控制方法,掌握从控制指令到执行器动作的完整实现
学习目标
- 掌握模拟量输出模块的选型与配置
- 理解工程量到输出值的转换方法
- 学会输出限幅和斜坡控制技术
- 能够实现变频器的模拟量控制
1. 模拟量输出模块选型
1.1 选型考虑因素
模拟量输出模块选型要点:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 执行器类型 → 输出信号类型 → 通道数量 → 精度要求 → 选型 │
│ │ │ │ │ │
│ 变频器 电压/电流 预留余量 分辨率 │
│ 阀门 响应速度 │
│ 调节器 │
│ │
└─────────────────────────────────────────────────────────────┘1.2 输出信号类型对比
| 输出类型 | 范围 | 负载能力 | 典型应用 |
|---|---|---|---|
| 电压输出 | 0-10V、±10V | 1kΩ以上 | 变频器、伺服 |
| 电流输出 | 4-20mA、0-20mA | 600Ω以下 | 阀门、远程控制 |
1.3 常用模拟量输出模块
西门子系列:
| 型号 | 通道 | 分辨率 | 信号类型 | 特点 |
|---|---|---|---|---|
| SM1232 AO 2x14位 | 2 | 14位 | V/I | 经济型 |
| SM1232 AO 4x14位 | 4 | 14位 | V/I | 多通道 |
| SM1234 AI/AO | 4AI+2AO | 14位 | V/I | 混合型 |
三菱系列:
| 型号 | 通道 | 分辨率 | 信号类型 | 特点 |
|---|---|---|---|---|
| FX3U-4DA | 4 | 12位 | V/I | 标准型 |
| FX3U-4DA-ADP | 4 | 12位 | V/I | 右侧扩展 |
2. 模块接线与配置
2.1 西门子SM1232接线
SM1232 AO 2通道接线图:
┌─────────────────────────────────────────────────────────────┐
│ │
│ SM1232 AO 模块 │
│ ┌───────────────────────────────────────────────┐ │
│ │ AO0+ AO0- M AO1+ AO1- M L+ 2M │ │
│ │ 1 2 3 4 5 6 7 8 │ │
│ └────┬─────┬────────┬─────┬────────────────────┘ │
│ │ │ │ │ │
│ │ │ │ │ │
│ ↓ ↓ ↓ ↓ │
│ ┌────┴─────┴──┐ ┌───┴─────┴──┐ │
│ │ 变频器1 │ │ 变频器2 │ │
│ │ AI输入 │ │ AI输入 │ │
│ │ VI COM │ │ VI COM │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ 电压输出接线: │
│ AO+ ──────→ 变频器 VI(电压输入端) │
│ AO- ──────→ 变频器 COM(公共端) │
│ │
│ 电流输出接线: │
│ AO+ ──────→ 变频器 II(电流输入端) │
│ AO- ──────→ 变频器 COM(公共端) │
│ │
└─────────────────────────────────────────────────────────────┘2.2 西门子TIA Portal配置
TIA Portal模拟量输出配置步骤:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 步骤1:添加模块 │
│ ├─设备配置 → 添加模块 → 选择SM1232型号 │
│ │
│ 步骤2:通道配置 │
│ ├─双击模块 → 常规 → 模拟量输出 │
│ ├─设置输出类型:电压/电流 │
│ ├─设置输出范围:0-10V、4-20mA等 │
│ │
│ 步骤3:变量配置 │
│ ├─PLC变量表 → 新建变量 │
│ ├─名称:Speed_Output │
│ ├─地址:%QW96(根据模块起始地址) │
│ ├─数据类型:Int │
│ │
│ 步骤4:下载配置 │
│ └─编译 → 下载到设备 │
│ │
└─────────────────────────────────────────────────────────────┘2.3 三菱FX3U-4DA配置
FX3U-4DA模块配置:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 物理接线: │
│ ┌──────────────────────────────────┐ │
│ │ FX3U-4DA 端子排列 │ │
│ │ ┌───┬───┬───┬───┬───┬───┬───┐ │ │
│ │ │V1 │I1 │COM│V2 │I2 │COM│...│ │ │
│ │ │CH1│CH1│ │CH2│CH2│ │ │ │ │
│ │ └───┴───┴───┴───┴───┴───┴───┘ │ │
│ │ │ │
│ │ 电压输出:V1 → 执行器+,COM → 执行器-│ │
│ │ 电流输出:I1 → 执行器+,COM → 执行器-│ │
│ └──────────────────────────────────┘ │
│ │
│ 缓冲存储器配置(TO指令): │
│ ┌────────────────────────────────────────────────────┐ │
│ │ BFM# │ 功能说明 │ │
│ ├─────────┼───────────────────────────────────────┤ │
│ │ #0 │ 通道1输出值(0~4000) │ │
│ │ #1 │ 通道2输出值 │ │
│ │ #2 │ 通道3输出值 │ │
│ │ #3 │ 通道4输出值 │ │
│ │ #17 │ 输出模式设置 │ │
│ │ #19 │ 输出保持/清零设置 │ │
│ └─────────┴───────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘3. 工程量到输出值转换
3.1 转换公式
工程量到输出值转换公式:
┌─────────────────────────────────────────────────────────────┐
│ │
│ (EngValue - EngMin) │
│ RawValue = ──────────────────────── × (RawMax - RawMin) + RawMin
│ (EngMax - EngMin) │
│ │
│ 参数说明: │
│ ├─EngValue: 工程量设定值(如速度50%) │
│ ├─EngMin: 工程量下限(如0%) │
│ ├─EngMax: 工程量上限(如100%) │
│ ├─RawMin: 原始值下限(如0) │
│ ├─RawMax: 原始值上限(如27648) │
│ └─RawValue: 输出到模块的原始值 │
│ │
│ 简化公式(当EngMin=0, RawMin=0时): │
│ │
│ RawValue = EngValue / EngMax × RawMax │
│ │
│ 示例:输出50%控制量 │
│ RawValue = 50 / 100 × 27648 = 13824 │
│ │
└─────────────────────────────────────────────────────────────┘3.2 西门子输出转换程序
方法1:使用NORM_X和SCALE_X指令
pascal
// 西门子S7-1200 输出量转换
// 工程量 → 标准化 → 原始值
VAR
Speed_Percent : REAL := 50.0; // 速度设定(%)
Speed_Norm : REAL; // 标准化值
Speed_Output : INT; // 输出原始值
END_VAR
// 步骤1:标准化(0~100% → 0.0~1.0)
Speed_Norm := NORM_X(
MIN := 0.0,
VALUE := Speed_Percent,
MAX := 100.0
);
// 步骤2:缩放到原始值(0.0~1.0 → 0~27648)
Speed_Output := REAL_TO_INT(SCALE_X(
MIN := 0.0,
VALUE := Speed_Norm,
MAX := 27648.0
));
// 输出到模拟量模块
%QW96 := Speed_Output;方法2:直接计算
pascal
// 直接计算方式
VAR
SetValue : REAL := 75.0; // 设定值(%)
Output_Raw : INT; // 输出原始值
// 参数定义
Eng_Min : REAL := 0.0;
Eng_Max : REAL := 100.0;
Raw_Min : INT := 0;
Raw_Max : INT := 27648;
END_VAR
// 工程量到原始值转换
Output_Raw := REAL_TO_INT(
(SetValue - Eng_Min) / (Eng_Max - Eng_Min) *
INT_TO_REAL(Raw_Max - Raw_Min) + INT_TO_REAL(Raw_Min)
);
// 计算过程:
// (75.0 - 0) / (100.0 - 0) × (27648 - 0) + 0
// = 0.75 × 27648
// = 207363.3 三菱输出转换程序
三菱FX工程量到输出值转换:
┌─────────────────────────────────────────────────────────────┐
│ │
│ // 假设:D300为设定值(0~100%),输出到4DA模块(0~4000) │
│ │
│ 方法1:整数运算 │
│ ┌────────────────────────────────────────────────────┐ │
│ │ LD M8000 │ │
│ │ MUL D300 K4000 D310 // 设定值×4000 │ │
│ │ DIV D310 K100 D320 // 结果÷100 │ │
│ │ // D320为输出原始值 │ │
│ │ │ │
│ │ // 写入4DA模块(假设为0号模块) │ │
│ │ TO K0 K0 D320 K1 // 写入通道1输出值 │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ 方法2:带小数精度 │
│ ┌────────────────────────────────────────────────────┐ │
│ │ // 假设D300为带1位小数的设定值(如505=50.5%) │ │
│ │ LD M8000 │ │
│ │ MUL D300 K4000 D310 // 设定值×4000 │ │
│ │ DIV D310 K1000 D320 // 结果÷1000 │ │
│ │ // D320为输出值 │ │
│ │ TO K0 K0 D320 K1 // 写入模块 │ │
│ └────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘【阶段总结1】 到目前为止,已介绍:
- 模拟量输出模块的选型要点
- 电压输出和电流输出的区别和应用
- 西门子SM1232和三菱FX3U-4DA的接线配置
- 工程量到输出值的转换公式和程序实现
继续填充输出限幅和斜坡函数:
4. 输出限幅处理
4.1 为什么需要限幅?
输出限幅的必要性:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 1. 保护执行器 │
│ └─防止过大的输出值损坏执行器 │
│ │
│ 2. 安全考虑 │
│ └─限制最大速度/功率,防止事故 │
│ │
│ 3. 工艺要求 │
│ └─某些工艺对输出范围有严格限制 │
│ │
│ 4. 设备保护 │
│ └─启动阶段限制输出,保护机械部件 │
│ │
│ 限幅示意图: │
│ │
│ 输出值 │
│ ↑ ┌─────────── 高限(如90%) │
│ │ ╱─────────┘ │
│ │ ╱ │
│ │ ╱ │
│ │ ╱ │
│ │╱─────────────────────────── 低限(如10%) │
│ └────────────────────────────→ 设定值 │
│ │
└─────────────────────────────────────────────────────────────┘4.2 限幅功能块
pascal
// 输出限幅功能块
FUNCTION_BLOCK "FB_Limiter"
VERSION : 0.1
VAR_INPUT
InputValue : REAL; // 输入值
HighLimit : REAL; // 高限
LowLimit : REAL; // 低限
Enable : BOOL; // 使能
END_VAR
VAR_OUTPUT
OutputValue : REAL; // 限幅后输出
AtHighLimit : BOOL; // 达到高限
AtLowLimit : BOOL; // 达到低限
END_VAR
BEGIN
IF #Enable THEN
// 高限判断
IF #InputValue >= #HighLimit THEN
#OutputValue := #HighLimit;
#AtHighLimit := TRUE;
#AtLowLimit := FALSE;
// 低限判断
ELSIF #InputValue <= #LowLimit THEN
#OutputValue := #LowLimit;
#AtHighLimit := FALSE;
#AtLowLimit := TRUE;
// 正常范围
ELSE
#OutputValue := #InputValue;
#AtHighLimit := FALSE;
#AtLowLimit := FALSE;
END_IF;
ELSE
#OutputValue := 0.0;
#AtHighLimit := FALSE;
#AtLowLimit := FALSE;
END_IF;
END_FUNCTION_BLOCK4.3 死区处理
pascal
// 带死区的输出处理
// 当输出值在死区范围内时,输出为0
FUNCTION_BLOCK "FB_DeadBand"
VERSION : 0.1
VAR_INPUT
InputValue : REAL; // 输入值
DeadBand : REAL; // 死区宽度(±)
Enable : BOOL; // 使能
END_VAR
VAR_OUTPUT
OutputValue : REAL; // 处理后输出
END_VAR
BEGIN
IF #Enable THEN
IF ABS(#InputValue) <= #DeadBand THEN
// 在死区内,输出为0
#OutputValue := 0.0;
ELSIF #InputValue > #DeadBand THEN
// 正向输出,减去死区偏移
#OutputValue := #InputValue - #DeadBand;
ELSE
// 负向输出,加上死区偏移
#OutputValue := #InputValue + #DeadBand;
END_IF;
ELSE
#OutputValue := 0.0;
END_IF;
END_FUNCTION_BLOCK
// 死区处理示意:
// 输入:-5 ~ +5 为死区
// 输入10 → 输出5(10-5)
// 输入3 → 输出0(在死区内)
// 输入-8 → 输出-3(-8+5)5. 斜坡函数(Ramp)
5.1 斜坡函数的作用
斜坡函数应用场景:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 无斜坡(阶跃输出): 有斜坡(渐变输出): │
│ │
│ 输出 输出 │
│ ↑ ┌─────── ↑ ╱───── │
│ │ │ │ ╱ │
│ │ │ │ ╱ │
│ │ │ │ ╱ │
│ └───┴───────→时间 └────────────→时间 │
│ │
│ 问题: 优点: │
│ • 机械冲击大 • 平滑过渡 │
│ • 电流冲击大 • 减少冲击 │
│ • 可能损坏设备 • 延长设备寿命 │
│ │
│ 典型应用: │
│ 1. 变频器启动/停止 3. 阀门开关控制 │
│ 2. 伺服电机速度变化 4. 温度设定变化 │
│ │
└─────────────────────────────────────────────────────────────┘5.2 斜坡函数功能块
pascal
// 斜坡函数功能块
FUNCTION_BLOCK "FB_Ramp"
VERSION : 0.1
VAR_INPUT
SetValue : REAL; // 目标设定值
RampUpRate : REAL; // 上升速率(单位/秒)
RampDownRate: REAL; // 下降速率(单位/秒)
CycleTime : REAL; // 调用周期(秒)
Enable : BOOL; // 使能
Reset : BOOL; // 复位
END_VAR
VAR_OUTPUT
OutputValue : REAL; // 当前输出值
RampDone : BOOL; // 斜坡完成标志
END_VAR
VAR
CurrentValue: REAL := 0.0; // 当前值
Increment : REAL; // 每周期增量
END_VAR
BEGIN
IF #Reset THEN
#CurrentValue := 0.0;
#OutputValue := 0.0;
#RampDone := FALSE;
ELSIF #Enable THEN
// 判断是上升还是下降
IF #CurrentValue < #SetValue THEN
// 需要上升
#Increment := #RampUpRate * #CycleTime;
#CurrentValue := #CurrentValue + #Increment;
// 检查是否超过目标值
IF #CurrentValue >= #SetValue THEN
#CurrentValue := #SetValue;
#RampDone := TRUE;
ELSE
#RampDone := FALSE;
END_IF;
ELSIF #CurrentValue > #SetValue THEN
// 需要下降
#Increment := #RampDownRate * #CycleTime;
#CurrentValue := #CurrentValue - #Increment;
// 检查是否低于目标值
IF #CurrentValue <= #SetValue THEN
#CurrentValue := #SetValue;
#RampDone := TRUE;
ELSE
#RampDone := FALSE;
END_IF;
ELSE
// 已到达目标值
#RampDone := TRUE;
END_IF;
#OutputValue := #CurrentValue;
ELSE
#OutputValue := #CurrentValue;
END_IF;
END_FUNCTION_BLOCK5.3 斜坡函数调用示例
pascal
// 斜坡函数调用示例
// 场景:变频器速度控制,10秒从0加速到100%
VAR
Speed_Target : REAL := 100.0; // 目标速度(%)
Speed_Current : REAL; // 当前速度
Ramp_Done : BOOL; // 斜坡完成
// 斜坡功能块实例
FB_SpeedRamp : "FB_Ramp";
END_VAR
// 调用斜坡功能块
// 假设在OB35中调用,周期100ms = 0.1秒
FB_SpeedRamp(
SetValue := Speed_Target,
RampUpRate := 10.0, // 10%/秒,10秒到达100%
RampDownRate := 20.0, // 20%/秒,5秒降到0
CycleTime := 0.1, // 100ms调用周期
Enable := TRUE,
Reset := FALSE,
OutputValue => Speed_Current,
RampDone => Ramp_Done
);
// 斜坡过程(上升):
// 时间(s) 输出(%)
// 0 0
// 1 10
// 2 20
// ...
// 10 1005.4 S曲线加减速
pascal
// S曲线斜坡(更平滑的加减速)
// 使用正弦函数实现S形曲线
FUNCTION_BLOCK "FB_SCurveRamp"
VERSION : 0.1
VAR_INPUT
SetValue : REAL; // 目标值
TotalTime : REAL; // 总时间(秒)
Enable : BOOL; // 使能
Reset : BOOL; // 复位
END_VAR
VAR_OUTPUT
OutputValue : REAL; // 输出值
Done : BOOL; // 完成标志
END_VAR
VAR
StartValue : REAL; // 起始值
ElapsedTime : REAL; // 已用时间
Progress : REAL; // 进度(0~1)
Initialized : BOOL; // 初始化标志
END_VAR
CONST
PI : REAL := 3.14159265;
END_CONST
BEGIN
IF #Reset THEN
#ElapsedTime := 0.0;
#Initialized := FALSE;
#Done := FALSE;
ELSIF #Enable THEN
// 首次运行初始化
IF NOT #Initialized THEN
#StartValue := #OutputValue;
#ElapsedTime := 0.0;
#Initialized := TRUE;
END_IF;
// 累加时间(假设100ms调用周期)
#ElapsedTime := #ElapsedTime + 0.1;
IF #ElapsedTime >= #TotalTime THEN
#OutputValue := #SetValue;
#Done := TRUE;
ELSE
// S曲线计算
// 公式:y = (1 - cos(π × t/T)) / 2
#Progress := (1.0 - COS(#PI * #ElapsedTime / #TotalTime)) / 2.0;
#OutputValue := #StartValue + (#SetValue - #StartValue) * #Progress;
#Done := FALSE;
END_IF;
END_IF;
END_FUNCTION_BLOCK
// S曲线与线性斜坡对比:
// 线性斜坡 S曲线斜坡
// 时间 输出 输出
// 0% 0% 0%
// 25% 25% 14.6% (慢速启动)
// 50% 50% 50%
// 75% 75% 85.4% (慢速停止)
// 100% 100% 100%【阶段总结2】 已介绍:
- 输出限幅的必要性和实现方法
- 死区处理功能块
- 斜坡函数的作用和应用场景
- 线性斜坡功能块实现
- S曲线加减速的原理和实现
继续填充变频器控制实例:
6. 应用实例:变频器模拟量控制
6.1 系统需求
变频器模拟量控制系统需求:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 项目:水泵变频调速系统 │
│ │
│ 变频器:西门子G120C(或通用型) │
│ 控制信号:0-10V模拟量(对应0-50Hz) │
│ 反馈信号:4-20mA模拟量(实际频率反馈) │
│ │
│ 功能要求: │
│ 1. HMI设定目标频率(0~50Hz) │
│ 2. 启动时10秒斜坡加速 │
│ 3. 停止时5秒斜坡减速 │
│ 4. 速度输出限幅(5~48Hz) │
│ 5. 运行状态监控 │
│ 6. 故障报警处理 │
│ │
│ 硬件配置: │
│ ├─PLC:西门子S7-1200 CPU1214C │
│ ├─输出模块:SM1232 AO 2通道 │
│ ├─输入模块:SM1231 AI 4通道 │
│ └─变频器:西门子G120C │
│ │
└─────────────────────────────────────────────────────────────┘6.2 系统架构
变频器控制系统架构:
┌─────────────────────────────────────────────────────────────┐
│ │
│ HMI设定 ──→ PLC处理 ──→ 模拟量输出 ──→ 变频器 ──→ 电机 │
│ │ │ │ │ │ │
│ 频率设定 斜坡处理 0-10V 速度控制 水泵运行│
│ │ 限幅处理 │ │
│ │ │ │
│ └────────────────────────────────────←┘ │
│ 频率反馈(4-20mA) │
│ │
│ 详细信号流: │
│ ┌─────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌─────┐ │
│ │ HMI │──→│ 斜坡 │──→│ 限幅 │──→│ 转换 │──→│SM1232│ │
│ │ │ │ 函数 │ │ 处理 │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ AO │ │
│ └─────┘ └───────┘ └───────┘ └───────┘ └──┬──┘ │
│ │ │ │
│ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───┴───┐ │
│ │ │ 显示 │←──│ 转换 │←──│ 读取 │←──│ 变频器 │ │
│ └───→│ 反馈 │ │ │ │ 反馈 │ │ G120C │ │
│ └───────┘ └───────┘ └───────┘ └───────┘ │
│ │
└─────────────────────────────────────────────────────────────┘6.3 数据块定义
pascal
// 数据块:DB_VFD_Control(变频器控制)
DATA_BLOCK "DB_VFD_Control"
VERSION : 0.1
STRUCT
// 命令与状态
CMD_Start : BOOL; // 启动命令
CMD_Stop : BOOL; // 停止命令
CMD_Reset : BOOL; // 故障复位
STS_Running : BOOL; // 运行状态
STS_Fault : BOOL; // 故障状态
STS_AtSpeed : BOOL; // 到达设定速度
// 频率设定与反馈
SP_Frequency : REAL := 0.0; // 设定频率(Hz)
PV_Frequency : REAL; // 反馈频率(Hz)
Freq_Error : REAL; // 频率偏差
// 斜坡参数
Ramp_UpTime : REAL := 10.0; // 加速时间(秒)
Ramp_DownTime : REAL := 5.0; // 减速时间(秒)
Ramp_Output : REAL; // 斜坡输出
Ramp_Done : BOOL; // 斜坡完成
// 限幅参数
Limit_High : REAL := 48.0; // 频率上限(Hz)
Limit_Low : REAL := 5.0; // 频率下限(Hz)
Limit_Output : REAL; // 限幅后输出
// 输出值
AO_Raw : INT; // 模拟量输出原始值
AI_Raw : INT; // 模拟量输入原始值
// 报警
ALM_OverSpeed : BOOL; // 超速报警
ALM_CommFault : BOOL; // 通信故障
END_STRUCT;
END_DATA_BLOCK6.4 完整控制程序
pascal
// OB1 - 变频器控制主程序
ORGANIZATION_BLOCK "VFD_Control_Main"
VERSION : 0.1
VAR_TEMP
temp_SetValue : REAL;
temp_RampOut : REAL;
temp_Output : INT;
END_VAR
BEGIN
// ========================================
// 变频器模拟量控制程序
// ========================================
// 1. 读取反馈(4-20mA → 0~50Hz)
"DB_VFD_Control".AI_Raw := %IW64;
// 转换为频率(假设0~27648对应0~50Hz)
IF "DB_VFD_Control".AI_Raw >= 0 AND "DB_VFD_Control".AI_Raw <= 28000 THEN
"DB_VFD_Control".PV_Frequency :=
INT_TO_REAL("DB_VFD_Control".AI_Raw) / 27648.0 * 50.0;
"DB_VFD_Control".ALM_CommFault := FALSE;
ELSE
"DB_VFD_Control".ALM_CommFault := TRUE;
END_IF;
// 2. 确定目标设定值
IF "DB_VFD_Control".CMD_Start AND NOT "DB_VFD_Control".CMD_Stop THEN
#temp_SetValue := "DB_VFD_Control".SP_Frequency;
"DB_VFD_Control".STS_Running := TRUE;
ELSE
#temp_SetValue := 0.0;
"DB_VFD_Control".STS_Running := FALSE;
END_IF;
// 3. 斜坡处理
"FB_VFD_Ramp_Instance"(
SetValue := #temp_SetValue,
RampUpRate := 50.0 / "DB_VFD_Control".Ramp_UpTime, // 速率=量程/时间
RampDownRate := 50.0 / "DB_VFD_Control".Ramp_DownTime,
CycleTime := 0.1, // 100ms周期(OB35调用)
Enable := TRUE,
Reset := "DB_VFD_Control".CMD_Reset,
OutputValue => "DB_VFD_Control".Ramp_Output,
RampDone => "DB_VFD_Control".Ramp_Done
);
// 4. 限幅处理
#temp_RampOut := "DB_VFD_Control".Ramp_Output;
// 只有在运行且输出大于0时才限幅
IF #temp_RampOut > 0.0 THEN
// 低限
IF #temp_RampOut < "DB_VFD_Control".Limit_Low THEN
"DB_VFD_Control".Limit_Output := "DB_VFD_Control".Limit_Low;
// 高限
ELSIF #temp_RampOut > "DB_VFD_Control".Limit_High THEN
"DB_VFD_Control".Limit_Output := "DB_VFD_Control".Limit_High;
"DB_VFD_Control".ALM_OverSpeed := TRUE;
ELSE
"DB_VFD_Control".Limit_Output := #temp_RampOut;
"DB_VFD_Control".ALM_OverSpeed := FALSE;
END_IF;
ELSE
"DB_VFD_Control".Limit_Output := 0.0;
END_IF;
// 5. 转换为模拟量输出(0~50Hz → 0~27648)
#temp_Output := REAL_TO_INT(
"DB_VFD_Control".Limit_Output / 50.0 * 27648.0
);
// 输出范围保护
IF #temp_Output < 0 THEN
#temp_Output := 0;
ELSIF #temp_Output > 27648 THEN
#temp_Output := 27648;
END_IF;
"DB_VFD_Control".AO_Raw := #temp_Output;
// 6. 输出到模拟量模块
%QW96 := "DB_VFD_Control".AO_Raw;
// 7. 到速判断(误差<1Hz认为到速)
"DB_VFD_Control".Freq_Error :=
ABS("DB_VFD_Control".SP_Frequency - "DB_VFD_Control".PV_Frequency);
IF "DB_VFD_Control".Freq_Error < 1.0 AND "DB_VFD_Control".STS_Running THEN
"DB_VFD_Control".STS_AtSpeed := TRUE;
ELSE
"DB_VFD_Control".STS_AtSpeed := FALSE;
END_IF;
// 8. 故障综合
"DB_VFD_Control".STS_Fault :=
"DB_VFD_Control".ALM_OverSpeed OR
"DB_VFD_Control".ALM_CommFault;
END_ORGANIZATION_BLOCK6.5 三菱实现版本
三菱FX变频器控制程序:
┌─────────────────────────────────────────────────────────────┐
│ │
│ // 变量说明: │
│ // D0 = 频率设定值(0~500,代表0~50.0Hz) │
│ // D10 = 斜坡输出值 │
│ // D20 = 限幅后输出 │
│ // D30 = 模拟量输出值(0~4000) │
│ // D100 = 频率反馈值 │
│ // M0 = 启动命令 │
│ // M1 = 停止命令 │
│ // M10 = 运行状态 │
│ │
│ // ============================================ │
│ // 1. 读取频率反馈 │
│ // ============================================ │
│ LD M8000 │
│ FROM K0 K0 D100 K1 // 读取AI模块通道1 │
│ // D100为原始值(0~4000) │
│ │
│ // 转换为频率值(×10倍,如500=50.0Hz) │
│ MUL D100 K500 D102 // ×500 │
│ DIV D102 K4000 D104 // ÷4000,D104为反馈频率×10 │
│ │
│ // ============================================ │
│ // 2. 斜坡处理 │
│ // ============================================ │
│ // 启动时加速 │
│ LD M0 // 启动命令 │
│ ANI M1 // 非停止 │
│ OUT M10 // 运行状态 │
│ │
│ // 设定值处理 │
│ LD M10 │
│ MOV D0 D2 // 运行时使用设定值 │
│ LDI M10 │
│ MOV K0 D2 // 停止时目标为0 │
│ │
│ // 斜坡上升(每100ms执行一次,加速时间10秒) │
│ // 增量 = 500 / (10s / 0.1s) = 5 │
│ LD M8013 // 100ms时钟 │
│ AND D10 < D2 // 当前值<设定值 │
│ ADD D10 K5 D10 // 递增 │
│ LD D10 > D2 // 超过设定值 │
│ MOV D2 D10 // 限制为设定值 │
│ │
│ // 斜坡下降(减速时间5秒) │
│ // 增量 = 500 / (5s / 0.1s) = 10 │
│ LD M8013 │
│ AND D10 > D2 │
│ SUB D10 K10 D10 // 递减 │
│ LD D10 < K0 // 小于0 │
│ MOV K0 D10 // 限制为0 │
│ │
│ // ============================================ │
│ // 3. 限幅处理(5~48Hz,即50~480) │
│ // ============================================ │
│ LD M8000 │
│ MOV D10 D20 // 复制斜坡输出 │
│ LD D20 > K0 // 输出>0时限幅 │
│ AND D20 < K50 │
│ MOV K50 D20 // 低限50(5Hz) │
│ LD D20 > K480 │
│ MOV K480 D20 // 高限480(48Hz) │
│ │
│ // ============================================ │
│ // 4. 转换并输出到DA模块 │
│ // ============================================ │
│ // D20(0~500)→ D30(0~4000) │
│ MUL D20 K4000 D32 // ×4000 │
│ DIV D32 K500 D30 // ÷500 │
│ TO K1 K0 D30 K1 // 输出到1号DA模块通道1 │
│ │
└─────────────────────────────────────────────────────────────┘【阶段总结3】 本文件已全部完成,总结如下:
- 模拟量输出模块选型和接线配置
- 工程量到输出值的转换方法
- 限幅和死区处理功能块
- 斜坡函数和S曲线加减速实现
- 变频器模拟量控制完整实例(西门子和三菱版本)
本节小结
模拟量输出控制知识要点:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 模块选型 接线配置 转换计算 │
│ ├─电压/电流 ├─正确极性 ├─线性公式 │
│ ├─通道数量 ├─负载匹配 ├─NORM/SCALE │
│ └─分辨率精度 └─屏蔽接地 └─范围保护 │
│ │
│ 限幅处理 斜坡函数 实际应用 │
│ ├─安全保护 ├─减少冲击 ├─变频器控制 │
│ ├─工艺要求 ├─平滑过渡 ├─阀门控制 │
│ └─死区处理 └─S曲线 └─调节系统 │
│ │
│ 编程要点: │
│ 1. 输出前必须进行范围限制,防止超量程 │
│ 2. 斜坡函数可有效保护机械设备 │
│ 3. 工程量转换要考虑精度损失 │
│ 4. 完善的状态反馈确保控制可靠性 │
│ │
└─────────────────────────────────────────────────────────────┘练习题
基础题
- 模拟量输出模块电压输出和电流输出各有什么特点?
- 斜坡函数在变频器控制中有什么作用?
- 为什么需要对模拟量输出进行限幅处理?
编程题
- 编写一个工程量到输出值转换功能块,实现0-100%到0-27648的转换
- 设计一个带上下限限幅的输出功能块
- 实现一个可设定加减速时间的斜坡函数
设计题
- 设计一个阀门控制程序,要求:
- 0-100%控制信号对应0-10V输出
- 开阀时间20秒,关阀时间10秒
- 包含手动/自动切换功能
思考题
- 斜坡函数的时间参数如何确定?有哪些影响因素?
- S曲线加减速相比线性斜坡有什么优势?
- 如何检测模拟量输出是否正常工作?
拓展阅读
- 西门子S7-1200编程手册:模拟量输出
- 变频器通信与控制技术
- 过程控制系统设计
- PID控制与调节技术
本节完