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

库卡机器人及配件服务商    

库卡机器人、库卡机器人备品配件

联系方式
  • 联系人:吴经理
  • 电话:18576370666
新闻分类
  • 暂无分类
首页 > 新闻中心 > PID_脚本实现.MCG分享!
新闻中心
PID_脚本实现.MCG分享!
发布时间:2025-09-27        浏览次数:5        返回列表

以下是一个基于 MCG(可能指特定的运动控制或 PLC 编程环境)的 PID 控制脚本实现,适用于温度、压力、速度等闭环控制场景。这个脚本实现了基本的 PID 算法,包含比例、积分、微分调节及抗积分饱和功能。

// MCG PID控制脚本实现

// 功能:实现位置式PID控制,支持参数调节与积分限幅

// 适用场景:温度、压力、速度等闭环控制系统


// PID参数结构体定义

TYPE PID_Params :

STRUCT

    Kp : REAL;               // 比例增益

    Ki : REAL;               // 积分时间(秒)

    Kd : REAL;               // 微分时间(秒)

    Output_Min : REAL;       // 输出最小值(限幅下限)

    Output_Max : REAL;       // 输出最大值(限幅上限)

    Sample_Time : REAL;      // 采样周期(秒,如0.1=100ms)

END_STRUCT

END_TYPE


// PID运行状态结构体定义

TYPE PID_State :

STRUCT

    Setpoint : REAL;         // 目标设定值

    Process_Value : REAL;    // 过程反馈值

    Output : REAL;           // 控制输出值

    Error : REAL;            // 当前偏差

    Error_Last : REAL;       // 上一周期偏差

    Integral : REAL;         // 积分项累计

    Derivative : REAL;       // 微分项

    Is_Enabled : BOOL;       // PID使能标志

END_STRUCT

END_TYPE


// PID初始化函数

FUNCTION_BLOCK PID_Init

VAR_INPUT

    Params : PID_Params;     // PID参数

END_VAR

VAR_OUTPUT

    State : PID_State;       // PID状态

END_VAR


// 初始化逻辑

State.Setpoint := 0.0;

State.Process_Value := 0.0;

State.Output := 0.0;

State.Error := 0.0;

State.Error_Last := 0.0;

State.Integral := 0.0;

State.Derivative := 0.0;

State.Is_Enabled := FALSE;

END_FUNCTION_BLOCK


// PID核心控制函数(周期性调用)

FUNCTION_BLOCK PID_Control

VAR_INPUT

    Params : PID_Params;     // PID参数

    State : PID_State;       // PID状态

END_VAR

VAR_OUTPUT

    New_State : PID_State;   // 更新后的状态

END_VAR

VAR

    Temp_Output : REAL;      // 临时输出(未限幅)

    Ki_Term : REAL;          // 积分项系数

    Kd_Term : REAL;          // 微分项系数

END_VAR


// 复制当前状态到新状态

New_State := State;


// 仅在使能状态下执行PID计算

IF New_State.Is_Enabled THEN

    // 1. 计算当前偏差

    New_State.Error := New_State.Setpoint - New_State.Process_Value;

    

    // 2. 计算比例项(P)

    // 比例项 = Kp * 偏差

    

    // 3. 计算积分项(I),带抗积分饱和

    Ki_Term := Params.Kp * (Params.Sample_Time / Params.Ki);

    IF (New_State.Output >= Params.Output_Max) OR (New_State.Output <= Params.Output_Min) THEN

        // 输出已饱和时,停止积分累计(抗积分饱和)

        New_State.Integral := New_State.Integral;

    ELSE

        // 正常积分累计

        New_State.Integral := New_State.Integral + (New_State.Error * Ki_Term);

    END_IF;

    

    // 4. 计算微分项(D),采用不完全微分(抑制噪声)

    Kd_Term := Params.Kp * (Params.Kd / Params.Sample_Time);

    New_State.Derivative := Kd_Term * (New_State.Error - New_State.Error_Last);

    

    // 5. 计算总输出(未限幅)

    Temp_Output := (Params.Kp * New_State.Error) + New_State.Integral + New_State.Derivative;

    

    // 6. 输出限幅(防止执行器超出范围)

    IF Temp_Output > Params.Output_Max THEN

        New_State.Output := Params.Output_Max;

    ELSIF Temp_Output < Params.Output_Min THEN

        New_State.Output := Params.Output_Min;

    ELSE

        New_State.Output := Temp_Output;

    END_IF;

    

    // 7. 保存当前偏差用于下一周期微分计算

    New_State.Error_Last := New_State.Error;

END_IF;

END_FUNCTION_BLOCK


// 示例:温度控制应用

PROGRAM Temperature_Control

VAR

    pid_params : PID_Params;     // 温度PID参数

    pid_state : PID_State;       // 温度PID状态

    pid_init : PID_Init;         // PID初始化实例

    pid_control : PID_Control;   // PID控制实例

    temp_sensor : REAL;          // 温度传感器反馈值(℃)

    heater_output : REAL;        // 加热器输出(0-100%)

    sample_trigger : BOOL;       // 采样触发信号(周期=Sample_Time)

END_VAR


// 初始化PID参数(温度控制示例)

pid_params.Kp := 5.0;           // 比例增益

pid_params.Ki := 20.0;          // 积分时间20秒

pid_params.Kd := 2.0;           // 微分时间2秒

pid_params.Output_Min := 0.0;   // 最小输出0%

pid_params.Output_Max := 100.0; // 最大输出100%

pid_params.Sample_Time := 0.5;  // 采样周期0.5秒


// 初始化PID

pid_init.Params := pid_params;

pid_init();

pid_state := pid_init.State;


// 设置目标温度(例如80℃)

pid_state.Setpoint := 80.0;

pid_state.Is_Enabled := TRUE;   // 使能PID


// 周期性执行PID计算(由sample_trigger触发,周期0.5秒)

IF sample_trigger THEN

    // 读取温度传感器反馈

    pid_state.Process_Value := temp_sensor;

    

    // 执行PID控制计算

    pid_control.Params := pid_params;

    pid_control.State := pid_state;

    pid_control();

    pid_state := pid_control.New_State;

    

    // 输出控制信号到加热器

    heater_output := pid_state.Output;

END_IF;

END_PROGRAM

脚本说明

这个 PID 脚本实现了以下核心功能:

  1. 参数配置:通过PID_Params结构体可设置比例增益(Kp)、积分时间(Ki)、微分时间(Kd)、输出上下限和采样周期,适应不同控制对象。

  2. 抗积分饱和:当输出达到上限或下限时,停止积分项累计,避免传统 PID 因积分过量导致的超调问题。

  3. 模块化设计

    • PID_Init:初始化 PID 状态,确保系统启动时参数处于安全状态

    • PID_Control:核心控制算法,周期性计算输出值

    • 示例程序Temperature_Control:展示在温度控制场景中的应用方法

  4. 使用方法

    • 根据被控对象调整 Kp、Ki、Kd 参数(可通过试凑法或自整定)

    • 设定合适的输出上下限(匹配执行器能力)

    • 按采样周期调用PID_Control函数块(建议 100ms-1s,根据系统响应速度调整)

实际应用时,需根据具体控制对象(如温度、压力、速度)的特性调整 PID 参数,通常可先固定 Ki=0、Kd=0,仅调节 Kp 至系统稳定,再逐步增加 Ki 和 Kd 优化响应速度。

收缩
  • QQ咨询

  • 电话咨询

  • 18576370666
  • 添加微信客服