Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 25

Тема: Всё-таки как правильно работать с файлами?

  1. #1

    По умолчанию Всё-таки как правильно работать с файлами?

    Коллеги!

    http://forum-ru.codesys.com/viewtopic.php?t=850 здесь рекомендуют выполнять не больше одной операции с файлом за один цикл работы ПЛК.

    Так ли это критично?

  2. #2
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,401

    По умолчанию

    Вот этот кусок важен:
    Функции эти имеют несложные параметры, но при их использовании надо учесть, что реакция системы контроллера на каждую команду (вызов функции) может быть больше времени перехода от одной команды к другой. т.е. Функции не блокирующие
    Я не находил подтверждения тому, что это неблокирующие функции. Да и существование библиотеки SysLibFileAsync (в противоположность обсуждаемой SysLibFile) говорит об обратном. Вообще было бы очень странно, если б та же SysFileOpen возвращала дескриптор преждевременно (откуда она его взяла тогда?) или SysFileRead возвращала число прочитанных байт до того, как система их прочитала.

    Может, подробнее расскажете о своей задаче для более предметного разговора?
    Последний раз редактировалось Yegor; 13.02.2016 в 08:29.

  3. #3

    По умолчанию

    Всё началось с того момента как сели батарейки на ПЛК-110 и я озадачился сохранением ритэйнов в файлах......

    Ритэйнов не мало, чуть меньше 512 байт. Сохраняю часто - по изменению, при активном использовании объекта периодичность - 2,5 сек.
    И похоже я начал совершать все возможные ошибки при работе с файлами.
    Причем ошибки фатальные, чуть что не так - ПЛК уходит в перезагрузку по срабатыванию исключения. Оказалось исключения это не только вотчдог, к перезагрузке могут приводить и косяки при работе с файлами, к примеру закрытие закрытого файла. Вот так. Причем ПЛК из этого дохлого цикла перезагрузок не возвращается. И в ряде случаев пришлось прошивать сам ПЛК. У меня в проекте есть объект button, поэтому остановить выполнение проекта не всегда получается (но иногда кстати получается, что тоже странно).

    Напоролся уже на такое явление - нельзя злоупотреблять удалением файлов. Я без всякой задней мысли каждый раз удалял файл перед сохранением ритэйна, а это до 40-50 тыс раз в сутки. Это привело к тому (это мне уже в техподдержке овен пояснили), что в файловой системе ПЛК увеличивается какой-то счетчик, причем при создании следующего файла файловая система пробегает этот весь диапазон до текущего значения счетчика и чего-то там проверяет, а это может подвесить ПЛК более чем на допустимый для выполнения шага контроллера интервал и вызвать срабатывание вотчдога. Это я уже прошёл. Что я не прошёл ещё?????

    По-поэтому вопрос корректной работы с файлами для меня очень важен,
    вот я и занялся изучением чего я ещё не знаю о работе с файлами, всякие возможные и невероятные версии =)

    Подскажите где ещё можно напороться с файлами? Пока не было траблов с ритейнами проект был стабилен....
    Проект показать не могу.... чисто гипотетически , что НЕЛЬЗЯ ДЕЛАТЬ С ФАЙЛАМИ?????

  4. #4

    По умолчанию

    Основная проблема - что да, нельзя удалять файлы, ибо они реально не удаляются! (после каждого удаления у вас в каталоге на один файл больше и когда-то наступает краш каталога) это, скажем так, особенность реализации файловой системы с контролем количества перезаписей блоков флэша.

    Файл нужно перезаписывать! Открываете файл с именем "my_ret" (ну или че фантазия подскажет), позиционируете на ноль и пишите свои данные, закрываете файл. Далее ОС разберется. Ну и надо выделять время на физическую запись - цикл open, pos, write, close - можно выполнить в одном цикле ПЛК, затем нужно запретить повторную перезапись на некоторое время (ну хотя бы на 50-100мс). И наступит счастье.

    модификатор "wr" не поддерживается. Ну вроде все, но при такой интенсивной перезаписи имеет смысл думать о внешней флэшке, ну и с нетерпением ждать "новый" плк110 - там другой тип памяти, лишенный существующих недостатков )))

  5. #5

    По умолчанию

    1. Внешняя флэшка это аддон к плк или по сети как-нить мутить?
    2. А можно допускать выполнение команды удаления файла которого нет (пока нет - это стартовый нюанс)?
    3. Можно спрашивать длину файла которого нет (пока нет - это стартовый нюанс)?
    4. Ниже мой код про ритэйны, там уже нет удаления каждый раз. Но справедливости ради нужно сказать, что в той версии что сейчас повесила мои два ПЛК не было условия sfo > 0 (это я уже сейчас добавил). Это может приводить к исключениям? Может ли операционка ПЛК по каким-либо своим причинам не давать ссылку на файл после выполнения SysFileOpen (я такого ни разу не видел просто)? Ведь если это не проверять получится что я буду делать SysFileClose с сылкой на файл 0, а это уже приведёт к исключению и перезагрузке ПЛК. Так ведь?




    Вот так я пишу свой ритэйн

    FUNCTION save_main_retain : BOOL
    VAR_INPUT
    END_VAR
    VAR
    sfo: DWORD;
    sfw: DWORD;
    sfc: BOOL;
    size: DWORD;
    END_VAR

    sfo:=SysFileOpen('retain_file','w');
    IF sfo > 0 THEN
    sfw:=SysFileWrite(sfo, ADR(b), SIZEOF(b));
    sfw:=SysFileWrite(sfo, ADR(m), SIZEOF(m));
    sfw:=SysFileWrite(sfo, ADR(dta), SIZEOF(dta));
    sfw:=SysFileWrite(sfo, ADR(c), SIZEOF(c));
    sfw:=SysFileWrite(sfo, ADR(sta), SIZEOF(sta));
    sfw:=SysFileWrite(sfo, ADR(cl), SIZEOF(cl));
    sfw:=SysFileWrite(sfo, ADR(ers), SIZEOF(ers));
    sfw:=SysFileWrite(sfo, ADR(mst), SIZEOF(mst));
    sfc:=SysFileClose(sfo);
    retain_cnt:=retain_cnt+1;
    END_IF;
    RETURN;


    во так я его читаю

    FUNCTION init_main_retain : BOOL
    VAR_INPUT
    END_VAR
    VAR
    sfo: DWORD;
    sfc: BOOL;
    sfgs: DWORD;
    size: DWORD;
    END_VAR
    sfgs:=SysFileGetSize('retain_file');
    IF (sfgs = SIZEOF(b)+SIZEOF(m)+SIZEOF(dta)+SIZEOF(c)+
    SIZEOF(sta)+SIZEOF(cl)+SIZEOF(ers)+SIZEOF(mst))
    THEN
    sfo:=SysFileOpen('retain_file','r');
    IF sfo > 0 THEN
    SysFileRead(sfo, ADR(b), SIZEOF(b));
    SysFileRead(sfo, ADR(m), SIZEOF(m)); m_:=m;
    SysFileRead(sfo, ADR(dta), SIZEOF(dta)); dta_:=dta;
    SysFileRead(sfo, ADR(c), SIZEOF(c)); c_:=c;
    SysFileRead(sfo, ADR(sta), SIZEOF(sta));
    SysFileRead(sfo, ADR(cl), SIZEOF(cl)); cl_:=cl;
    SysFileRead(sfo, ADR(ers), SIZEOF(ers));
    SysFileRead(sfo, ADR(mst), SIZEOF(mst)); mst_:=mst;
    sfc:=SysFileClose(sfo);
    END_IF;
    ELSE
    SysFileDelete('retain_file');
    init_microstat();
    init_costs();
    init_config();
    init_client();
    init_inkass();
    b.block_to_counter:=0;
    b.FLAG_POST_BLOCKED := FALSE;
    calc_event_request(8);
    END_IF

    RETURN;

  6. #6

    По умолчанию

    И похоже у меня на старте возможен вариант когда к одному и тому же файлу за один цикл ПЛК возможен многократная операция open, write, close. Это сильно плохо? Разнести их по времени?

  7. #7
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    709

    По умолчанию

    Чтобы узнать есть файл или нет надо попробовать его открыть. Если дескриптор равен нулю, то файла нет и работать с ним нет смысла.
    За один цикл только одна операция с файлом.
    Чтение и запись может занять несколько циклов (зависит от размера файла).
    Узнать окончание записи или чтения можно по количеству реально записанных (прочитанных) байт, которые возвращает функция.
    Пока не закончится одна операция с файлом к другой не переходить.
    Последний раз редактировалось amn; 13.02.2016 в 11:37.

  8. #8

    По умолчанию

    у меня считываются несколько структур, т.е. мне следует сначала считать весь файл в несколько заходов, если это потребуется, в некоторый буфер, а уже из него раскидать данные по структурам, так получается? жеееееесть.....

  9. #9
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    709

    По умолчанию

    Что мешает в качестве буфера использовать ФБ. В этот ФБ копируете все свои структуры, после чего задаете его параметром для функции записи. То же самое при чтении. Функциональный блок это по сути та же структура.

  10. #10
    Пользователь
    Регистрация
    24.07.2012
    Адрес
    Россия
    Сообщений
    1,529

    По умолчанию

    Внесу свои пять копеек.
    Андрей Шатохин писал, Ритэйнов не мало, чуть меньше 512 байт. Сохраняю часто - по изменению, при активном использовании объекта периодичность - 2,5 сек.
    Весьма интересно, как писать "ритэйн" каждые 2,5 секунды? Как их вообще можно писать??

    Причем ПЛК из этого дохлого цикла перезагрузок не возвращается. И в ряде случаев пришлось прошивать сам ПЛК.
    Про заводской сброс не слышали?

    Цитата Сообщение от Дмитрий Артюховский Посмотреть сообщение
    ...
    Файл нужно перезаписывать! Открываете файл с именем "my_ret" (ну или че фантазия подскажет), позиционируете на ноль и пишите свои данные, закрываете файл. Далее ОС разберется. Ну и надо выделять время на физическую запись - цикл open, pos, write, close - можно выполнить в одном цикле ПЛК, затем нужно запретить повторную перезапись на некоторое время (ну хотя бы на 50-100мс). И наступит счастье. ...
    И зачем это одноразовая запись? Хранить позицию где то надо, чтобы дозаписать файл чтоли или сколько читать потом.

    Я хотел написать свой архиватор, потому что штатный убог, он только для иконки на сайте и для засерания менеджерами мозги покупателям, не более.
    Проштудировал форум, выписал все косяки, начал писать библиотеку, но всё в пустую.
    Если сегодня файл создался, записался, проситался и удалился, то завтра я не могу почему то использовать этоже имя, только хард резет.
    Нет абсолютно никакой уверенности что данные не пропадут.
    Если у кого то получился свой архиватор на 100й линейке плк, то буду благодарен за пример, но думаю таких людей нет.

Страница 1 из 3 123 ПоследняяПоследняя

Похожие темы

  1. ЕКОН-134 Подводный камень или решение все-таки есть?
    от EFrol в разделе Сетевые технологии
    Ответов: 1
    Последнее сообщение: 15.10.2015, 10:17
  2. Работа СПК с файлами на SD
    от GoodLuck в разделе СПК2хх
    Ответов: 2
    Последнее сообщение: 10.06.2014, 13:42
  3. Плк 100 работа с файлами
    от Scream в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 12.02.2013, 14:07
  4. Работа ПЛК с внешними файлами
    от korzhyk в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 20.08.2008, 17:49

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •