Skip to main content

Пользовательские типы данных (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

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

  • Расширение: INTDINT, REALLREAL (без потери данных)
  • 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) напрямую — нужна сериализация
  • Вложенные структуры (структура в структуре) поддерживаются, но увеличивают сложность

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