Статті бази ▾ ← Усі бази знань
Автоматика oCBot
Концепція та філософія12 Ласкаво просимо до екосистеми oCBotЗвідки взявся oCBotІдеологія oCBotСфери призначення та режими роботиПериферійні пристроїСвобода периферіїБазові скрипти автоматизаціїВіртуальні панелі оператораСкладні сценарії та логіка автоматизаціїМультиконтролерністьЗагальний огляд автоматики oCBotАрхітектура та опис
Підтримувані контролери18 Контролер Kincony KC868-A6Підключення живлення й USB на KC868-A6Реле й аналогові виходи KC868-A6Сухі контакти й аналогові входи KC868-A6Шини й роз'єми KC868-A6: RS485, I2C, 1-Wire і рештаЩо зайнято на ESP32 у KC868-A6: карта GPIOЯк зібрати щиток на KC868-A6Як прогнати сценарії без куба: тестовий стенд для KC868-A6Контролер Kincony KC868-A16Підключення живлення й USB на KC868-A16Силові виходи KC868-A16: MOSFET замість релеСухі контакти й аналогові входи KC868-A16Шини й мережа KC868-A16: Ethernet, RS485, I2C, 1-WireЩо зайнято на ESP32 у KC868-A16: карта GPIOЯк зібрати щиток на KC868-A16Як прогнати сценарії без куба: тестовий стенд для KC868-A16Контролер WT32-ETH01Універсальний ESP32 DevKit (Custom)
Каталог периферійних пристроїв9 Датчики температуриДатчики тискуДатчики рівня рідиниДатчики потоку (витратоміри)Виконавчі механізми (Клапани, Насоси, ТЕНи)Датчики середовища (Вологість, Світло, Тиск)Датчики електричні та вагиОргани керування (Кнопки, Енкодери)Електродвигуни та вентилятори
Складання та Перший запуск (DIY)20 Збирання контролера oCBot своїми рукамиПервинне прошивання та запуск контролераШвидке підключення Wi-Fi через BluetoothПідключення ТЕНів та регуляторів потужностіВибір та підключення електромагнітних клапанівКілька плат PCA9685 на одній шиніПін OE — апаратне зняття всіх виходівПлата PCA9685 зблизька — що на ній є і навіщоПлата розширення PCA9685 — 16 каналів ШІМСервопривід і плата розширення — чому це не працюєТвердотілки на платі розширенняПідключення LCD та OLED дисплеїв по шині I2CДвигун і частотний перетворювач: силове підключенняПромисловий протокол RS485 (Modbus RTU)Частотник AE200 (Yingshida) по Modbus: клеми, параметри й регістр завдання частотиЧастотник CFM310 по Modbus: панель RS485, сервісне меню і три регістриЧастотник Ennera FCE по Modbus: налаштування і діагностикаЧастотник без Modbus (900E): пуск реле й оберти 0–10 ВКалібрування ваг на тензодатчиках (HX711)Усунення типових несправностей
Робота з веб-інтерфейсом17 Головна сторінка (Home)Діаграма процесу (Flow)Сценарії автоматизаціїРедактор скриптівПульти оператораДизайнер пультів HMI DesignerПериферіяПлати та шиниЗагальні налаштуванняОбладнанняТочки монтажуНалаштування графіківОновлення прошивкиНалаштування Wi-FiЛогиПорталПро програму
Написання сценаріїв (C++ Скрипти)10 Огляд скриптівМій перший сценарій: Крок за крокомШІМ-відбір: Як налаштувати клапан правильноНалаштування ПІД-регулятора для стабілізаціїАвтоматизація температурних пауз при затиранні солодуСкрипт ББКРегулювання тискуРозрахунок ABV за температурою париСкрипт «Розрахунок ABV»ABV у сценаріях
Безпека, Хмара та Інтеграція5 Система безпеки oCBot: Захист від аварійСтворення хмарного кабінету UA DistilleryЯк опублікувати звіт про перегонкуШеринг кастомних пультів оператора (HMI)Інтеграція з Home Assistant та MQTT
База знаньАвтоматика oCBotПідтримувані контролери

Як прогнати сценарії без куба: тестовий стенд для KC868-A6

Плата на столі, до неї три тумблери й один DS18B20 — так перевіряється лише те, що реле клацає. Сценарій ББК має сім стадій і десяток аварій, парогенератор — три скрипти в композиції, і половину їхніх станів на живому кубі викликати не можна: надтиск, сухий хід, датчик, що показує 130 °C, шину 1-Wire, яку поклав один датчик. Кожна така ситуація, не перевірена на стенді, перевіриться на клієнті — у розпал перегону.

