PDA

Просмотр полной версии : Порча RETAIN переменной при срабатывании Watchdog'а



rapucha
23.11.2015, 17:23
ПЛК73, булевская RETAIN переменная. При старте устанавливается в FALSE. Больше в коде записи в эту переменную нет вообще -- программа еще не дописана.
По ходу написания сделал случайно долгий цикл, словил рестарт по вочдогу. С изумлением увидел, что после такого рестарта эта переменная оказалась в состоянии TRUE.

Вообще, наверно, "reset" в неудачный момент времени может поломать запись в eeprom.

Поделитесь опытом. Есть такое -- порча RETAIN переменных? Кто как борется?

Дмитрий Артюховский
23.11.2015, 17:32
ретаин переменная запишется в память при выключении питания, никак не раньше... при ресетах и вачдогах, разряженных аккумуляторах вообще никогда ))) бороться - только организовывая собственное хранилище и сбрасывая туда инфо периодически

rapucha
23.11.2015, 17:46
ретаин переменная запишется в память при выключении питания, никак не раньше... при ресетах и вачдогах, разряженных аккумуляторах вообще никогда ))) бороться - только организовывая собственное хранилище и сбрасывая туда инфо периодически

Насколько я смог прочитать в каком-то местном треде, у ПЛК63/73 другой подход, пишется сразу.

Валенок
23.11.2015, 17:48
В 63/73 с собственными бортовыми хранилищами - проблема, но и резет "случайно" не прокатит.
Не доводить до собаки - и все будет пучком. С батарейкой само собой - иногда.
А что ТС ответил на предложение при соединении после собаки ?

rapucha
23.11.2015, 17:51
В 63/73 с собственными бортовыми хранилищами - проблема, но и резет "случайно" не прокатит.
Не доводить до собаки - и все будет пучком. С батарейкой само собой - иногда.
А что ТС ответил на предложение при соединении после собаки ?

Извините, я не понял вопроса ) и ответа, пожалуй, тоже.

ТС это кто? и что именно с батарейкой иногда?

А файловой системы у 73 нету, да.

rapucha
23.11.2015, 17:56
Нашел тред, http://www.owen.ru/forum/showthread.php?t=14258

И правда, сохраняется по потере питания.

Это, правда, не меняет сути изначальной проблемы -- мусор в RETAIN переменнной после вочдога.

Разъясните тупому -- такое бывает (или я что-то неверно проинтерпретировал)?

Валенок
23.11.2015, 22:40
В чем проблема-то. В нормальной программе собаки в принципе быть не должно. И что там при ней случается - абсолютно ..ю

rapucha
23.11.2015, 23:42
В чем проблема-то. В нормальной программе собаки в принципе быть не должно.
Согласен. Но в программах бывают ошибки.


И что там при ней случается - абсолютно ..ю

Не согласен. Такой вочдог, котоый мусорит в памяти, не лучше тупого зависания.

"Собака" нужна для сохранения работоспособности при возникновении не отловленной на этапе тестирования баги. Для программирования в других областях концепция вообще спорная -- сервер при возникновении серьезной ошибки пусть уж лучше упадет, вывалив в логи всю подноготную, чем будет изображать работу.
А когда данные испорчены -- ну что контроллер хорошего сделает? Если например уставки слетели, или что-то в таком роде..

Как минимум, нужно иметь возможность в программе узнать, не сработал ли вочдог в прошлом ресете.

Валенок
24.11.2015, 11:27
"Собака" нужна для сохранения работоспособности при возникновении не отловленной на этапе тестирования баги
Ватчдог это голимое зацикливание. Его не исключить - расписаться в месторождении рук.Только на стадии написания.
Автор не понимает поведения своей собственной программы ? )))

Для программирования в других областях...
Для выпекания пирожков тоже не подходит.

rapucha
24.11.2015, 14:01
Ватчдог это голимое зацикливание

Нет. Вотчдог это ресет, который случается, когда зацикливание случилось. Дополнительная фича.

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

приборист
24.11.2015, 14:17
Нет. Вотчдог это ресет, который случается, когда зацикливание случилось. Дополнительная фича.

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

Это не дополнительная фича.
Это ошибка, как не крути, причем фатальная.

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

rapucha
24.11.2015, 15:36
Давайте будем точны в понятиях. Ошибка -- это именно глухой цикл. Вотчдог -- это способ минимизировать последствия такой ошибки.
Что глухой цикл это ошибка, никто не спорит.

Вот вы выходы упомянули. Для них предусмотрены безопасные дефолтные состояния. Понятно почему -- между ресетом и инициализацией пользовательского кода есть сколько-то времени, в это время лишних действий установка делать не должна.

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

Грубо говоря, если сработал вочдог -- надо прекращать всякую работу и начинать отладку. беда в том, что из-за порчи флагов как раз и невозможно точно сказать -- стартуем мы после нормального включения, или после вочдога.

Поэтому retain не должен портится. Ну или пользователь должен быть предупрежден, чтобы сохранять данные с камим-нибудь CRC.

Филоненко Владислав
25.11.2015, 19:17
Если этот ретайн вообще есть... А если ни разу питания не выключалось?

rapucha
25.11.2015, 22:02
Заводим флаг "была авария". Сбрасываем его только в процедуре штатного выключения. Если при старте флаг выставлен -- что-то было не так, а если сброшен -- то, значит, выключали как положено. Ну или данные испорчены :mad: