西门子增量式PID算法带积分分离

科技   2024-12-04 22:00   广东  
西门子增量式带积分分离PID控制器是一种改进的PID控制算法,它结合了增量式PID和积分分离的优点。这种控制器在处理某些特定类型的控制问题时特别有效,尤其是在需要快速响应且避免积分饱和的情况下。下面我将解释其作用、应用场合以及如何使用SCL(Structured Control Language)在FB(Function Block)中封装这样的PID控制器。



一、作用
  1. 增量式PID:增量式PID控制器计算的是输出的变化量,而不是绝对值。这使得控制器更加稳定,特别是在系统受到扰动时。增量式PID通过以下公式计算:

  2. 积分分离:积分分离是指在误差较大时关闭积分项,以防止积分饱和。当误差较小或接近零时,再启用积分项,以消除稳态误差。这样可以提高系统的响应速度,并减少超调。


二、应用场合
  1. 过程控制系统:在化工、制药、食品加工等行业的温度、压力、流量控制中,增量式带积分分离PID可以提供更好的控制性能。

  2. 机械系统:在伺服电机、液压系统等需要精确位置控制的应用中,这种PID控制器可以提高系统的响应速度和稳定性。

  3. 电力系统:在发电机调速、电压调节等电力系统控制中,可以有效减少超调和振荡。

  4. 机器人控制:在机器人关节控制、轨迹跟踪等应用中,可以提高控制精度和响应速度。


三、SCL FB块封装
下面是一个使用SCL语言封装的增量式带积分分离PID控制器的示例。这个FB块可以用于西门子S7-1200/1500系列PLC。

(**************************************************************************


FunctionBlockName:  PID-FB块
* Version:            1.0.0
* Author:             王同学玩工控
* UpdateTime:         2024-11-30
* Comment:


简单说明:


积分分离:

1、当误差大于阈值的时候关闭积分项此时只有PD在作用 系统快速动作

2、当误差小于或等于阈值的时候打开积分项开始累计误差 系统缓慢调整


死区控制:当死区设置为 1 时 目标值为 36 系统在35-36之间进入死区停止PID的运算  且输出值不变
当系统大于36或小于35的时候系统开始进行PID运算


正动作逆动作:当外部输入引脚为 1 时 系统为正动作 为 0 时 系统为逆动作



Setpoint            目标设定值
Feedback            实际反馈值
Kp                  比例增益
Ti                  积分时间ms
Td                  微分时间ms
Max_output          输出限幅最大值
Min_output          输出限幅最小值
Dead_Band           死区控制
Control_Mode        正动作逆动作(0/1)
Mode                输出模式选择(0/1)
integral_separate   阀值
PWM_output          pwm输出
Analog_output       模拟量输出



***************************************************************************)



#error := #Setpoint -#Feedback;    //计算误差

IF #error > ( 0 - #Dead_Band )AND #error < #Dead_Band THEN
    
    #data_relay[2] := 1;
    #last_error := #error;     //上次误差更新
    #prev_error := #last_error;    //上上次误差更新
      
ELSE
    #data_relay[2] := 0;
    
END_IF;


IF #data_relay[2] = 0 THEN
    
    
    IF ABS(#error) <= #integral_separate THEN
        
        #data_relay[1] := 1;
    END_IF;
    
    IF ABS(#error) > #integral_separate THEN
        
        #data_relay[1] := 0;
    END_IF;

    
    #P_term := #Kp * (#error - #last_error);    //比例系数计算
    
    #I_term := #data_relay[1] * (#Ki * #error); //积分系数计算
    
    #D_term := #Kd * (#error - 2 * #last_error + #prev_error);   //微分系数计算
    
    #delta_output := #P_term + #I_term + #D_term;  //增量式PID输出值
    
    #rdata_realy[0] += #delta_output;    //最终输出值    
    
    


    
    #Max_data_relay := 100.0;  //限幅处理最大值
    #Min_data_relay := 0.0;   //限幅处理最小值
    
    IF #Control_Mode THEN// 正动作
        
        IF #rdata_realy[0] > #Max_data_relay THEN
            
            #rdata_realy[0] := #Max_data_relay;
            
        END_IF;
        
        IF #rdata_realy[0] < #Min_data_relay THEN
            
            #rdata_realy[0] := #Min_data_relay;
            
        END_IF;
        
    ELSE  // 逆动作
        
        #rdata_realy[0] := 0- #rdata_realy[0];  // 逆动作,反转输出范围
        IF #rdata_realy[0] > #Max_data_relay THEN
            
            #rdata_realy[0] := #Max_data_relay;
        END_IF;
        
        IF #rdata_realy[0] < #Min_data_relay THEN
            
            #rdata_realy[0] := #Min_data_relay;
            
        END_IF;
    END_IF;

    
    #Analog_output  := ( #rdata_realy[0]  -#Min_data_relay ) / ( #Max_data_relay - #Min_data_relay)  * (#Max_output-#Min_output)+#Min_output;
    
END_IF;



往期 · 推荐

拒绝小蛮腰,地应该怎么分?

电路板常用的几种胶,你知道几种?

某35MWh储能电站起火,起火原因和灭火流程公开!

工业信号指示灯及按钮开关颜色如何定义?

这样接的电缆端头,恐怕一送电就能见“太奶”了吧,来见识一下!




戳“阅读原文”学习更多行业知识!
你的点赞,转发,关注就是对小编最大的鼓励!



工控论坛
工控论坛,自动化从业者的精神家园
 最新文章