Ця стаття — про стенд, на якому кожен вхід A6 має імітатор під рукою, а кожен вихід — навантаження, яке видно й чути. Перша половина — що купити і куди підключити, клема за клемою. Друга — методика: які тумблери в якому порядку клацати, щоб провести кожен сценарій прошивки через усі стадії й усі аварії, і що при цьому має показати контролер.


Що стенд має вміти#

Прошивка бачить залізо не як «датчики й реле», а як шість типів інтерфейсів (interface_type у rb_environment_parts.h). Стенд імітує саме їх — тоді будь-яка периферія, яку клієнт створить у Периферії, на стенді має свій фізичний відповідник:

Інтерфейс у oCBot Що на клемі A6 Що імітуємо Чим
dry_contact_inputs DI-1…DI-6 поплавки, пресостати, кнопки, аварійні контакти тумблер між DI і GND
analog_inputs A1–A4 тиск 0–5 В, вага, датчик 4–20 мА; імпульси витратоміра потенціометр від 5 В; імітатор струмової петлі з шунтом; генератор імпульсів
one_wire (io_3v3) IO-1, IO-2 DS18B20 у кубі, колоні, парогенераторі справжні датчики в нагрівальному блоці + емулятор, що видає будь-яке число
relays Output 1–6 ТЕНи, клапани, мішалка, вхід твердотілки нагрівальний патрон, лампа, соленоїд, вентилятор, вхід SSR
analog_outputs DA-1, DA-2 плавний ТЕН, помпа браги вхід SSR з лампою, драйвер ШІМ з вентилятором, вольтметр
modbus RS485 A, B частотник мішалки, модуль PT100, лічильник симулятор Modbus на ноутбуці, справжній модуль PT100 з резисторами
board_0…7 IIC плата PCA9685 для другого ТЕНа PCA9685 + ULN2803 + SSR з лампою

Три стани, які прошивка розрізняє окремо, і стенд має вміти дати кожен:

Важливо

Стенд перевіряє прошивку, а не електрику щитка. 220 В на ньому потрібні лише для одного — побачити, як твердотілка тримає лампу в часо-пропорційному режимі. Усе інше — 12 В: реле A6 не знає, що комутує, а сценарію байдуже, ТЕН на 3 кВт за контактом чи лампа на 21 Вт.


Що потрібно#

Перелік — під один стенд A6. Позиції з каталогу — за посиланням у рядку «У каталозі» під статтею; решта — типові модулі, які продаються під тими назвами, що в таблиці.

Живлення й захист#

Що Роль на стенді
Блок 12 В 15 Вт на DIN (Mean Well HDR-15-12) живлення плати. Окремий, щоб коротке в навантаженні не перезавантажувало контролер
Блок 12 В 3–5 А живлення навантажень: патрон, лампа, соленоїд, вентилятор, реле
Два тримачі запобіжників 5×20 на DIN, 1 А і 5 А плата й навантаження окремо
Грибок «Стоп» з фіксацією розриває лише 12 В навантажень. Контролер лишається живим — щоб бачити в панелі, що він робить після аварії
Автомат 6 А + ПЗВ 10 мА, розетка, корпус із кришкою окрема секція 220 В лише під лампу твердотілки. Без цієї секції стенд повноцінний
Шинки GND і +12 на DIN, клемники усі землі — в одну точку: блоки живлення, плата, імітатори, симулятор Modbus

Імітатори входів#

Що Скільки Роль
Тумблер SPST ON-OFF 6 сухі контакти DI-1…DI-6
Кнопка без фіксації 1 паралельно тумблеру DI-6 — «кнопка» як тип периферії
Потенціометр 10-обертовий 10 кОм (3590S) 2 аналогові 0–5 В: тиск, вага
Стабілізатор 5 В (модуль 78L05 або buck 12→5) 1 опора для потенціометрів: на A6 клеми 5 В немає
Панельний вольтметр 0–5 В 2 бачити, скільки подано на A1 і A4
Імітатор струмової петлі 4–20 мА (кишеньковий, з крокопотенціометром) 1 датчик 4–20 мА
Резистор 250 Ом 0,1 % 1 шунт: 4–20 мА → 1–5 В на клемі
Генератор імпульсів з дисплеєм (модуль XY-LPWM або на NE555), живлення 5 В 1 витратомір: частота = витрата
DS18B20 у гільзі 3–4 справжні датчики температури
Плата Arduino Nano з бібліотекою OneWireHub 1 емулятор DS18B20: задає з ноутбука будь-яке значення, зокрема 130 °C і −30 °C, яких справжній датчик не дасть
Тумблер у лінії DQ по одному на датчик «датчик відвалився»
Перемичка DQ–GND 1 «датчик закоротив шину»
Алюмінієвий брусок 50×50×20 мм з двома отворами під гільзи 1 нагрівальний блок — міні-куб
Нагрівальний патрон 12 В 40 Вт 1 ТЕН міні-куба
Вентилятор 12 В 40 мм 1 «сорочка охолодження» міні-куба

