-1

在制作程序来读取我的 XML 文件时,我正在使用 TwinCat。我需要读取 XML 文件中的点数组。但点的数量可能会有所不同。是否有根据 XML 数据创建数组的方法。

4

1 回答 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 回答