Skip to content

5.3 模拟量输出控制

本节将介绍模拟量输出的控制方法,掌握从控制指令到执行器动作的完整实现

学习目标

  • 掌握模拟量输出模块的选型与配置
  • 理解工程量到输出值的转换方法
  • 学会输出限幅和斜坡控制技术
  • 能够实现变频器的模拟量控制

1. 模拟量输出模块选型

1.1 选型考虑因素

模拟量输出模块选型要点:
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  执行器类型 → 输出信号类型 → 通道数量 → 精度要求 → 选型     │
│      │              │            │          │              │
│   变频器         电压/电流      预留余量    分辨率         │
│   阀门                                     响应速度        │
│   调节器                                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 输出信号类型对比

输出类型范围负载能力典型应用
电压输出0-10V、±10V1kΩ以上变频器、伺服
电流输出4-20mA、0-20mA600Ω以下阀门、远程控制

1.3 常用模拟量输出模块

西门子系列:

型号通道分辨率信号类型特点
SM1232 AO 2x14位214位V/I经济型
SM1232 AO 4x14位414位V/I多通道
SM1234 AI/AO4AI+2AO14位V/I混合型

三菱系列:

型号通道分辨率信号类型特点
FX3U-4DA412位V/I标准型
FX3U-4DA-ADP412位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
// = 20736

3.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】 到目前为止,已介绍:

  1. 模拟量输出模块的选型要点
  2. 电压输出和电流输出的区别和应用
  3. 西门子SM1232和三菱FX3U-4DA的接线配置
  4. 工程量到输出值的转换公式和程序实现

继续填充输出限幅和斜坡函数:


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_BLOCK

4.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_BLOCK

5.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      100

5.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】 已介绍:

  1. 输出限幅的必要性和实现方法
  2. 死区处理功能块
  3. 斜坡函数的作用和应用场景
  4. 线性斜坡功能块实现
  5. 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_BLOCK

6.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_BLOCK

6.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】 本文件已全部完成,总结如下:

  1. 模拟量输出模块选型和接线配置
  2. 工程量到输出值的转换方法
  3. 限幅和死区处理功能块
  4. 斜坡函数和S曲线加减速实现
  5. 变频器模拟量控制完整实例(西门子和三菱版本)

本节小结

模拟量输出控制知识要点:
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  模块选型          接线配置          转换计算               │
│  ├─电压/电流       ├─正确极性        ├─线性公式            │
│  ├─通道数量        ├─负载匹配        ├─NORM/SCALE         │
│  └─分辨率精度      └─屏蔽接地        └─范围保护            │
│                                                             │
│  限幅处理          斜坡函数          实际应用               │
│  ├─安全保护        ├─减少冲击        ├─变频器控制          │
│  ├─工艺要求        ├─平滑过渡        ├─阀门控制            │
│  └─死区处理        └─S曲线          └─调节系统            │
│                                                             │
│  编程要点:                                                  │
│  1. 输出前必须进行范围限制,防止超量程                      │
│  2. 斜坡函数可有效保护机械设备                              │
│  3. 工程量转换要考虑精度损失                                │
│  4. 完善的状态反馈确保控制可靠性                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

练习题

基础题

  1. 模拟量输出模块电压输出和电流输出各有什么特点?
  2. 斜坡函数在变频器控制中有什么作用?
  3. 为什么需要对模拟量输出进行限幅处理?

编程题

  1. 编写一个工程量到输出值转换功能块,实现0-100%到0-27648的转换
  2. 设计一个带上下限限幅的输出功能块
  3. 实现一个可设定加减速时间的斜坡函数

设计题

  1. 设计一个阀门控制程序,要求:
    • 0-100%控制信号对应0-10V输出
    • 开阀时间20秒,关阀时间10秒
    • 包含手动/自动切换功能

思考题

  1. 斜坡函数的时间参数如何确定?有哪些影响因素?
  2. S曲线加减速相比线性斜坡有什么优势?
  3. 如何检测模拟量输出是否正常工作?

拓展阅读

  • 西门子S7-1200编程手册:模拟量输出
  • 变频器通信与控制技术
  • 过程控制系统设计
  • PID控制与调节技术

本节完

本教程由 AI (Claude Opus 4.5) 生成,仅供学习参考