Навантаження виходів#

Що Скільки Роль
Індикатор 12 В на DIN (лампа-модуль) 6 + 2 стан кожного реле; на реле 6 — два кольори на NO і NC
Лампа 12 В 21 Вт (автомобільна, у патроні) 1 реальний струм 1,75 А через контакт
Соленоїдний клапан 12 В 1 індуктивне навантаження, чутно клацання
Твердотілка з входом 3–32 В DC, з індикатором 2 ТЕН на реле й ТЕН на DA
Лампа розжарювання 220 В 40–60 Вт у патроні 1 навантаження твердотілки, лише в захищеній секції
Драйвер MOSFET з ШІМ-входом (модуль на IRF520 чи D4184) 1 помпа на DA-2: ШІМ → вентилятор або помпа 12 В
RC-фільтр 10 кОм + 10 мкФ і вольтметр 0–10 В 1 показує середнє на DA: меандр 4 кГц вольтметр напряму не прочитає

Шини#

Що Роль
Перехідник USB–RS485 з автонапрямом (CH340 + MAX485), з перемичкою термінатора ноутбук на шині: симулятор Modbus-пристроїв
Програма-симулятор Modbus RTU slave (diagslave, ModRSsim2 або скрипт на pymodbus) частотник, модуль PT100, лічильник PZEM — будь-який регістр будь-яким значенням, і «замовкнути» за клацанням
Модуль PT100 → Modbus, 4 канали справжній Modbus-датчик; замість PT100 — резистори
Резистори 100 Ом, 138 Ом, 176 Ом на тумблері 0, 100 і 200 °C за таблицею IEC 60751 (100,00 / 138,51 / 175,86 Ом)
PCA9685 + буфер ULN2803 другий плавний ТЕН по I2C — на A6 необовʼязково, але це та сама пара, що обовʼязкова на A16

Інструменти#

Мультиметр, кабель USB-C, ноутбук із панеллю oCBot і симулятором Modbus, маркер для ферул. Осцилограф не потрібен: усе, що треба побачити на DA, показує твердотілка з лампою.


Як підключити#

Схема стенда KC868-A6: ліворуч імітатори входів — тумблери на DI, потенціометри й генератор імпульсів на A1–A4, датчики й емулятор на IO-1 та IO-2; праворуч навантаження — нагрівальний патрон, лампа, соленоїд і вентилятор на реле 1–4, твердотілки на реле 5 та DA-1, драйвер ШІМ на DA-2; знизу шина RS485 до ноутбука й модуля PT100, I2C до PCA9685; живлення плати й навантажень від окремих блоків зі спільною землею

Принцип один на всі клеми: між платою і будь-яким імітатором — клемник на DIN, а на клемнику — ферула з номером клеми плати. Тоді стенд перекомутовується під іншу збірку за хвилину, і дріт «DI-3» знайдеться без прозвонки.

Реле: шість навантажень#

COM кожного реле — на шинку +12 блока навантажень (не блока плати). З NO — навантаження, другий дріт навантаження — на шинку GND. Контакт тримає 10 А, тож лампа на 1,75 А і патрон на 3,3 А для нього ніщо (стаття про виходи).

Реле Навантаження на NO Що перевіряє Периферія oCBot
1 нагрівальний патрон 12 В 40 Вт у блоці + індикатор замкнутий контур термостата: реле гріє блок, DS18B20 у блоці це бачить Нагрівач, relays канал 0
2 лампа 12 В 21 Вт + індикатор другий ТЕН каскаду, ротація ТЕНів, контакт під реальним струмом Нагрівач, канал 1
3 соленоїд 12 В + індикатор клапан: індуктивне навантаження, чутно Клапан, канал 2
4 вентилятор 12 В на блоці + індикатор охолодження міні-куба: замкнутий контур для «спуску» в затиранні на ферментах Клапан, канал 3
5 вхід твердотілки 1 (+ на NO, на GND) ТЕН на релейному виході — лише увімк/вимк Нагрівач, канал 4
6 індикатор на NO і інший на NC перекидний контакт: після перезавантаження плати світиться NC Реле / Мішалка, канал 5

Нагрівальний блок — це і є «куб» стенда. Брусок алюмінію 50×50×20 мм важить близько 135 г; при 40 Вт і теплоємності 0,9 Дж/(г·К) він гріється на 0,33 К/с — від кімнатної до 80 °C за три хвилини, а вентилятор за стільки ж повертає назад. Цього досить, щоб термостат затирання пройшов усі паузи в реальному часі, а не в уяві.

