Статті бази ▾ ← Усі бази знань
Автоматика 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-A16

A16 беруть під великий щиток: два парогенератори, клапани на кожну фракцію, аварійний контакт на кожен вузол. Саме на такому щитку найбільше станів, яких на живому апараті не викликати навмисне: два баки, один із яких сухий, надтиск на другому парогенераторі, датчик, який мовчить, поки решта шини живе. Стенд з кількома тумблерами й одним датчиком перевіряє на A16 хіба те, що світлодіод біля виходу засвітився.

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

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


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

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

Інтерфейс у oCBot Що на клемі A16 Що імітуємо Чим
dry_contact_inputs Digital Input 1–16 поплавки двох баків, чотири пресостати, кнопки, аварійні контакти 16 тумблерів між INn і GND
analog_inputs Analog Input 1–4 тиск 0–5 В, вага, датчик 4–20 мА; імпульси витратоміра потенціометри від 5 В; імітатор струмової петлі з шунтом; генератор імпульсів
one_wire (io_3v3) HT1, HT2, HT3 DS18B20 у кубі, колоні, двох парогенераторах справжні датчики в нагрівальному блоці + емулятор на окремій шині
relays Output 1–16 клапани, помпи, вхід твердотілки, ТЕН «увімк/вимк» соленоїд, вентилятор, лампа через авто-реле, входи SSR, індикатори. Для прошивки MOSFET-ключ — теж «реле»
analog_outputs немає (dac = IO_NONE)
board_0…7 I²C (майданчики) плавний ТЕН і помпа браги — на A16 тільки так PCA9685 + ULN2803 → SSR з лампою; PCA9685 → драйвер ШІМ → вентилятор
modbus RS485 A, B частотник, модуль PT100, лічильник, блок реле симулятор Modbus на ноутбуці, справжній модуль PT100 з резисторами
ethernet RJ45 дротова мережа патч-корд до світча — і перевірка пастки після OTA

Стани, які стенд має давати окремо від значення: «нема даних» — для 1-Wire і Modbus прошивка ловить його сама через 15 с без вдалого читання (RB_SENSOR_STALE_S), тож потрібен вимикач у лінії DQ і спосіб «вимкнути» Modbus-пристрій; обрив і конфлікт — аналогові й сухі входи на збій не перевіряються (read_value()), обрив датчика 4–20 мА — це 0 В на клемі, і ловити його має умова «Безпека» скрипта.

Важливо

На виходи A16 220 В не подаються ні з якого боку: це ключ у плюсі, а не сухий контакт. Уся мережева частина стенда — одна лампа за твердотілкою в окремій захищеній секції, і без неї стенд повноцінний: 12 В навантаження показують сценарію рівно те саме.


Що потрібно#

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

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

Про клеми 12/24V окремо: їх дві, по одній на колодку 1–8 і 9–16, і незапитана колодка виглядає робочою — світлодіоди каналів світяться, а на клемах нуль (стаття про виходи). На стенді обидві йдуть від блока навантажень через грибок.

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

Що Скільки Роль
Тумблер SPST ON-OFF 16 сухі контакти IN1…IN16
Кнопка без фіксації 2 паралельно тумблерам IN11 і IN12 — «кнопка» як тип периферії для пультів
Потенціометр 10-обертовий 10 кОм 2 аналогові 0–5 В
Стабілізатор 5 В (78L05 або buck 12→5) 1 опора потенціометрів і живлення генератора: 5 В на платі назовні не виведено
Панельний вольтметр 0–5 В 2 контроль поданого на A1 і A4
Імітатор струмової петлі 4–20 мА + шунт 250 Ом 0,1 % 1 датчик 4–20 мА → 1–5 В
Генератор імпульсів з дисплеєм (XY-LPWM або NE555), живлення 5 В 1 витратомір
DS18B20 у гільзі 4 справжні датчики: два в блоці, два в повітрі
Arduino Nano з бібліотекою OneWireHub 1 емулятор DS18B20 на окремій шині: будь-яке число з терміналу
Тумблер у лінії DQ по одному на датчик + один на шину HT3 «датчик відвалився», «шина порожня»
Перемичка DQ–GND 1 «датчик закоротив шину»
Алюмінієвий брусок 50×50×20 мм, патрон 12 В 40 Вт, вентилятор 12 В 40 мм 1 нагрівальний блок — міні-куб із «сорочкою»

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

