如何从XML文件读取大小可变的数组?

时间:2018-11-13 12:37:10

标签: arrays xml twincat

编写程序读取XML文件时,我正在使用TwinCat。 我需要读取XML文件中的点数组。但积分的数量可以变化。有没有一种方法可以根据XML数据创建数组。

1 个答案:

答案 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