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