比例 + 积分 (PI)
此信息适用于
CompactLogix
5370、ControlLogix
5570、Compact GuardLogix
5370、GuardLogix
5570、CompactLogix
5380、ControlLogix
5580 和 ControlLogix 5590 控制器。PI 指令提供两种运算方法。第一种方法采用传统 PI 算法,其中比例和积分增益在整个输入信号(误差)范围内保持恒定。第二种方法采用非线性算法,其中比例和积分增益在整个输入信号范围内会发生变化。输入信号是过程设置点与反馈之差。
可用语言
梯形图
此指令不可用于梯形图中。
功能块

结构化文本
PI(PI_tag);
操作数
功能块
操作数 | 类型 | 格式 | 说明 |
|---|---|---|---|
PI tag | PROP_INT | 结构 | PI 结构 |
结构化文本
操作数 | 类型 | 格式 | 说明 |
|---|---|---|---|
PI tag | PROP_INT | 结构 | PI 结构 |
有关结构化文本中表达式语法的详细信息,请参见
结构化文本语法
部分。PROP_INT 结构
输入参数 | 数据类型 | 说明 |
|---|---|---|
EnableIn | BOOL | 启用输入。如果此参数清零,指令不会执行,也不会更新输出。 默认置位。 |
In | REAL | 过程误差信号输入。这就是设定值和反馈的区别。 有效值 = 任意浮点值 默认值 = 0.0 |
Initialize | BOOL | 指令初始化命令。置位时,Out 和内部积分器设为等于 InitialValue 的值。 默认清零。 |
InitialValue | REAL | 输入初始值。Initialize 置位时,Out 和积分器设为 InitialValue 的值。使用 HighLimit 和 LowLimit 来限制 InitialValue 的值。 有效值 = 任意浮点值 默认值 = 0 |
Kp | REAL | 比例增益。该值会影响比例和积分控制算法的计算值。如果该值无效,指令会将 Kp 强制设为限值,并将 Status 中的相应位置位。 有效值 = 大于 0.0 的任意浮点数。 默认值 = 最小正浮点值 |
Wld | REAL | 超前频率(弧度/秒)。该值会影响积分控制算法的计算值。如果该值无效,指令会将 Wld 强制设为限值,并将 Status 中的相应位置位。 有效值 = 有关有效范围,请参阅下面的“说明”部分 默认值 = 0.0 |
HighLimit | REAL | 上限值。这是 Out 的最大值。如果 HighLimit LowLimit,则指令会将 HighAlarm 和 LowAlarm 置位,将 Status 中的相应位置位,并设置 Out = LowLimit。有效值 = LowLimit < HighLimit 最大正浮点值默认值 = 最大正浮点值 |
LowLimit | REAL | 下限值。这是 Out 的最小值。如果 HighLimit LowLimit,则指令会将 HighAlarm 和 LowAlarm 置位,将 Status 中的相应位置位,并设置 Out = LowLimit。有效值 = 最大负浮点值 LowLimit < HighLimit默认值 = 最大负浮点值 |
HoldHigh | BOOL | 保持高位命令。置位时,不允许内部积分器的值增大。 默认清零。 |
HoldLow | BOOL | 保持低位命令。置位时,不允许内部积分器的值减小。 默认清零。 |
ShapeKpPlus | REAL | 正 Kp 修正增益乘数。当 In 0 时使用。如果该值无效,指令会将 ShapeKpPlus 强制设为限值,并将 Status 中的相应位置位。在 NonLinearMode 清零时不使用。有效值 = 0.1 至 10.0 默认值 = 1.0 |
ShapeKpMinus | REAL | 负 Kp 修正增益乘数。In < 0 时使用。如果该值无效,指令会将 ShapeKpMinus 强制设为限值,并将 Status 中的相应位置位。在 NonLinearMode 清零时不使用。 有效值 = 0.1 至 10.0 默认值 = 1.0 |
KpInRange | REAL | 比例增益修正范围。定义一个 In(误差)范围,比例增益在该范围内根据 | In | / KpInRange 之比增大或减小。当 | In | > KpInRange 时,指令使用输入的 Kp 修正增益 x (In - KpInRange) 计算比例误差变化。如果该值无效,指令会将 KpInRange 强制设为限值,并将 Status 中的相应位置位。在 NonLinearMode 清零时不使用。 有效值 = 大于 0.0 的任意浮点数。 默认值 = 最大正浮点值 |
ShapeWldPlus | REAL | 正 Wld 修正增益乘数。当 In 0 时使用。如果该值无效,指令会将 ShapeWldPlus 强制设为限值,并将 Status 中的相应位置位。在 NonLinearMode 清零时不使用。有效值 = 0.0 至 10.0 默认值 = 1.0 |
ShapeWldMinus | REAL | 负 Wld 修正增益乘数。In < 0 时使用。如果该值无效,指令会将 ShapeWldMinus 强制设为限值,并将 Status 中的相应位置位。在 NonLinearMode 清零时不使用。 有效值 = 0.0 至 10.0 默认值 = 1.0 |
WldInRange | REAL | 积分增益修正范围。定义一个 In(误差)范围,积分增益在该范围内根据 | In | / WldInRange 之比增大或减小。条件 |In| > WldInRange 时,计算积分误差时,指令会将 In 限制为 WldInRange。如果该值无效,指令会将 WldInRange 强制设为限值,并将 Status 中的相应位置位。在 NonLinearMode 清零时不使用。 有效值 = 大于 0.0 的任意浮点数。 默认值 = 最大正浮点值 |
NonLinearMode | BOOL | 启用非线性增益模式。置位时,指令会使用由 ParabolicLinear 选择的非线性增益模式来计算实际的比例增益和积分增益。清零时,指令会禁用非线性增益模式,并将 Kp 和 Wld 值用作比例增益和积分增益。 默认清零。 |
ParabolicLinear | BOOL | 选择非线性增益模式。模式可以是线性模式或抛物线模式。置位时,指令使用抛物线增益方法 y=a * x 2 + b 来计算实际的比例增益和积分增益。清零时,指令使用线性增益方法 y=a * x + b。默认清零。 |
TimingMode | DINT | 选择时序执行模式。 0 = 周期性模式 1 = 过采样模式 2 = 实时采样模式 有关时序模式的更多信息,请参见“功能块属性”部分。 有效值 = 0 至 2 默认值 = 0 |
OversampleDT | REAL | 过采样模式的执行时间。 有效值 = 0 到 4194.303 秒 默认值 = 0 |
RTSTime | DINT | 实时采样模式的模块更新周期 有效值 = 1 至 32,767 ms 默认值 = 1 |
RTSTimeStamp | DINT | 实时采样模式的模块时戳值。 有效值 = 0 至 32,767 ms 默认值 = 0 |
输出参数 | 数据类型 | 说明 |
|---|---|---|
EnableOut | BOOL | 指示指令的执行状态。 |
Out | REAL | 计算出的 PI 算法输出。将该输出的数学状态标志置位。 |
HighAlarm | BOOL | 上限报警指示器。当 Out 的计算值 HighLimit 且输出和积分器强制设为 HighLimit 时置位。 |
LowAlarm | BOOL | 下限报警指示器。当 Out 的计算值 LowLimit 且输出和积分器强制设为 LowLimit 时置位。 |
DeltaT | REAL | 两次更新间隔的时间。控制算法计算过程输出所用的时间(秒)。 |
Status | DINT | 功能块的状态。 |
InstructFault (Status.0) | BOOL | 该指令检测到以下执行错误之一。这不是轻微或严重的控制器错误。检查其他状态位以确定发生的情况。 |
KpInv (Status.1) | BOOL | Kp < 最小值或 Kp > 最大值。 |
WldInv (Status.2) | BOOL | Wld < 最小值或 Wld > 最大值。 |
HighLowLimsInv (Status.3) | BOOL | HighLimit LowLimit。 |
ShapeKpPlusInv (Status.4) | BOOL | ShapeKpPlus < 最小值或 ShapeKpPlus > 最大值。 |
ShapeKpMinusInv (Status.5) | BOOL | ShapeKpMinus < 最小值或 ShapeKpMinus > 最大值。 |
KpInRangeInv (Status.6) | BOOL | KpInRange < 最小值或 KpInRange > 最大值。 |
ShapeWldPlusInv (Status.7) | BOOL | ShapeWldPlus < 最小值或 ShapeWldPlus > 最大值。 |
ShapeWldMinusInv (Status.8) | BOOL | ShapeWldMinus < 最小值或 ShapeWldMinus > 最大值。 |
WldInRangeInv (Status.9) | BOOL | WldInRange < 最小值或 WldInRange > 最大值。 |
TimingModeInv (Status.27) | BOOL | TimingMode 无效。 有关时序模式的更多信息,请参见“功能块属性”部分。 |
RTSMissed (Status.28) | BOOL | 仅用于实时采样模式。当 ABS | DeltaT - RTSTime | > 1(0.001 秒)时置位。 |
RTSTimeInv (Status.29) | BOOL | RTSTime 值无效。 |
RTSTimeStampInv (Status.30) | BOOL | RTSTimeStamp 值无效。 |
DeltaT (Status.31) | BOOL | DeltaT 值无效。 |
说明
PI 指令采用位置式 PI 算法。这意味着,增益项直接应用于输入信号,而非输入信号的变化。PI 指令专用于恒速扫描的任务 (task) 中。
在非线性算法中,比例增益和积分增益随着输入信号幅值的变化而变化。PI 指令支持两种非线性增益模式:线性和抛物线增益模式。在线性算法中,增益随输入幅值的变化呈线性变化。在抛物线算法中,增益随输入幅值的变化呈抛物线变化。
PI 指令使用以下公式计算 Out:

一旦计算出的输出值无效(NAN 或
INF),指令会设置 Out = 无效值,并将数学溢出状态标志置位。内部参数不会更新。在每次的后续扫描过程中,都会使用上一次扫描(输出有效)的内部参数计算输出。
INF),指令会设置 Out = 无效值,并将数学溢出状态标志置位。内部参数不会更新。在每次的后续扫描过程中,都会使用上一次扫描(输出有效)的内部参数计算输出。在线性模式下工作
在线性模式下,非线性增益模式将被禁用。指令使用 Kp 和 Wld 值作为比例增益和积分增益。计算 Out 值的公式如下:
值 | 公式 |
|---|---|
ITerm | ![]() 其中,DeltaT 以秒为单位。 |
PTerm | Kp x In |
Out | ITerm + PTerm |
Wld 的限值如下:
- 下限 > 0.0
- 上限 = 0.7p/DeltaT
- WldInput = In
在非线性模式下工作
在非线性模式下,指令使用由 ParabolicLinear 选择的非线性增益模式来计算实际的比例增益和积分增益。
当 In = 0 时,Kp 和 Wld 指定的增益将乘以 1.0。随着误差幅值的变化,相应的比例和积分算法也会分别增大或减小比例或积分增益。这些算法使用输入范围和修正增益参数计算实际的比例增益和积分增益。输入范围将定义进行增益修正的 In(即误差)范围。输入范围由 KpInRange 和 WldInRange 这两个参数设置。修正增益定义在修正增益参数所控制的象限内的增益乘数。修正增益由 ShapeKpPlus、ShapeKpMinus、ShapeWldPlus 和 ShapeWldMinus 设置。
ParabolicLinear 输入用于选择非线性增益模式。如果 ParabolicLinear 清零,则选择线性模式。如果 ParabolicLinear 置位,则选择抛物线模式。
要配置特定的修正增益曲线,可输入 0.0-10.0 的积分修正增益和 0.1-10.0 的比例修正增益,并输入要进行修正的输入范围。将 Kp 和 Wld 与计算出的 ShapeMultiplier 相乘即可得出实际的比例增益和积分增益。如果输入的修正增益为 1.0,则禁用用于为象限计算比例增益或积分增益的非线性算法。
当 In(误差)幅值大于 InRange 时,ShapeMultiplier 等于 | In | 与 InRange 相等时计算出的值。
下图显示了表示抛物线增益和线性增益公式的最大和最小增益曲线。

