『7x24小时有问必答』

▎西门子博途 LGF 库详解 · 08:矩阵运算——加减乘除、转置求逆一次搞定

博途原生指令没有矩阵运算。要做个 3x3 矩阵乘法?自己写嵌套循环,自己管索引,自己 debug。几个矩阵一多,代码可读性直接归零。
LGF 的矩阵运算组 7 个块直接填上这个空白。从前三篇的位逻辑和数学函数过渡到这里,你会发现 LGF 的野心不止于"辅助工具"——它在认真补博途的数学能力短板。文末有一个关于 MatrixInverse 的关键更正,看看你有没有和我踩过同样的坑。

一、7 个块一览

矩阵运算组(4.6 Math operations / Matrix)

| 块名 | 类型 | 版本 | 功能 | 约束 |
|------|------|------|------|------|
| LGF_MatrixAddition | FC | V3.0.1 | 矩阵加法 A + B | A、B 同尺寸 |
| LGF_MatrixSubtraction | FC | V3.0.1 | 矩阵减法 A - B | A、B 同尺寸 |
| LGF_MatrixMultiplication | FC | V3.0.1 | 矩阵乘法 A × B | A 的列数 = B 的行数 |
| LGF_MatrixScalarMultiplication | FC | V3.0.1 | 标量乘法 k × A | — |
| LGF_MatrixTranspose | FC | V3.0.1 | 矩阵转置 Aᵀ | 输出矩阵的维度为输入维度的行列互换 |
| LGF_MatrixInverse | FC | V3.0.1 | 矩阵求逆 A⁻¹ | 方阵(行数=列数)即可,不限尺寸 |
| LGF_MatrixCompare | FC | V3.0.1 | 比较两个矩阵是否完全相等 | 同尺寸 |
所有 7 个块都是 FC(无状态函数),操作统一的 Array[,] of LReal 二维数组。矩阵尺寸通过数组声明自动识别,不需要额外的 rows/cols 参数——这和某些第三方库不同,使用起来更简洁。

二、引脚详解

#### LGF_MatrixAddition(加法)
引脚类型方向说明
matrix1Array[*,*] of LRealINOUT第一个加数矩阵
matrix2Array[*,*] of LRealINOUT第二个加数矩阵
matrixResultArray[*,*] of LRealINOUT结果矩阵(matrix1 + matrix2)
Ret_ValVoidOUT无返回值
errorBoolOUTFALSE=正常;TRUE=出错
statusWordOUT状态码
#### LGF_MatrixSubtraction(减法)
接口与加法完全一致,功能为 matrix1 - matrix2。
引脚类型方向说明
matrix1Array[*,*] of LRealINOUT被减数矩阵
matrix2Array[*,*] of LRealINOUT减数矩阵
matrixResultArray[*,*] of LRealINOUT结果矩阵(matrix1 - matrix2)
Ret_ValVoidOUT无返回值
errorBoolOUT错误标志
statusWordOUT状态码
#### LGF_MatrixMultiplication(乘法)
引脚类型方向说明
matrix1Array[*,*] of LRealINOUT左乘矩阵(尺寸 m×k)
matrix2Array[*,*] of LRealINOUT右乘矩阵(尺寸 k×n)
matrixResultArray[*,*] of LRealINOUT结果矩阵(尺寸 m×n)
Ret_ValVoidOUT无返回值
errorBoolOUT错误标志
statusWordOUT状态码
#### LGF_MatrixScalarMultiplication(标量乘法)
引脚类型方向说明
scalarLRealIN标量乘数 k
matrixInputArray[*,*] of LRealINOUT输入矩阵
matrixResultArray[*,*] of LRealINOUT结果矩阵(k × 每个元素)
Ret_ValVoidOUT无返回值
errorBoolOUT错误标志
statusWordOUT状态码
#### LGF_MatrixTranspose(转置)
引脚类型方向说明
matrixArray[*,*] of LRealINOUT待转置的矩阵(m×n)
matrixTransposeArray[*,*] of LRealINOUT转置结果(n×m)
Ret_ValVoidOUT无返回值
errorBoolOUT错误标志
statusWordOUT状态码
#### LGF_MatrixInverse(求逆)
引脚类型方向说明
matrixArray[*,*] of LRealINOUT待求逆的方阵
matrixResultArray[*,*] of LRealINOUT逆矩阵结果
Ret_ValVoidOUT无返回值
errorBoolOUT错误标志
statusWordOUT状态码

关于 MatrixInverse 的尺寸限制——一个重要更正

