# Самовар и безопасность

- Ссылка: https://www.samovar-tool.ru/2021/03/26/samovar-i-bezopasnost/
- Опубликовано: 2021-03-26T10:03:00+03:00
- Автор: kosoj.diy

«Самовар» следит за параметрами процесса и аварийно отключает нагрев при выходе 
показаний за безопасные пределы. Все аварийные события фиксируются в журнале и отправляются
в мобильное приложение и на сайт samovar-tool.ru. Эта страница описывает полный 
список аварийных сценариев прошивки 7.00 и реакцию контроллера на каждый из них.

## Как устроена аварийная защита

Все аварийные проверки сосредоточены в модуле `alarm.h` и вызываются из главного
цикла контроллера функцией `check_alarm()`. При срабатывании любой проверки формируется
причина аварийного останова и вызывается `request_emergency_stop(reason)`. Функция
выключает нагрев, останавливает насосы, записывает причину в энергонезависимую память
и отправляет уведомление. Выход из аварийного режима — только перезагрузка контроллера.

Сообщения об авариях приходят:

 * на основной экран веб-интерфейса;
 * в мобильные приложения Android и iOS;
 * на сайт samovar-tool.ru;
 * в локальный лог на SD-карте или в LittleFS.

Тип сообщения — `ALARM_MSG` для аварий и `WARNING_MSG` для предупреждений. Предупреждения
не останавливают процесс, но требуют внимания оператора.

## Предельные температуры

Предельные температуры заданы константами в файле `Samovar_ini.h`. Эти значения —
порог для немедленного аварийного останова. Для настраиваемых пользователем порогов(
например, температура завершения дистилляции) — отдельные поля в настройках.

 * `MAX_STEAM_TEMP = 98,8 °C` — предельная температура пара. Превышение — аварийный
   останов с причиной «Превышена максимальная температура пара».
 * `MAX_WATER_TEMP = 75 °C` — предельная температура воды охлаждения. Превышение—
   аварийный останов с причиной «Превышена максимальная температура воды».
 * `ALARM_WATER_TEMP = 70 °C` — критическая температура воды (предупреждение). При
   её достижении контроллер ступенчато снижает напряжение регулятора мощности на
   5 В за итерацию и делает паузу 30 секунд между шагами. Если снижение не помогает
   и температура продолжает расти, срабатывает авария по `MAX_WATER_TEMP`.
 * `MAX_ACP_TEMP = 75 °C` — предельная температура ТСА (датчик в термосопротивлении
   насадочной части колонны). Превышение — аварийный останов.
 * `SamSetup.DistTemp` (настраивается, по умолчанию 99,9 °C) — температура завершения
   дистилляции и БК. При её достижении контроллер пытается штатно завершить программу
   через очередь команд `SAMOVAR_POWER`. Если очередь занята, контроллер вызывает
   аварийный останов — лучше пойти по аварийному пути, чем оставить нагрев до полного
   выкипания.

## Давление

Если установлен датчик давления MPX5010DP и в настройках задано значение `MaxPressureValue`(
по умолчанию 0 — проверка выключена), контроллер следит за давлением в колонне. 
При превышении порога — аварийный останов с причиной «Превышено предельное давление!».
После снижения давления на 5 % ниже порога (гистерезис) аварийное состояние снимается
автоматически.

## Датчик захлёба

Если в настройках включён параметр «Использовать датчик уровня флегмы» (`UseHLS`)
и датчик подключён к пину WHLS, контроллер следит за уровнем флегмы в голове колонны.
При срабатывании датчика более чем `WHLS_ALARM_TIME = 3 секунды`:

 * включается зуммер и отправляется уведомление «Сработал датчик захлёба!»;
 * если используется регулятор мощности, контроллер снижает напряжение на одну ступень(
   для SEM AVR — 3 %, для остальных регуляторов — 1 × PWR_FACTOR);
 * следующая реакция возможна только через 40 секунд — процесс инерционный, и чаще
   снижать нет смысла.

Если программа работает на предзахлёбе (тип строки C), контроллер запоминает текущее
напряжение как `prev_target_power_volt` и через `TIME_C / 5 минут` возвращает напряжение
к запомненному значению минус 0,5 ступени. Если датчик продолжает срабатывать, цикл
снижения повторяется.

## Поток воды

Если установлен датчик потока воды и в настройках включён параметр «Использовать
контроль потока воды» (`UseWS`), контроллер следит за наличием расхода воды во всех
режимах, где требуется охлаждение. Если в течение `WF_ALARM_COUNT` циклов опроса
расход воды нулевой, вызывается `request_emergency_stop` с причиной отсутствия потока.
Это защита от перегрева колонны и ТСА при отключении воды или отказе насоса.

## Отказ температурного датчика

