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

西驰电气专营    

变频器、软启动器

新闻分类
  • 暂无分类
站内搜索
 
首页 > 新闻中心 > 用PLC写过模糊控制代替PID控制温度的程序吗?
新闻中心
用PLC写过模糊控制代替PID控制温度的程序吗?
发布时间:2026-01-21        浏览次数:5        返回列表

如何用 PLC 编写模糊控制程序来替代传统 PID 控制实现温度调节,这是工业控制中很常见的优化需求,我可以给你提供完整的实现思路和 PLC 程序框架。

一、模糊控制替代 PID 控温的核心思路

温度控制中,模糊控制不需要精确的数学模型,更适合非线性、大滞后的温度系统(比如烘箱、反应釜)。核心步骤如下:

  1. 确定输入输出变量

    • 输入:温度偏差 E(设定值 - 实际值)、偏差变化率 EC(当前偏差 - 上一周期偏差);

    • 输出:执行器输出增量 ΔU(比如调节阀开度、加热功率)。

  2. 模糊化:将精确的 E、EC、ΔU 映射到模糊集合(负大 NB、负中 NM、负小 NS、零 ZO、正小 PS、正中 PM、正大 PB);

  3. 制定模糊规则:根据工艺经验制定 if-then 规则(比如 “若 E 为 PB 且 EC 为 ZO,则 ΔU 为 PB”);

  4. 模糊推理:根据输入的模糊值匹配规则,得到输出的模糊集合;

  5. 解模糊:将模糊输出转换为精确的执行器控制量(常用重心法);

  6. PLC 程序实现:通过数据处理、查表、运算完成上述过程。

二、PLC 模糊控制温度程序(以西门子 S7-1200/1500 为例)

以下是结构化的 ST 语言程序框架,可直接适配西门子 PLC,其他品牌(三菱、罗克韦尔)可参考逻辑修改。

1. 变量定义(DB 块:DB_TempFuzzy)

st

// 温度模糊控制数据块
DATA_BLOCK DB_TempFuzzy
VAR_GLOBAL
    // 温度参数
    SetTemp: REAL := 80.0;        // 温度设定值(℃)
    ActualTemp: REAL := 0.0;      // 实际温度(℃,来自温度传感器)
    // 输入变量
    E: REAL := 0.0;               // 温度偏差 E=SetTemp-ActualTemp
    EC: REAL := 0.0;              // 偏差变化率 EC=E-E_Last
    E_Last: REAL := 0.0;          // 上一周期偏差
    // 模糊化参数
    E_Scale: REAL := 0.1;         // E的量化因子(根据实际量程调整,比如量程±50℃则0.1)
    EC_Scale: REAL := 0.2;        // EC的量化因子(量程±5℃/s则0.2)
    U_Scale: REAL := 5.0;         // 输出比例因子(对应执行器0-100%)
    // 模糊集合论域(-3~3,7个等级)
    E_Fuzzy: INT := 0;            // E的模糊化结果
    EC_Fuzzy: INT := 0;           // EC的模糊化结果
    U_Fuzzy: INT := 0;            // 输出模糊结果
    // 输出控制量
    Output_U: REAL := 0.0;        // 最终执行器输出(0-100%)
    Output_U_Last: REAL := 0.0;   // 上一周期输出
END_VAR
END_DATA_BLOCK

2. 模糊化子程序(FC100: Fuzzy_Input)

st

FUNCTION_BLOCK FC100
VAR_INPUT
    In_Value: REAL;       // 输入精确值
    Scale: REAL;          // 量化因子
END_VAR
VAR_OUTPUT
    Fuzzy_Out: INT;       // 模糊化结果(-3~3)
END_VAR
VAR
    Temp: REAL := 0.0;
END_VAR
// 步骤1:量化(将实际值转换到论域-3~3)
Temp := In_Value * Scale;
// 步骤2:限幅+取整(模糊化)
IF Temp > 3.0 THEN
    Fuzzy_Out := 3;
ELSIF Temp < -3.0 THEN
    Fuzzy_Out := -3;
ELSE
    Fuzzy_Out := INT(Temp + 0.5); // 四舍五入
END_IF;
END_FUNCTION_BLOCK

3. 模糊规则表与推理子程序(FC101: Fuzzy_Inference)

st

FUNCTION_BLOCK FC101
VAR_INPUT
    E_Fuzzy: INT;         // 偏差模糊值(-3~3)
    EC_Fuzzy: INT;        // 偏差变化率模糊值(-3~3)
END_VAR
VAR_OUTPUT
    U_Fuzzy: INT;         // 输出模糊值(-3~3)
END_VAR
VAR
    // 模糊规则表(7x7,行=E_Fuzzy(+3~-3),列=EC_Fuzzy(+3~-3))
    // NB(-3),NM(-2),NS(-1),ZO(0),PS(1),PM(2),PB(3)
    Rule_Table: ARRAY[-3..3, -3..3] OF INT := [
        [3,3,2,2,1,0,0],  // E=PB(3)
        [3,2,2,1,1,0,-1], // E=PM(2)
        [2,2,1,1,0,-1,-2],// E=PS(1)
        [2,1,0,0,-1,-2,-2],// E=ZO(0)
        [1,1,0,-1,-1,-2,-3],// E=NS(-1)
        [1,0,-1,-1,-2,-2,-3],// E=NM(-2)
        [0,0,-1,-2,-2,-3,-3] // E=NB(-3)
    ];
