PDA

Просмотр полной версии : Быстрый рестарт ПЛК по "передергу" питания



drvlas
07.12.2012, 12:46
Включил недавно модуль статистики, а толком его использовать не получается. Прошу помощи.

Задача такая. При выключении питания ПЛК пробует повисеть на аккумуляторе, "цепляется за жизнь". Как результат, выключение питания и включение его через 5-10 секунд не приводит к перезапуску программы ПЛК с нуля. А мне нужно, чтобы приводил именно к перезапуску. То есть, он цепляется, а мы его топориком...

Решение 1: выпаять аккум. Работает. Но изделия идут в серию, выпаивание не есть гут.

Решение 2: Ловлю, когда модуль статистики показывает, что питание пропало, запускаю таймерок (на всякий случай) и через 50 мс говорю: "питалово йок!"


TON_Power( IN:= (NOT bPLC_Power_ON) AND (NOT TON_Power.Q), PT:=T#50ms);
IF TON_Power.Q THEN bPWR_Was_Bad := TRUE; END_IF

А по появлению bPWR_Was_Bad я вызываю программу инициализации, кагбэ перезапуская все с нуля.

И что странно: плохо работает! Вчера, когда аккум был разряжен, вроде как работало. А сегодня - не хочет даже после выключения на 10 секунд перестартовывать. Как понаблюдать в онлайне - не ясно, срывается же связь без питания...

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

Спасибо!

capzap
07.12.2012, 15:38
по пропаданию питания запустите бесконечный цикл, вроде по быстрому рестартанет

Terrano1992
07.12.2012, 15:44
каковы канонические подходы к использованию информации о пропадании питания?
Загнать программу в бесконечный цикл, чтобы ПЛК по watchdog'у перезагрузился. Вот одна из тем на этот счет:
http://www.owen.ru/forum/showthread.php?p=7351

drvlas
07.12.2012, 16:35
Спасибо, коллеги!

Учел замечание от автора той темы, коллеги SergeyNG, о том, что во время первого скана ПЛК еще не знает, что питанию ж*па.

Поэтому все же оставил ожидание в течение 500 мс, проверку надежности смерти:


TON_Power( IN:= (NOT bPLC_Power_ON) AND (NOT TON_Power.Q), PT:=T#500ms);
IF TON_Power.Q THEN
WHILE TRUE
DO ;
END_WHILE
END_IF


Работает замечательно! Параллельно ПЛК включена панель ИП320, которая, да будет известно уважаемым коллегам, прекрасно работает при снижении питания до 10 В. Поэтому выключение 24-вольтового блока питания не сразу отражается на "морде лица" панели, ее импульсный стабилизатор вытягивает, сколько может. Я пробовал настолько быстро передергивать питание, что панель еще не погасла - а ПЛК уже все уловил, постоял в глубоком раздумье - и рестартовал.
Переживать, что он "словит" короткий провал в питании я не буду. Провал может породить всякой гадости в системе - поэтому для моих приборов предпочтительнее "словить" и перезапуститься, чем вытягивать работу до последнего. Ну, это мои подробности, я больше приборист, чем автоматчик.

Gans
07.12.2012, 17:23
Поэтому все же оставил ожидание в течение 500 мс, проверку надежности смерти:


TON_Power( IN:= (NOT bPLC_Power_ON) AND (NOT TON_Power.Q), PT:=T#500ms);
IF TON_Power.Q THEN
WHILE TRUE
DO ;
END_WHILE
END_IF


Работает замечательно!

Можно немного проще :-)


TON_Power( IN:= (NOT bPLC_Power_ON) AND (NOT TON_Power.Q), PT:=T#500ms);
WHILE TON_Power.Q DO; END_WHILE

drvlas
07.12.2012, 17:29
Точно! Спешил :)

Gans
07.12.2012, 17:35
Точно! Спешил :)
Еще один вопрос :-) В строке: TON_Power( IN:= (NOT bPLC_Power_ON) AND (NOT TON_Power.Q), PT:=T#500ms);

Для чего тут "AND (NOT TON_Power.Q)"? Без него должно работать не хуже, или я что-то недопонял?

drvlas
07.12.2012, 17:45
или я что-то недопонял?Да х.з., у меня сложные отношения с таймерами. Когда-то пробовал, получилось запускать именно так, вот с тех пор и ставлю всегда по шаблону. А что, можно иначе?
Если говорить не о случае, когда просто делается задержка на таймере...

Gans
07.12.2012, 17:50
Вот так должно работать:

TON_Power(IN:= NOT bPLC_Power_ON, PT:=T#500ms);
WHILE TON_Power.Q DO; END_WHILE

Проще я я не умею :-)

drvlas
07.12.2012, 17:54
Проще я я не умею :-)Если выбросить одно "я", то будет проще!

Да, именно так сейчас и запустил. Работает :)

