Як прогнати сценарії без куба: тестовий стенд для 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 і терміналом до емулятора, маркер для ферул.
Як підключити#
Правило те саме, що на 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 → вимкнув-увімкнув → дріт» входить у чек-лист.
Як розташувати#
Монтажна плита 500×500 мм із трьома DIN-рейками і лицьова панель 500×250 мм на петлях знизу. Панель — усе, що клацається; плита — усе, що підключається.
Три рейки#
- Верхня — живлення. Автомат і ПЗВ секції 220 В, блок плати з окремим вимикачем (для перевірки Ethernet), блок навантажень, запобіжники, грибок. Силове зліва, слабкострумове справа, 50 мм порожньої рейки між ними.
- Середня — контролер і все, що з ним по шині. A16 посередині на DIN-адаптері; ліворуч — PCA9685 з ULN2803 на каретці й три твердотілки на спільному радіаторі; праворуч — модуль PT100, USB-перехідник RS485 у тримачі, світч. Кабель I²C до PCA9685 — не довше 20 см.
- Нижня — клемники. Два ряди: лівий — 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»). Нагрівальний блок — на кронштейні збоку від плити з боку зони температури, вентилятором назовні.
Кабелі#
- Жили: червона —
+12навантажень, чорна —GND, синя — сигнали IN і аналог, біла — DQ 1-Wire, жовта/зелена — RS485A/B, коричнева й синя 1,5 мм² — тільки в секції 220 В. - Панель до клемників — джгутом на трьох пружинних роз'ємах по 12 контактів: 16 входів, 4 аналогові й 5 датчикових ліній, решта — резерв. Панель знімається без викрутки.
- Сигнальні й силові джгути по різних боках плити, перетин під прямим кутом; RS485 і Ethernet — подалі від авто-реле й соленоїда.
- Ферули з номерами клем на обох кінцях кожного дроту.
Методика прогону#
Еталон — збірки з пісочниці: «Затирання зернових», «Затирання на
ферментах», «ББК». Периферію на стенді створюйте з тими самими назвами й
кольорами. Дві поправки під A16: нагрівачі збірок сидять на relays
каналах 0–1 — це Y1 і Y2; помпа браги в збірці ББК — analog_outputs, яких
на A16 немає, тож на стенді вона на board_0 каналі 2 (PCA9685).
Загальні правила:
- Перед сценарієм — усі тумблери вниз, потенціометри на нуль, емулятор на
25 °C, грибок відпущений, обидві
12/24Vпід напругою (індикатор на планці загоряється при ручному вмиканні будь-якого виходу з обох колодок). - Тумблер рівня → стан у Периферії через 2 с (антидребезг типу
«Рівень» за замовчуванням,
rb_default_debounce_ms); кнопка — 50 мс. - DQ вимкнули — попередження на картці через 15 с.
- Стадії й аварії названі так, як у коді, — так вони в журналі.
Керування нагрівом: релейні й плавний разом#
«Керування нагрівом» (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 хв, heating → idle, тримається ±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_overpressure → sg_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#
- Мішалка (
sk_mixing) на Y15 — режим 0, увімкнено на час роботи. На частотнику-симуляторі: завдання в0x044D, пуск у0x0328; біт «працює» в0x04C4виставте в симуляторі вручну, інакше картка покаже «стоп». - Міцність (
sk_abv): папуга з емулятора, тиск з потенціометра 1, атмосферний — віртуальний. Три точки — 78,5, 85 і 95 °C при нульовому надлишковому — проти калькулятора «Міцність за температурою пари» з рядка «Порахувати» під статтею (як він рахує). Розбіжність понад 1 % об. — тиск не відкалібровано на нуль. - Блок E16, якщо є: Y16 →
K16, реле 16 блока → індикатор. Для прошивки нічого не змінюється, перевірка одна — реле блока повторює Y16.
«Нема даних», блокування, мережа#
| Дія | Через скільки | Очікування |
|---|---|---|
| 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 індикаторів гаснуть, картки виходів показують «увімкнено» — прошивка не знає про грибок; сценарій це має пережити без аварії |
Чек-лист прогону перед релізом прошивки#
- Ротація ТЕНів через 60 с; ТЕН на Y5 — лише увімк/вимк; часо-пропорційний на PCA9685 — 3 с / 7 с при 30 %.
- Термостат на блоці: три паузи, гістерезис ±0,5 °C.
- Рівень: комбінації з таблиці на обох баках незалежно.
- Два парогенератори: аварія одного не зупиняє другого.
- ББК: сім стадій і чотири аварії; помпа на PCA9685.
- Вісім контурів охолодження незалежні.
- Протухання: датчик, шина, порожній роз'єм, Modbus — по 15 с; блокування виходів.
- Ethernet: після OTA — Wi-Fi, після зняття живлення — дріт.
- Незапитана колодка
12/24V: індикатори світяться, навантаження мертве — переконатись, що стенд це показує, бо клієнт саме так і помилиться. - Перезавантаження під час роботи: усі 16 виходів вимкнені до старту прошивки, сценарії не стартують самі.
Кожен пункт — рядок у журналі релізу з версією й датою. Не пройшов — стоп реліз.
Куди рости: замкнута модель апарата#
Стенд ганяється руками — і для методики це правильно. Наступний крок — коли емулятор читає виходи плати через оптопари (у A16 їх 16, і на планці вже є всі сигнали) і сам піднімає «температуру», поки горить ключ ТЕНа, і «рівень», поки відкритий клапан. Тоді обидва парогенератори й ББК проходять усі стадії без оператора на кожну збірку прошивки. Коду для цього поки немає; стенд із цієї статті для нього готовий — усі сигнали на клемниках.
Суміжні статті#
- Контролер Kincony KC868-A16 — огляд плати й серія про кожен вузол, звідки взяті числа для стенда.
- Тестовий стенд для KC868-A6 — молодша плата: реле й власні плавні виходи, один парогенератор.
- Твердотілки на платі розширення — чому на A16 без PCA9685 і буфера плавного нагріву не буде.
- Пісочниця на demo.the.in.ua — еталонні збірки, які стенд відтворює в залізі.