Що Скільки Роль
Автомобільне реле 12 В 30 А з колодкою 2 між виходом і патроном / лампою: скільки ампер тримають доріжки й клемники A16 — Kincony не публікує, тож 3,3 А патрона через ключ не ганяємо
Лампа 12 В 21 Вт 1 реальний струм за реле
Соленоїдний клапан 12 В 1 0,3 А напряму з виходу; діод самоіндукції уже на платі
Твердотілка з входом 3–32 В DC, з індикатором 3 одна на ключі (ТЕН «увімк/вимк»), дві на PCA9685 (плавний і доводочний)
Лампа 220 В 40–60 Вт 1 навантаження однієї твердотілки в захищеній секції
Драйвер MOSFET з ШІМ-входом 1 помпа браги з каналу PCA9685
Індикаторна планка 12 В на 16 світлодіодів (або 16 модулів на DIN) 1 видно з лицьової панелі; вбудовані світлодіоди A16 за панеллю не видно
Блок реле KC868-E16 0–1 необов'язково: сухі контакти для клієнтів, які його купують

Шини#

Що Роль
Гребінка 4 pin і паяльник майданчики 3V3, GND, SCL, SDA на A16 не запаяні
PCA9685 + буфер ULN2803 єдиний плавний нагрів на A16 і ШІМ помпи
Перехідник USB–RS485 з автонапрямом, з перемичкою термінатора ноутбук на шині: симулятор Modbus
Програма-симулятор Modbus RTU slave (diagslave, ModRSsim2, скрипт на pymodbus) частотник, PZEM, будь-який регістр
Модуль PT100 → Modbus, 4 канали + резистори 100 / 138 / 176 Ом на тумблері справжній Modbus-датчик: 0 / 100 / 200 °C за IEC 60751 (100,00 / 138,51 / 175,86 Ом)
Патч-корд і світч або роутер Ethernet

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

Мультиметр, кабель USB-C, ноутбук із панеллю oCBot, симулятором Modbus і терміналом до емулятора, маркер для ферул.


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

Схема стенда KC868-A16: ліворуч імітатори входів — шістнадцять тумблерів на IN1–IN16, потенціометри й генератор імпульсів на аналогових 1–4, датчики на HT2 і HT3 з вимикачами й емулятор на HT1; праворуч навантаження — авто-реле з патроном і лампою на Y1–Y2, соленоїд і вентилятор на Y3–Y4, вхід твердотілки на Y5, індикаторна планка на Y6–Y16; знизу шини — PCA9685 з ULN2803 на дві твердотілки й драйвер помпи по I2C, RS485 до ноутбука й модуля PT100, Ethernet до світча; живлення плати й навантажень від окремих блоків, плюс навантажень на обидві клеми 12/24V

Правило те саме, що на A6: між платою і імітатором — клемник на DIN, на клемнику й на обох кінцях дроту — ферула з номером клеми плати. На A16 це ще важливіше: 36 сигнальних дротів, і без номерів стенд перекомутовується довше, ніж збирається.

Виходи 1–16: ключ у плюсі#

Увімкнений канал подає на Yn те, що на клемі 12/24V його колодки; навантаження — між Yn і шинкою GND. Струм на канал без заміру не називаю, тому все, що більше за ампер, — через авто-реле (стаття про виходи).

