Codesys中ST语言实现矩阵乘法结果异常的原因排查
CODESYS结构化文本实现矩阵乘法结果错误的原因分析
你的代码回顾
变量初始化代码
PROGRAM POU VAR a: ARRAY [1..5,1..2] OF INT:= [1,2,3,4,5,6,7,8,9,1]; b: ARRAY [1..2,1..5] OF INT := [1,2,3,4,5,6,7,8,9,1]; r1: INT:= 5; // no. of rows in a; c1: INT:=2; // no. of columns in a; r2: INT:= 2; //no. Of rows in b; c2: INT:= 5; //no. of columns in b; i: INT; j: INT ; k: INT; z: INT:=2; result: ARRAY [1..5,1..5] OF INT:= 0; END_VAR
矩阵乘法逻辑代码
FOR i:=1 TO r1 DO FOR j:=1 TO c2 DO FOR k:=1 TO z DO result[i,j]:= result[i,j]+(a[i,k]*b[k,j]); END_FOR END_FOR END_FOR
可能的错误原因
1. 多维数组初始化顺序不符合预期
CODESYS中多维数组的初始化是按列优先填充,而非常规认知的行优先。以你的数组a为例:
- 定义为
ARRAY [1..5,1..2](5行2列),初始化列表[1,2,3,4,5,6,7,8,9,1]会被按列赋值:- 第一列:
a[1,1]=1、a[2,1]=2、a[3,1]=3、a[4,1]=4、a[5,1]=5 - 第二列:
a[1,2]=6、a[2,2]=7、a[3,2]=8、a[4,2]=9、a[5,2]=1
如果你的预期是行优先赋值(比如a[1,1]=1、a[1,2]=2,a[2,1]=3、a[2,2]=4...),那么数组实际存储的数值和你预想的完全不一致,最终计算结果必然错误。
- 第一列:
2. 结果数组result初始化不彻底
在CODESYS中,多维数组仅写:= 0只会将数组的第一个元素初始化为0,其余元素会保留内存中的随机初始值。在矩阵乘法的累加过程中,这些随机值会被加入计算,导致最终结果完全偏离预期。
正确的初始化方式应该是显式地将所有元素设为0,比如:
result: ARRAY [1..5,1..5] OF INT:= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
或者在程序开始时通过循环遍历所有元素赋值为0。
3. 循环变量z硬编码存在维护风险
虽然当前z=2和c1、r2的值一致,但硬编码的方式会导致后续修改矩阵维度时,若忘记同步修改z的值,就会出现循环次数错误,进而导致计算结果错误。建议直接使用c1(或r2,因为矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数)作为循环上限:
FOR k:=1 TO c1 DO result[i,j]:= result[i,j]+(a[i,k]*b[k,j]); END_FOR
内容的提问来源于stack exchange,提问作者Nehal Trivedi
相关产品推荐
相关产品推荐