Обережно

Патрон без датчика в блоці за десять хвилин розігріє брусок понад 200 °C і зіпсує DS18B20 (межа +125 °C). Тому в блоці два отвори: другий — під датчик, який ніколи звідти не виймається і привʼязаний в умові «Безпека» термостата як аварійний на 110 °C.

DA-1, DA-2: два плавні виходи#

На клемі DA при 50 % — не 5 В, а меандр 0/10 В на 4 кГц; для нагрівача прошивка з 0.2.7 замість меандру тримає 10 с період: частку — 10 В, решту — 0 В (що насправді на клемі). Стенд має показати обидва режими:

Клема Навантаження Що видно
DA-1 вхід твердотілки 2 (+ на DA-1, на GND); на її виході — лампа 220 В із захищеної секції або лише індикатор SSR нагрівач 30 % → лампа 3 с горить, 7 с ні. Горить рівно — периферія створена не як «Нагрівач» або прошивка старіша за 0.2.7
DA-1 паралельно RC-фільтр 10 кОм + 10 мкФ → вольтметр 0–10 В середнє: 30 % → 3 В
DA-2 драйвер MOSFET з ШІМ-входом → вентилятор 12 В (або помпа) помпа браги 10…95 % — обороти на слух і на око

Вихід DA — операційний підсилювач, він тримає лише вхід приймача. Вентилятор на нього напряму не садити: тільки через драйвер.

DI-1…DI-6: сухі контакти#

Тумблер між DIn і GND тієї ж колодки. Живлення на контакт дає плата, струм близько 5 мА, полярності немає (стаття про входи). Розкладка під збірку ББК з пісочниці — три рівні, два пресостати, кнопка:

Клема Орган на панелі Периферія oCBot Стан у ролі
DI-1 тумблер «води · низ» Рівень, стан SAS_DOWN level-low
DI-2 тумблер «води · центр» Рівень, SAS_CENTER level-mid
DI-3 тумблер «води · верх» Рівень, SAS_UP level-high
DI-4 тумблер «тиск є» Тиск, SAS_READY pressure-ready
DI-5 тумблер «надтиск» Тиск, SAS_ERROR pressure-error
DI-6 тумблер + кнопка паралельно Кнопка (для пульта) або аварійний контакт кнопка на панелі оператора; умова «Безпека»

Тумблер увімкнено = контакт замкнутий = «мокро» / «тиск є». Інверсію (нормально замкнутий поплавок) вмикайте в налаштуваннях периферії, а не переставляйте дроти: саме так її вмикатиме клієнт.

A1–A4: аналог і імпульси#

Дільник 5,1 кОм / 10 кОм уже на платі: клема чекає 0–5 В, зовнішній дільник не потрібен, лінійна ділянка — до ~3,7 В на клемі (стаття про входи). Порядок каналів на A6 збігається з клемами: A1 → канал 0.

Клема Імітатор Що перевіряє Периферія oCBot
A1 потенціометр 1: крайні виводи на 5 В і GND, повзунок на A1, вольтметр паралельно тиск у колоні для розрахунку міцності; калібрування нуля Тиск, analog_inputs канал 0
A2 генератор імпульсів: вихід через 1 кОм на A2, GND спільна; живлення генератора 5 В, щоб імпульс був 5 В витрата браги: частота → л/хв Витратомір, канал 1, «імпульсів на літр»
A3 імітатор 4–20 мА послідовно з шунтом 250 Ом на GND; клема A3 — на верхній кінець шунта датчик 4–20 мА: 4 мА = 1 В, 20 мА = 5 В; обрив петлі = 0 В Тиск або Вага, канал 2
A4 потенціометр 2 другий аналог: вага, енкодер пульта Вага / Енкодер, канал 3

Частоту для витратоміра рахуйте з формули прошивки: витрата, л/хв = імпульси/с ÷ (імп/л ÷ 60). Для збірки ББК з 400 імп/л це 6,67 Гц на 1 л/хв; поріг «мінімальна подача браги» 0,5 л/хв — 3,3 Гц. Генератор із дисплеєм показує герци, і в Периферії одразу видно л/хв.

IO-1, IO-2: температура#

Дві шини 1-Wire з підтяжкою 4,7 кОм на платі; DS18B20 — трьома дротами на IO-n, 3V, GND, без другої підтяжки. Шина 0 в oCBot — це IO-2 (стаття про шини). На стенді шини розділені за призначенням:

Роз'єм Що на шині Навіщо
IO-2 (шина 0) 3 справжні DS18B20: два в нагрівальному блоці, один у повітрі; у лінії DQ кожного — тумблер реальна фізика: термостат, каскад ТЕНів, охолодження. Тумблер = «датчик відвалився»
IO-1 (шина 1) емулятор на Arduino Nano (OneWireHub, приклад DS18B20): кілька адрес, температура кожної задається з монітора порту значення, яких не дасть залізо: 130 °C для аварії ББК, стрибок на 20 °C за секунду, «верх колони» окремо від «низу»
обидві перемичка DQ–GND на панелі «один датчик поклав шину»: усі датчики цієї шини протухають, сусідня шина живе

Емулятор — не готовий прилад, а скетч, який заливається в Nano: бібліотека OneWireHub відкрита, приклад емуляції DS18B20 в ній є, адреси датчиків задаються в коді. Півгодини роботи, і далі температура «верху колони» — це число, набране в терміналі.

RS485: Modbus#

Клеми A, B. Драйвер з автонапрямом, rts = -1, 9600, термінатор 120 Ом уже на платі — тож другий термінатор вмикається перемичкою на USB-перехіднику, а модуль PT100 посередині шини лишається без нього (стаття про шини). Третій дріт GND — на шинку землі.

Пристрій на шині Slave-id Що імітує Як «зламати»
ноутбук із симулятором 1 частотник Ennera FCE: регістри 0x0328 керування, 0x044D завдання, 0x04C4 стан, 0x0718 аварія (стаття) закрити порт — привід «замовк»; у слово стану записати біт аварії
він же, друга адреса 2 лічильник PZEM-016 або модуль аналогових виходів будь-яке значення в будь-якому регістрі
модуль PT100, 4 канали 3 справжній Modbus-датчик: на вхід 1 — тумблер із резисторами 100 / 138 / 176 Ом зняти резистор — модуль віддає код обриву, а не температуру

Одна пастка: UART під RS485 на платі один, тож контролер у ролі вузла для іншого oCBot не може водночас опитувати свій частотник. Для перевірки мультиконтролерності на стенді потрібен другий контролер, а не симулятор.

IIC: плата розширення#

Роз'єм IIC запаяний: GND, 3V3, SCL, SDA. Адреси 0x22, 0x24, 0x68 зайняті платою; PCA9685 за замовчуванням сідає на 0x40 без конфлікту. Канал 0 PCA9685 → ULN2803 → вхід третьої твердотілки → індикатор. На A6 це потрібно лише для перевірки часо-пропорційного режиму плати розширення і кількох плат на шині; нагрів на A6 сценарії ведуть через DA.


Як розташувати#

Компонування стенда KC868-A6: зверху монтажна плита з трьома DIN-рейками — живлення й захист, контролер із модулями шин, клемники та індикатори реле; знизу лицьова панель із зонами тумблерів рівнів і тиску, потенціометрів і генератора імпульсів, гнізд датчиків з вимикачами й вольтметрів виходів; нагрівальний блок збоку

Стенд — це монтажна плита 400×500 мм із трьома DIN-рейками і лицьова панель 400×250 мм перед нею, на якій живе все, що клацається під час прогону. Панель на петлях знизу: відкинув — видно клемники.

Три рейки#

  1. Верхня — живлення й захист. Автомат і ПЗВ секції 220 В (якщо є), два блоки 12 В, два запобіжники, клеми грибка. Силове зліва, слабкострумове справа, між ними — 50 мм порожньої рейки.
  2. Середня — контролер і шини. A6 на DIN-адаптері посередині, ліворуч модуль PT100 і USB-перехідник RS485 у тримачі, праворуч PCA9685 з ULN2803 на DIN-каретці та обидві твердотілки на радіаторі. Усе, що спілкується з платою по шині, — на одній рейці з нею, кабелі короткі.
  3. Нижня — клемники й індикатори. Два ряди клемників: лівий — входи (DI, A, IO), правий — виходи (реле, DA). Над правим рядом — вісім індикаторів реле. Кожен клемник підписаний номером клеми плати, той самий номер — на ферулі дроту.

Лицьова панель#

Зони — зліва направо, у тому ж порядку, що колодки на платі, щоб рука не шукала:

Зона Органи Колір підпису
Сухі контакти 6 тумблерів у два ряди: рівні окремо від тиску; кнопка під DI-6 рівні — помаранчевий, тиск — фіолетовий, кнопка — сірий
Аналог два потенціометри з вольтметрами, гніздо імітатора 4–20 мА, генератор імпульсів із дисплеєм тиск — фіолетовий, витрата — золотий
Температура 3-контактні гнізда датчиків шини 0 з тумблером DQ під кожним; гніздо емулятора шини 1; перемичка «коротке на шині» під захисною кришкою червоний
Виходи 8 індикаторів реле (пронумеровані 1–6, у шостого два), вольтметр DA-1. Ручок тут немає: DA керується лише з панелі oCBot нагрів — червоний, клапани — блакитний, помпа — золотий
Аварія грибок «Стоп» у правому нижньому куті, окремо від решти червоний на жовтому