Вихід Навантаження Що перевіряє Периферія oCBot
Y1 авто-реле → патрон 12 В 40 Вт у блоці замкнутий контур термостата: ключ гріє блок, DS18B20 у блоці це бачить Нагрівач, relays канал 0
Y2 авто-реле → лампа 12 В 21 Вт другий ТЕН каскаду, ротація Нагрівач, канал 1
Y3 соленоїд 12 В напряму клапан наливу парогенератора 1; чутно Клапан, канал 2
Y4 вентилятор 12 В на блоці напряму вода в сорочку / дефлегматор: охолодження міні-куба Клапан, канал 3
Y5 вхід твердотілки 1 (+ на Y5, на GND) ТЕН на власному виході плати — прошивка лише вмикає й вимикає Нагрівач, канал 4
Y6 індикатор клапан наливу парогенератора 2 Клапан, канал 5
Y7–Y14 індикатори вісім контурів охолодження sk_cooling_1…8, клапани фракцій Клапан, канали 6–13
Y15 індикатор помпа увімк/вимк Помпа, канал 14
Y16 K16 блока E16, якщо він є; інакше індикатор сухий контакт через блок реле Реле, канал 15

Нагрівальний блок — «куб» стенда: 135 г алюмінію при 40 Вт гріються на 0,33 К/с, тобто від кімнатної до 80 °C за три хвилини, і вентилятор за стільки ж повертає назад. Термостат затирання проходить паузи в реальному часі, а не в уяві. Другий отвір блока — під датчик, який ніколи звідти не виймається і стоїть в умові «Безпека» термостата як аварійний на 110 °C: патрон без нагляду за десять хвилин зіпсує DS18B20 (межа +125 °C).

PCA9685: плавний нагрів і помпа#

На A16 нагрівач на власному виході плати регулюється лише «увімкнено / вимкнено» (IT_RELAY_OUTPUT у rb_environment.cpp); часо-пропорційний режим — тільки на каналах плати розширення. Тому стенд A16 без PCA9685 не перевірить ані плавного ТЕНа, ані помпи браги в ББК, яка на A6 сидить на DA-2.

Гребінку на майданчики I²C припаяти; адреси 0x21, 0x22, 0x24, 0x25 зайняті платою, PCA9685 на 0x40 сідає без конфлікту (стаття про шини). Плата в Плати та шиниШІМ PCA9685 — 16 каналів (I2C), її канали в oCBot — інтерфейс board_0.

Канал PCA9685 Через що Навантаження Що перевіряє Периферія oCBot
0 ULN2803 вхід твердотілки 2 → лампа 220 В із захищеної секції або лише індикатор SSR часо-пропорційний режим: нагрівач 30 % → лампа 3 с горить, 7 с ні Нагрівач, board_0 канал 0
1 ULN2803 вхід твердотілки 3 → індикатор доводочний ТЕН у каскаді Нагрівач, board_0 канал 1
2 драйвер MOSFET вентилятор або помпа 12 В помпа браги 10…95 %: швидкий ШІМ, обороти на слух Помпа, board_0 канал 2

Чому буфер обов'язковий і що буде без нього — окрема стаття.

Входи 1–16: сухі контакти#

Тумблер між INn і GND тієї самої колодки (у кожної своя GND). Живить плата, близько 5 мА при 12 В, полярності немає; індикаторів на входах немає — спрацювання видно лише в Периферії (стаття про входи). Розкладка — під два парогенератори одразу, бо на A16 їх ставлять два:

Клема Орган на панелі Периферія oCBot Роль
IN1 тумблер «ПГ1 · води · низ» Рівень, SAS_DOWN level-low скрипта «Рівень води 1»
IN2 тумблер «ПГ1 · води · центр» Рівень, SAS_CENTER level-mid
IN3 тумблер «ПГ1 · води · верх» Рівень, SAS_UP level-high
IN4 тумблер «ПГ2 · води · низ» Рівень, SAS_DOWN level-low скрипта «Рівень води 2»
IN5 тумблер «ПГ2 · води · центр» Рівень, SAS_CENTER level-mid
IN6 тумблер «ПГ2 · води · верх» Рівень, SAS_UP level-high
IN7 тумблер «ПГ1 · тиск є» Тиск, SAS_READY pressure-ready «Тиск пари 1»
IN8 тумблер «ПГ1 · надтиск» Тиск, SAS_ERROR pressure-error
IN9 тумблер «ПГ2 · тиск є» Тиск, SAS_READY pressure-ready «Тиск пари 2»
IN10 тумблер «ПГ2 · надтиск» Тиск, SAS_ERROR pressure-error
IN11 тумблер + кнопка Кнопка кнопка для пульта оператора
IN12 тумблер + кнопка Кнопка аварійний стоп, дверцята
IN13–IN16 тумблери резерв: рівень третього бака, пресостат куба за задачею

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

