Перейти к основному содержимому

Пользовательские типы данных (Structured Types)

Источник

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

4diac IDE поддерживает создание пользовательских типов данных: структур и массивов. Это позволяет передавать сложные данные между FB через одно соединение.

Элементарные типы данных IEC 61499​

КатегорияТипыРазмер
ЛогическийBOOL1 бит
Целые (знаковые)SINT, INT, DINT, LINT8, 16, 32, 64 бит
Целые (беззнаковые)USINT, UINT, UDINT, ULINT8, 16, 32, 64 бит
ВещественныеREAL, LREAL32, 64 бит
СтроковыеSTRING, WSTRINGпеременная длина
ВременныеTIME, DATE, TIME_OF_DAY, DATE_AND_TIME—
БайтовыеBYTE, WORD, DWORD, LWORD8, 16, 32, 64 бит

Автоматическое приведение типов​

4diac поддерживает неявное приведение типов по иерархии:

SINT → INT → DINT → LINT
↘
REAL → LREAL
↗
USINT → UINT → UDINT → ULINT

Допустимые преобразования:

  • Расширение: INT → DINT, REAL → LREAL (без потери данных)
  • INT → REAL: допускается, но возможна потеря точности для больших целых
  • REAL → INT: требует явного преобразования через FB (REAL_TO_INT)

Массивы (Arrays)​

Объявление массива в интерфейсе FB​

В 4diac IDE тип массива указывается в поле Type интерфейса:

ARRAY [0..7] OF REAL
ARRAY [1..16] OF BOOL
ARRAY [0..3] OF INT

Доступ к элементам​

Для доступа к отдельным элементам массива используйте FB из библиотеки:

FBОписание
ARRAY_ATЧтение элемента по индексу
ARRAY_SETЗапись элемента по индексу
ARRAY_SIZEПолучение размера массива

Пример: массив показаний датчиков​

FB: DataCollector
Input:
INIT (Event)
READ (Event)
Output:
INITO (Event)
IND (Event)
VALUES: ARRAY [0..7] OF REAL ← 8 каналов аналоговых входов
COUNT: UINT ← Количество прочитанных каналов

Структуры (Structured Types)​

Создание структурного типа​

Пример структурного типа в 4diac IDE

  1. File → New → Type → Structured Data Type
  2. Задайте имя (например, SensorData)
  3. Определите поля структуры

Пример: структура данных датчика​

STRUCT SensorData
Value : REAL; -- Текущее значение
Quality : BOOL; -- Качество сигнала
Timestamp: DATE_AND_TIME; -- Метка времени
Status : INT; -- Код статуса (0=OK, 1=Warning, 2=Error)
END_STRUCT

В IDE это определяется через графический редактор:

ПолеТипОписание
ValueREALТекущее значение
QualityBOOLКачество сигнала
TimestampDATE_AND_TIMEМетка времени
StatusINTКод статуса

Использование структуры в FB​

После создания типа SensorData его можно использовать как тип данных в интерфейсе любого FB:

FB: TemperatureMonitor
Input:
INIT (Event)
REQ (Event)
Sensor1: SensorData ← Структурный тип
Sensor2: SensorData
Output:
INITO (Event)
CNF (Event)
MaxTemp: REAL
AlarmActive: BOOL

Доступ к полям структуры​

В алгоритмах Structured Text (ST) доступ к полям осуществляется через точку:

// Алгоритм внутри Basic FB
IF Sensor1.Quality = TRUE THEN
MaxTemp := MAX(Sensor1.Value, Sensor2.Value);
AlarmActive := MaxTemp > 85.0;
END_IF;

Массивы структур​

Можно комбинировать массивы и структуры:

Sensors: ARRAY [0..3] OF SensorData

Доступ:

CurrentTemp := Sensors[0].Value;
AllOk := Sensors[0].Quality AND Sensors[1].Quality;

Практический пример: мониторинг Ларус-100​

Структура для модуля AI8​

STRUCT AnalogInputModule
Channels : ARRAY [0..7] OF REAL; -- 8 каналов 4-20мА
ModuleOK : BOOL; -- Статус модуля
DiagCode : UINT; -- Код диагностики
END_STRUCT

FB для обработки​

FB: AI8_Monitor
Input:
INIT, REQ (Events)
Module: AnalogInputModule
LowLimit: ARRAY [0..7] OF REAL
HighLimit: ARRAY [0..7] OF REAL
Output:
INITO, CNF (Events)
Alarms: ARRAY [0..7] OF BOOL
AlarmCount: UINT

Ограничения​

  • Не все среды выполнения поддерживают структурные типы (FORTE ≥ 2.0 — поддерживает)
  • Структуры нельзя передавать через коммуникационные FB (PUBLISH/SUBSCRIBE) напрямую — нужна сериализация
  • Вложенные структуры (структура в структуре) поддерживаются, но увеличивают сложность

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