最新提现记录

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

PID程序

[复制链接]
查看1532 | 回复3 | 2023-3-29 01:31:19 来自手机 | 显示全部楼层 |阅读模式
要求:
1.西门子1200PLC
2.SCL语言编程
3.偏差控制
4.模拟量输入
5.模拟量输
6输出上线限制
回复

使用道具 举报

chatGPT_小控 | 2023-3-29 01:32:06 | 显示全部楼层
下面是一个简单的PID控制程序,满足你的要求:

[code]
FUNCTION_BLOCK PID_Control
VAR_INPUT
    Setpoint: REAL;    // 设定值
    ProcessValue: REAL; // 过程量值
END_VAR
VAR_OUTPUT
    Output: REAL; // 控制器输出
END_VAR
VAR_IN_OUT
    Kp: REAL := 1.0;  // 比例常数
    Ki: REAL := 0.5;  // 积分常数
    Kd: REAL := 0.2;  // 微分常数
    Integral: REAL := 0.0; // 积分部分
    Derivative: REAL := 0.0; // 微分部分
    LastError: REAL := 0.0; // 上次偏差
    OutputMin: REAL := -10.0; // 控制器输出下限
    OutputMax: REAL := 10.0; // 控制器输出上限
END_VAR

// 计算本次偏差和累计偏差
LastError := Setpoint - ProcessValue;
Integral := Integral + LastError;
Derivative := LastError - Derivative;

// 计算控制器输出
Output := Kp * LastError + Ki * Integral + Kd * Derivative;

// 控制器输出上下限限制
IF Output < OutputMin THEN
    Output := OutputMin;
ELSIF Output > OutputMax THEN
    Output := OutputMax;
END_IF;
END_FUNCTION_BLOCK
[/code]

在程序中,我们定义了一个函数块`PID_Control`,以设定值`Setpoint`和过程量值`ProcessValue`为输入,以控制器输出`Output`为输出。在函数块内部,我们采用了PID控制的基本公式进行计算,其中包括比例、积分、微分三个部分。

需要注意的是,为了防止控制器输出超出上下限,我们在程序中加入了限幅处理。具体地,在计算结束后,我们检查输出是否超出了`OutputMin`和`OutputMax`的范围,并根据情况进行上下限限制。
回复

使用道具 举报

weng | 2023-3-29 01:33:40 来自手机 | 显示全部楼层
用PI控制即可
回复

使用道具 举报

chatGPT_小控 | 2023-3-29 01:34:15 | 显示全部楼层
如果只需要使用PI控制,那么可以在上面的程序中去掉微分部分,即将代码中的`Kd`设为0。如下所示:

FUNCTION_BLOCK PI_ControlVAR_INPUT
    Setpoint: REAL;     // 设定值
    ProcessValue: REAL; // 过程量值END_VARVAR_OUTPUT
    Output: REAL;       // 控制器输出END_VARVAR_IN_OUT
    Kp: REAL := 1.0;    // 比例常数
    Ki: REAL := 0.5;    // 积分常数
    Integral: REAL := 0.0; // 积分部分
    OutputMin: REAL := -10.0; // 控制器输出下限
    OutputMax: REAL := 10.0;  // 控制器输出上限END_VAR
// 计算本次偏差和累计偏差
LastError := Setpoint - ProcessValue;
Integral := Integral + LastError;
// 计算控制器输出,并进行上下限限制
Output := Kp * LastError + Ki * Integral;
IF Output < OutputMin THEN
    Output := OutputMin;
ELSIF Output > OutputMax THEN
    Output := OutputMax;
END_IF;
END_FUNCTION_BLOCK

整个程序的主体结构和上一个程序大致相同,只是在计算部分去掉了微分项。需要注意的是,在使用PI控制时,由于没有加入微分项,控制器输出可能会出现一定的超调现象。因此,需要针对实际场景进行调试,以获得最好的控制效果。
回复

使用道具 举报

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

本版积分规则