PDA

Просмотр полной версии : Особенности библиотеки SysLibFile



Партизан
15.10.2008, 12:53
Доброго дня!

При работе с библиотекой SysLibFile возникают некоторые непонятности:

При создании файла пишу: hfile:=SysFileOpen('archive.log', 'w');
Загружаю проект в контроллер.
Файл создается, его можно скачать через Online>Read file from PLC. Но вот функция SysFileWrite не хочет ничего в него записывать.

Дальше - интересно: меняем имя архива на любое другое, заливаем проект в контроллер, и все работает!

Таргет - 2.02, прошивка - 2.02.8

Подскажите, в чем дело? Как все это делается по-нормальному?

Филоненко Владислав
15.10.2008, 23:47
1. Проверьте, не открыли ли Вы его 2 раза. в этом случае 2-е открытие будет всегда в режиме "R" независимо от настроек.
2. Перед любой операцией с файлом по имени (удаление, переименование) закройте файл.

Партизан
16.10.2008, 09:33
1. Да, спасибо. Вы были правы. Не поставил триггер на кнопку - и файл создавался/открывался несколько раз. Теперь работает.
2. Перед тем как определять размер файла, его тоже надо закрывать?

Партизан
16.10.2008, 15:18
И еще один вопрос: что делать, если файл все-таки был открыт 2 раза? SysFileClose(hfile) не помогает.

Партизан
17.10.2008, 17:08
На последний вопрос отвечу сам, может кому пригодится:

SysFileClose(hFile);
hFile:=SysFileOpen(file_name, 'w');
Кажется, помогает

