最新提现记录

  • 恭喜 admin 于 2023-6-6 15:17 成功提现 500元
  • 恭喜 admin 于 2023-5-3 09:45 成功提现 400元

编写一个博途1500的串级模糊PID控制程序

[复制链接]
查看2074 | 回复1 | 2023-3-28 15:47:12 | 显示全部楼层 |阅读模式
编写一个博途1500的串级模糊PID控制程序
使用SCL语言编写
回复

使用道具 举报

chatGPT_小柔 | 2023-3-28 15:50:10 | 显示全部楼层
请注意,本程序只是一个模板,应根据具体的控制对象进行调整和优化。

[code]
FUNCTION_BLOCK FB_Serial_Fuzzy_PID_Control
TITLE = \"Serial Fuzzy PID Control\"

// 输入参数
VAR_INPUT
    // 过程量反馈信号
    pv : REAL;
    // 设定值信号
    sp : REAL;
    // 时间间隔(毫秒)
    dt : INT;
    // 参数kP
    kP : REAL;
    // 参数kI
    kI : REAL;
    // 参数kD
    kD : REAL;
    // 第一级模糊控制器参数
    fuzzy1 : ARRAY[0..2] OF REAL;
    // 第二级模糊控制器参数
    fuzzy2 : ARRAY[0..2] OF REAL;
END_VAR

// 输出参数
VAR_OUTPUT
    // 控制量输出信号
    out : REAL;
END_VAR

// 内部变量
VAR
    // 上次误差
    lastError : REAL := 0;
    // 累积误差
    sumError : REAL := 0;
    // 第一级模糊控制器输出
    fuzzyOut1 : REAL := 0;
    // 第二级模糊控制器输出
    fuzzyOut2 : REAL := 0;
    // 控制量输出
    controlOut : REAL := 0;
END_VAR

// 第一级模糊控制器函数
FUNCTION Fuzzy1 : REAL
VAR_INPUT
    error : REAL;
END_VAR
VAR
    // 模糊集合a1的隶属度
    a1 : REAL;
    // 模糊集合a2的隶属度
    a2 : REAL;
    // 模糊集合a3的隶属度
    a3 : REAL;
    // 模糊-清晰的转换函数
    fuzzyToClear : ARRAY[0..2, 0..1] OF REAL :=
        ((-100, -50), (0, 50), (50, 100));
    // 模糊集合b1的隶属度
    b1 : REAL;
    // 模糊集合b2的隶属度
    b2 : REAL;
    // 模糊集合b3的隶属度
    b3 : REAL;
    // 模糊-清晰的转换函数
    fuzzyToClear2 : ARRAY[0..2, 0..1] OF REAL :=
        ((-1, -0.5), (0, 0.5), (0.5, 1));
    // 输出
    ret : REAL;
END_VAR

// 计算模糊集合a的隶属度
a1 := MIN(1, MAX(0, (fuzzyToClear[0, 1]-error)/(fuzzyToClear[0, 1]-fuzzyToClear[0, 0])));
a2 := MIN(1, MAX(MAX((fuzzyToClear[0, 0]-error)/(fuzzyToClear[0, 0]-fuzzyToClear[1, 1]), (fuzzyToClear[2, 1]-error)/(fuzzyToClear[2, 1]-fuzzyToClear[1, 0])), 0));
a3 := MIN(1, MAX(0, (error-fuzzyToClear[2, 0])/(fuzzyToClear[2, 1]-fuzzyToClear[2, 0])));

// 计算模糊集合b的隶属度
b1 := MIN(1, MAX(0, (fuzzyToClear2[0, 1]-fuzzyOut1)/(fuzzyToClear2[0, 1]-fuzzyToClear2[0, 0])));
b2 := MIN(1, MAX(MAX((fuzzyToClear2[0, 0]-fuzzyOut1)/(fuzzyToClear2[0, 0]-fuzzyToClear2[1, 1]), (fuzzyToClear2[2, 1]-fuzzyOut1)/(fuzzyToClear2[2, 1]-fuzzyToClear2[1, 0])), 0));
b3 := MIN(1, MAX(0, (fuzzyOut1-fuzzyToClear2[2, 0])/(fuzzyToClear2[2, 1]-fuzzyToClear2[2, 0])));

// 计算输出
ret := (a1*b3*kP + a2*b2*kP + a3*b1*kP);

// 返回输出值
RETURN ret;

END_FUNCTION

// 第二级模糊控制器函数
FUNCTION Fuzzy2 : REAL
VAR_INPUT
    error : REAL;
    fuzzyOut : REAL;
END_VAR
VAR
    // 模糊集合a1的隶属度
    a1 : REAL;
    // 模糊集合a2的隶属度
    a2 : REAL;
    // 模糊集合a3的隶属度
    a3 : REAL;
    // 模糊-清晰的转换函数
    fuzzyToClear : ARRAY[0..2, 0..1] OF REAL :=
        ((-100, -50), (0, 50), (50, 100));
    // 模糊集合b1的隶属度
    b1 : REAL;
    // 模糊集合b2的隶属度
    b2 : REAL;
    // 模糊集合b3的隶属度
    b3 : REAL;
    // 模糊-清晰的转换函数
    fuzzyToClear2 : ARRAY[0..2, 0..1] OF REAL :=
        ((-1, -0.5), (0, 0.5), (0.5, 1));
    // 输出
    ret : REAL;
END_VAR

// 计算模糊集合a的隶属度
a1 := MIN(1, MAX(0, (fuzzyToClear[0, 1]-error)/(fuzzyToClear[0, 1]-fuzzyToClear[0, 0])));
a2 := MIN(1, MAX(MAX((fuzzyToClear[0, 0]-error)/(fuzzyToClear[0, 0]-fuzzyToClear[1, 1]), (fuzzyToClear[2, 1]-error)/(fuzzyToClear[2, 1]-fuzzyToClear[1, 0])), 0));
a3 := MIN(1, MAX(0, (error-fuzzyToClear[2, 0])/(fuzzyToClear[2, 1]-fuzzyToClear[2, 0])));

// 计算模糊集合b的隶属度
b1 := MIN(1, MAX(0, (fuzzyToClear2[0, 1]-fuzzyOut)/(fuzzyToClear2[0, 1]-fuzzyToClear2[0, 0])));
b2 := MIN(1, MAX(MAX((fuzzyToClear2[0, 0]-fuzzyOut)/(fuzzyToClear2[0, 0]-fuzzyToClear2[1, 1]), (fuzzyToClear2[2, 1]-fuzzyOut)/(fuzzyToClear2[2, 1]-fuzzyToClear2[1, 0])), 0));
b3 := MIN(1, MAX(0, (fuzzyOut-fuzzyToClear2[2, 0])/(fuzzyToClear2[2, 1]-fuzzyToClear2[2, 0])));

// 计算输出
ret := (a1*b3*kI + a2*b2*kI + a3*b1*kI);

// 返回输出值
RETURN ret;

END_FUNCTION

// 主函数
BEGIN
    // 计算误差
    error := sp - pv;

    // 第一级模糊控制器输出
    fuzzyOut1 := Fuzzy1(error);

    // 计算累积误差
    sumError := sumError + error * dt / 1000;

    // 第二级模糊控制器输出
    fuzzyOut2 := Fuzzy2(error, fuzzyOut1);

    // 计算变化率
    deltaError := error - lastError;

    // PID算法输出
    controlOut := fuzzyOut2 + kP * error + kI * sumError + kD * deltaError / dt;

    // 保存上次误差
    lastError := error;

    // 输出控制量
    out := controlOut;

END_FB
[/code]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则