首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以间接索引结构化文本中的数组(IEC 61131-3标准)

是否可以间接索引结构化文本中的数组(IEC 61131-3标准)
EN

Stack Overflow用户
提问于 2020-02-04 19:38:59
回答 3查看 753关注 0票数 0

我有一个结构数组:myStructure[0..100]

我想按名称对该结构进行索引。

它的工作原理是为每个索引指定一个名称:

代码语言:javascript
运行
复制
P101_AI := 9
P102_AI := 10
P103_AI := 11
P104_AI := 12

所以索引结构中的一个成员:myStructure[P103_AI].value (即索引myStrutire11.value)

然而,是否有可能间接地对此进行索引?

即,如果不关心TempString : STRING[30];

在运行时更改TempString以对数组进行索引。

下面是一些伪装来描述我想要做的事情:

代码语言:javascript
运行
复制
FOR i:=101 TO 104 DO
   TempString := CONCAT('P',i);
   TempString := CONCAT(TempString,'_AI');
   MyStructure[ indirect(TempString)].value := 'some value';
END_FOR;
EN

回答 3

Stack Overflow用户

发布于 2020-02-05 04:24:37

创建枚举怎么样?

代码语言:javascript
运行
复制
{attribute 'qualified_only'}
TYPE E_AnalogInput :
(
    P101_AI := 9,
    P102_AI,
    P103_AI,
    P104_AI
);
END_TYPE

然后,您可以声明:

代码语言:javascript
运行
复制
analogInputs : ARRAY[E_AnalogInput.P101_AI..E_AnalogInput.P104_AI] OF INT;

运行for循环:

代码语言:javascript
运行
复制
FOR inputCount:=E_AnalogInput.P101_AI TO E_AnalogInput.P104_AI BY 1 DO
    //Do something
END_FOR

希望这能有所帮助

票数 1
EN

Stack Overflow用户

发布于 2020-02-06 13:55:22

我会使用指针和映射。首先,将您的结构更改为指针。

代码语言:javascript
运行
复制
TYPE MyType: STRUCT
        input: POINTER TO INT;
        value: INT;
        // other properties
    END_STRUCT
END_TYPE

然后,创建一个全局数组。

代码语言:javascript
运行
复制
VAR_GLOBAL
    MyStructure: ARRAY[1..100] OR MyType;
END_VAR

现在,在程序中创建一次运行代码。

代码语言:javascript
运行
复制
PROGRAM PLC_PRG:
    VAR
        xInit:= FALSE;
    END_VAR

    IF NOT xInit THEN
        xInit := TRUE;
        mMap();
    END_IF
END_PROGRAM

现在,在方法或动作mMap中,对每个数组元素执行此操作。

代码语言:javascript
运行
复制
MyStructure[1].input:= ADR(AI_Name);
MyStructure[2].input:= ADR(P102_AI);
MyStructure[3].input:= ADR(%ID0.1);

我使用了三种不同的方法来绑定指针。我认为顺序并不重要。然后在程序中,你可以做到这一点。

代码语言:javascript
运行
复制
FOR i := 1 TO 100 DO
   MyStructure[i].value := 'MyStructure[i].input^;
END_FOR;
票数 0
EN

Stack Overflow用户

发布于 2020-02-20 11:18:41

这就是我解决这个问题的方法。

代码语言:javascript
运行
复制
TYPE infoType: STRUCT
    name: STRING[20];
    END_STRUCT
END_TYPE
代码语言:javascript
运行
复制
TYPE sensorType: STRUCT
    value: INT;
    info:  infoType;
    END_STRUCT
END_TYPE
代码语言:javascript
运行
复制
TYPE IO_Type: STRUCT
    AI: ARRAY[1..100] OF sensorType;
    END_STRUCT
END_TYPE
代码语言:javascript
运行
复制
TYPE E_AnalogInput :
(
    P101_AI := 9,
    P102_AI,
    P103_AI,
    P104_AI
);
END_TYPE
代码语言:javascript
运行
复制
PROGRAM PLC_PRG:
    VAR
        IOs: IO_Type;
    END_VAR

    IOs.AI[P101_AI].info.name := 'P101_AI';

    FOR i:=101 TO 104 DO
        TempString := CONCAT('P',i);
        TempString := CONCAT(TempString,'_AI');
        FOR i:=0 TO SIZE_OF(ADR(IOs.AI)) / SIZE_OF(ADR(IOs.AI[0]))  DO
            IF TempString = IOs.AI[i].info.name THEN
                IOs.AI[i].value := 123; // Some value
                EXIT;
            END_IF;
        END_FOR;
    END_FOR;

END_PROGRAM
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60056589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档