计算 Out 值的公式如下:
值 | 公式 |
|---|---|
Kp 修正增益乘数 | ![]() |
Kp 输入比率 | ![]() |
Kp 比率 | ![]() |
Kps 修正增益 | ![]() |
比例输出 | ![]() |
Wld 修正增益 | ![]() |
Wld 输入 | ![]() |
Wld 输入比率 | ![]() |
Wld 比率 | ![]() |
Wlds 修正增益 | ![]() |
Wlds 限值 | ![]() |
积分输出 | ![]() |
输出 | ![]() |
限制
指令根据保持输入的状态停止 ITerm 的积分饱和。
条件 | Action |
|---|---|
![]() | ![]() |
![]() | ![]() |
指令还会根据 HighLimit 和 LowLimit 值停止积分器的积分饱和。
条件 | Action |
|---|---|
Integrator > HighLimit | Integrator = HighLimit |
Integrator > LowLimit | Integrator = LowLimit |
指令会根据 HighLimit 和 LowLimit 值限制 Out 值。
条件 | Action |
|---|---|
HighLimit LowLimit | Out = LowLimit ITerm = LowLimit HighLowLimsInv 已设置 HighAlarm 置位 LowAlarm 置位 WldInput = 0 |
Out HighLimit | Out = HighLimit ITerm = ITerm n-1 HighAlarm 置位 |
ITerm > HighLimit | ITerm = HighLimit |
Out LowLimit | Out = LowLimit ITerm = ITerm n-1 LowAlarm 置位 |
ITerm < LowLimit | ITerm = LowLimit |
影响数学状态标志
否
严重/轻微故障
没有特定于此指令的故障。有关操作数相关的故障,请参见“通用属性”。
执行
功能块
条件 | 执行的操作 |
|---|---|
预扫描 | EnableIn 和 EnableOut 设置为假。 |
Tag.EnableIn 为假 | EnableIn 和 EnableOut 位设置为假。 |
Tag.EnableIn 为真 | EnableIn 和 EnableOut 位设置为真。 指令执行。 |
指令首次运行 | Out n-1 = 0 将不执行用于计算 Out 的算法。 |
指令首次扫描 | Out n-1 = 0 将不执行用于计算 Out 的算法。 |
后扫描 | EnableIn 和 EnableOut 位设置为假。 |
结构化文本
条件/状态 | 执行的操作 |
|---|---|
预扫描 | 请参见“功能块”表中的“预扫描”行。 |
正常执行 | 请参见“功能块”表中的“Tag.EnableIn 为真”行。 |
后扫描 | 请参见“功能块”表中的“后扫描”行。 |
示例
PI 指令是包含比例增益分量和积分增益分量的调节指令。积分增益分量由用户设置(弧度/秒),用于设置 PI 调节器的基本频率响应。比例增益用于设置功能块的总增益,包括功能块的比例增益和积分增益。
下图显示了 PI 功能块在线性模式下的基本调节回路,其中不包括初始化和保持/钳位功能。
PI 指令:线性模式

