PDA

Просмотр полной версии : Распределение памяти



Milchuk
30.05.2007, 23:01
В документации по пункту есть сноски, что размеры некоторых областей памяти можно изменять. Где узнать, в каких пределах?
Вопрос второй: подскажите, как можно узнать заполнение Flash памяти (ПЛК150УМ)?

Малышев Олег
31.05.2007, 08:54
1) Это можно сделать в Target Settings
2) Не совсем понятно что Вы имеете в виду - возможно командами PLC browser 'dpt', 'ppt', 'pid' ?

Milchuk
31.05.2007, 15:14
По первому вопросу: Target Settings-> Memory Layout, допустим, Retain->Size - в каких пределах можно менять значение? Что такое сегментный номер Area? Где прочитать про это?
У меня задача хранить большой объём данных. Как вариант - сбрасывать их в файл, используя библиотеку SysLibFile.lib. Нужна информация о максимально возможном размере одного файла и о максимально возможном объёме информации, хранимой в нескольких файлах. Как посмотреть кол-во используемой и свободной Flash памяти?

Малышев Олег
31.05.2007, 16:11
1) Retain - max 16kB. Почитать в документации на CoDeSys.
2) Считывайте размер каждого файла командой SysLibGetFileSize и полученное число вычитаете из 3мБ (размер ФС)-размер default.prg.
Макс. размер файла в ФС - 4 Гб (понятно, что пока USB Host недоступен это конечно не нужно...)

Василий Куц
31.05.2007, 17:55
Олег, а каким образом подгружать файлы? просто я тут почитал (пробовать пока некогда).... стринговая переменная вмещает в себе 200 символов. Я так понимаю придется заполнять массив кусками по 200 символов на переменную? Или есть менее извратный способ?

Филоненко Владислав
31.05.2007, 18:47
Переменная типа STRING может иметь беск. размер (Аналогично строке в C). Ограничение на размер накладывается библиотечными функциями работы со строками. Если их не использовать, то все будет нормально.

Также можно использовать массивы и более сложные структуры, а в файловые функции передавать указатель на них (приведенный к нужному типу).

Василий Куц
01.06.2007, 06:35
(приведенный к нужному типу).

В каком смысле? Обрезанный до 200?

Филоненко Владислав
01.06.2007, 09:26
Пример:

FUNCTION SysFileWrite : DWORD
VAR_INPUT
File: DWORD;
Buffer: DWORD; (* Address (ADR) to Buffer *)
Size: DWORD;
END_VAR
VAR
END_VAR

объявляем массив:

my_file_buffer:Array 0 .. 65535 of BYTE;

Вызываем функцию

SysFileWrite (File_handler, ADR(my_file_buffer), 5000);
В результате записали 5000 байт из массива my_file_buffer