Статті бази ▾ ← Усі бази знань
Автоматика oCBot
Концепція та філософія12 Ласкаво просимо до екосистеми oCBotЗвідки взявся oCBotІдеологія oCBotСфери призначення та режими роботиПериферійні пристроїСвобода периферіїБазові скрипти автоматизаціїВіртуальні панелі оператораСкладні сценарії та логіка автоматизаціїМультиконтролерністьЗагальний огляд автоматики oCBotАрхітектура та опис
Підтримувані контролери22 Контролер Kincony KC868-A6Підключення живлення й USB на KC868-A6Підключення периферії до KC868-A6Реле й аналогові виходи KC868-A6Сухі контакти й аналогові входи KC868-A6Твердотілка, драйвер помпи й датчики: підключення до колодки DA/IOШини й роз'єми KC868-A6: RS485, I2C, 1-Wire і рештаЩо зайнято на ESP32 у KC868-A6: карта GPIOЯк зібрати щиток на KC868-A6Як прогнати сценарії без куба: тестовий стенд для KC868-A6Контролер Kincony KC868-A16Підключення живлення й USB на KC868-A16Підключення периферії до KC868-A16Проміжне реле й контактор АСКО-УКРЕМ на 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)
Каталог периферійних пристроїв11 Датчики температуриДатчики тискуДатчики рівня рідиниСхема підключення щупа рівня через платку оптопариДатчики потоку (витратоміри)Схема підключення витратоміра до KC868-A6 і A16Виконавчі механізми (Клапани, Насоси, ТЕНи)Датчики середовища (Вологість, Світло, Тиск)Датчики електричні та вагиОргани керування (Кнопки, Енкодери)Електродвигуни та вентилятори
Складання та Перший запуск (DIY)27 Збирання контролера oCBot своїми рукамиПервинне прошивання та запуск контролераШвидке підключення Wi-Fi через BluetoothПідключення ТЕНів та регуляторів потужностіВибір та підключення електромагнітних клапанівКілька плат PCA9685 на одній шиніПін OE — апаратне зняття всіх виходівПлата PCA9685 зблизька — що на ній є і навіщоПлата розширення PCA9685 — 16 каналів ШІМСервопривід на платі PCA9685 — режим 50 ГцТвердотілки на платі розширенняПідключення LCD та OLED дисплеїв по шині I2CДвигун і частотний перетворювач: силове підключенняПроводка датчиків DS18B20: чому зникають показанняПроводка датчиків DS18B20: як зібрати шину на A6 і A16Промисловий протокол RS485 (Modbus RTU)Термометри стартового комплекту: ланцюжок на M12 і ящик з нержавійкиЧастотник AE200 (Yingshida) по Modbus: клеми, параметри й регістр завдання частотиЧастотник CFM310 по Modbus: панель RS485, сервісне меню і три регістриЧастотник Ennera FCE по Modbus: налаштування і діагностикаЧастотник без Modbus (900E): пуск реле й оберти 0–10 ВШина RS485 на кілька пристроїв: шлейф, термінатори, адресиВаги на тензодатчиках (NAU7802)Роз'єми M12: кодування A, B, D, X і кількість контактівРоз'єми M12: трійники, вилки, гнізда і заглушкиРоз'єми M12: чим захистити від води — корпус, кабель, IPУсунення типових несправностей
Робота з веб-інтерфейсом18 Головна сторінка (Home)Технічна підтримка: віддалена допомогаДіаграма процесу (Flow)Сценарії автоматизаціїРедактор скриптівПульти оператораДизайнер пультів HMI DesignerПериферіяПлати та шиниЗагальні налаштуванняОбладнанняТочки монтажуНалаштування графіківОновлення прошивкиНалаштування Wi-FiЛогиПорталПро програму
Написання сценаріїв (C++ Скрипти)10 Огляд скриптівМій перший сценарій: Крок за крокомШІМ-відбір: Як налаштувати клапан правильноНалаштування ПІД-регулятора для стабілізаціїАвтоматизація температурних пауз при затиранні солодуСкрипт ББКРегулювання тискуРозрахунок ABV за температурою париСкрипт «Розрахунок ABV»ABV у сценаріях
Безпека, Хмара та Інтеграція6 Безпека щита автоматикиСистема безпеки oCBot: Захист від аварійПідключення контролера до кабінету the.in.uaЯк опублікувати звіт про перегонкуШеринг кастомних пультів оператора (HMI)Інтеграція з Home Assistant та MQTT
Сценарії5
ББК5 Сценарій ББК: що робить автоматика і де вона чекає на васББК: залізо й прив'язки — без чого сценарій не стартуєББК: параметри за етапами — що означає кожен і як обратиББК: перший запуск — спочатку на воді, потім брагаББК: аварії — що написано на картці, чому і що робити
#Скрипти#C++#АвтоматизаціяОновлено: 24 лип 2026

