Skip to main content

IEC 61499 Function Blocks

Только Версия 2

Кастомные Function Blocks доступны только в модулях V2 (Cortex-M7), где на MCU работает runtime Eclipse 4diac FORTE.

Обращение к физическим каналам I/O осуществляется через кастомные SIFB (Service Interface Function Blocks), аналогичные IX/QX в IEC 61131.

LARUS_AI — аналоговый вход

┌─────────────────────────────┐
│ LARUS_AI │
├─────────────────────────────┤
│ INIT ──────────────► CNF │ инициализация канала
│ REQ ──────────────► CNF │ запрос значения
├──────────┬──────────────────┤
│ INPUTS │ OUTPUTS │
│ QI: BOOL │ QO: BOOL │ качество (TRUE = OK)
│ CHANNEL: │ VALUE: REAL │ физ. значение (мА, В, °C)
│ UINT │ RAW: UDINT │ сырое значение ADC
│ TYPE: INT│ STATUS: INT │ код статуса
│ SCALE_LO:│ TIMESTAMP: LINT │ метка времени (мс)
│ REAL │ │
│ SCALE_HI:│ │
│ REAL │ │
└──────────┴──────────────────┘

Параметр TYPE

ЗначениеРежимОписание
04–20 мАТоковая петля
10–10 ВНапряжение
2Pt100Термосопротивление 100 Ом
3Pt1000Термосопротивление 1000 Ом
4TC_KТермопара тип K
5TC_JТермопара тип J

Коды STATUS

КодЗначение
0OK
1WIRE_BREAK (обрыв линии, < 3.6 мА)
2OVERRANGE (насыщение, > 20.5 мА)
3UNDERRANGE
4HW_ERROR

LARUS_DI — дискретный вход

┌─────────────────────────────────┐
│ LARUS_DI │
├─────────────────────────────────┤
│ INIT, REQ → CNF │
├──────────┬──────────────────────┤
│ INPUTS │ OUTPUTS │
│ CHANNEL: │ VALUE: BOOL │ состояние входа
│ UINT │ COUNTER: UDINT │ счётчик фронтов
│ FILTER_ │ FREQ: REAL │ частота (Гц)
│ TIME: │ STATUS: INT │ код статуса
│ TIME │ │
└──────────┴──────────────────────┘
  • FILTER_TIME — время фильтрации дребезга (по умолчанию T#5ms)
  • COUNTER — 32-бит счётчик нарастающих фронтов (для каналов-счётчиков)
  • FREQ — частота в Гц (рассчитывается по периоду между фронтами)

LARUS_DO — дискретный выход

┌─────────────────────────────────┐
│ LARUS_DO │
├─────────────────────────────────┤
│ INIT, SET, RESET → CNF │
├──────────┬──────────────────────┤
│ INPUTS │ OUTPUTS │
│ CHANNEL: │ VALUE: BOOL │ текущее состояние
│ UINT │ STATUS: INT │ код статуса
│ VALUE: │ │
│ BOOL │ │
└──────────┴──────────────────────┘
  • SET — установить выход в значение VALUE
  • RESET — принудительно сбросить выход в FALSE

Конфигурация через .fboot

Пример конфигурации для чтения давления с AI канала 0 (4–20 мА):

EMB_RES;<Request ID="10" Action="CREATE">
<FB Name="AI_PRESSURE" Type="LARUS_AI"/>
</Request>
EMB_RES;<Request ID="11" Action="WRITE">
<Connection Source="TRUE" Destination="AI_PRESSURE.QI"/>
</Request>
EMB_RES;<Request ID="12" Action="WRITE">
<Connection Source="0" Destination="AI_PRESSURE.CHANNEL"/>
</Request>
EMB_RES;<Request ID="13" Action="WRITE">
<Connection Source="0" Destination="AI_PRESSURE.TYPE"/>
</Request>

Сборка FORTE с модулями Ларус

git clone https://github.com/eclipse-4diac/4diac-forte.git
mkdir build && cd build
cmake .. \
-DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/arm-none-eabi.cmake \
-DFORTE_ARCHITECTURE=FreeRTOS_LwIP \
-DFORTE_COM_ETH=ON \
-DFORTE_MODULE_IEC61131=ON \
-DFORTE_LRS_IO=ON # Кастомные SIFBs Ларус-IO
make -j$(nproc)

Структура исходного кода

4diac-forte/src/modules/larus_io/
├── CMakeLists.txt
├── larus_ai.h / larus_ai.cpp ← LARUS_AI FB
├── larus_rtd.h / larus_rtd.cpp ← LARUS_RTD FB
├── larus_di.h / larus_di.cpp ← LARUS_DI FB
├── larus_do.h / larus_do.cpp ← LARUS_DO FB
├── io_driver/
│ ├── ads1247_driver.cpp ← SPI: STM32 HAL
│ ├── gpio_driver.cpp ← GPIO: HAL_GPIO
│ └── io_manager.cpp ← singleton, FreeRTOS mutex
└── calibration/
├── rtd_callendar.cpp ← Pt100/Pt1000
└── tc_tables.cpp ← NIST таблицы термопар

Подробнее о программировании в 4diac IDE — в разделе 4diac IDE.