Инициализировать массив пользовательских типов в синтаксисе структурированного текста

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

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 := ??? )];

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


person Michael LeVan    schedule 31.01.2019    source источник
comment
Вы получили ответ?   -  person Sergey Romanov    schedule 03.02.2019


Ответы (2)


Что эквивалентно 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 это не прототип нужных вам данных, а уже инициализированная переменная.

person Sergey Romanov    schedule 01.02.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;

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

person Quirzo    schedule 01.02.2019