Кольори — не декор, а та сама палітра, що в прошивці: помаранчевий у рівнів, пурпуровий у тиску, золотий у помпи й витрати, блакитний і бірюзовий у води, червоний у нагріву — саме такі кольори мають картки в збірках пісочниці. Людина дивиться на панель і на екран і бачить один колір.

Підпис кожного органа — у два рядки: зверху назва периферії так, як вона буде в Периферії («води · низ»), знизу — клема плати («DI-1»). Нагрівальний блок — на кронштейні збоку від плити, з боку зони температури, з вентилятором назовні: він гарячий, і йому не місце серед тумблерів.

Кабелі#


Методика прогону#

Еталон конфігурації — збірки з пісочниці (packages/firmware/sandbox/kits): «Затирання зернових», «Затирання на ферментах», «ББК». Периферію на стенді створюйте з тими самими назвами й кольорами, що в збірці, — тоді журнал зі стенда читається так само, як журнал з пісочниці, і розбіжність між ними одразу видно.

Загальні правила прогону:

  1. Перед кожним сценарієм — всі тумблери вниз, потенціометри на нуль, емулятор на 25 °C, грибок відпущений.
  2. Клацнули тумблер рівня — стан у Периферії зміниться через 2 с: такий антидребезг у типу «Рівень» за замовчуванням (rb_default_debounce_ms). Кнопка — через 50 мс.
  3. Вимкнули DQ датчика — картка попередить через 15 с, не одразу.
  4. Кожен пункт методики — це пара «дія на панелі → стадія або аварія, яку має показати картка скрипта». Стадії названі так, як у коді, бо саме так вони видні в журналі.

Керування нагрівом: каскад і ротація#

Скрипт «Керування нагрівом» (sk_heater) розкладає задану потужність по елементах: реле — цілком, від найбільшого, а рівні за потужністю міняє місцями кожні cycle_period_s (60 с за замовчуванням), щоб зношувались порівну.

Дія Очікування
нагрівачі 3 кВт на реле 1 і 2, ціль 6000 Вт, старт обидва індикатори горять, патрон гріє, лампа світить
ціль 3000 Вт один горить; через 60 с — інший, перший гасне
ціль 2000 Вт при елементах 3 кВт жодного: у бюджет не влазить ні один; показник heater-1-power = 0
нагрівач «на DA-1» 3 кВт + реле 2 3 кВт, ціль 4500 реле 2 горить постійно, лампа за твердотілкою DA-1 блимає 5 с / 5 с

Термостат і затирання#

Збірка «Затирання зернових»: датчик затору — DS18B20 у нагрівальному блоці, ТЕНи — реле 1 (патрон) і 2 (лампа), мішалка — реле 3. Це єдиний сценарій, який на стенді йде замкнутим контуром без рук: патрон гріє блок, датчик це бачить, термостат (sk_temp, режим 0) вимикає нагрів при target + hyst і вмикає при target − hyst.

Дія Очікування
старт сценарію з паузами 52 → 63 → 72 → 78 °C, час пауз по 1–2 хв блок доходить до 52 °C за ~1,5 хв, стадія heatingidle, тримається ±0,5 °C, таймер паузи йде; далі наступна пауза
відкрити вентилятор рукою (реле 4 з панелі) під час паузи температура падає, термостат знову heating — гістерезис видно на графіку
тумблер DQ датчика затору вниз на 20 с через 15 с картка датчика протухла; якщо датчик у блокуванні — реле 1–2 гаснуть, стадія скрипта не змінюється, а виходи заблоковані «замком»
емулятор замість блока (шина 1): 63 °C рівно нагрів не вмикається (в межах гістерезису); 62,4 → вмикається; 63,6 → вимикається

«Затирання на ферментах» додає спуск — режим охолодження термостата (cool-main → скрипт охолодження) з клапаном сорочки на реле 4. На стенді реле 4 крутить вентилятор на блоці: після розрідження при 63 °C сценарій має відкрити «клапан» і чекати 58 °C. Вентилятор скидає ці 5 градусів приблизно за хвилину.

Рівень води#

Скрипт «Рівень води» (sk_water_lvl): пара датчиків OFF (мокрий → стоп подачі) і ON (сухий → пуск), решта — на узгодженість. Клапан наливу — реле 3 (соленоїд, чутно).

stateDiagram-v2
    [*] --> filling: старт, датчик ON сухий
    filling --> full: датчик OFF мокрий
    full --> filling: датчик ON знову сухий
    filling --> sensor_conflict: мокрий вище сухого
    full --> sensor_conflict: мокрий вище сухого
    sensor_conflict --> filling: конфлікт зник
    filling --> error_missing_sensor: обраний датчик не привʼязаний
