Каков наилучший способ очистить всю структуру в структурированном тексте - PullRequest
0 голосов
/ 20 февраля 2020

Вот так у меня сейчас

TYPE MyType: STRUCT
    name: STRING[20];
    input: INT;
    output: INT;
    END_STRUCT
END_TYPE
PROGRAM PLC_PRG:
    VAR
        struct:  MyType;
        struct_NULL:  MyType;
        error: BOOL;
    END_VAR

    IF error THEN
        struct := struct_NULL;
    END_IF
END_PROGRAM

Есть ли другой способ обнулить структуру, не объявляя и не используя struct_NULL

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Просто используйте функции SysMemSet (библиотека Codesys SysMem), MemSet (библиотека Codesys MemoryUtils) или MEMSET (библиотека Tc2_System библиотеки TwinCAT 3), чтобы установить для всех данных значение 0.

SysMemSet(
    pDest       := ADR(TestStruct), 
    udiValue    := 0, 
    udiCount    := SIZEOF(TestStruct)
);

You может написать для него простую вспомогательную функцию:)

FUNCTION F_Clear : BOOL
VAR_INPUT
    Target : ANY;
END_VAR
VAR
END_VAR


SysMemSet(
    pDest       := Target.pValue, 
    udiValue    := 0, 
    udiCount    := Target.diSize
);

Использование, работает для всех видов переменных!

F_Clear(TestStruct);
1 голос
/ 22 февраля 2020

Да, это будет работать, но можете ли вы гарантировать, что никто не напишет в коде что-то вроде этого:

struct_NULL.input := 7;

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

FUNCTION F_setToDefault_MyStruct : MyStruct
VAR
    DefaultStruct   : MyStruct;
END_VAR

F_setToDefault_MyStruct := DefaultStruct;

Итак, в программе вы можете вызвать:

//set struct to default values
TestStruct:=F_setToDefault_MyStruct();

Я знаю, намного больше кода, но никто не может изменить начальные значения в struct_NULL, и я думаю, что это Намного легче читать и понимать

...