При обработке данных, реализации протоколов и в других задачах часто требуются манипуляции с памятью.
Базовые функции для работы с памятью доступны в библиотеке CAA Memory.
2021-06-11_9-16-45.png
В частности, в ней расположены две крайне часто используемые функции - MemMove (копирование данных, аналог memmove из С) и MemFill (заполнение области памяти, аналог memset из С).
Ниже приведены примеры вызова функций для работы с экземпляром структуры SOME_DATA.
Код:
TYPE SOME_DATA :
STRUCT
iVar: INT;
rVar: REAL;
byVar: BYTE;
lwVar: LWORD;
END_STRUCT
END_TYPE
Код:
PROGRAM PLC_PRG
VAR
stSomeData: SOME_DATA := (iVar := 11, rVar := 22.33, byVar := 42, lwVar := 16#DEADCAFEDEADCAFE);
abyBuffer: ARRAY [0..255] OF BYTE;
xCopy: BOOL;
xClear: BOOL;
END_VAR
Функция MemMove копирует uiNumberOfBytes байт из области памяти, размещенной по указателю pSource, в область памяти, размещенную по указателю pDestination.
Области памяти могут перекрываться.
Код:
IF xCopy THEN
MEM.MemMove(pSource := ADR(stSomeData), pDestination := ADR(abyBuffer), uiNumberOfBytes := SIZEOF(stSomeData) );
xCopy := FALSE;
END_IF
2021-06-11_8-32-47.png
Обратите внимание на "разрывы" в массиве. Они связаны с тем, что переменные в структурах располагаются с учетом выравнивания памяти.
Для контроля выравнивания можно использовать атрибут pack_mode:
https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
Функция MemFill "заполняет" область памяти размером uiLength байт по указателю pMemoryBlock значением byFillValue.
Код:
IF xClear THEN
MEM.MemFill(pMemoryBlock := ADR(stSomeData), uiLength := SIZEOF(stSomeData), byFillValue := 0);
xClear := FALSE;
END_IF
2021-06-11_9-12-47.png