在制作程序来读取我的 XML 文件时,我正在使用 TwinCat。我需要读取 XML 文件中的点数组。但点的数量可能会有所不同。是否有根据 XML 数据创建数组的方法。
问问题
523 次
1 回答
0
您无法在大多数基于 Codesys 的系统中定义动态数组。但是,如果需要,可以通过 VAR_IN_OUT 创建函数和块来处理动态大小的数组(TwinCAT 3 - 请参阅此链接)。
注意:实际上在最新的 TwinCAT 3 版本中,也可以使用__NEW
命令分配动态内存(请参阅此链接)。我还没有测试过,但是有一个例子如何在运行时创建一个大小为 25 的字节数组。这可能是一个好方法,但可能会出现一些问题,因为您需要在不再需要__DELETE
函数后删除使用的内存。
在这些系统中,通常会创建一个尽可能大的阵列。因此,请考虑一下您将在文件中拥有多少点的理论最大值,并创建一个该大小的数组。然后你只需要知道你添加了多少点供以后使用。这种方法使用起来非常安全,所以我建议你从它开始,而不是__NEW
.
帮助你理解的小简单代码:
PROGRAM PRG_XmlTest
VAR CONSTANT
MAXIMUM_ARRAY_SIZE : UINT := 9999;
END_VAR
VAR
PointArray : ARRAY[0..MAXIMUM_ARRAY_SIZE] OF REAL;
PointsInArray : UINT;
i : UINT;
END_VAR
//Deleting old data before loading
MEMSET(
destAddr := ADR(PointArray),
fillByte := 0,
n := SIZEOF(PointArray)
);
PointsInArray := 0;
//Loading your XML. NOTE: This is not a working code
WHILE Xml.HasPoints() DO
IF PointsInArray < MAXIMUM_ARRAY_SIZE THEN
PointArray[PointsInArray] := XmlReader.GetPoint();
PointsInArray := PointsInArray + 1;
ELSE
//Overflow, array is full. Do something
EXIT;
END_IF
END_WHILE
//To do something with your data.
//NOTE: Using MIN to prevent faults if PointsInArray has too large value
FOR i := 0 TO MIN(PointsInArray, MAXIMUM_ARRAY_SIZE) DO
DoSomething(PointArray[i]);
END_FOR
于 2018-11-14T06:12:22.937 回答