2026a

# tunablePID


可调 PID 控制器

函数库: TyControlSystems

# 描述

创建一自由度 PID 控制器的模型对象。tunablePID 参数化可调 SISO PID 控制器,从而用于参数研究。

tunablePID 是参数化模型的控制设计块系列的一部分。其他控制设计模块包括 tunablePID2tunableTFtunableSStunableGain

# 属性

Kp, Ki, Kd, Tf - PID 增益及滤波时间常数的参数化
结构体

PID 控制器增益 Kp、Ki、Kd 以及滤波时间常数 Tf 的参数化,指定为结构体。

当对模块进行调优时,可以使用 blk.Kp,blk.Ki,blk.Kd 和 blk.Tf 的如下字段:

字段 描述
Value 参数的当前值。
Free 确定参数是固定参数还是可调参数的逻辑值。例如
- 如果 blk.Kp.Free[ ] = True,那么 blk.Kp.Value 是可调的;
- 如果 blk.Kp.Free[ ] = False,那么 blk.Kp.Value 是固定的。
Minimum 参数的最小值。此属性对参数的调优值设置了下界。例如,设置 blk.Kp.Minimum = 0 确保 Kp 保持为正。blk.Kp.Minimum 的最小值必须总是正的。
Maximum 该参数的最大值。此属性对参数的调优值设置了上限。例如,设置 blk.Tf.Maximum = 100 确保过滤器时间常数不超过 100。
IFormula, DFormula - 离散时间积分公式
字符串

积分项 和微分项 的离散积分公式,指定为如下字符串之一:

取值 公式
"ForwardEuler"
"BackwardEuler"
"Trapezoidal"

数据类型: String

Ts - 采样时间
正实数 | 0(默认) | -1

系统的采样时间,指定为正实数(表示离散系统)、0(表示连续系统)或 -1(表示未指定)。

更改此属性不会使模型离散化或重新采样。

数据类型: Float | Int

TimeUnit - 时间单位
字符串

模型中时间变量、采样时间 Ts 和任意时延的单位,指定为字符串。可用的时间单位包括:

  • "nanoseconds"
  • "microseconds"
  • "milliseconds"
  • "seconds"
  • "minutes"
  • "hours"
  • "days"
  • "weeks"
  • "months"
  • "years"

更改 TimeUnit 对其他属性没有影响,因此不会改变整个系统的行为。

数据类型: String

InputName - 输入通道名称
向量

可调模型的输入通道名称,指定为由字符串构成的向量。

数据类型: String

InputUnit - 输入通道单位
向量

可调模型的输入通道单位,指定为由字符串构成的向量。

数据类型: String

InputGroup - 输入通道组
字典

输入通道组,指定为由输入通道索引构成的字典。InputGroup 属性将 MIMO 系统的输入通道按名称分配到组中。例如,

sys.InputGroup = Dict([("controls",[1,2]),("noise",[3,5])])

创建名为 controls 和 noise 的输入组,分别包括输入通道 1,2 和 3,5。

OutputName - 输出通道名称
向量

可调模型的输出通道名称,指定为由字符串构成的向量。

数据类型: String

OutputUnit - 输出通道单位
向量

可调模型的输出通道单位,指定为由字符串构成的向量。

数据类型: String

OutputGroup - 输出通道组
字典

输出通道组,指定为由输入通道索引构成的字典。OutputGroup 属性将 MIMO 系统的输出通道按名称分配到组中。例如,

sys.OutputGroup= Dict([("temperature",[1]),("measurement ",[3,5])])

创建名为 temperature 和 measurement 的输出组,分别包括输入通道 1 和 3,5。

Name - 模型名称
字符串

模型名称,指定为字符串。

数据类型: String

Notes - 提示文本
字符串

要与系统关联的任何文本,指定为字符串。

数据类型: String

UserData - 用户数据
任意类型

与系统关联的用户数据,指定为任意 Julia 数据类型。

# 语法

blk = tunablePID(name, type)
blk = tunablePID(name, type, Ts)

# 说明

blk = tunablePID(name, type) 创建一自由度连续时间PID控制器:

其中, 为可调参数。输入参数 type 通过固定一部分上述值为 0 来设置控制器的类型(详见 type)。 示例


blk = tunablePID(name, type, Ts) 创建采样时间为 Ts 的一自由度离散时间PID控制器:

其中, 分别是积分项和微分项的离散积分公式,它们的取值详见 IFormula, DFormula示例

# 示例

参数固定的可调控制器

创建一个可调 PD 控制器。

