Як прогнати сценарії без куба: тестовий стенд для 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 з лампою |
Три стани, які прошивка розрізняє окремо, і стенд має вміти дати кожен:
- значення — те, що читається; для більшості перевірок досить його міняти руками;
- «нема даних» — датчик мовчить. Для 1-Wire і Modbus прошивка це
бачить: без вдалого читання довше 15 с (
RB_SENSOR_STALE_Sуrb_environment.h) датчик стає протухлим, картка попереджає, а блокування виходів (rb_interlock.cpp) тримає відмічені ТЕНи вимкненими. Стенду потрібен вимикач у лінії DQ і спосіб «вимкнути» Modbus-пристрій; - обрив і конфлікт — сухий контакт розімкнений там, де має бути
замкнений, «мокрий» датчик вище «сухого». Аналоговий вхід і сухий контакт
прошивка на збій не перевіряє (
read_value(): «локальні входи збій не розрізняють»), тому обрив датчика 4–20 мА стенд показує як 0 В на клемі — і саме це має ловити налаштування «Безпека» скрипта, а не прошивка сама.
Стенд перевіряє прошивку, а не електрику щитка. 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, показує
твердотілка з лампою.
Як підключити#
Принцип один на всі клеми: між платою і будь-яким імітатором — клемник на 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.
Як розташувати#
Стенд — це монтажна плита 400×500 мм із трьома DIN-рейками і лицьова панель 400×250 мм перед нею, на якій живе все, що клацається під час прогону. Панель на петлях знизу: відкинув — видно клемники.
Три рейки#
- Верхня — живлення й захист. Автомат і ПЗВ секції 220 В (якщо є), два блоки 12 В, два запобіжники, клеми грибка. Силове зліва, слабкострумове справа, між ними — 50 мм порожньої рейки.
- Середня — контролер і шини. A6 на DIN-адаптері посередині, ліворуч модуль PT100 і USB-перехідник RS485 у тримачі, праворуч PCA9685 з ULN2803 на DIN-каретці та обидві твердотілки на радіаторі. Усе, що спілкується з платою по шині, — на одній рейці з нею, кабелі короткі.
- Нижня — клемники й індикатори. Два ряди клемників: лівий — входи (DI, A, IO), правий — виходи (реле, DA). Над правим рядом — вісім індикаторів реле. Кожен клемник підписаний номером клеми плати, той самий номер — на ферулі дроту.
Лицьова панель#
Зони — зліва направо, у тому ж порядку, що колодки на платі, щоб рука не шукала:
| Зона | Органи | Колір підпису |
|---|---|---|
| Сухі контакти | 6 тумблерів у два ряди: рівні окремо від тиску; кнопка під DI-6 | рівні — помаранчевий, тиск — фіолетовий, кнопка — сірий |
| Аналог | два потенціометри з вольтметрами, гніздо імітатора 4–20 мА, генератор імпульсів із дисплеєм | тиск — фіолетовий, витрата — золотий |
| Температура | 3-контактні гнізда датчиків шини 0 з тумблером DQ під кожним; гніздо емулятора шини 1; перемичка «коротке на шині» під захисною кришкою | червоний |
| Виходи | 8 індикаторів реле (пронумеровані 1–6, у шостого два), вольтметр DA-1. Ручок тут немає: DA керується лише з панелі oCBot |
нагрів — червоний, клапани — блакитний, помпа — золотий |
| Аварія | грибок «Стоп» у правому нижньому куті, окремо від решти | червоний на жовтому |
Кольори — не декор, а та сама палітра, що в прошивці: помаранчевий у рівнів, пурпуровий у тиску, золотий у помпи й витрати, блакитний і бірюзовий у води, червоний у нагріву — саме такі кольори мають картки в збірках пісочниці. Людина дивиться на панель і на екран і бачить один колір.
Підпис кожного органа — у два рядки: зверху назва периферії так, як вона буде в Периферії («води · низ»), знизу — клема плати («DI-1»). Нагрівальний блок — на кронштейні збоку від плити, з боку зони температури, з вентилятором назовні: він гарячий, і йому не місце серед тумблерів.
Кабелі#
- Кольори жил: червона —
+12навантажень, чорна —GND, синя — сигнал DI та аналог, біла — DQ 1-Wire, жовта/зелена — RS485A/B, коричнева й синя 1,5 мм² — тільки в секції 220 В. - Панель з'єднана з клемниками джгутом на роз'ємі (два пружинні роз'єми на 12 контактів), щоб відкидалась і знімалась без викрутки.
- Сигнальні й силові джгути — по різних боках плити, перетин під прямим кутом. Датчики 1-Wire — витою парою DQ+GND, не довше метра.
- Ферули з номерами клем на обох кінцях кожного дроту. Це та єдина річ, за якою стенд відрізняється від купи дротів через пів року.
Методика прогону#
Еталон конфігурації — збірки з пісочниці (packages/firmware/sandbox/kits):
«Затирання зернових», «Затирання на ферментах», «ББК». Периферію на стенді
створюйте з тими самими назвами й кольорами, що в збірці, — тоді журнал зі
стенда читається так само, як журнал з пісочниці, і розбіжність між ними
одразу видно.
Загальні правила прогону:
- Перед кожним сценарієм — всі тумблери вниз, потенціометри на нуль, емулятор на 25 °C, грибок відпущений.
- Клацнули тумблер рівня — стан у Периферії зміниться через 2 с:
такий антидребезг у типу «Рівень» за замовчуванням
(
rb_default_debounce_ms). Кнопка — через 50 мс. - Вимкнули DQ датчика — картка попередить через 15 с, не одразу.
- Кожен пункт методики — це пара «дія на панелі → стадія або аварія, яку має показати картка скрипта». Стадії названі так, як у коді, бо саме так вони видні в журналі.
Керування нагрівом: каскад і ротація#
Скрипт «Керування нагрівом» (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 хв, стадія heating → idle, тримається ±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 |
boost → hold → hold → work |
гістерезис 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: сценарій стає, помпа й ТЕНи вимкнені |
Стадії з таймаутами ганяються з малими значеннями параметрів — інакше прогін триватиме, як справжній перегін.
Охолодження, мішалка, міцність#
- Охолодження (
sk_cooling): поки працює — тримаєsupply-loop(реле 4, вентилятор) наcool_power;temp-loop— лише показ. Дія: старт → вентилятор; стоп → стоп. Разом із термостатом у режимі охолодження — «спуск» вище. - Мішалка (
sk_mixing) на реле 3: режим 0 — увімкнено на час роботи. На частотнику-симуляторі — у регістр0x044Dмає прийти завдання частоти, у0x0328— команда пуску; біт «працює» в0x04C4виставте вручну в симуляторі, інакше картка покаже «стоп». - Міцність (
sk_abv): папуга з емулятора, тиск з потенціометра A1, атмосферний — віртуальний. Перевірка на трьох точках температури пари — 78,5, 85 і 95 °C при нульовому надлишковому тиску — проти калькулятора «Міцність за температурою пари» з рядка «Порахувати» під статтею (як він рахує). Розбіжність більша за 1 % об. на будь-якій точці — тиск на A1 не відкалібровано на нуль.
«Нема даних» і блокування#
Це те, заради чого на панелі тумблери 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 с» |
Чек-лист прогону перед релізом прошивки#
- Ротація ТЕНів: зміна елемента через 60 с.
- Термостат на блоці: три паузи, гістерезис ±0,5 °C.
- Рівень: усі комбінації тумблерів з таблиці, включно з конфліктом.
- Тиск пари:
boost→hold→work→sp_overpressure. - Парогенератор:
filling→steam→ сухий хід →sg_level_fault. - ББК: усі сім стадій і чотири аварії з таблиці.
- Часо-пропорційний режим на
DA-1: 30 % — 3 с / 7 с на лампі. - Протухання: датчик, шина, Modbus — по 15 с; блокування виходів.
- Перезавантаження плати під час роботи: усі реле в спокої,
NCреле 6 світиться, сценарії не стартують самі.
Кожен пункт — рядок у журналі релізу з версією прошивки й датою. Пункт, що не пройшов, — це не «подивимось потім», а стоп реліз.
Куди рости: замкнута модель апарата#
Стенд вище ганяється руками, і для методики це правильно: людина бачить кожен перехід. Наступний крок — коли емулятор на Nano не лише слухає терміналу, а читає виходи плати через оптопари й сам піднімає «температуру», поки горить індикатор ТЕНа, і «рівень», поки відкритий клапан. Тоді ББК проходить усі стадії без оператора, а прогін стає регресійним тестом, який запускається на кожну збірку прошивки. Коду для цього поки немає — це окрема робота, і стенд із цієї статті для неї вже готовий: усі сигнали виведені на клемники, лишається замінити руку на мікроконтролер.
Суміжні статті#
- Контролер Kincony KC868-A6 — огляд плати й серія статей про кожен вузол, звідки взяті числа для стенда.
- Тестовий стенд для KC868-A16 — те саме для старшої плати: MOSFET-виходи замість реле, 16 входів, ТЕН через PCA9685.
- Пісочниця на demo.the.in.ua — еталонні збірки «Затирання», «Затирання на ферментах» і «ББК», які стенд відтворює в залізі.
- Аварійний захист у сценаріях — умови «Безпека», які на стенді провокуються тумблерами.