END_VAR
// 模糊推理:直接查表获取输出模糊值
U_Fuzzy := Rule_Table[E_Fuzzy, EC_Fuzzy];
END_FUNCTION_BLOCK

4. 解模糊与输出子程序(FC102: Fuzzy_Output)

st

FUNCTION_BLOCK FC102
VAR_INPUT
    U_Fuzzy: INT;         // 模糊输出值(-3~3)
    U_Scale: REAL;        // 输出比例因子
END_VAR
VAR_OUTPUT
    Out_Value: REAL;      // 解模糊后的精确输出
END_VAR
// 重心法解模糊(简化版,直接线性转换)
Out_Value := REAL(U_Fuzzy) * U_Scale;
// 限幅(执行器输出0-100%)
IF Out_Value > 100.0 THEN
    Out_Value := 100.0;
ELSIF Out_Value < 0.0 THEN
    Out_Value := 0.0;
END_IF;
END_FUNCTION_BLOCK

5. 主控制程序(OB35: 周期中断,建议 1s 执行一次)

st

ORGANIZATION_BLOCK OB35
VAR
    fc100: FC100;
    fc101: FC101;
    fc102: FC102;
END_VAR
// 步骤1:读取实际温度(假设AI模块地址为PIW256,转换为℃)
DB_TempFuzzy.ActualTemp := REAL(PIW256) / 27648.0 * 100.0; // 假设量程0-100℃

// 步骤2:计算偏差E和偏差变化率EC
DB_TempFuzzy.E := DB_TempFuzzy.SetTemp - DB_TempFuzzy.ActualTemp;
DB_TempFuzzy.EC := DB_TempFuzzy.E - DB_TempFuzzy.E_Last;

// 步骤3:输入模糊化
DB_TempFuzzy.E_Fuzzy := fc100(In_Value:=DB_TempFuzzy.E, Scale:=DB_TempFuzzy.E_Scale);
DB_TempFuzzy.EC_Fuzzy := fc100(In_Value:=DB_TempFuzzy.EC, Scale:=DB_TempFuzzy.EC_Scale);

// 步骤4:模糊推理
DB_TempFuzzy.U_Fuzzy := fc101(E_Fuzzy:=DB_TempFuzzy.E_Fuzzy, EC_Fuzzy:=DB_TempFuzzy.EC_Fuzzy);

// 步骤5:解模糊得到输出
DB_TempFuzzy.Output_U := fc102(U_Fuzzy:=DB_TempFuzzy.U_Fuzzy, U_Scale:=DB_TempFuzzy.U_Scale);

// 步骤6:输出执行(叠加到上一周期输出,避免突变)
DB_TempFuzzy.Output_U := DB_TempFuzzy.Output_U_Last + DB_TempFuzzy.Output_U * 0.1; // 平滑系数0.1
// 限幅
IF DB_TempFuzzy.Output_U > 100.0 THEN DB_TempFuzzy.Output_U := 100.0; END_IF;
IF DB_TempFuzzy.Output_U < 0.0 THEN DB_TempFuzzy.Output_U := 0.0; END_IF;

// 步骤7:写入执行器(假设AO模块地址为PQW272)
PQW272 := INT(DB_TempFuzzy.Output_U / 100.0 * 27648.0);

// 步骤8:保存上一周期数据
DB_TempFuzzy.E_Last := DB_TempFuzzy.E;
DB_TempFuzzy.Output_U_Last := DB_TempFuzzy.Output_U;
END_ORGANIZATION_BLOCK

三、关键参数调试说明

  1. 量化 / 比例因子(E_Scale、EC_Scale、U_Scale)

    • E_Scale:根据温度偏差范围调整,比如系统最大偏差 ±50℃,要映射到论域 ±3,则 E_Scale=3/50=0.06;

    • EC_Scale:根据偏差变化率范围调整,比如最大变化率 ±5℃/s,EC_Scale=3/5=0.6;

    • U_Scale:根据执行器量程调整,比如输出 0-100% 对应论域 ±3,则 U_Scale=100/6≈16.7。

  2. 模糊规则表:可根据实际工艺调整,比如温度超调严重时,增大 “E 为 PB 且 EC 为 NS” 对应的输出负增量。

  3. 周期中断时间:温度系统滞后大,建议 OB35 周期设为 1-5s,避免频繁波动。

总结

  1. PLC 实现模糊控温的核心是模糊化 - 规则推理 - 解模糊三步,无需复杂数学模型,依赖工艺经验制定规则表;

  2. 程序采用结构化设计(DB 块存参数、FC 块分子程序),适配西门子 S7-1200/1500,其他品牌可复用逻辑;

  3. 调试重点是量化 / 比例因子和模糊规则表,需结合实际温度系统的滞后特性、非线性特性优化。

收缩
  • QQ咨询

  • 电话咨询

  • 18576370666
  • 添加微信客服