Аналогові 1–4#

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

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

Витрата, л/хв = імпульси/с ÷ (імп/л ÷ 60): для збірки ББК з 400 імп/л — 6,67 Гц на 1 л/хв, поріг 0,5 л/хв — 3,3 Гц.

Нотатка

На поточній прошивці номер каналу дорівнює номеру клеми: «Аналоговий вхід 2» — це клема 2. Стенд, зібраний під старішу прошивку (до виправлення ain_adc_channel), після оновлення покаже потенціометр на клемі 2 в каналі 4: переприв'яжіть периферію, а не переставляйте дроти — так само, як доведеться клієнту.

HT1–HT3: температура#

Три окремі шини 1-Wire з підтяжкою 4,7 кОм на платі; шина 0 в oCBot — це HT2, а не HT1 (стаття про шини). На стенді три роз'єми — три різні ролі:

Роз'єм Шина Що на ній Навіщо
HT2 0 два справжні DS18B20 у нагрівальному блоці, тумблер DQ на кожному реальна фізика: термостат, каскад, охолодження; «датчик відвалився»
HT1 1 емулятор на Nano з кількома адресами верх і низ колони, папуга, обидва парогенератори — числа з терміналу, зокрема 130 °C
HT3 2 один DS18B20 у повітрі, тумблер у DQ перед роз'ємом «порожня шина»: сценарій із датчиком на шині, якої немає
будь-яка перемичка DQ–GND «один датчик поклав шину»: протухає вся шина, дві інші живі

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

RS485#

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

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

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

Ethernet#

Патч-корд у гніздо, другий кінець — у світч на столі. Прошивка при старті спочатку пробує дріт, за 10 с без лінку переходить на Wi-Fi. Пастка: після кнопки RESET, esptool чи OTA мікросхема LAN8720 не скидається і дріт не піднімається — лише зняття живлення (чому — у статті про шини). На стенді для цього є окремий вимикач 12 В плати на верхній рейці: перевірка «OTA → Wi-Fi → вимкнув-увімкнув → дріт» входить у чек-лист.


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

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

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

Три рейки#

  1. Верхня — живлення. Автомат і ПЗВ секції 220 В, блок плати з окремим вимикачем (для перевірки Ethernet), блок навантажень, запобіжники, грибок. Силове зліва, слабкострумове справа, 50 мм порожньої рейки між ними.
  2. Середня — контролер і все, що з ним по шині. A16 посередині на DIN-адаптері; ліворуч — PCA9685 з ULN2803 на каретці й три твердотілки на спільному радіаторі; праворуч — модуль PT100, USB-перехідник RS485 у тримачі, світч. Кабель I²C до PCA9685 — не довше 20 см.
  3. Нижня — клемники. Два ряди: лівий — 16 входів + 4 аналогові + три шини датчиків, правий — 16 виходів + обидві 12/24V. Над правим рядом — індикаторна планка на 16 виходів, над лівим — два авто-реле в колодках.

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

Зона Органи Колір підпису
Рівні 6 тумблерів у два ряди по три: ряд «ПГ1», ряд «ПГ2»; підписи «низ · центр · верх» помаранчевий
Тиск 4 тумблери у два ряди: «тиск є» і «надтиск» для ПГ1 і ПГ2 пурпуровий
Кнопки й резерв тумблери IN11–IN16, під IN11 і IN12 — кнопки сірий
Аналог два потенціометри з вольтметрами, гніздо імітатора 4–20 мА, генератор із дисплеєм пурпуровий і золотий
Температура гнізда шини 0 з тумблером DQ під кожним, гніздо шини 1 (емулятор), гніздо шини 2 з тумблером «шина», перемичка «коротке» під кришкою червоний
Виходи нічого, крім планки з 16 світлодіодів над клемниками: виходами керує лише панель oCBot за ролями каналів
Аварія грибок у правому нижньому куті окремо від решти червоний на жовтому

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

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

Кабелі#


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

