如何从 XML 文件中读取不同大小的数组?
How to read an Array of varying size from a XML file?
我正在使用 TwinCat,在编写程序来读取我的 XML 文件时。
我需要读取 XML 文件中的点数组。但点数可能会有所不同。有没有一种方法可以根据 XML 数据创建数组。
您不能在大多数基于 Codesys 的系统中定义动态数组。但是,如果需要 (TwinCAT 3 - see this link),可以通过 VAR_IN_OUT 创建函数和块来处理动态大小的数组。
注意:实际上在最新的 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
我正在使用 TwinCat,在编写程序来读取我的 XML 文件时。 我需要读取 XML 文件中的点数组。但点数可能会有所不同。有没有一种方法可以根据 XML 数据创建数组。
您不能在大多数基于 Codesys 的系统中定义动态数组。但是,如果需要 (TwinCAT 3 - see this link),可以通过 VAR_IN_OUT 创建函数和块来处理动态大小的数组。
注意:实际上在最新的 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