Просмотр полной версии : Особенности библиотеки 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 символов.
А есть возможность построчно читать файлфы как это реализовано в других языках программирования. Самому конечно можно написать простенький цикл с побитовым чтением файла и проверкой конца строки, но думаю что внутренняя реалзация должна работать быстрее и надёжней.
Еще вопрос, есть ли в Codesys библиотеки для работы с xml файлами, для хранения данных.
И ещё, может у кого есть реализация обработчика ini файлов или в CodeSys предподчителен какой то другой механизм инициализации и хранения настроек программ?
Предложения желательно выдовать в контексте Codesys v3.3 patch2...
Контроллер будет Pentium 3, ОС Tiny Core linux
Филоненко Владислав
23.06.2009, 13:35
текстовый доступ не реализован. Используйте надстройку в самой СoDeSys-программе. Библиотека SysLibFile не поддерживает текстовый доступ, и менять ее мы не можем, стандарт.
P.S. А у Вас есть контроллер с 3.3?
Я же говорю, контроллером выступает Pentium 3, под управлением операционки Tiny Core linux, по модбасу управляет Clik'ом, МВУ и МВА. Тьфу тьфу, пока всё работает...
Владислав, а что за надстройка в Codesys? PersistentVars или Export PLCopen(с ним ещё не разобрался, для чего он), что вы имели ввиду?
Филоненко Владислав
23.06.2009, 18:33
руки и самостоятельно написанная программа для считывания файлов как строк.
Библиотеку потом можно выложить тут для всеобщего пользования.
Добрый день.Вопрос по библиотеке SysLibFile.Использую ее для записи архива на флэш диск ПЛК.Каков максимально возможный размер файла?И что произойдет с ПЛК если размер файла архива выйдет за границы допуступного размера?
Малышев Олег
31.07.2009, 08:21
теоретически 4 Гб - практически ограниченна размером свободого флеша т.е. порядка 3 Мб. При превышении SysFileWrite будет возвращать ошибку.
Я проверял записывая подходящий mp3 файл через среду (Online->Write File).
Добрый день.Вопрос по библиотеке SysLibFile.Использую ее для записи архива на флэш диск ПЛК.Каков максимально возможный размер файла?И что произойдет с ПЛК если размер файла архива выйдет за границы допуступного размера?
на всякий случай, посмотрите этот пример, возможно, он вам поможет.
http://owen.ru/forum/attachment.php?attachmentid=1318&d=1244099091
В принципе запись сама по себе остановиться по истечению свободного места на флэш,а на работе программы крнтроллера это не отразится?
Филоненко Владислав
31.07.2009, 12:47
Будет возвращаться код ошибки.
Не будут писаться логи.
Не будет возможности обновить проект.
А так работать будет.
Добрый день! "Овен" тут не причем, но все таки, напишу здесь, может, кому и пригодится...
Так, что же возвращает 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.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot