PDA

Просмотр полной версии : Открытие файла на дозапись.



izwerg
24.04.2007, 09:52
Это можно на ПЛК? На чтение и запись ("r" и "w") работает нормально, а на запись в конец файла("a") - не работает.

Филоненко Владислав
24.04.2007, 10:09
Это причуды стандартной библиотеки CoDeSys. Она понимает только r и w.
Открывайте с 'w', перемещайте указатель позиции в конец и дописывайте...

izwerg
24.04.2007, 16:25
А разве открытие с "w" не очищает содержимое файла?

Филоненко Владислав
24.04.2007, 17:05
С чего бы это? Насколько я знаю, нет вообще в природе функций, очищающих файл без его стирания.

Andrey
13.06.2007, 14:04
При открытии файла в режиме 'w' как перемещать указатель, у меня например не перемещается - функция возвращает ошибку. В примечаниях библиотеки сказано что доступны режимы открытия файла 'r' 'w' и 'rw'. Вопрос - насколько коректно работает режим 'rw' и в какой версии прошивки.
И можно фрагмент кода где реализована корректная дозапись файла, а то вроде сделано вроде работает, но регулярно косяки с файловой системой вылазят. О том что надо прошивку обновить знаю но пока работаю на 1.31.4

Филоненко Владислав
13.06.2007, 14:13
функция установки указателя работает в абсолютном режиме и если
операция прошла успешно, то возвращает 1, при ошибке - 0

режима 2, "r" и "w", "w" подразумевает и "r". Никакого режима "rw" не существует

Andrey
13.06.2007, 14:25
вот что написано в библиотеке
FUNCTION SysFileOpen : DWORD
VAR_INPUT
FileName: STRING;
Mode: STRING [20]; (* Use 'w' (write), 'r' (read) or 'rw' (read and write) *)
END_VAR
VAR
END_VAR


Тогда что я делаю не правильно, у меня такой код не работает - предыдущие записи перетираются и остается последняя.

fln:STRING;
pF: DWORD;
buf:STRING(255);
Size: DWORD;
err:BOOL;

pF:=SysFileOpen(fln, 'w'); (*pF:=SysFileOpen(fln, 'rw'); а вот так работает *)
Size:=SysFileGetSize(fln);
err:=SysFileSetPos(pF,Size);
res:=SysFileWrite(pF, ADR(buf), LEN(buf));
err:=SysFileClose(pF);

Andrey
13.06.2007, 14:30
Или может у меня не та версия библиотеки SysLibFile

Филоненко Владислав
13.06.2007, 14:38
Ну конечно этот код работать не будет так, как вы хотите!

1. err:=SysFileSetPos(pF,Size); - посылаете указатель за пределы файла (счет идет с нуля!)
2. Если вы пытаетесь открыть файл на запись во 2 раз, то он ПРИНУДИТЕЛЬНО будет открыт в режиме на чтение (начиная с прошивки 2.00.6)

Andrey
13.06.2007, 14:44
спасибо за ответ - попробую, но остается не понятно почему в режиме 'rw' все работает.

Филоненко Владислав
13.06.2007, 14:46
и пишет тоже? - тогда у вас старая прошивка.

Andrey
20.06.2007, 14:50
Поставил самую последнюю прошивку с сайта, действительно теперь с флагом 'rw' не работает но и с 'w' теперь дописывать нехочет. Тоесть он пишет но с начала файла перетирая всю существующую инфу, а SysFileSetPos в любых выриациях возвращает ошибку за исключением SysFileSetPos(pF,0). Так как все таки переместить указатель в конец файла и дописать его. Кстати вы говорили что при открытии с флагом 'w' файл открывается в режиме RW всегда кроме случая когда открывается у же открытый - то режим R, но у меня всегда открывается только на запись и прочитать из него ничего не могу соответственно и указатель не могу переместить.
Киньте рабочий пример для идеота, а то уже неделю кругами вокруг этой проблемы бегаю.
Target 2.0
Прошивка 2.01.1
CodeSys 2.3.7.5
SysLibFile.lib 2.4.0.6

