Codesys добавляет элементы в производную структуру - PullRequest
0 голосов
/ 30 марта 2020

Возможно ли добавить элементы в экземпляр структуры.

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

StructDerived : StructBase;

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

Элементы StructDerived будут пронумерованы в функции 'enum'. По завершении элементы StructDerived используются для оператора case.

Идея состоит в том, чтобы иметь полную абстрактную функцию, готовую с базовыми c необходимыми мне функциями. Когда эта функция расширена, должно быть понятно, куда что добавить. так что все устройства в машине, например, все имеют одинаковую планировку.

То, что я изучал, было примерно таким:

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:
        ....

«Имя» регистрируется для отслеживания состояния , Похоже, много работы, где что-то вроде список или словарь может помочь.

Спасибо за любые советы в этом вопросе.

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Структурированный текст является языком со строгой типизацией, и динамическое добавление элементов в структуру во время выполнения невозможно.

Структура данных не является функцией, поэтому вам следует создать функциональный блок вместо структуры если вы собираетесь иметь полную абстрактную функцию

, готовую с базовыми c функциональностями, которые мне требуются

" case ", инструкции имеют одну условная переменная , которая проверяется по одной или нескольким условным инструкциям (целочисленные литералы).

Вы не можете использовать переменные в качестве условных инструкций .

Вы можете использовать наследование для расширения структур и функциональных блоков, чтобы создать иерархию различных модулей и устанавливать их в разных случаях для разных целей.

0 голосов
/ 31 марта 2020

Во-первых, вы не можете использовать строки в CASE. Только ANY_NUM или ANY_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

То же самое.

Во-вторых, если вы хотите создать универсальную функцию, которая принимает различное количество элементов, вы должны использовать указатели. Это общий ответ, если вы отредактируете свой вопрос и опишите, что вы хотите сделать в целом, я отредактирую свой ответ и дополню его решением.

...