Управление аппаратным watchdog ом

Здравствуйте,

думаю, надо иметь возможность отключать и включать аппаратный watchdog, который перезагружает систему через 15 секунд, по уровню заряда ИБП. Не поднимали ли еще эту тему? В поиске не нашел.

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

Бывает, что в деревне электричество отключается так надолго, что все системы гарантированного питания перестают работать, и остается только WB-UPS v.2. Он имеет аналоговый вывод, по которому можно оценить его оставшийся заряд. Я собирался испускать команду shutdown при падении заряда ИБП до некоторого уровня, например, 50%, чтобы все службы успели нормально остановиться. Но контроллер через 15 секунд включается снова, и, соответсвенно, перезагрузка зациклится, пока электричество не кончится совсем и опять неожиданно, с порчей файлов.

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

Как бы спаять схемку, чтобы при заряде нашего маленького WB-UPS до 80-90% (как сказано в документации, на выходе Vb будет около 8 вольт) размыкать эту перемычку, ну и, соответственно, при меньшем вольтаже замыкать. Или можно использовать одно из имеющихся устройств?

Также, пусть это будет хотелка к WB-8

но

но мне бы хотелось наколхозить что-то уже на WB7

… если, разумеется, известно, что изменение состояния этой перемычки watchdog во время нахождения платы под питанием не переклинит там чего-нибудь

В 7.4 уже будет интеллектуальный watchdog с возможностью его выключить-включить и (возможно) включить контроллер через ХХ часов. Логика такая: при отсутствии основного питания wtachdog будет контроллер через установленное время, тот выполняет какие-то действия и снова отключается на установленное время или до появления основного питания.

Очень не советую подключаться в внутренние цепи контроллера. Если очень уж хочется - да, можно, в общем, осознавая последствия

То есть путь “в лоб”: замыкать цепь отключения watchdog через оптрон. То есть к клеммам контроллера - коллектор и эмиттер оптрона, на его светодиод подавать напряжение от компаратора. Компаратор - обычный операционник, например как тут
Надо настроить его напряжение срабатывания на какой-то уровень напряжения клеммы АКБ UPS, и (дополнительно) его, компаратора, выход подключить к клемме контроллера Ax например, чтобы можно было точно знать что watchdog уже выключен.
Еще, что важно: нельзя допустить чтобы после выключения контроллера поднявшееся в результате снижения нагрузки напряжение АКБ включало опять watchdog.
То есть - нужно еще поработать от UPS, чтобы гарантированно немного посадить напряжение а потом отключаться.

Я бы поступил немного проще… Взять внешний микроконтроллер, например ту же Ардуино, и сделал на ней выключатель не watchdog а просто питания на контроллер.
Например подключив ее по rs-485 так. Логика такая же, почти. Контроллер “взводит” на ардуино регистр, выключается. Ардуино со взведенным регистром запускает таймер, сбрасываемый обращениями (чтением регистров). Если обращений нет более 10 (например) секунд, то есть контроллер уже выключен - выключает питание контроллера.

Не переклинит.

ничего себе проще!!! :face_with_spiral_eyes: я на си программировал две недели 30 лет назад! А Ардуино в глаза не видел! Почитаю… и придется еще подумать.

А что, при команде shutdown контроллер до последней секунды читает регистры (то есть, я так понимаю, опрашивает шину rs-485)? а в этой схеме родной watchdog отключен? Потому что можно было бы и пару минут подождать, пока все остановится, прежде чем отключать питание.

Но включен родной watchdog или выключен, так и так питание надо восстанавливать, когда питание восстановится и UPS наберет определенное количество заряда. То есть этому Адруино надо и выход UPS измерять. То есть к Ардуино будет подключено 3 группы проводков: управление реле питания контроллера, вывод от UPS для определения заряда, и шина rs-485.

А если у нас есть ввод от UPS, то можно полениться и не делать шину rs-485, а просто транслировать это значение далее на контроллер, если оно ему нужно. А оно ему можеть быть даже и не нужно, его дело - запустить shutdown, если он работает от батареи больше 1 минуты, например.

В этой схеме родной watchdog выключен.

Возможно, я чего-то не понял, но спасибо за идеи и был бы рад комментариям, если есть возможность

edit: да, можно какие-нибудь импульсы посылать на Ардуино, чтобы оно точно знало, работает контроллер или нет, я имею в виду не по шине, а просто через “аналоговый выход” например или 5Vout или еще как-то

Драйвер останавливается секунд за 5-10 до фактического выключения.

Не отключен, точнее это отключение необязательно.

Да, верно.

Ну, конечно можно.

Можно, естетственно. Но мне например, проще не умножать сущности и использовать modbus через rs-485.

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

Я бы наверное решал это программно. Сервис должен следить за зарядом и при его падении ниже критического уровня выключать сервисы (переходить на другой таргет systemd) и ожидать появления питания обратно. Если оно появилось - стартовать сервисы снова.

1 лайк

Тема. Если бы я знал Линукс, я бы сам додумался :slight_smile: наверно, так буду делать, спасибо!

ЗЫ. Евгений, жду от вас посылку. Это так неудобно - нельзя выбрать доставку в пункт выдачи! Раньше после создания посылки на сайте СДЭК я мог поменять доставку курьером на доставку в пункт выдачи, теперь и у них это сломалось! Дико не удобно, мне надо будет уезжать, а я жди курьера. :frowning:

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.