Инициализировать массив пользовательских типов в синтаксисе структурированного текста - PullRequest
0 голосов
/ 01 февраля 2019

В моем проекте у меня есть такой тип:

TYPE myDataStruct :
STRUCT
    A : UINT;
    B : WORD;
    C : REAL;
    D : Custom_Obj;
END_STRUCT
END_TYPE

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

myarray := ARRAY[0..20] OF myDataStruct;

Как мне затем инициализировать этот массив в пустой массив?Что эквивалентно new на других языках?

Я догадался

myarray := [21(A := 0,
               B := '',
               C := 0.0,
               D := ??? )];

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

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Что эквивалентно new на других языках?

Аналогом этого является

VAR
    EmptyArray  : ARRAY[0..20] OF myDataStruct;
END_VAR

Если вы хотите предварительно заполнить егозначения по умолчанию

VAR
    EmptyArray  : ARRAY[0..20] OF myDataStruct := [
        (A := 100, B := 200, С := 0.0, D := ???),
        (A := 34, B := 45, С := 0.1, D := ???),
        ..... etc
    ];
END_VAR

Для CoDeSys 2.3 удалите [ и ].

Что нужно понимать, что EmptyArray - это не прототип данных, которые вам нужны, а уже инициализированная переменная.

0 голосов
/ 01 февраля 2019

Нет способа инициализировать его "x = new struct()" способом.Насколько я знаю, вы также не можете назначить весь массив в коде чем-то вроде myarray = [1, 2, 3] etc.

Если вы просто хотите установить его пустым со значениями, такими как 0, '' и т. Д., Тоя бы использовал два способа:

1.Используйте функцию MEMSET для установки всех байтов на 0

Ссылка на онлайн-справку

//Something like
MemSet(
    pbyBuffer   := ADR(myarray),    //Address of the variable
    byValue     := 0,               //Byte that address is filled with
    dwSize      := SIZEOF(myarray)  //How many bytes? (variable size)
)

2.Создайте фиктивную переменную и присвойте ее myarray

Переменная всегда инициализируется нулями, поэтому все значения типа EmptyArray равны 0 / пусты и т. Д.

VAR
    EmptyArray  : ARRAY[0..20] OF myDataStruct;
END_VAR

//In the code
myarray := EmptyArray;

НадеюсьЯ правильно понял ваш вопрос.

...