0

是否可以将元素添加到 struct.

TYPE StructBase:
STRUCT
   Start : INT;
   Complete : INT;
END_STRUCT
END_TYPE

StructDerived : StructBase;

StructDerived.StateInit : INT;
StructDerived.StateMoveFwd : INT;

StructDerived 的元素将在“枚举”函数中编号。完成后,StructDerived 元素用于 case 语句。

这个想法是准备一个完整的抽象函数,并准备好我需要的基本功能。当这个功能被扩展时,应该清楚在哪里添加什么。因此,例如机器中的所有单元都具有相同的布局。

我正在研究的是这样的:

TYPE BaseState:
STRUCT
   EnumVal : INT;
   Name : STRING;
END_STRUCT
END_TYPE

TYPE StructBase:
STRUCT
   StateArray : ARRY [..] OF BaseState;
END_STRUCT
END_TYPE

StructDerived : StructBase;
StructDerived[0].Name := 'StateInit';
StructDerived[1].Name := 'StateMoveFwd';

So if i would use it in a case:
CASE AbortingState OF
    StructDerived[0].EnumVal:
        ....

记录“名称”以进行状态跟踪。看起来像列表字典之类的东西会做很多工作。

感谢您对此事的任何建议。

4

2 回答 2

0

结构化文本是一种强类型语言,无法在运行时动态地将元素添加到结构中。

数据结构不是函数,因此如果您打算拥有一个数据结构,则应该设计一个功能块而不是结构

具备我需要的基本功能的完整抽象功能

case of ” 指令有一个条件变量,该变量根据一个或多个条件指令(整数文字)进行检查。

您不能将变量用作条件指令

您可以使用继承来扩展结构和功能块,以便创建不同模块的层次结构,并在不同场合将它们实例化以用于不同目的。

于 2020-03-31T08:58:12.693 回答
0

首先,您不能在CASE. 仅ANY_NUMANY_BYTE一般类型。所以,如果你想使用枚举,你会像这样使用它。

TYPE EN_STEPS: (
    enStateInit,
    enStateMoveFwd
);
END_TYPE

TYPE BaseState:
STRUCT
   EnumVal : INT;
   Step : EN_STEPS;
END_STRUCT
END_TYPE

GLOBAL_VAR
   StateArray : ARRAY [1..c_TOTAL] OF BaseState := 
       (EnumVal := 0, Step := enStateInit),
       (EnumVal := 0, Step := enStateMoveFwd);
END_VAR

GLOBAL_VAR CONSTANT
    c_TOTAL: INT := 2;
END_VAR

然后在程序中

VAR
    currentStep : EN_STEPS;
END_VAR

CASE currentStep OF
StateArray[0].Step:
    //do something
END_CASE

但这并不完全清楚你为什么要这样做。看起来没有实际的应用程序。你可以简单地做

TYPE EN_STEPS: (
    enStateInit,
    enStateMoveFwd
);
END_TYPE

VAR
    currentStep : EN_STEPS;
END_VAR

CASE currentStep OF
enStateInit:
    //do something
END_CASE

同样的事情。

其次,如果你想创建一个接受不同数量元素的通用函数,你必须使用指针。这是一个一般性的答案,如果您编辑您的问题并描述您一般想要做什么,我将编辑我的答案并用解决方案扩展它。

于 2020-03-31T06:55:33.310 回答