Примеры прикладных задач
Практические примеры, демонстрирующие типовые задачи промышленной автоматизации с использованием 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-блока

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

Компоненты
| 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 PID | PID-алгоритм | Kp=2.0, Ki=0.5, Kd=0.1 |
F_LIMIT | Ограничение выхода | MN=0.0, MX=100.0 |
CLIENT_0_1 | Запись на AO | modbus[ip:502, 1, 6, 0, 1] |
Часть приложения: 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
| Параметр | Консервативный | Средний | Агрессивный |
|---|---|---|---|
| Kp | 1.0 | 2.0 | 5.0 |
| Ki | 0.1 | 0.5 | 1.0 |
| Kd | 0.05 | 0.1 | 0.5 |
- Установите Ki=0, Kd=0
- Увеличивайте Kp до появления устойчивых колебаний (Ku)
- Измерьте период колебаний (Tu)
- 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_Red | 0 | 0 | 1 | 1 | 0 | 0 |
| S1_Yellow, S2_Red | 0 | 1 | 0 | 1 | 0 | 0 |
| S2_Green, S1_Red | 1 | 0 | 0 | 0 | 0 | 1 |
| S2_Yellow, S1_Red | 1 | 0 | 0 | 0 | 1 | 0 |

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 используйте 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:
- Создайте узел оборудования → укажите MQTT-топик
- Настройте пороги алармов для каждого канала
- Архивирование включается автоматически
- Тренды доступны в реальном времени
Общие рекомендации
Период опроса
| Тип сигнала | Рекомендуемый период | Обоснование |
|---|---|---|
| Температура | 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 направляется на обработку ошибки.
Следующие шаги
- Обзор туториалов — все учебные материалы
- Ларус: конфигурация — подключение оборудования
- Протокол MQTT — детали MQTT-интеграции