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 направляется на обработку ошибки.

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