Anonymous - 2012-10-10

Originally created by: erm.sovtigaz@mail.ru

Была проблема получения из CoDeSys доступа к свободной оперативной памяти чипа (в IEC Platform Builder максимально можно выбрать до 65536 байт "The value may not be larger as 16#10000 !"). Немцы подсказали (в частности Günter Berberich, за что ему спасибо). Есть библиотека SysLibMem ,позволяющая выделять области памяти вне среды исполнения CoDeSys.
Пример из проекта (для архива аварий):
VAR
AlarmArchive: AlarmArchive_Item; (Это переменная типа моей структуры)
AlarmArchiveP: POINTER TO AlarmArchive_Item;(Указатель типа моей структуры)
AlarmArchive_length: WORD:=10000; (Максимальное кол-во элементов массива
из переменных типа моей структуры
)
IF AlarmArchiveP<>0 THEN SysMemFree(AlarmArchiveP, SIZEOF (AlarmArchive) AlarmArchive_length); (Очищаю/освобождаю место памяти ,которое могло быть выделено ранее*)
END_IF;

IF AlarmArchiveP=0 THEN AlarmArchiveP:=SysMemAlloc(SIZEOF (AlarmArchive) * AlarmArchive_length); (Резервирую область внешней для среды исполнения оперативки
возвращает указатель на выделенную область ,если он = 0, значит не хватает памяти
)
END_IF;

Использованы:
FUNCTION SysMemAlloc : DWORD
( Allocates memory blocks. )
( SysMemAlloc returns a void pointer to the allocated space, or NULL if there is insufficient
memory available.. Always check the return from malloc, even if the amount of memory
requested is small.
)
VAR_INPUT
dwSize: DWORD; ( Bytes to allocate )
END_VAR

и

FUNCTION SysMemFree : BOOL
( Deallocates or frees a memory block. )
VAR_INPUT
dwAddress: DWORD; ( Previously allocated memory block to be freed )
dwSize:DWORD; ( Size of block to free )
END_VAR


еще в библиотеке:
SysMemCmp - сравнение байт в областях памяти
FUNCTION SysMemCmp : DWORD
( Compare characters in two buffers. )
(* The return value indicates the relationship between the buffers:
< 0 buf1 less than buf2
0 buf1 identical to buf2

0 buf1 greater than buf2
)
VAR_INPUT
dwBuf1: DWORD; (
First buffer )
dwBuf2: DWORD; (
Second buffer )
dwCount: DWORD; (
Number of characters to compare *)
END_VAR

SysMemCpy - копирование байта из одной области памяти в другую
FUNCTION SysMemCpy : DWORD
( Copies characters between buffers. )
( returns the value of dwDest. )
VAR_INPUT
dwDest: DWORD; ( New buffer )
dwSrc: DWORD; ( Buffer to copy from )
dwCount: DWORD; ( Number of characters to copy)
END_VAR

SysMemMove - перенос байта из одной области памяти в другую с удалением исходного
FUNCTION SysMemMove : DWORD
( Moves one buffer to another. )
( SysMemMovereturns the value of dest )
VAR_INPUT
dwDest: DWORD; ( New buffer )
dwSrc: DWORD; ( Buffer to copy from )
dwCount: DWORD; ( Number of characters to copy)
END_VAR

и еще:

FUNCTION SysMemSet : DWORD
( Sets buffers to a specified character. )
( returns the value of dwDest. )
VAR_INPUT
dwDest: DWORD; ( Pointer to destination )
bCharacter: BYTE; ( Character to set )
dwCount: DWORD; ( Number of characters )
END_VAR

и

FUNCTION SysMemSwap : BOOL
( Swap data in buffer, dependant on target system.
Return: TRUE, if swapping is done
)
VAR_INPUT
dwAddress:DWORD; ( Address of byffer to swap )
diSize:DINT; ( Swap size: 2,4,8 )
diCount:DINT; ( Number of swap elements in buffer )
END_VAR
VAR
END_VAR


В общем так . Может кому пригодится.

SysLibMem.zip [1.37 КБ]