Каждый датчик DS18B20 имеет счётчик ошибок `ErrCount`, который инкрементируется 
при неудачных попытках чтения (обрыв провода, отсутствие ответа). Функция `optional_sensor_failed`
считает датчик отказавшим, если показания вне диапазона 2,0–126,0 °C или ошибки 
чтения повторяются. При отказе:

 * отправляется уведомление вида «Датчик пара не отвечает» / «Датчик куба не отвечает»/«
   Датчик воды не отвечает» / «Датчик ТСА не отвечает» с указанием режима;
 * включается аварийная защёлка — нагрев остаётся выключенным до устранения причины;
 * выход из аварии — перезагрузка контроллера.

Дополнительно в режиме «Ректификация» проверяется, что датчики пара и куба вообще
назначены (адрес не 0xFF). Если на шине 1-Wire нет ни одного датчика, контроллер
пытается штатно выключить нагрев через очередь команд, а если очередь занята — переходит
в аварийный режим.

## Аварийная кнопка

Если в настройках платы определён пин `ALARM_BTN_PIN` (по умолчанию это GPIO 35 
на классическом ESP32 и GPIO 48 на ESP32-S3), к нему можно подключить аварийную 
кнопку или датчик протечки воды, работающий на замыкание. Контакт подтянут к питанию;
при замыкании на землю (FALLING) срабатывает прерывание, отдельная задача `triggerEmergencyButton`
вызывает `request_emergency_stop` с причиной «Аварийное отключение: нажата аварийная
кнопка».

Особенности пинов:

 * на классическом ESP32 пины 34–39 — только вход без внутренних подтяжек, поэтому
   требуется внешний подтягивающий резистор к питанию;
 * на ESP32-S3 пин 48 имеет внутреннюю подтяжку, внешняя не требуется.

Аварийная кнопка по умолчанию отключена — для её включения нужно раскомментировать`#
define USE_ALARM_BTN` в `Samovar_pin.h` или задать пин через `user_config_override.
h`. После срабатывания выход из аварийного режима возможен только перезагрузкой 
контроллера.

## Защита регулятора мощности

Если в настройках включён параметр «Использовать проверку подключения регулятора»(`
CheckPower`) и связь с регулятором мощности пропала во время работы, контроллер 
аварийно выключает нагрев. Это защита от случая, когда регулятор перестал отвечать(
обрыв связи по UART, отказ питания регулятора), а нагрев остался включённым.

## Сторожевые таймеры задач

FreeRTOS-задачи контроллера (задача регулятора, задача надзора за SysTicker, стек-
вотчдог) следят друг за другом. Если какая-либо из них не отвечает дольше допустимого
времени:

 * задача регулятора не запустилась — аварийный останов «Задача регулятора не запущена»;
 * задача аварийной кнопки не запустилась — аварийный останов «Задача аварийной 
   кнопки не запущена»;
 * критически малый остаток стека любой задачи — аварийный останов «Критически малый
   остаток стека задачи …»;
 * зависание задачи надзора SysTicker — аварийный останов «Задача надзора SysTicker
   зависла».

## Причины аварийных остановов

При срабатывании любой аварийной проверки причина записывается в энергонезависимую
память (`latched_emergency_stop_reason`) и доступна для чтения через веб-интерфейс
и API. После устранения причины оператор снимает аварийный режим перезагрузкой контроллера.

Типичные причины, которые видит оператор:

 * «Превышена максимальная температура пара / воды / ТСА»;
 * «Лимит максимальной температуры куба. Программа завершена.» (штатное завершение);
 * «Превышено предельное давление!»;
 * «Датчик пара не отвечает» / «Датчик куба не отвечает» / «Датчик воды не отвечает»/«
   Датчик ТСА не отвечает»;
 * «Аварийное отключение: нажата аварийная кнопка»;
 * «Нет потока воды»;
 * «Регулятор мощности не отвечает»;
 * «Критическая температура воды! Ошибка подачи воды» (предупреждение, ступенчатое
   снижение мощности).

## Где смотреть настройки

 * Предельные температуры — `MAX_STEAM_TEMP`, `MAX_WATER_TEMP`, `MAX_ACP_TEMP`, `
   ALARM_WATER_TEMP` в `Samovar_ini.h`.
 * Температура завершения дистилляции — `DistTemp` на вкладке «Основные» страницы
   настроек.
 * Давление аварии — `MaxPressureValue` на вкладке «Основные».
 * Датчик захлёба — параметр «Использовать датчик уровня флегмы» на вкладке «Основные»
   и пин WHLS в `Samovar_pin.h`.
 * Датчик потока воды — параметр «Использовать контроль потока воды» (`UseWS`) на
   вкладке «Прочие».
 * Аварийная кнопка — пин `ALARM_BTN_PIN` и флаг `USE_ALARM_BTN` в `Samovar_pin.
   h`.
 * Проверка регулятора мощности — параметр «Использовать проверку подключения регулятора»(`
   CheckPower`) на вкладке «Прочие».

### Понравилось это:

Нравится Загрузка…

### _Похожее_