Теперь у меня изменится шаблон...

drvlas
11.12.2012, 13:45
Продолжение.

Может ли кто-то подсказать, как именно перезапускает ПЛК сторожевой таймер?
Я ловлю пропадание питания и по нему ухожу в бесконечный цикл, из которого вотчог сбрасывает ПЛК. При этом почему-то переменные инициализируются как-то... кривовато. Например, в упор устанавливается в единицу (1 Гц) частота Генератора по дискретному выходу номер 6.0 (в Конфигураторе подмодуль Генератор).
Тут и мои косяки могут быть, не спорю. Но все же - как именно сбрасывает вотчдог? Идет ли после этого неявная инициализация переменных?

Спасибо!

Terrano1992
11.12.2012, 13:57
все же - как именно сбрасывает вотчдог? Идет ли после этого неявная инициализация переменных?
По ссылке, которую я давал чуть раньше, как раз обсуждались нюансы сохранения Retain'ов при перезапуске по бесконечному циклу через watchdog. Не в этом ли причина?

Andrei Z
11.12.2012, 13:57
Для меня это набор английских букв и символов))) всегда когда смотришь на это и думаешь неужели я когда буду в этом разбиратся

drvlas
11.12.2012, 15:22
По ссылке, которую я давал чуть раньше, как раз обсуждались нюансы сохранения Retain'ов Но это не то, братцы...
Я не использую RETAIN вообще. Но есть много обычных переменных. Инициализация их идет такими способами:

1) Совершенно неявно: начальное значение переменной не имеет для меня значения, т.к. при первом ее использование предполагается, что этой переменной будет присвоено значение (это большинство очень локальных, временных переменных). Первая операция - запись переменной.

2) Операцией присвоения в процессе инициализации программы: есть часть кода, которая выполняется 1 раз после старта программы. В дальнейшем значение переменной может либо использоваться в операциях чтения-записи, либо только читаться.

3) Операцией присвоения при объявлении переменной. Интересно, эта операция производится при перезапуске от собаки?

4) Думаю, что при запуске работы контроллера он может устанавливать свое ОЗУ в определенное состояние (скорее всего, нули). Происходит ли это в ПЛК100? Происходит ли это при перезапуске от собаки?

Ответов на эти вопросы в той ветке я не нашел. Где-то еще есть описание разных типов сбросов ПЛК (в режиме ОНЛАЙН), сейчас буду искать. Но не уверен, что там четко сказано о собаке.

drvlas
11.12.2012, 16:22
Ну, братцы, я таки действительно доигрался.

Прошу подсказать, как мне теперь сбросить программу у ПЛК. В ходе своих экспериментов я сделал шедевр, в котором за 50 мс после старта программа уходит в мертвый цикл. После положенных 1000 мс вотчдог дает рестарт. ПЛК вякает своим противным зуммером и сидит некоторое время в глубокомысленных стартовых процедурах ("что он там так долго делает?" Обычный вопрос возле туалетной комнаты в коммуналке...). Затем он 50 мс работает. И все повторяется.

А чуднодивный гейтвей устроен так, что системе не все равно, чем там занят процессор. Ей, видишь ли, нужно, чтобы процессор работал.
В результате, ОНЛАЙН не включится, если проц сидит в мертвой петле. После перезапуска ПЛК система тоже не хочет с ним вязаться. Вероятно, те единственные 50 мс, когда ПЛК работает по программе, слишком малы, чтобы установить ОНЛАЙН.

Сухой остаток: я не могу теперь подключиться к ПЛК. Я не могу перешить программу или хоть стереть ее как-то. Кто знает, каковы выходы? "Выбросить в форточку" - плохой совет. У меня 13-й этаж.

capzap
11.12.2012, 16:26
там вроде при нажатой утопленной кнопке сброса надо выключить питание, вроде как то так

drvlas
11.12.2012, 16:31
"Отче наш" читать или нет?
Впрочем, пробовал и так, и эдак. Не помогло.

Какие еще варианты?

ДОБАВЛЕНО: Перепрошивка помогла. Очевидно, во время загадочной надписи "Идет форматирование" (с очень эмоциональным восклицательным знаком) форматируется таки память. Слава Богу!

drvlas
11.12.2012, 18:01
Итак, работоспособность ПЛК восстаноовлена.

Снова вернемся к вопросу рестарта программы. Сброс неодинаков от меню СБРОС отладчика и от включения питания

В приложении проект. Желающие могут его развернуть и проверить, мож у меня руки кривые...

Опишу кратко для тех, кому влом запускать проект.
7598

В проекте запускается аппаратный генератор на дискретном выходе 6.0. Частота генератора должна быть 10 Гц, меандр.

В Конфигураторе создал Генератор с частотой Out11Freq, дьюти-сайклом Out11Duty и непрерывной генерацией.

