PDA

Просмотр полной версии : ArchivatorOwenLib - ограничения при записи в файл



alexmaemur
21.06.2016, 16:55
Коллеги прошу помощи. Не могу понять как библиотека ArchivatorOwenLib ведет запись на диск.
Задача записывать в файл по нажатию кнопки или событию
массив 6 параметров (в строку) на 500.
По кнопке все пишется исправно. За один заход 1 строка или
если организовать цикл FOR, то можно по нажатию кнопки
за раз стабильно 10 строк записать, на 20 строках уже
вешается виртуальный контроллер (как будет реальная панель
себя вести не знаю).
Поэтому пришлось сделать цикл через IF с использованием таймера - каждую секунду по 10 строк, НО!!!
Если я 50 раз нажму кнопку, то все супер, запись идет великолепно:D:D:D.
Если в цикле, то записывается только первые 10 строк т.е первый проход, далее цикл работает, но запись на диск не идет.
Поставил точки останова, посмотрел пошагово, все ОК цикл работает правильно, запись не идет.

Кусок кода. Run_write AND R_Pause.Q каждую секунду запускают цикл FOR, в нем записываю 10 строк, выход и через секунду снова.

R_EnableWriteArchiv(CLK := V_G_EnableWriteArchiv); //Запуск по кнопке
R_Pause(CLK := PLC_PRG.FB_Blink_1s.OUT); //Запуск по таймеру 1сек
IF R_EnableWriteArchiv.Q THEN Run_write := TRUE; END_IF

IF Run_write AND R_Pause.Q THEN
FOR i := 1+x TO 10+x BY 1 DO
//Get data for archive
FB_GetData.SetHead();
FB_GetData(
Name:= 'N',
Tip:= 4,
Znachenie:= ADR(ST_G_Tablo_Full[i].DegaN_Time),
ErrCode=> ,
StrOut=> ,
StrOutHead=> );
... ... ...
FB_GetData(
Name:= 'Error',
Tip:= 4,
Znachenie:= ADR(ST_G_Tablo_Full[i].DegaN_Error),
ErrCode=> ,
StrOut=> ,
StrOutHead=> );
//Write data to disc
FB_WriteData(
Enable:= R_EnableWriteArchiv.Q,
ArcPnt:= ADR(FB_GetData),
NameArc:= 'arhiv',
Path:= 'C:\', (*'/var/log/',*)
Mode:= 0,
ErrCode=> );
END_FOR
IF x >= V_GC_ArchivMaxN-10 THEN
x := 0;
Run_write := FALSE;
ELSE
x := x + 10;
END_IF
END_IF


Функциональный блок Arhiv_To_Flash.

alexmaemur
21.06.2016, 19:37
Коллеги ура, мы его победили:D
Камень преткновения вход WriteData(Enable), его надо сбрасывать после записи. Я бы его назвал Start, а не Enable т.к по фронту на входе происходит запись, а не при вызове разрешенного к записи блока.
Разработчики укажите это пожалуйста в хелпе.
Как итог массив 6х500 string переменных записывается по 10 строк, в каждой 6 переменных за один цикл. При записи более 20 строк виртуальный контроллер зависает. При экспериментах от 20 до 50 строк получалось записывать в цикле, я выбрал 10 для стабильности. Правда пока на виртуальном контроллере, как на реальной панельке не знаю.

Соответственно вопрос к разработчикам, если есть здесь конкретный специалист который эту библиотеку разрабатывает:
а. Каковы ограничения при записи? Можно ли увеличить количество данных записываемых за цикл. Может можно оптимизировав типы данных в плане уменьшения размера можно увеличить количество строк записываемых за раз в файл или есть другие тонкости.
б. Возможно ли изменить вариант выходного формата - приблизить его к CSV. Заменить #000=, #001= на точку с запятой или ту же решетку. С точкой-запятой получим практически готовый CSV. Если будет просто решетка то в Эксель есть импорт где символ разделителя (должен быть именно 1 символ) можно указать. Решетка не удобна т.к в тексте может быть формат времени T#1S например, точка с запятой тоже может встречаться. Самый лучший вариант это добавить вход для блока где можно указывать символ разделителя, если не указан, то создавать файл как есть сейчас например.

В целом библиотека работает, за что разработчикам отдельное спасибо:D

eoldgu
18.08.2017, 11:57
Поддерживаю alexmaemur. Использовал библиотеку ArchivatorOwenLib. Есть необходимость увеличить длину строки больше 255 байт. И приблизить Файл к CSV было-бы здорово.