вот код



fln:STRING;
pF: DWORD;
buf:STRING(255);
Size: DWORD;
err:BOOL;

pF:=SysFileOpen(fln, 'w');
Size:=SysFileGetSize(fln);
err:=SysFileSetPos(pF,Size-1);
res:=SysFileWrite(pF, ADR(buf), LEN(buf));
err:=SysFileClose(pF);

Andrey
22.06.2007, 11:16
а в ответ тишина... неужели в новой версии прошивки нельзя реализовать дозапись файла?

Филоненко Владислав
22.06.2007, 11:30
Поставил самую последнюю прошивку с сайта, действительно теперь с флагом 'rw' не работает но и с 'w' теперь дописывать нехочет. Тоесть он пишет но с начала файла перетирая всю существующую инфу, а SysFileSetPos в любых выриациях возвращает ошибку за исключением SysFileSetPos(pF,0). Так как все таки переместить указатель в конец файла и дописать его. Кстати вы говорили что при открытии с флагом 'w' файл открывается в режиме RW всегда кроме случая когда открывается у же открытый - то режим R, но у меня всегда открывается только на запись и прочитать из него ничего не могу соответственно и указатель не могу переместить.
Киньте рабочий пример для идеота, а то уже неделю кругами вокруг этой проблемы бегаю.
Target 2.0
Прошивка 2.01.1
CodeSys 2.3.7.5
SysLibFile.lib 2.4.0.6

вот код



fln:STRING;
pF: DWORD;
buf:STRING(255);
Size: DWORD;
err:BOOL;

pF:=SysFileOpen(fln, 'w');
Size:=SysFileGetSize(fln);
err:=SysFileSetPos(pF,Size-1);
res:=SysFileWrite(pF, ADR(buf), LEN(buf));
err:=SysFileClose(pF);

Проектик свой пришлите, на нем и потренируемся

Andrey
22.06.2007, 11:45
Хорошо в понедельник пришлю, хотя приведненый фрагмент кода практически полностью соответствует тестовому проекту
остается лиш дописать fln:='test.txt' и buf:='Test 1 Test 2 Test3', ну и обеспечить однократное выполнение кода например при нажатии кнопки в визуализации.

Andrey
22.06.2007, 11:59
вот тестовый проект

Andrey
27.06.2007, 14:52
проектик свой пришлите, на нем и потренируемся Как тренировка?

Andrey
02.07.2007, 06:01
наверное никак...

Филоненко Владислав
02.07.2007, 11:09
добрый день!
в текущей версии библиотеки при открытии файла на запись он удаляется...:(
в сл. версии файла это исправим

P.s. и ещё 5 копеек по представленному проекту.
у вас запись в конец начинается по нажатию кнопки и длится пока кнопка нажата -
как следствие пока кнопка нажата, контроллер 1000 раз в секунду будет писать во Flash!
очередь команд на запись по Flash из кэша не бесконечная и в этом случае через 300-400 мс она переполнится и нек-е блоки не будут записаны.
будьте внимательны и не делайте так никогда!

Andrey
02.07.2007, 14:06
это тестовый проект, в реальности запись происходит по другим условиям без участия кнопки, и делается доп проверка по условию пока идет запись новая запись не начнется.

Andrey
03.07.2007, 07:45
добрый день!
в текущей версии библиотеки при открытии файла на запись он удаляется...:(
в сл. версии файла это исправим

в какой версии? после 2.01.5?

Филоненко Владислав
03.07.2007, 11:48
давайте своё мыло и тип плк, я вышлю всем желающим.

Andrey
04.07.2007, 13:17
andrey-sw@yandex.ru ПЛК-150 УМ

Василий Куц
04.07.2007, 13:36
vkuts[собака]kippribor.ru

Версии ПЛК - все.

tgnv
10.07.2007, 14:42
tgnv@ma-samara.ru (mailto://tgnv@ma-samara.ru) ПЛК-150 УМ