PDA

Просмотр полной версии : архив не записывается в файл при отключении питания!



JuLi
04.03.2010, 08:34
Данные архива не сохраняются при отключении питания. Файл создается коректно, данные читаются тоже, если вместо переменной pwr (имя канала Power status) ставлю переменные, описывающие кнопки "Сохранить в файл" и "Прочитать из файла".
Знаю, что при включении питания данные читаются из файла (запись в файл осуществлялась через кнопку "Сохранить в файл").
Ниже привожу кусок из текста программы:
VAR
Q: INT; bArh: BOOL; bSbros: BOOL; bSort: BOOL; R_TR1: R_TRIG;
R_TR2: R_TRIG; R_TR3: R_TRIG; N: INT; ValBuf: INT; K: INT:=0;
R_TR4: R_TRIG; Enter: REAL; file_name:STRING[10] := 'File1';
hFile: DWORD; file_opened: BOOL :=FALSE; size_file: DINT;
read_file:DINT; set: BOOL; R_TRIG_Read: R_TRIG;
flagPower: BOOL; F_TRIG_Write: F_TRIG; bRead: BOOL;
bWrite: BOOL; R_TRIG_write: R_TRIG; proba: ARRAY [0..9] OF DWORD; write_file: DWORD; size_of: DWORD; R_TRIG_PowerOut: R_TRIG;
F_TRIG_PowerOut: F_TRIG; read: STRING; flag: BOOL;
END_VAR

(*ОТКРЫТИЕ/СОЗДАНИЕ/ЗАПИСЬ/ЧТЕНИЕ ФАЙЛА*)

F_TRIG_PowerOut(CLK:=pwr);
IF F_TRIG_PowerOut.Q THEN
SysFileClose(hFile); (*закрываем для надежности*)
file_opened:=FALSE;
hFile:=SysFileOpen(file_name, 'w'); (*и создаем его*)
write_file:=SysFileWrite(hFile, ADR(proba), SIZEOF(proba)); (*затем записываем заголовок*)
file_opened:=SysFileClose(hFile); (*закрываем файл*)
END_IF;

R_TRIG_PowerOut(CLK:=pwr); (* При включении питания *)
IF R_TRIG_PowerOut.Q THEN
SysFileClose(hFile); (*закрываем для надежности*)
file_opened:=FALSE;
hFile:=SysFileOpen(file_name, 'r'); (*открываем его*)
size_file:=SysFileGetSize(file_name); (* определяем размер файла *)
size_of:=SIZEOF(proba);
read_file:=SysFileRead(hFile,ADR(proba), SIZEOF(proba)); (*читаем данные из файла*)
file_opened:=SysFileClose(hFile); (*закрываем файл*)
END_IF

Филоненко Владислав
04.03.2010, 08:53
Для сохранения данных в момент выкл. питания придуман retain.

JuLi
04.03.2010, 09:05
да, но в архиве огромное количество записей. энергонезависимой памяти может не хватить...

JuLi
04.03.2010, 09:25
Причем, не понимаю, почему после отключения питания программа в ПЛК не работает хотя бы N-й промежуток времени. Читаю про ПЛК-100 на сайте www.owen.ru:
Конкурентные преимущества ПЛК 100 встроенный аккумулятор, позволяющий «пережидать» пропадание питания – выполнять программу при пропадании питания, и переводить выходные элементы в «безопасное состояние».
В руководстве к ПЛК-100 заявлено: при случайном отключении основного питания контроллер переходит на аварийное питание и сохраняет промежуточные результаты вычислений и работоспособность интерфейсов Ethernet и Debug RS&232 в течение 10 минут.
Светодиодная индикация и выходные элементы контроллера при этом не запитываются и не функционируют. При включении основного питания во время работы на аварийном питании контроллер сразу приступает к выполнению пользовательской программы, не тратя времени на загрузку ядра CoDeSys и сохраняя все промежуточные результаты вычислений.

Так объясните, пожалуйста, программа будет работать N-е время после выключения питания? Например, у меня выставиться флаг flag в true после отключения питания, если он в разделе описания не объявлен как retain переменная?
И что подразумевается под выполнением программы после выключения питания?

Николаев Андрей
04.03.2010, 10:14
Это значит ровно следующее:
В контроллере встроен аккумулятор. При пропадании питания он на какое то время обеспечивает работу:
Ethernet, 232 и обсчет программы (сохраняется в ОЗУ). Ни выхода ни что либо еще не питается - потребление большое.
В момент, когда аккумулятор понимает, что все - записывает Retain.
В случае, если ресурс аккумулятора полный, и он полностью заряжен - программа до перезагрузки ПЛК может "крутиться" в контроллере до 10 мин.
Если во время, пока аккумулятор держит питание вернуть, то контроллер не будет перезагружаться и начинать с начала, а продолжит с запомненного места.

JuLi
04.03.2010, 11:09
Так выставится у меня flag в true или нет после отключения питания при идеальном условии (аккумулятор заряжен полностью)?
Привожу ниже текст программы.
1-й вариант:
F_TRIG_PowerOut(CLK:=pwr);
IF F_TRIG_PowerOut.Q THEN flag:=TRUE;

2-й вариант:
IF pwr=false THEN flag:=TRUE;
Здесь pwr - системная переменная power status.

Филоненко Владислав
04.03.2010, 11:54
Вы можете сами пронаблюдать работу ПЛК при выкл. питания, если залогинитесь через Ethernet. Связь не пропадет.

JuLi
04.03.2010, 12:30
В руководстве к ПЛК-100 заявлено: при случайном отключении основного питания контроллер переходит на аварийное питание и сохраняет промежуточные результаты вычислений и работоспособность интерфейсов Ethernet и Debug RS&232 в течение 10 минут.

Отладка идет через rs232. При выключении питания флаг flag не меняет своего состояния (хотя вроде бы должен). Сообщение о выключении питания появляется сразу. Еще вопрос: при выключении питания, когда контроллер работает от встроееного аккумулятора, отладка по Debug RS&232 должна работь? Сейчас на мой взгляд нет - обновление переменных замирает сразу после выключения питания. Контроллер стоял включенным перед выключением неск. часов (когда проводили эксперимент). Почему?

Филоненко Владислав
04.03.2010, 16:46
Повторяю, если залогинитесь через Ethernet. Связь не пропадет.

Дмитрий Артюховский
06.03.2010, 10:45
да, но в архиве огромное количество записей. энергонезависимой памяти может не хватить...

Архив нужно сбрасывать буферами во флэш во время нормальной работы. Держать в памяти можно только текущий буфер, который при пропадании питания поместиться в retain область микропрограммой самого контроллера. Проблема в том что скорость физической записи во флэш невысока, и при записи будет конкурировать ваша программа и прошивка контроллера (которая победит! гы ))) Кроме того, в реальной эксплуатации, часто аккумулятор не успевает зарядиться за время появления питания для обеспечения достаточного времени сохранения данных, и при последовательных выключениях будет сбой архива.
И еще, это не комп, не пытайтесь дописывать данные в файл, весь файл будет перезаписан физически - это время и ресурс флэша - пишите маленькие файлики. Не пытайтесь придумывать динамические имена файлам - очень легко потерять текущий дескриптор и забить всю память флэша.