Skip to main content

Примеры прикладных задач

Практические примеры, демонстрирующие типовые задачи промышленной автоматизации с использованием 4diac и оборудования Ларус.

Пример 1: PID-регулятор температуры

Источник

Основано на примере PID Motor из официальной документации Eclipse 4diac, лицензия EPL-2.0.

Классическая задача — поддержание заданной температуры с помощью PID-регулятора.

Архитектура

Датчик (4-20мА) ──► Ларус-100 AI ──► PID FB ──► Ларус-100 AO ──► Нагреватель

Уставка (SP)

FB-сеть

E_CYCLE (DT=T#100ms)

▼ EO
CLIENT_1_0 ──► F_SUB ──► PID_Controller ──► F_LIMIT ──► CLIENT_0_1
(Modbus AI) (Error (PID алгоритм) (0..100%) (Modbus AO)
= SP-PV)

Интерфейс PID-блока

Интерфейс PID FB

ECC (конечный автомат) PID-блока

ECC диаграмма PID FB

Компоненты

FBНазначениеПараметры
E_CYCLEПериод регулированияDT = T#100ms (10 Гц)
CLIENT_1_0Чтение температуры (AI)modbus[ip:502, 1, 3, 0, 1]
F_SUBВычисление ошибкиError = SP - PV
Basic FB PIDPID-алгоритмKp=2.0, Ki=0.5, Kd=0.1
F_LIMITОграничение выходаMN=0.0, MX=100.0
CLIENT_0_1Запись на AOmodbus[ip:502, 1, 6, 0, 1]

Часть приложения: PID-вычисления

FB-сеть PID-части

Выходная часть приложения

Выходная часть PID

PID-алгоритм (Structured Text)

// Внутри Basic FB: PID_Controller
VAR
Integral : REAL := 0.0;
PrevError: REAL := 0.0;
DeltaT : REAL := 0.1; // 100 мс
END_VAR

// Пропорциональная составляющая
P := Kp * Error;

// Интегральная составляющая (с ограничением anti-windup)
Integral := Integral + Error * DeltaT;
Integral := LIMIT(-100.0, Integral, 100.0);
I := Ki * Integral;

// Дифференциальная составляющая
D := Kd * (Error - PrevError) / DeltaT;
PrevError := Error;

// Выход
Output := P + I + D;

Настройка PID

ПараметрКонсервативныйСреднийАгрессивный
Kp1.02.05.0
Ki0.10.51.0
Kd0.050.10.5
Метод Циглера-Николса
  1. Установите Ki=0, Kd=0
  2. Увеличивайте Kp до появления устойчивых колебаний (Ku)
  3. Измерьте период колебаний (Tu)
  4. Kp = 0.6×Ku, Ki = 2×Kp/Tu, Kd = Kp×Tu/8

Пример 2: Управление светофором

Источник

Основано на примере BeagleBone Traffic Controller из официальной документации Eclipse 4diac, лицензия EPL-2.0.

Конечный автомат для управления двухсторонним светофором на перекрёстке.

Система светофоров — общая схема

Архитектура

Ларус-100 DO ──► Светофор 1 (Красный, Жёлтый, Зелёный)
Ларус-100 DO ──► Светофор 2 (Красный, Жёлтый, Зелёный)

Состояния (ECC в Basic FB)

         ┌──────────────────────────────────┐
▼ │
┌─────────┐ T=30s ┌──────────┐ │
│ S1_Green├──────────►│S1_Yellow │ │
│ S2_Red │ │ S2_Red │ │
└─────────┘ └────┬─────┘ │
│ T=3s │
┌────▼─────┐ │
│ S2_Green │ │
│ S1_Red │ │
└────┬─────┘ │
│ T=30s │
┌────▼─────┐ │
│ S2_Yellow│ │
│ S1_Red │──────┘
└──────────┘ T=3s

Выходы по состояниям

СостояниеDO1 (Кр.)DO2 (Жёл.)DO3 (Зел.)DO4 (Кр.)DO5 (Жёл.)DO6 (Зел.)
S1_Green, S2_Red001100
S1_Yellow, S2_Red010100
S2_Green, S1_Red100001
S2_Yellow, S1_Red100010

Развёрнутый светофор

FB-сеть

E_RESTART.COLD ──► TrafficLightFB.INIT
E_CYCLE (DT=T#100ms) ──► TrafficLightFB.TICK

TrafficLightFB.DO1 ──► QX (gpio: DO канал 1)
TrafficLightFB.DO2 ──► QX (gpio: DO канал 2)
...
TrafficLightFB.DO6 ──► QX (gpio: DO канал 6)

Пример 3: Сбор данных с датчиков → MQTT → ЛиманИСУ 2.0

Типовая задача IIoT: опрос аналоговых датчиков, обработка и публикация в MQTT для ЛиманИСУ 2.0.

Архитектура

Датчики (4-20мА)


Ларус-100 (4diac FORTE)
│ MQTT publish

MQTT Broker (Mosquitto)


ЛиманИСУ 2.0 (визуализация, архив, алармы)

FB-сеть

E_CYCLE (DT=T#1s)
│ EO

CLIENT_8_0 ────────────► F_MUL ──► PUBLISH_1 (MQTT)
(Modbus: 8 AI каналов) (масштаб (topic: equipment/larus100/ai)
4-20мА
→ физ.ед.)

Конфигурация CLIENT (чтение 8 AI)

CLIENT_8_0.ID = "modbus[192.168.1.100:502, 1, 3, 0, 8]"

Масштабирование 4-20 мА → физические единицы

// Линейное масштабирование
// Raw: 0..32767 (Modbus 16-бит) соответствует 4..20 мА
// Пример: 4 мА = 0°C, 20 мА = 200°C

ScaledValue := (RawValue - 6553.4) / (32767.0 - 6553.4) * (MaxRange - MinRange) + MinRange;

// Для 0-200°C:
Temperature := (RawValue - 6553.4) / 26213.6 * 200.0;

Конфигурация PUBLISH (MQTT)

PUBLISH_1.ID = "raw[].mqtt[tcp://mqtt-broker:1883, equipment/larus100/ai]"

Формат MQTT-сообщения

Для интеграции с ЛиманИСУ 2.0 данные публикуются в JSON:

{
"timestamp": "2026-01-20T14:30:00Z",
"device": "larus100-01",
"channels": [
{"id": 0, "value": 45.2, "unit": "°C", "quality": "good"},
{"id": 1, "value": 3.14, "unit": "bar", "quality": "good"},
{"id": 2, "value": 78.5, "unit": "%", "quality": "good"}
]
}
JSON формирование

Для формирования JSON используйте Custom SIFB (Service Interface FB) на C++ внутри FORTE, или передавайте значения по отдельным топикам:

equipment/larus100/ai/0 → 45.2
equipment/larus100/ai/1 → 3.14
equipment/larus100/ai/2 → 78.5

Мониторинг в ЛиманИСУ 2.0

После настройки MQTT-источника в ЛиманИСУ 2.0:

  1. Создайте узел оборудования → укажите MQTT-топик
  2. Настройте пороги алармов для каждого канала
  3. Архивирование включается автоматически
  4. Тренды доступны в реальном времени

Общие рекомендации

Период опроса

Тип сигналаРекомендуемый периодОбоснование
Температура1–5 сИнерционный процесс
Давление100–500 мсБыстрый процесс
Вибрация1–10 мсВысокочастотный сигнал
Дискретные входы10–50 мсДетекция коротких импульсов
Управляющие выходы100 мсТиповой ПИД

Обработка ошибок связи

E_CYCLE ──► CLIENT ──► E_SWITCH (STATUS = OK?)
│ │
EO0 EO1
│ │
[Alarm FB] [Process FB]

При ошибке Modbus (STATUS ≠ 0) FB CLIENT генерирует событие, которое через E_SWITCH направляется на обработку ошибки.

Следующие шаги