Подприложения (Subapplications)
Основано на официальной документации Eclipse 4diac, лицензия EPL-2.0.
Subapplication — механизм модульной декомпозиции в IEC 61499. Подприложение инкапсулирует часть FB-сети в отдельный блок с собственным интерфейсом, аналогично Composite FB, но с важным отличием: FB внутри подприложения можно маппить на разные устройства и ресурсы.
Subapplication vs Composite FB
| Свойство | Composite FB (CFB) | Subapplication |
|---|---|---|
| Инкапсуляция FB-сети | ✅ | ✅ |
| Собственный интерфейс | ✅ | ✅ |
| Маппинг на разные устройства | ❌ Весь CFB — на одно устройство | ✅ Каждый FB — на своё |
| Многократное использование | Через Type Library | Через копирование |
| Типизация | Новый тип FB | Экземпляр приложения |
| Вложенность | ✅ | ✅ |
Когда использовать Subapplication:
- Часть приложения должна работать на нескольких устройствах
- Нужна логическая группировка FB без ограничения маппинга
- Иерархическая декомпозиция сложных систем
Когда использовать Composite FB:
- Вся логика выполняется на одном устройстве
- Нужен переиспользуемый тип (библиотечный элемент)
Создание Subapplication в IDE
Способ 1: Новое подприложение
- В System Explorer правый клик на Application → New → Subapplication
- Задайте имя (например,
DataAcquisition) - Двойной клик — откроется редактор подприложения
- Перетащите FB из палитры, создайте соединения
- Определите интерфейс подприложения (входы/выходы)
Способ 2: Из существующих FB
- В Application Editor выделите группу FB
- Правый клик → Map to Subapplication
- IDE автоматически создаст подприложение и определит интерфейс на основе внешних соединений

Определение интерфейса
Интерфейс подприложения определяется в Property View:
- Выберите подприложение в Application Editor
- Вкладка Interface в Properties
- Добавьте входные/выходные события и данные
Соединения между FB внутри подприложения и внешними FB автоматически проходят через интерфейсные порты.

Маппинг подприложения на устройства
Ключевое преимущество — гибкий маппинг:
Subapplication: DataAcquisition
├── SensorReader (FB) ──► Device: Larus100_Field
├── DataFilter (FB) ──► Device: Larus100_Field
├── DataLogger (FB) ──► Device: EdgeServer
└── Alarm (FB) ──► Device: EdgeServer
Для маппинга:
- Откройте подприложение двойным кликом
- Выберите FB внутри
- Правый клик → Map to... → выберите устройство и ресурс
Пример: система сбора данных
Архитектура
┌─────────────────────────────────────── ┐
│ MainApp │
│ │
│ ┌──────────────┐ ┌───────────────┐ │
│ │ DataAcq │ │ Visualization │ │
│ │ (Subapp) ├──┤ (Subapp) │ │
│ │ │ │ │ │
│ │ ┌──────┐ │ │ ┌─────────┐ │ │
│ │ │Sensor│ │ │ │Display │ │ │
│ │ └──┬───┘ │ │ └─────────┘ │ │
│ │ ┌──▼───┐ │ │ ┌─────────┐ │ │
│ │ │Filter│ │ │ │ Logger │ │ │
│ │ └──┬───┘ │ │ └─────────┘ │ │
│ │ │ ▲ │ │ │ │
│ └────┼──┼──────┘ └───────────────┘ │
│ └──┘ │
└───────────────────────────────────────┘
Интерфейс Subapplication DataAcquisition
| Тип | Имя | Тип данных | Описание |
|---|---|---|---|
| Event In | INIT | — | Инициализация датчиков |
| Event In | READ | — | Запрос чтения |
| Data In | CONFIG | STRING | Конфигурация Modbus |
| Event Out | INITO | — | Инициализация завершена |
| Event Out | IND | — | Новые данные готовы |
| Data Out | VALUES | ARRAY[0..7] OF REAL | Значения датчиков |
| Data Out | STATUS | BOOL | Статус подсистемы |
Маппинг
| FB | Устройство | Обоснование |
|---|---|---|
| SensorReader | Ларус-100 (полевой) | Близко к датчикам, Modbus RTU |
| DataFilter | Ларус-100 (полевой) | Минимизация трафика |
| DataLogger | Edge-сервер | Хранение данных, диск |
| AlarmHandler | Edge-сервер | Интеграция с SCADA |
Вложенные подприложения
Подприложения можно вкладывать друг в друга для создания иерархической структуры:
System
└── MainApplication
├── SubApp: ProductionLine1
│ ├── SubApp: DataAcquisition
│ │ ├── FB: SensorReader
│ │ └── FB: DataFilter
│ └── SubApp: Control
│ ├── FB: PIDController
│ └── FB: ActuatorDriver
└── SubApp: ProductionLine2
└── ...
Каждый уровень имеет собственный интерфейс, обеспечивая чёткое разделение ответственности.
Рекомендации
- Называйте подприложения по функциональному назначению (
DataAcquisition,MotorControl) - Минимизируйте интерфейс — только необходимые события и данные
- Группируйте FB по принадлежности к устройству, когда это возможно
- Документируйте распределение маппинга для каждого подприложения
Следующие шаги
- Пользовательские типы данных — структуры и массивы
- Адаптеры — переиспользование интерфейсов