如何从 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