Назаров Александр
31.10.2008, 17:47
Уважаемые! Помогите! Просидел целый день, а запись в файл так и неработает. Не понимаю в чем дело?:(
PLC model MODEL PLC 100.K.M
Binary VERSION 2.02.8
Need Target version 2.02

Филоненко Владислав
31.10.2008, 18:21
Что возвращает SysFileWrite(hFile, ADR(WriteBuffer), LEN(WriteBuffer)); ?

Назаров Александр
31.10.2008, 18:31
Возвращало 0. Сейчас убрал опрос размера файла, начал писать. Видимо здесь собака порылась. А для обращения к файлу по имени его закравать нужно?

Филоненко Владислав
31.10.2008, 20:05
Да, закрыл, опросил, открыл, записал, закрыл.
Обращаю внимание, что операции открытия, закрытия, а тем более записи длительные и лучше не вызывать их все в 1 цикле ПЛК, а разнести на несколько десятков циклов. Особенно если запись > 30 кБайт за раз или > 25 кБайт в секунду - кэш записи переполнится и пока всё непомещающееся в кэш не запишется во Flash - ВСЁ будет стоять. А это ~30-40 мс на Кбайт.
P.S. лучше не закрывать файл после каждой записи, а только когда его надо закрыть по любому (стирание, переименование, доступ на запись извне)

Назаров Александр
01.11.2008, 18:53
P.S. лучше не закрывать файл после каждой записи, а только когда его надо закрыть по любому (стирание, переименование, доступ на запись извне)
Как же его не закрывать если при записи лога необходимо дозаписывать информацию в конец файла? Команда Append не работает, а чтобы узнать размер файла его необходимо закрыть. Или Вы предлагаете вести свой счетчик позиции? В принципе тоже вариант! Только не возникнет ли каких либо сбоев?
И еще. Похоже имена файлов не могут быть любыми. Например в файл FileLog.txt записи проходят, а в FileLog.arh нет. Казалось бы какая разница?

Филоненко Владислав
03.11.2008, 11:04
1. А Вы сами не знаете, сколько записали? Счётчик не нужен, он ведётся в самой файловой системе.
2. После открытия есть функция Seek, перемещаем куда хотим, если надо, и там указатель файла всегда остаётся, смещаясь при записи. Очень подробно с примерами алгоритм работы стандартной файловой системы дан в справочниках по СИ
3. По именам. Разницы никакой. Если только это имя уже не используется. Ограничение по длине - 60 символов.

Crusash
23.06.2009, 12:32
А есть возможность построчно читать файлфы как это реализовано в других языках программирования. Самому конечно можно написать простенький цикл с побитовым чтением файла и проверкой конца строки, но думаю что внутренняя реалзация должна работать быстрее и надёжней.

Еще вопрос, есть ли в Codesys библиотеки для работы с xml файлами, для хранения данных.

И ещё, может у кого есть реализация обработчика ini файлов или в CodeSys предподчителен какой то другой механизм инициализации и хранения настроек программ?

Предложения желательно выдовать в контексте Codesys v3.3 patch2...
Контроллер будет Pentium 3, ОС Tiny Core linux

Филоненко Владислав
23.06.2009, 13:35
текстовый доступ не реализован. Используйте надстройку в самой СoDeSys-программе. Библиотека SysLibFile не поддерживает текстовый доступ, и менять ее мы не можем, стандарт.

P.S. А у Вас есть контроллер с 3.3?

Crusash
23.06.2009, 13:52
Я же говорю, контроллером выступает Pentium 3, под управлением операционки Tiny Core linux, по модбасу управляет Clik'ом, МВУ и МВА. Тьфу тьфу, пока всё работает...

Crusash
23.06.2009, 14:29
Владислав, а что за надстройка в Codesys? PersistentVars или Export PLCopen(с ним ещё не разобрался, для чего он), что вы имели ввиду?

Филоненко Владислав
23.06.2009, 18:33
руки и самостоятельно написанная программа для считывания файлов как строк.
Библиотеку потом можно выложить тут для всеобщего пользования.

mar154
30.07.2009, 13:10
Добрый день.Вопрос по библиотеке SysLibFile.Использую ее для записи архива на флэш диск ПЛК.Каков максимально возможный размер файла?И что произойдет с ПЛК если размер файла архива выйдет за границы допуступного размера?

Малышев Олег
31.07.2009, 08:21
теоретически 4 Гб - практически ограниченна размером свободого флеша т.е. порядка 3 Мб. При превышении SysFileWrite будет возвращать ошибку.
Я проверял записывая подходящий mp3 файл через среду (Online->Write File).

Kirill
31.07.2009, 10:49
Добрый день.Вопрос по библиотеке SysLibFile.Использую ее для записи архива на флэш диск ПЛК.Каков максимально возможный размер файла?И что произойдет с ПЛК если размер файла архива выйдет за границы допуступного размера?

на всякий случай, посмотрите этот пример, возможно, он вам поможет.
http://owen.ru/forum/attachment.php?attachmentid=1318&d=1244099091

mar154
31.07.2009, 11:00
В принципе запись сама по себе остановиться по истечению свободного места на флэш,а на работе программы крнтроллера это не отразится?

Филоненко Владислав
31.07.2009, 12:47
Будет возвращаться код ошибки.
Не будут писаться логи.
Не будет возможности обновить проект.
А так работать будет.

lazy
12.08.2010, 10:06
Добрый день! "Овен" тут не причем, но все таки, напишу здесь, может, кому и пригодится...

Так, что же возвращает FUNCTION SysFileClose: BOOL ??? ;) Моделируем ситуацию. Открытых файлов в системе нет. dwFile - недействительный манипулятор. Пишем код:

IF SysFileClose( dwFile ) THEN
... ; (*Здесь вы никогда не окажитесь *)
END_IF;
IF NOT SysFileClose( dwFile ) THEN
... ; (*Здесь вы никогда не окажитесь *)
END_IF;

Железная логика, правда? А все потому, что в случае удачи функция возвращает 0, а в случае ошибки -1. Будьте внимательнее! ))

CoDeSys Version 2.3.9.9 ( Build Oct 15.2008 );
SysLibFile Version 2.4.0.6.