Еталон — збірки з пісочниці: «Затирання зернових», «Затирання на ферментах», «ББК». Периферію на стенді створюйте з тими самими назвами й кольорами. Дві поправки під A16: нагрівачі збірок сидять на relays каналах 0–1 — це Y1 і Y2; помпа браги в збірці ББК — analog_outputs, яких на A16 немає, тож на стенді вона на board_0 каналі 2 (PCA9685).

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

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

Керування нагрівом: релейні й плавний разом#

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

Дія Очікування
ТЕНи 3 кВт на Y1 і Y2, ціль 6000 Вт обидва індикатори, патрон гріє, лампа світить
ціль 3000 Вт один; через 60 с — інший
ТЕН 3 кВт на Y5 (твердотілка 1), ціль 1500 не вмикається: релейний елемент береться цілком або ніяк, а 3000 у бюджет 1500 не влазить; показник heater-1-power = 0
той самий ТЕН на Y5 як пряма периферія heat-main у «Тиску пари» без скрипта нагріву, power_work 30 твердотілка горить на повну: на власному виході плати регулювання лише увімк/вимк — нижче 1 % вимкнено, решта увімкнено
ТЕН 3 кВт на board_0 канал 0 + 3 кВт на Y2, ціль 4500 Y2 постійно, лампа за твердотілкою 2 блимає 5 с / 5 с — часо-пропорційний режим плати розширення

Четвертий рядок — головна перевірка A16: саме тут клієнт очікує плавності й не отримує її. Стенд має показувати це до релізу, а не служба підтримки — після.

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

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

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

«Затирання на ферментах» додає спуск — термостат у режимі охолодження з клапаном сорочки на Y4: після розрідження при 63 °C сценарій вмикає вентилятор і чекає 58 °C; на блоці це близько хвилини.

Рівень води: два баки#

«Рівень води» (sk_water_lvl): пара датчиків OFF (мокрий → стоп подачі) і ON (сухий → пуск). На A16 два екземпляри одночасно: бак 1 — IN1–IN3 і Y3, бак 2 — IN4–IN6 і Y6.

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

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

Тиск пари й парогенератор: два одночасно#

«Тиск пари» (sk_steam_press): boost до першого досягнення, hold (power_idle) поки тиск є, work після падіння; датчик — контакт pressure-ready, аналог pressure-main або temp-main проти boil_temp (98 °C, гістерезис 2). «Парогенератор» (sk_steam_gen) дозволяє гріти лише при full від рівня.

Дія ПГ1 (IN1–3, IN7–8, Y1–Y3) ПГ2 (IN4–6, IN9–10, Y5, Y6)
старт обох, усі тумблери ↓ filling, Y3 відкритий, ТЕНи темні filling, Y6 відкритий
рівні ПГ1 ↑ steam, тиск у boost, Y1+Y2 горять без змін
рівні ПГ2 ↑ без змін steam, твердотілка 1 горить
«ПГ1 · тиск є» ↑ тиск hold, ТЕНи на power_idle без змін
«ПГ2 · надтиск» ↑ без змін sp_overpressuresg_pressure_fault, усе ПГ2 вимкнено
«ПГ1 · верх» ↓ filling, нагрів знято ПГ2 працює далі
«ПГ1 · низ» ↓ + «Безпека» рівня 1: «низ < 0,5 через 20 с» через 20 с sg_level_fault ПГ2 працює далі

Останні три рядки — те, заради чого на A16 два баки: аварія одного парогенератора не чіпає другого. Якщо чіпає — це помилка привʼязок (спільний датчик або спільний ТЕН у двох скриптах), і саме її стенд ловить.

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