根据官方文档,MatrixInverse 使用 Shipley-Coleman 方法求逆,理论上支持任意大小的方阵,不限于 2x2 或 3x3。但需要注意两个实际限制:
1. 矩阵必须是方阵(行数 = 列数),否则返回错误。
2. 随着矩阵尺寸增大,数值精度会下降,计算时间也会增加。对于 4x4 及以上矩阵,建议在实际 PLC 上测试精度和扫描周期影响后再用于生产环境。
#### LGF_MatrixCompare(比较)
引脚类型方向说明
matrix1Array[*,*] of LRealINOUT第一个矩阵
matrix2Array[*,*] of LRealINOUT第二个矩阵
Ret_ValBoolOUTTRUE=两个矩阵完全相同
errorBoolOUT错误标志
statusWordOUT状态码

MatrixCompare 的精度问题

MatrixCompare 是精确比较,要求两个矩阵的每一个元素都完全相等。这意味着即使是浮点运算中微小的舍入误差(如 1/3 × 3 ≠ 1.0)也会导致 Ret_Val = FALSE。如果你需要容差比较,应该自己写一个循环,用 CompareLRealByPrecision(第 04 篇讲的)逐个元素比较,而不是直接用 MatrixCompare。

三、实战案例

#### 案例 1:AGV 坐标旋转
AGV 在工位前需要旋转 30°,用 2x2 旋转矩阵乘以当前位置向量:

MatrixMultiplication 坐标旋转

变量声明:
rotationMtx : Array[0..1, 0..1] of LReal := [cos30, -sin30, sin30, cos30]
position      : Array[0..1, 0..0] of LReal := [posX, posY]
newPosition : Array[0..1, 0..0] of LReal
计算:
LGF_MatrixMultiplication(matrix1 := rotationMtx, matrix2 := position,
matrixResult => newPosition);
做完后 newPosition[0,0] 和 newPosition[1,0] 就是旋转后的 X 和 Y 坐标。
#### 案例 2:检验刚度矩阵是否对称
有限元计算中的刚度矩阵应该是对称的(K = Kᵀ)。用 Transpose + Compare 验证:

对称性检验

LGF_MatrixTranspose(matrix := stiffnessMtx, matrixTranspose => stiffnessT);
isSymmetric := LGF_MatrixCompare(matrix1 := stiffnessMtx, matrix2 := stiffnessT);
#### 案例 3:传感器标定的标量修正
10 个传感器的出厂校准系数需要统一乘以 1.05:

MatrixScalarMultiplication 批量标定

LGF_MatrixScalarMultiplication(scalar := 1.05, matrixInput := calibMtx,
matrixResult => calibMtx);
注意 matrixInput 和 matrixResult 可以是同一个变量——因为它们是 INOUT 参数,原地操作不会产生冲突。

四、使用注意

避坑提醒

1. INOUT 参数意味着原地操作——所有矩阵块的 matrix1/matrix2/matrixResult 都是 INOUT。这意味着调用后原始数据会保留在数组里,不会被"消耗掉"。但如果你不希望修改原始矩阵,调用前先复制一份。
2. 矩阵尺寸通过声明自动确定——不需要传 rows/cols 参数。但这也意味着你必须正确声明数组尺寸,声明错了(如乘法时 A=3x3 但 B=2x3)会返回错误。
3. 所有块都是 FC,无内部状态——每次调用完全独立,不依赖上一次结果。
4. 大矩阵注意扫描周期——一个 10x10 矩阵乘法的计算量约 10³=1000 次乘加。如果你的 OB1 周期很短(<5ms),建议把大矩阵计算放在较慢的循环中断 OB 中。

五、总结与下载

矩阵运算组是 LGF 库中被低估的一组块。大多数工程师不知道博途里可以直接做矩阵乘法——等知道了,可能已经自己写了半个月的嵌套循环。

下载信息

| 项目 | 内容 |
|------|------|
| 库名称 | Library of General Functions (LGF) |
| SIOS-ID | 109479728 |
| 下载地址 | 中文站:www.ad.siemens.com.cn/download/documentdetail_12471.html |
| 当前版本 | V5.1.1(中文站最新;SIOS 全球站另有面向高版本博途的 V5.2.1) |
| 兼容 | TIA Portal V17+、S7-1200 (固件 ≥V4.2)、S7-1500 (固件 ≥V2.0) |
| 费用 | 完全免费 |
> 本文所有引脚数据基于 LGF V5.1.1 官方文档(SIOS 109479728,372 页 PDF)。全球站地址:support.industry.siemens.com/cs/document/109479728
下篇预告:LGF 库详解 · 09——CRC 校验(上)。CRC8 全套 3 个块:标准 CRC8、高级自定义 CRC8、单字节 CRC8。Modbus 和 1-Wire 传感器通信中的校验码怎么自动生成——下一篇一次讲透。
如果这篇文章对你有帮助,欢迎点赞、在看、转发给需要的同事。还没关注的,点右上角关注——这系列还有 16 篇在路上。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码