在下面的示例中,PI 指令作为速度调节器使用。本例中,速度误差通过将系统速度参考值与速度反馈信号相减(通过 SCRV 指令)得出(参见 PMUL 指令示例)。速度误差直接送入 PI 指令,该指令将根据上图所示的函数对该信号进行处理。
功能块

结构化文本
Reference_Select.In1 := Master_Machine_Ref;
Reference_Select.Select1 := Master_Machine_Select;
Reference_Select.In2 := Section_Jog;
Reference_Select.Select2 := Jog_Select;
SSUM(Reference_Select);
S_Curve.In := Reference_Select.Out;
S_Curve.AccelRate := accel_rate;
S_Curve.DecelRate := accel_rate;
SCRV(S_Curve);
PMUL_01.In := Resolver_Feedback;
PMUL_01.WordSize := 12;
PMUL_01.Multiplier := 100000;
PMUL(PMUL_01);
Speed_Feedback := PMUL_01.Out;
Velocity_Error := S_Curve.Out - Speed_Feedback;
PI_01.In := Velocity_Error;
PI_01.Initialize := Enable_Regulator;
PI_01.Kp := Velocity_Proportional_Gain;
PI_01.Wld := Velocity_Integral_Gain;
PI(PI_01);
Torque_Reference := PI_01.Out;
提供反馈
LowLimit,则指令会将 HighAlarm 和 LowAlarm 置位,将 Status 中的相应位置位,并设置 Out = LowLimit。
0 时使用。如果该值无效,指令会将 ShapeKpPlus 强制设为限值,并将 Status 中的相应位置位。在 NonLinearMode 清零时不使用。