В программе есть начальный участок, который устанавливает частоту генератора 10 Гц. Этого должно быть достаточно, если никто больше к переменной Out11Freq не обращается?

Компилируем, грузим проект. Запускаем, видим частоту 10 Гц. Можно и без осциллографа - в отладчике при работе ОНЛАЙН видно, что переменная Out11Freq таки равна 10.
Сброс от Кодесиса ничего не меняет, все работает прекрасно.
А теперь сброс кнопкой на ПЛК. И, о-па! Частота стала 1 Гц. Это видно и осциллом, и по значению переменной Out11Freq, если сейчас подключиться отладчиком. Она равна 1, то есть 1 Гц.
Такое же поведение при выключении питания и повторном включении.

Я так понимаю, что инициализации переменных не произошло, переменная Initialized не стала ЛОЖЬю, начальный участок программы не прокрутился... Или где? Где рыться. чтобы понять разницу в сбросах от системы отладки и от выключения питания?
Причем, что прискорбно, именно сброс от выключения питания дает плохой (для моей задачи) результат. Бог с ней, с системой отладки, но как же работать с непонятной мне инициализацией переменных?

capzap
11.12.2012, 18:12
влом смотреть Ваш проект, а такая инициализация Вам не подойдет?

drvlas
11.12.2012, 18:16
В ней тоже есть простая вещь: проверка значения переменной init. Если у меня не работает проверка значения переменной Initialized, то что изменится?
Или там что-то еще, что я упустил?

capzap
11.12.2012, 18:21
а как она может не работать? Создав экземпляр ФБ, все переменные в области VAR будут в фальш, соответственно условие выполниться один раз в самом начале, как мне кажется не зависимо от какого то определенного сброса, покрайней мере я не замечал чтоб это не работало
clk_prg uses the internal sps time to generate a clock with programmable period time.
the first cycle after start is a clk pulse and then depending on the programmed period time a delay.
every pulse is only valid for one cycle.
the accuracy of clk_prg is depending on the accuracy of the system clock вот ихнее пояснилово к этому коду

drvlas
11.12.2012, 21:28
Инициализация переменных происходит одинаково, а вот инициализация периферии - по-разному. К периферии я отношу в данном случае аппаратный генератор на дискретном выходе 11 (6.0) ПЛК.

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

7602

Здесь видно, что Out11Freq присваивается нужное значение во втором цикле. И все работает нормально. И тогда все одинаково, то ли сброс от системы (КДС), то ли от кнопки, то ли от включения питания.
А если переставить это в первый цикл, то аппаратный генератор не включится на нужной частоте (включится на частоте 1 Гц).

Странно, что такую существенную деталь не могут пояснить представители фирмы-разработчика ПЛК. Вероятно, они ждут, что я научусь читать их великолепные руководства по эксплуатации. Ребята, я скоро их писать начну :)

capzap
11.12.2012, 21:37
а чего не хотите Вашим выходам в конфигурации присвоить имена. С использованием %_канал_ в программе, очень много у кого не получается нормально работать, даже приведенный пример в документации к примеру у меня не пошел, пока не стал именовать каналы

drvlas
11.12.2012, 21:57
а чего не хотите Вашим выходам в конфигурации присвоить имена. Не-не, это не вопрос! У меня же опыт в программировании давний, так что с такими вещами не путаюсь. Оставил в данном примере только для наглядности. А в жизни все именованое :)

Была тема (http://www.owen.ru/forum/showthread.php?t=1307), на которую ссылался уважаемый Terrano1992. Там SergeyNG писал о необходимости дождаться конца цикла при проверке модуля статистики. Это, собсно, и натолкнуло меня на результат. Пойду благодарить.

mkhm
16.12.2012, 19:50
Вот так должно работать:

TON_Power(IN:= NOT bPLC_Power_ON, PT:=T#500ms);
WHILE TON_Power.Q DO; END_WHILE

Проще я я не умею :-)

IF (NOT bPLC_Power_ON) THEN WHILE(TRUE) DO;END_WHILE; END_IF;

TON по моему лишний. Даже если потеря питания не в первый цикл ПЛК,
если уж флаг потери питания есть , то он есть и для запуска TON и для пуска бесконечного цикла. И по моему, цикла 0.5 сек для Watchdoga маловато

capzap
16.12.2012, 19:55
IF (NOT bPLC_Power_ON) THEN WHILE(TRUE) DO;END_WHILE; END_IF;

TON по моему лишний. Даже если потеря питания не в первый цикл ПЛК,
если уж флаг потери питания есть , то он есть и для запуска TON и для пуска бесконечного цикла. И по моему, цикла 0.5 сек для Watchdoga маловато

Здесь же таймер стоит, только для того что если через 500мс питание не восстановилось, то тогда уходим в рестарт, зачем лишний раз перегружаться если все продолжает работать

mkhm
17.12.2012, 16:53
Ясно, спасибо.