Збірка «ББК» на стенді: верх і низ колони, папуга, вода з дефлегматора, парогенератор — на емуляторі (шина 1); тиск у колоні — потенціометр 1; витрата — генератор на клемі 2; помпа браги — board_0 канал 2 з вентилятором; ТЕНи — Y1, Y2; вода — Y3, Y4; рівні й тиск — ПГ1.

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
Стадія На панелі Очікування
Перевірка цілісності «Готово» — лише кнопка в картці сценарію перехід у наповнення
Наповнення IN1 → IN2 → IN3 ↑ Y3 закривається на верхньому; ПГ → steam
Розігрів емулятор: верх колони 25 → 61 °C Y1+Y2 на максимумі; на 61 °C потужність → parog_pow
Розігрів, таймаут верх 40 °C довше steamgen_warmup_timeout_min warm_st_gen_timeout
Розігрів, датчик верх 130 °C миттєво up_column-temp ERROR (межі −30…130); лише емулятор це дасть
Стабілізація верх 80,0…81,5 °C 30 с після 20 показів — помпа на стартовій потужності: вентилятор на каналі 2 PCA9685 закрутився
Не стабілізується гойдати 78 ↔ 83 °C через 10 хв col_stab_timeout
Дистиляція, міцність висока папуга 78 °C, тиск на нулі, desired_abv 45 помпа −1 % за період — обороти падають; на мінімумі → ПГ +5 % діапазону і стабілізація; на максимумі ПГ → abv_too_high
Брага скінчилась генератор < 3,3 Гц, папуга 100 °C штатне завершення: Y4 ще 2 хв, стоп
Фільтр генератор < 3,3 Гц при міцності 45 і помпі вище мінімуму wort_filter_is_clogged
Аварія учасника IN8 ↑ participant_alarm: усе стає

Таймаути ганяються з малими значеннями параметрів.

Вісім контурів охолодження#

На A16 є куди повісити всі вісім sk_cooling_1…8: клапани Y7–Y14. Кожен тримає свій supply-loop на cool_power, поки працює. Що перевіряється саме тут: старт восьми скриптів поспіль — вісім індикаторів; стоп одного — гасне лише його; термостат у режимі охолодження з cool-main на контурі 3 — клапан Y9 ходить за гістерезисом емулятора, решта не рухається.

Мішалка, міцність, E16#

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

Дія Через скільки Очікування
DQ одного датчика шини 0 ↓ 15 с його картка протухла, сусід по шині живий
тумблер «шина» HT3 ↓ 15 с датчик шини 2 протухлий; шини 0 і 1 живуть
перемичка DQ–GND на шині 0 15 с уся шина 0 протухла; шини 1 і 2 живі — три роз'єми справді незалежні
датчик у групі блокування «ТЕНи», DQ ↓ 15 с Y1, Y2, Y5 і канал 0 PCA9685 вимкнені, замки на картках, скрипт із цими виходами не стартує
симулятор Modbus закрити 15 с частотник протухлий, read_value() віддає 0
імітатор 4–20 мА від'єднати одразу 0 В на клемі, прошивка обриву не бачить — лише умова «Безпека» «менше 0 через 5 с»
OTA з панелі при підключеному дроті після перезапуску контролер на Wi-Fi, лінк на гнізді блимає й падає
вимикач 12 В плати вимкнути-увімкнути 10 с контролер на дроті
грибок одразу усі 16 індикаторів гаснуть, картки виходів показують «увімкнено» — прошивка не знає про грибок; сценарій це має пережити без аварії

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

  1. Ротація ТЕНів через 60 с; ТЕН на Y5 — лише увімк/вимк; часо-пропорційний на PCA9685 — 3 с / 7 с при 30 %.
  2. Термостат на блоці: три паузи, гістерезис ±0,5 °C.
  3. Рівень: комбінації з таблиці на обох баках незалежно.
  4. Два парогенератори: аварія одного не зупиняє другого.
  5. ББК: сім стадій і чотири аварії; помпа на PCA9685.
  6. Вісім контурів охолодження незалежні.
  7. Протухання: датчик, шина, порожній роз'єм, Modbus — по 15 с; блокування виходів.
  8. Ethernet: після OTA — Wi-Fi, після зняття живлення — дріт.
  9. Незапитана колодка 12/24V: індикатори світяться, навантаження мертве — переконатись, що стенд це показує, бо клієнт саме так і помилиться.
  10. Перезавантаження під час роботи: усі 16 виходів вимкнені до старту прошивки, сценарії не стартують самі.

Кожен пункт — рядок у журналі релізу з версією й датою. Не пройшов — стоп реліз.


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

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


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