编写程序读取XML文件时,我正在使用TwinCat。 我需要读取XML文件中的点数组。但积分的数量可以变化。有没有一种方法可以根据XML数据创建数组。
答案 0 :(得分:0)
您不能在大多数基于Codesys的系统中定义动态数组。但是,可以根据需要创建函数和块,以通过VAR_IN_OUT处理动态大小数组(TwinCAT 3 - see this link)。
注意:实际上,在最新的TwinCAT 3版本中,也可以使用__NEW
命令(see this link)分配动态内存。我还没有测试过,但是有一个示例如何在运行时创建大小为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