ШІМ-відбір: Як налаштувати клапан правильно

Написано для прошивки 0.2.93 (коміт 9648be9) · порталу 0.0.176Можливо, застаріло: поточна прошивка 0.2.238, поточний портал 0.0.344

Широтно-імпульсна модуляція (ШІМ, англ. PWM) є основним методом регулювання швидкості відбору спирту або дистиляту за допомогою стандартних електромагнітних клапанів. Оскільки клапан може перебувати лише у двох станах, повністю відкритий або повністю закритий, швидкість відбору (літрів на годину) регулюється часовим співвідношенням цих станів.


Принцип роботи ШІМ-відбору#

ШІМ-відбір базується на понятті періоду ШІМ (зазвичай становить від 5 до 20 секунд).

Наприклад, якщо встановлено період ШІМ 10 секунд, то відсоткове значення відбору (швидкість) визначає час відкриття клапана всередині цього вікна:

Часова діаграма ШІМ-відбору: три періоди по 10 секунд для відбору 100, 50 і 10 відсотків — відсоток задає частку часу, коли клапан відкритий


Нотатка

Занадто короткий період ШІМ (наприклад, менше 3 секунд) призводить до швидкого механічного зносу клапана та перегріву його котушки. Занадто довгий період (понад 20 секунд) може спричинити температурні коливання в колоні через циклічне осушення та переповнення насадкової частини дефлегматора. Оптимальним вважається період 10 секунд.


Реалізація ШІМ-відбору в C++ скрипті oCBot#

В автоматиці oCBot ви можете реалізувати логіку ШІМ як програмно через таймери, так і апаратно, якщо клапан налаштований у системі як пристрій із підтримкою ШІМ на рівні драйвера.

Ось приклад коду для програмної реалізації циклу ШІМ-відбору «голів» (швидкість 8%):

#include "OcbScript.h"

class PwmSelectionScenario : public OcbScript {
private:
    int valveId;             // ID клапана відбору
    unsigned long lastPeriodStart;
    const unsigned long periodMs = 10000; // Період ШІМ = 10 секунд (10000 мс)
    float selectionPercent;  // Поточний відсоток відбору (0.0 - 100.0)

public:
    PwmSelectionScenario() {
        valveId = 3;            // ID клапана з меню Периферії
        selectionPercent = 8.0; // Встановлюємо 8% для відбору голів
    }

    void init() override {
        lastPeriodStart = millis();
        setPeripheralValue(valveId, 0.0); // Зачиняємо клапан
        logMessage("Запуск ШІМ-відбору. Швидкість: " + String(selectionPercent) + "%");
    }

    void loop() override {
        unsigned long currentMillis = millis();
        unsigned long timeInPeriod = currentMillis - lastPeriodStart;

        // Якщо поточний період завершився, починаємо новий
        if (timeInPeriod >= periodMs) {
            lastPeriodStart = currentMillis;
            timeInPeriod = 0;
        }

        // Розраховуємо час, протягом якого клапан має бути відкритим
        unsigned long openDuration = (periodMs * selectionPercent) / 100.0;

        if (timeInPeriod < openDuration) {
            // Клапан має бути відкритим
            setPeripheralValue(valveId, 1.0);
        } else {
            // Клапан має бути зачиненим
            setPeripheralValue(valveId, 0.0);
        }
    }
};

Практичні поради щодо калібрування швидкості#

  1. Визначення максимальної пропускної здатності:
    • Повністю відкрийте клапан (100% ШІМ) на 60 секунд. Виміряйте об'єм зібраної рідини (наприклад, отримали 50 мл).
    • Помножте на 60, щоб отримати максимальну швидкість в л/год: 0.050 л * 60 = 3 л/год.
  2. Розрахунок відсотка для відбору «голів»:
    • Якщо вам потрібна швидкість відбору голів 150 мл/год, то необхідний відсоток складе: $$\text{Відсоток} = \left( \frac{150 \text{ мл/год}}{3000 \text{ мл/год}} \right) \times 100% = 5%$$
    • Задайте selectionPercent = 5.0 у вашому сценарії.