using TyControlSystems
blk = tunablePID("pdblock","PD")
  可调连续时间 PID 控制器 pdblock,公式:

               s
  Kp + Kd * --------
             Tf*s+1

  具有可调参数 Kp, Kd, Tf。

键入 pid(blk) 可查看当前值,键入 get(blk) 可查看所有属性。

随后,初始化参数值并设置滤波器时间常数。

blk.Kp.Value = 4;        # 初始化 Kp 为 4
blk.Kd.Value = 0.7;      # 初始化 Kd 为 0.7
blk.Tf.Value = 0.01;     # 设置 Tf 为 0.01
blk.Tf.Free[1] = false;   # 固定 Tf 为该值

查看 blk 的当前值。

pid(blk)
名称: pdblock

               s    
  Kp + Kd * --------
             Tf*s+1

  且Kp = 4.0, kd = 0.7

并联型的连续时间 PDF 控制器

如果为采样时间为 0.005 s 的离散时间系统,可以按如下方式创建。

blk = tunablePID("pdblock","PD", 0.005)
  可调离散时间 PID 控制器 pdblock,公式:

                 1
  Kp + Kd * -----------
            Tf+Ts/(z-1)

  具有可调参数 Kp, Kd, Tf。

键入 pid(blk) 可查看当前值,键入 get(blk) 可查看所有属性。
blk.Kp.Value = 4;        # 初始化 Kp 为 4
blk.Kd.Value = 0.7;      # 初始化 Kd 为 0.7
blk.Tf.Value = 0.01;     # 设置 Tf 为 0.01
blk.Tf.Free[1] = false;   # 固定 Tf 为该值

查看 blk 的当前值。

pid(blk)
名称: pdblock

                 1     
  Kp + Kd * -----------
            Tf+Ts/(z-1)

  且 Kp = 4.0, Kd = 0.7, Tf = 0.01, Ts = 0.005

Sample Time: 0.005 (seconds)

并联型的离散时间 PDF 控制器
带有输入输出名称的控制器

创建一个可调 PID 控制器,并为输入和输出指定名称。

using TyControlSystems
blk = tunablePID("pidblock","PID")   
  可调连续时间 PID 控制器 pidblock,公式:

             1            s
  Kp + Ki * --- + Kd * --------
             s          Tf*s+1

  具有可调参数 Kp, Ki, Kd, Tf。

键入 pid(blk) 可查看当前值,键入 get(blk) 可查看所有属性。
blk.InputName = "error";
blk.OutputName = "control"; 

查看 blk 的所有属性:

get(blk)
             Kp: 1-by-1 结构体
             Ki: 1-by-1 结构体
             Kd: 1-by-1 结构体
             Tf: 1-by-1 结构体
       IFormula: "ForwardEuler"
       DFormula: "ForwardEuler"
           Name: "pidblock"
             Ts: 0.0
       TimeUnit: "seconds"
      InputName: "error"
      InputUnit: ""
     InputGroup: Dict{Any, Any}()
     OutputName: "control"
     OutputUnit: ""
    OutputGroup: Dict{Any, Any}()
          Notes: ""
       UserData: Any[]

# 输入参数

name - PID 控制器名称
字符串

可调 PID 控制器 blk 的名称,指定为字符串。

数据类型: String

type - 控制器类型
字符串

控制器 blk 的类型,指定为字符串。其取值如下表所示,最多可指定 3 个 PID 控制器参数。

type 取值 控制器类型 对PID参数的影响
"P" 比例 置为 0; 置为 1; 可调
"PI" 比例-积分 置为 0; 置为 1; 可调
"PD" 比例-微分(微分作用带有一节滤波器) 置为 0;可调
"PID" 比例-积分-微分(微分作用带有一节滤波器) 可调

数据类型: String

Ts - 采样时间
正实数 | 0(默认) | -1

采样时间,指定为正实数(表示离散系统)、0(表示连续系统)或 -1(表示未指定)。

数据类型: Float | Int

# 输出参数

blk - 可调 PID 控制器模块
可调 PID 控制器

由 tunablePID 创建得到的可调 PID 控制器模块。

# 其他描述

  • 通过固定或者释放任意参数()来调整 PID 的结构。例如,使用字段 blk.TF.Free = false 让 TF 固定为当前值;
  • 要将一个 tunablePID 参数模型转化为一个数字(非可调)模型,可以使用 pidtfzpkss 模型创建命令。

# 另请参阅

pid | tunablePID2 | tunableGain | tunableTF | tunableSS