Тумблери низ / центр / верх Стадія Клапан
↓ ↓ ↓ filling відкритий
↑ ↓ ↓ filling (OFF = верх) відкритий
↑ ↑ ↑ full закритий
↑ ↑ ↓ після full, level_on = той самий (типово) filling — гістерезис лише в самому поплавку відкритий
↑ ↑ ↓ після full, level_on = низ full — засувка: низ ще мокрий закритий
↓ ↑ ↑ sensor_conflict — центр мокрий над сухим низом закритий, скрипт працює далі
привʼязку level-high зняти, level_off лишити = верх error_missing_sensor, скрипт в помилці закритий

Аварії за часом — «низ сухий довше N с» (сухий хід), «верх мокрий довше N с» (переповнення) — це не логіка скрипта, а умова із затримкою у вкладці Безпека (alarm_delay_s). Перевіряється так: задати умову «рівень низ менше 0,5 через 30 с», опустити тумблер низу й тримати — рівно через 30 с скрипт стає в аварію, на 29-й — ні. Прапорець «Лише після норми» (alarm_arm_after_ok): порожній бак на старті аварією бути не має, поки хоч раз не був мокрим.

Тиск пари й парогенератор#

«Тиск пари» (sk_steam_press) — двопозиційний регулятор: до першого досягнення тиску — boost (power_boost), тиск є — hold (power_idle), впав після досягнення — work (power_work). Датчик тиску — будь-який із трьох: аналоговий pressure-main, контакт pressure-ready, або температура temp-main проти boil_temp (98 °C, гістерезис 2 °C).

Дія на панелі Стадія Показник spress-1-demand
старт, тумблер «тиск є» ↓ boost 100
«тиск є» ↑ hold 0 (power_idle)
«тиск є» ↓ work 80
«надтиск» ↑ у будь-якій стадії аварія sp_overpressure, нагрів 0 0
без контакту, temp-main = емулятор: 97 → 98,5 → 96,5 → 95,5 boostholdholdwork гістерезис 2 °C
потенціометр A1 як pressure-main, target_bar 0,5, hyst 0,1 hold при ≥ 0,5; work при ≤ 0,4 після калібрування шкали

«Парогенератор» (sk_steam_gen) — композиція «рівень + тиск»: він не гріє сам, а дозволяє тиску гріти лише коли рівень доповів full (або heat_while_fill увімкнено).

Дія Стадія парогенератора Що з нагрівом
старт із сухими тумблерами filling, рівень у filling, соленоїд відкритий вимога тиску 0 — індикатори ТЕНів темні
верх ↑ (і центр, низ) steam вимога передана, тиск у boost
верх ↓ (вода пішла нижче OFF-датчика) filling нагрів знято, поки знову не full
низ ↓ + умова «Безпека» рівня «низ < 0,5 через 20 с» через 20 с — sg_level_fault усе вимкнено
«надтиск» ↑ sg_pressure_fault усе вимкнено
привʼязку «Тиск пари» зняти, старт sg_no_pressure одразу

ББК: сім стадій#

Збірка «ББК» з пісочниці на стенді: верх і низ колони, папуга, вода з дефлегматора, парогенератор — на емуляторі (шина 1), бо їх треба вести незалежно й з точністю до десятих; тиск у колоні — потенціометр A1; витрата браги — генератор на A2; помпа браги — DA-2 з вентилятором; парогенератор — три тумблери рівня й два тиску; ТЕНи — реле 1 і 2; вода — реле 3 і 4.

flowchart TD
    A["Перевірка цілісності колони<br>пауза, чекає «Готово»"] --> B["Наповнення парогенератора"]
    B -->|"рівень full"| C["Розігрів: максимум ПГ,<br>поки верх колони нижчий за steam_warmup_temp"]
    C -->|"таймаут"| X1["warm_st_gen_timeout"]
    C --> D["Стабілізація: розкид верху до 2 °C<br>у вікні 20 показів, не менше 30 с"]
    D -->|"10 хв"| X2["col_stab_timeout"]
    D --> E["Помпа браги 60 с<br>на стартовій потужності"]
    E --> F["Дистиляція: помпа ±1 % за період<br>за міцністю папуги"]
    F -->|"витрата нижча за min, ABV нижчий за 1"| G["Завершення: вода ще 2 хв"]
    F -->|"витрата нижча за min, помпа вища за min"| X3["wort_filter_is_clogged"]
    F -->|"помпа на межі, ПГ на межі"| X4["abv_too_high або abv_too_low"]
    F -->|"помпа на межі, ПГ не на межі"| D
