本文回答的问题
文章摘要
要在 PLC 中实现模型预测控制 (MPC),工程师必须使用基于数组的数学运算来执行矩阵乘法。由于标准的梯形图 (Ladder Diagram) 没有原生的矩阵运算符,通常的做法是将状态空间项映射到数组中,展开所需的 `MUL`(乘法)和 `ADD`(加法)指令,并在部署到硬件之前验证扫描时间的影响。
在 PLC 中,矩阵乘法主要不是一个数学问题,而是一个披着数学外衣的确定性问题。MPC 依赖于诸如 \(x_{k+1}=Ax_k+Bu_k\) 之类的状态空间方程,但标准的梯形图并不提供原生的矩阵乘法指令,因此工程师必须将这些代数运算转换为控制器可以可预测地执行的显式数组操作。
Ampergon Vallis 指标: 在内部 OLLA Lab 扫描周期压力测试中,将 3x3 矩阵向量乘法展开为显式的顺序 `MUL` 和 `ADD` 指令,比在同一模拟任务环境下嵌套循环的结构化文本 (Structured Text) 基准测试每个扫描周期快 4.2 毫秒。方法论: n=18 次重复运行;任务定义 = 重复的 3x3 REAL 矩阵向量评估及模拟状态更新;基准比较器 = 嵌套 `FOR` 循环的结构化文本实现;时间窗口 = 2026 年 3 月的基准测试。这支持了关于该测试设置中实现开销的有限声明。它并不证明展开的梯形图在所有 PLC 系列、固件版本或编译器上总是更快。
这种区别至关重要,因为看门狗定时器不是哲学问题,它们会导致真实的 CPU 故障。
模型预测控制 (MPC) 中矩阵数学的作用是什么?
矩阵数学是 MPC 的计算核心。控制器根据模型预测未来的过程行为,评估控制动作,并根据多个相互作用变量的预期响应来更新输出。
标准的离散时间状态空间形式为:
\[ x(k+1)=Ax(k)+Bu(k) \]
其中:
- \(x(k)\) = 当前状态向量
- \(x(k+1)\) = 下一个预测状态向量
- \(A\) = 描述内部过程动态的系统矩阵
- \(B\) = 描述操纵变量如何影响状态的输入矩阵
- \(u(k)\) = 控制输入向量
在 PLC 术语中,这些对象变成了标签和数组:
- `Matrix_A` 存储过程动态系数
- `Matrix_B` 存储输入影响系数
- `Vector_x` 存储当前测量或估计的状态
- `Vector_u` 存储当前的操纵输入
- `Vector_x_Next` 存储预测的下一个状态
重要的区别在于 SISO(单输入单输出)与 MIMO(多输入多输出)。PID 回路通常处理一个测量变量对一个操纵变量的关系。MPC 是为多输入、多输出行为而构建的,其中改变一个执行器可能会同时影响多个过程变量。蒸汽系统、储罐网络、热力撬块以及压力-流量相互作用通常不会保持解耦状态。
状态空间方程如何映射到梯形图数组?
状态空间方程通过将矩阵和向量转换为 PLC 数组,然后显式执行每个点积运算,从而映射到梯形图中。梯形图可以表示数学运算,但它不会为您进行抽象。
对于一个紧凑的 2x2 示例,标签结构可以定义如下:
2x2 系统的标签字典结构
- `Matrix_A`: 二维 `REAL` 数组 `[0..1, 0..1]` - `Vector_x`: 一维 `REAL` 数组 `[0..1]` - `Vector_x_Next`: 一维 `REAL` 数组 `[0..1]` - `Temp_Mul_00`: `REAL` - `Temp_Mul_01`: `REAL` - `Temp_Mul_10`: `REAL` - `Temp_Mul_11`: `REAL`
- 存储系统动态系数
- 存储当前状态,例如液位和温度
- 存储下一个预测的状态值
- 用于存储 `Matrix_A[0,0] * Vector_x[0]` 的临时存储区
- 用于存储 `Matrix_A[0,1] * Vector_x[1]` 的临时存储区
- 用于存储 `Matrix_A[1,0] * Vector_x[0]` 的临时存储区
- 用于存储 `Matrix_A[1,1] * Vector_x[1]` 的临时存储区
操作规则很简单:矩阵的每一行变成一个点积计算,每个点积变成一系列显式的乘法和加法。在纸上很优雅,但在梯形图中很繁琐。然而,CPU 更关心可预测性而非优雅。
在 OLLA Lab 中,这变得可检查而非理论化。梯形图编辑器可以与变量面板配对,这样工程师可以在模拟过程中实时观察每个数组索引、临时寄存器和最终的状态值更新。这在操作上很有用,因为它不仅让您验证梯级在语法上是否有效,还能在涉及任何实际输出卡之前,验证数组绑定和中间值在数值上是否合理。
为什么梯形图难以处理矩阵乘法?
梯形图难以处理矩阵乘法,因为标准的梯形图是面向指令的,而不是面向代数的。它是围绕触点、线圈、功能块和确定性梯级执行设计的,而不是高密度线性代数。
核心限制通常是:
- 没有原生矩阵运算符
- 标准梯形图环境通常不提供用于矩阵-向量或矩阵-矩阵乘法的单一指令。
- 循环人体工程学受限
- 在结构化文本中进行迭代通常比在梯形图中更容易。
- 严重依赖临时标签
- 即使是小的矩阵运算也需要为每个部分积提供中间存储。
- 扫描周期敏感性
- 浮点运算、数组索引和重复计算会消耗可测量的执行时间。
这并不意味着梯形图无法完成这项工作。这意味着工程师必须在两种实现风格之间做出选择:
选项 1:使用结构化文本进行循环
这通常是数学运算更紧凑的表达方式。嵌套的 `FOR` 循环可以清晰地计算矩阵-向量积,尤其是在维度可能发生变化时。
优点
- 代码更短
- 更容易扩展到更大的矩阵
- 对迭代数学更自然
权衡
- 执行开销可能会根据平台和编译器行为而增加
- 对于主要使用梯形图的团队来说,调试可见性可能不那么直观
- 一些维护团队更喜欢显式的逐梯级逻辑以便进行故障排除
选项 2:在梯形图中展开矩阵数学
这意味着显式地编写每个乘法和加法。
优点
- 确定性且视觉上可追踪的执行
- 更容易进行梯级级别的故障排除
- 通常更符合梯形图中心系统对维护的期望
权衡
- 实现冗长
- 随着矩阵大小的增加,可扩展性较差
- 如果命名规范较弱,则存在很高的复制粘贴错误风险
这是经典的对比:紧凑的代码与透明的执行。在实时过程中,透明的逻辑通常更易于维护。
PLC 中基于数组的数学运算有哪些扫描时间风险?
基于数组的浮点数学运算会显著增加 PLC 的扫描时间。如果总执行时间超过了为该控制器配置的看门狗阈值,CPU 可能会发生故障并停止执行。
这是实际的硬件风险。不是“代码感觉很重”,而是故障。
扫描时间的负担通常来自多种因素的组合:
- REAL 算术
- 在许多 PLC 平台上,浮点运算比整数运算开销更大。
- 数组索引
- 与固定标量标签相比,索引访问增加了寻址开销。
- 嵌套循环
- 重复迭代会迅速成倍增加执行成本。
- 额外的模拟逻辑
- 缩放、滤波、限幅和报警检查通常围绕着矩阵数学,而不是替换它。
- 单次扫描执行
- 每个扫描周期都运行完整的计算可能是不必要的且昂贵的。
看门狗定时器设置因控制器系列和应用设计而异。在实践中,广泛的“通常为 10–50 毫秒”范围很常见,但相关的数字始终是目标系统上配置的阈值。标准无法将控制器从其无法及时完成的算术运算中拯救出来。
扫描时间缓解策略
主要的缓解策略是架构上的,而不是修饰性的。
#### 1. 展开关键计算
为小矩阵中的每一项编写显式的 `MUL` 和 `ADD` 指令。
- 最适合小型固定维度系统
- 提高可追溯性
- 在某些环境中避免了循环开销
#### 2. 时间片计算
使用步进索引或状态机将矩阵计算分配到多个扫描周期中。
- 降低峰值扫描负载
- 对大型计算有用
- 引入了必须在控制性能中考虑的延迟
#### 3. 优化数据类型
在过程分辨率和范围允许的情况下,使用缩放后的整数数学(如 `DINT`)。
- 可以降低执行成本
- 需要严格的缩放和溢出管理
- 对于高分辨率过程模型并不总是可接受的
#### 4. 降低执行频率
如果过程动态允许,则在较慢的周期性任务中运行预测计算。
- 适用于较慢的热力或液位系统
- 不太适用于快速运动或严格的压力控制
- 必须与控制目标保持一致
#### 5. 尽可能预计算常量
存储固定系数,并避免对扫描周期内不发生变化的数值进行重复计算。
- 减少不必要的算术运算
- 简化运行时执行路径
一个实用的修正值得明确说明:更快的扫描时间并不自动意味着更好的控制。对于 MPC,问题在于控制更新速率是否适合该过程,以及控制器是否能够承受。快速且不稳定仍然是不稳定的。
如何在 OLLA Lab 中逐步构建 2x2 矩阵乘法器?
梯形图中的 2x2 矩阵-向量乘法器是通过为每个输出索引计算一个点积来构建的。每个输出元素都是来自一个矩阵行和输入向量的乘积之和。
假设:
\[ A = \begin{bmatrix} a_{00} & a_{01}\\ a_{10} & a_{11} \end{bmatrix} ,\quad x = \begin{bmatrix} x_0\\ x_1 \end{bmatrix} \]
则:
\[ x_{next,0} = a_{00}x_0 + a_{01}x_1 \]
\[ x_{next,1} = a_{10}x_0 + a_{11}x_1 \]
第 1 步:计算索引 0 的第一个部分积
将 `Matrix_A[0,0]` 乘以 `Vector_x[0]` 并将结果存储在 `Temp_Mul_00` 中。
- 源 A: `Matrix_A[0,0]` - 源 B: `Vector_x[0]` - 目标: `Temp_Mul_00`
第 2 步:计算索引 0 的第二个部分积
将 `Matrix_A[0,1]` 乘以 `Vector_x[1]` 并将结果存储在 `Temp_Mul_01` 中。
- 源 A: `Matrix_A[0,1]` - 源 B: `Vector_x[1]` - 目标: `Temp_Mul_01`
第 3 步:对输出索引 0 的乘积求和
将 `Temp_Mul_00` 和 `Temp_Mul_01` 相加,然后将结果存储在 `Vector_x_Next[0]` 中。
- 源 A: `Temp_Mul_00` - 源 B: `Temp_Mul_01` - 目标: `Vector_x_Next[0]`
第 4 步:对输出索引 1 重复该模式
乘并求和第二行:
- `Matrix_A[1,0] * Vector_x[0] -> Temp_Mul_10`
- `Matrix_A[1,1] * Vector_x[1] -> Temp_Mul_11`
- `Temp_Mul_10 + Temp_Mul_11 -> Vector_x_Next[1]`
第一行的梯形图概念
|----[MUL Matrix_A[0,0] Vector_x[0] ]----------------(Temp_Mul_00)----| |----[MUL Matrix_A[0,1] Vector_x[1] ]----------------(Temp_Mul_01)----| |----[ADD Temp_Mul_00 Temp_Mul_01 ]--------------(Vector_x_Next[0])--|
媒体概念: 2x2 状态矩阵第 0 行的展开式 `MUL` 和 `ADD` 指令。
图片替代文本: OLLA Lab 梯形图编辑器的截图,显示了展开为显式 MUL 和 ADD 块的 2x2 矩阵乘法,变量面板显示了多变量预测控制场景下生成的 REAL 数组值。
在 OLLA Lab 中,实际的工作流程是在基于浏览器的梯形图编辑器中构建此梯级序列,运行模拟模式,并在变量面板中检查 `Matrix_A`、`Vector_x`、临时标签和 `Vector_x_Next`。这使工程师能够分别确认三件事:
- 算术运算是正确的,
- 标签映射是正确的,
- 扫描时间成本在模拟负载下保持在可接受范围内。
这是一个有用的区别,因为错误的数学运算和错误的接线通常会产生相同的第一个症状:过程变量正朝着无益的方向发展。
如何针对数字孪生验证 PLC 矩阵数学?
数学上的正确性是必要的,但不是充分的。矩阵计算在数值上可能是正确的,但当连接到具有耦合、延迟、饱和和干扰的模拟工厂时,仍可能产生较差的控制行为。
对于本文而言,数字孪生验证意味着一种操作上的具体含义:针对真实的模拟设备模型运行梯形图实现,注入受控的更改或故障,并在任何现场部署之前比较控制器状态、I/O 行为和过程响应。
在 OLLA Lab 中,该验证工作流程可以包括:
- 将基于数组的逻辑绑定到多变量模拟场景,
- 在模拟模式下调整过程输入和干扰,
- 实时观察变量和 I/O 行为,
- 比较梯形图状态与模拟设备状态,
- 并在出现异常行为后修改实现。
一个有用的测试案例是耦合过程,例如流量和罐压或液位和温度。在一个操纵变量中注入阶跃变化,然后验证预测的状态更新是否在没有失控振荡、饱和或不可信的交叉耦合的情况下跟踪模拟的过程响应。
这就是应该正确定义“模拟就绪 (Simulation-Ready)”的地方。一名“模拟就绪”的工程师不仅仅是能够编写有效 PLC 语法的人,更是一位能够在逻辑到达实际过程之前,证明、观察、诊断并强化控制逻辑以抵御真实过程行为的工程师。语法很容易令人赞叹,但可部署性却不那么宽容。
您应该记录哪些工程证据?
如果您想展示在高级 PLC 逻辑方面的能力,请构建一个紧凑的工程证据体系,而不是截图库。
使用此结构:
- 定义过程、状态、操纵变量和控制目标。
- 用可衡量的术语说明可接受的行为意味着什么:稳定时间、有界超调、无看门狗故障、稳定的状态更新、正确的联锁行为。
- 展示实现的梯级、相关标签以及相应的模拟工厂响应。
- 记录引入的干扰、错误的系数、传感器故障、饱和事件或定时压力。
- 解释应用了什么逻辑、调度、缩放或数据类型更改。
- 说明故障揭示了关于模型、实现或控制器限制的什么信息。
- 系统描述
- “正确”的操作定义
- 梯形图逻辑和模拟设备状态
- 注入的故障案例
- 所做的修订
- 经验教训
该结构比精美的截图更有价值,因为它展示了在约束条件下的工程判断力。雇主和审查人员通常不太关心梯级看起来是否整洁,而更关心当模型出现异常时您是否知道该怎么做。
何时应该将 MPC 数学保留在 PLC 中,何时不应该?
只有当控制器、任务结构和过程动态支持时,MPC 数学才属于 PLC。高级控制向边缘和本地执行的迁移是真实的,但这并不意味着每个 PLC 都应该成为一个小型的、过度劳累的 DCS。
当满足以下条件时,请将计算保留在 PLC 中:
- 矩阵维度适中,
- 执行时间有界且经过测试,
- 过程受益于本地确定性响应,
- 维护团队可以支持该实现,
- 验证已显示在真实干扰下的稳定行为。
当以下条件占主导地位时,请将计算移动到 DCS、工业 PC 或边缘计算层:
- 更大的优化范围,
- 更繁重的矩阵运算,
- 频繁的模型更新,
- 受限的 PLC 资源,
- 或不可接受的扫描时间影响。
工程问题不在于基于 PLC 的 MPC 是否时髦,而在于该实现是否在目标硬件上可审计、确定且可支持。这些词汇不如“AI”或“优化”那样光鲜亮丽,但它们能让工厂保持运行。
评估此方法时,哪些标准和文献很重要?
此实现涵盖了控制理论、PLC 执行约束、模拟实践和安全相关的工程学科。没有单一的标准告诉您如何在梯形图中编写矩阵乘法,但多部文献和标准塑造了正确的边界。
相关参考资料包括:
- IEC 61131-3
- 规范了梯形图和结构化文本等 PLC 编程语言。
- IEC 61508
- 为电气/电子/可编程电子系统的功能安全提供了更广泛的框架。
- exida 指导和安全生命周期文献
- 对于理解证明、验证纪律以及功能行为与安全声明之间的分离非常有用。
- IFAC 和过程控制文献
- 与 MPC 架构、状态空间建模和约束优化相关。
- 数字孪生和模拟培训文献
- 与针对真实工厂行为验证逻辑和提高调试准备度相关。
一个必要的界限:在模拟中验证控制逻辑本身并不能确立 SIL 适用性、监管合规性或现场能力。它改进了部署前的证据,但不能取代工程学的其他部分。
互联链接
向上链接: 要将基于数组的控制逻辑置于更广泛的自动化环境中,请返回“梯形图掌握中心 (Ladder Logic Mastery Hub)”。
横向链接: 有关噪声过程测量下的状态估计,请阅读《在结构化文本中实现一维卡尔曼滤波器:大师课》。
横向链接: 有关从更高级系统到 PLC 可执行逻辑的模型转换,请参阅《将神经网络权重转换为 PLC 逻辑》。
向下链接: 要安全地演练矩阵数学、扫描时间限制和多变量验证,请在 OLLA Lab 中打开“多变量优化预设 (Multi-Variable Optimization Preset)”。
References
相关阅读
- 向下: 在 OLLA Lab 中练习此工作流程。
- 向上: 探索完整的梯形图掌握中心。
- 横向: 相关文章 1。
- 横向: 相关文章 2。
- 横向: 相关文章 3。