Архив типа shift mode средствами SysLibFile
Добрый день!
Очень нужено организовать архив типа "shift mode" средствами SysLibFile, а опыта работы с этой библиотекой и с файлами очень мало.
Прочитал почти все, что писалось об этом на форуме. Прочитав это:
http://www.owen.ru/forum/showthread....ght=SysLibFile
http://www.owen.ru/forum/showthread....ght=syslibfile
Кое что стало понятно, а воплотить это в жизнь, без подробного примера, не получается :(
Может кто-нибуть может поделится более менее подробным примером создания архива типа "shift mode" средствами SysLibFile с применением следующих приемов:
Цитата:
читаете последнюю половину файла в буфер, создаете новый файл, записываете буфер (не забудьте заголовок добавить к нему), удаляете старый файл, переименовываете.
лучше делить файл не побайтно, а по строкам.
Buffer:Array [0..1024] of byte;
Строки можно делать любой длинны, но работать с ними с помощью строковых функций - только до размера 256 байт.
Цитата:
Рекомендую не писать 20 раз в файл, а накапливать данные в буфере и сбрасывать на диск большими блоками. Каждое обращение к функции записи неизбежно затирает 1 блок Flash. Да и быстрее будет.
В программе архивации создаёте буфер на 1 (а лучше на 2-5) записей.
Архивируете в буфер и считаете число свободных блоков в буфере. Когда буфер заполнится - записываете его весь на диск и сбрасываете счётчик свободных блоков.
Архивировать нужно переменные типа REAL и WORD.
Если кто может таким поделиться, буду очень благодарен.
Вложений: 1
Вариант архивации shift mode
Здравствуйте Владислав!
Попытался написать архивацию на SysLibFile в режиме shift mode, но где-то напутал - в результате есть проект - надеюсь кандидат в "примеры программ и полезности" но с ошибками. Сильно не ругайте, в этом деле я новичок :rolleyes: , только учусь. Если поможите мне разобрать в моих ошибках и немного доработать, буду благодарен и обязательно выложу рабочий вариант на форум. Если есть и други желающие помочь разобраться - пожалуйста, буду рад.
Проект прилогаю. ПЛК100-24 P-L прошивка 2.10.7 таргет 2.10
Моему земеле Gans отдельный большуший привет :) Если есть возможность - присоединяйся.
Вложений: 1
помоему даже красиво получается
привет вот накидал чуток побольше. у меня на руках нет плк100 для надругательств поэтому обкатывать придется самому. и времени пока маловато :-)
мне то же нравится. счастьемет, прям какой-то :-)
Цитата:
...обкатывать придется самому
Не вопрос! Для этой цели у меня есть все. В понедельник на работе запущу проект в работу. Результат обязательно сообщю. А вот SysLibFile без "железа" не работает! Проверенно. Спасиб за советы в коментах, очень помогает. Нравится мне твой ход мыслей. Все, до понедельника!
P.S. Смотрю, народ интересуется нашей темой. Только почемуто ни кто не высказывается и свои идеи не предлагает...
начались проблемы, елки-иголки...
Всем привет!
Долго я мучил проект ARC_Y_10_04_17 и результаты странные:
Хороший результат:
1. Проект работает нормально - время и строки формируются
Плохохие результаты:
1. Фаил на запись не открывается (дискриптор всегда равен 0) и на диск не пишется
2. Размер файла полученный с помощью SysFileGetSize принимает странные значения (541212688, 537416024, 536991940) и раза два принял реальные значения (типа 128, 256) и файла естественно на диске нет...
Вечные вопросы: что делать? В чем причина?
Может нам Филоненко Владислав подскажет?
Использую ПЛК100-24 P-L прошивка 2.10.7 таргет 2.10
Реализация режима Shift mode
Огромный привет Gans! Ну, вот, приехал с командировки и третий день пытаюсь разнести по циклам работу с файлами. Получается все что угодно, только не то что нужно... Может кто подскажет, как правильно и грамотно это сделать?
Какие операторы работы с файлами из SysLibFile требуют больше времени для завершения своих действий, а какие можно писать в программе подряд? Привожу часть кода из ARC_Y_10_04_17 который нужно разнести по циклам.
sizAR := SysFileGetSize('arc.txt'); (*Получаем размер файла в байтах*)
IF sizAR > 3072 THEN (*Если файл превысил лимит по объему в байтах, хотя придел надо уточнять*)
sizBUF := (sizAR / 3) *2; (*Вычисляем 2/3 размера файла*)
SysFileSetPos(f1, sizBUF); (*Выставляем указатель на 2/3 файла*)
SysFileRead(f1, ADR(BUFER), (siz - sizBUF)); (*Читаем в буфер последнюю треть файла*)
SysFileClose(f1);
IF f2 = 0 THEN f2 := SysFileOpen('temp.txt', 'w'); END_IF (*Открываю новый файл для записи*)
SysFileWrite(f2, ADR(BUFER), SIZEOF(BUFER));
FOR i := 0 TO 1024 DO BUFER [i] := 0; END_FOR (*Очищищаем буфер*)
SysFileClose(f2);
SysFileDelete('arc.txt');
SysFileRename('temp.txt', 'arc.txt');
END_IF;(*IF sizAR > 3072 THEN*)