Стадія Що зробити на панелі Очікування
Перевірка цілісності нічого — сценарій на паузі «Готово» — лише кнопка в картці сценарію; фізична кнопка на DI-6 сюди не привʼязується
Наповнення тумблери рівня ↑ по черзі знизу вгору соленоїд закривається на верхньому; парогенератор → steam
Розігрів емулятор: верх колони 25 → 61 °C (порог steam_warmup_temp 60) ТЕНи на максимумі (обидва індикатори), на 61 °C — перехід, потужність → parog_pow
Розігрів, таймаут верх колони лишити 40 °C довше steamgen_warmup_timeout_min warm_st_gen_timeout
Розігрів, поганий датчик емулятор: верх колони 130 °C миттєво up_column-temp ERROR — межі валідності −30…130 °C. Справжній DS18B20 цього не дасть, тому емулятор
Стабілізація верх колони тримати 80,0…81,5 °C 30 с після 20 показів у вікні ≤ 2 °C — «колона стабільна», помпа на стартовій потужності, вентилятор DA-2 закрутився
Стабілізація не настає гойдати верх 78 ↔ 83 °C через 10 хв — col_stab_timeout
Дистиляція, міцність висока папуга 78 °C, тиск A1 на нулі, desired_abv 45 ABV з пари вище цілі → помпа −1 % за період (wort_pump_adjust_period_sec) — обороти вентилятора падають
Помпа вперлась у мінімум тримати міцність високою потужність ПГ +5 % діапазону, повернення в стабілізацію; на максимумі ПГ — abv_too_high
Витрата впала, брага скінчилась генератор < 3,3 Гц, папуга 100 °C (ABV ≈ 0) штатне завершення: вода ще 2 хв, сценарій зупиняється сам
Витрата впала, фільтр генератор < 3,3 Гц при міцності 45 і помпі вище мінімуму wort_filter_is_clogged
Аварія учасника «надтиск» ↑ під час дистиляції participant_alarm: сценарій стає, помпа й ТЕНи вимкнені

Стадії з таймаутами ганяються з малими значеннями параметрів — інакше прогін триватиме, як справжній перегін.

Охолодження, мішалка, міцність#

«Нема даних» і блокування#

Це те, заради чого на панелі тумблери DQ і перемичка:

Дія Через скільки Очікування
DQ одного датчика шини 0 ↓ 15 с його картка з попередженням «дані протухли», сусіди на шині живі, показ — останнє значення
перемичка DQ–GND на шині 0 15 с усі датчики шини 0 протухли; шина 1 (емулятор) живе — доказ того, що датчики в різних роз'ємах не кладуть один одного
датчик у групі блокування «ТЕНи», DQ ↓ 15 с реле 1–2 і DA-1 вимкнені, на картках замок, скрипт із цими виходами не стартує (script_start_failed_interlock)
симулятор Modbus закрити 15 с периферія частотника протухла; read_value() віддає 0
імітатор 4–20 мА від'єднати одразу на клемі 0 В — прошивка не знає, що це обрив: показ піде на −25 % шкали після калібрування 1–5 В. Ловить лише умова «Безпека»: «тиск менше 0 через 5 с»

Чек-лист прогону перед релізом прошивки#

  1. Ротація ТЕНів: зміна елемента через 60 с.
  2. Термостат на блоці: три паузи, гістерезис ±0,5 °C.
  3. Рівень: усі комбінації тумблерів з таблиці, включно з конфліктом.
  4. Тиск пари: boostholdworksp_overpressure.
  5. Парогенератор: fillingsteam → сухий хід → sg_level_fault.
  6. ББК: усі сім стадій і чотири аварії з таблиці.
  7. Часо-пропорційний режим на DA-1: 30 % — 3 с / 7 с на лампі.
  8. Протухання: датчик, шина, Modbus — по 15 с; блокування виходів.
  9. Перезавантаження плати під час роботи: усі реле в спокої, NC реле 6 світиться, сценарії не стартують самі.

Кожен пункт — рядок у журналі релізу з версією прошивки й датою. Пункт, що не пройшов, — це не «подивимось потім», а стоп реліз.


Куди рости: замкнута модель апарата#

Стенд вище ганяється руками, і для методики це правильно: людина бачить кожен перехід. Наступний крок — коли емулятор на Nano не лише слухає терміналу, а читає виходи плати через оптопари й сам піднімає «температуру», поки горить індикатор ТЕНа, і «рівень», поки відкритий клапан. Тоді ББК проходить усі стадії без оператора, а прогін стає регресійним тестом, який запускається на кожну збірку прошивки. Коду для цього поки немає — це окрема робота, і стенд із цієї статті для неї вже готовий: усі сигнали виведені на клемники, лишається замінити руку на мікроконтролер.


Суміжні статті#