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

Приложения A–G стандарта IEC 61499-1 Ed.2

Данная страница содержит перевод приложений (Annexes) A–G стандарта IEC 61499-1:2012, второе издание. Приложения дополняют основной текст стандарта нормативными и справочными материалами: типами событийных функциональных блоков (Event Function Blocks), текстовым синтаксисом, объектными моделями UML, связью с IEC 61131-3, правилами обмена информацией, текстовыми спецификациями и атрибутами.


Приложение A (нормативное) — Событийные функциональные блоки

A.1 Общие сведения

Экземпляры (Instances) типов функциональных блоков (Function Block Types), перечисленных в Таблице A.1, могут использоваться для генерации и обработки событий (Events) в составных функциональных блоках (Composite Function Blocks); в подприложениях (Subapplications); в определениях типов ресурсов (Resource Types) и устройств (Device Types); а также в конфигурации приложений (Applications), ресурсов (Resources) и устройств (Devices).

Те типы ФБ из Приложения A, которые используют диаграммы управления выполнением (Execution Control Charts, ECC), являются базовыми типами функциональных блоков (Basic Function Block Types). Текстовые объявления алгоритмов для этих типов ФБ даны на языке структурированного текста (Structured Text, ST), определённом в IEC 61131-3.

Эталонные реализации некоторых типов ФБ из Приложения A даны в виде определений составных функциональных блоков (Composite Function Block Types). Эти реализации являются нормативными лишь в том смысле, что функциональное поведение совместимых реализаций должно быть эквивалентно эталонным.

примечание

Полные текстовые спецификации всех типов ФБ из Таблицы A.1 приведены в Приложении F.

A.2 Таблица A.1 — Событийные функциональные блоки

В таблице ниже представлены 18 типов событийных ФБ с описанием интерфейса и поведения (ECC / алгоритмы / сервисные последовательности).

Имя типаОписание
1E_SPLITРазделение события (Split an event). Появление события на входе EI вызывает события на выходах EO1, EO2, ..., EOn.
2E_MERGEСлияние (OR) нескольких событий (Merge of multiple events). Появление события на любом из входов EI1, EI2, ..., EIn вызывает событие на выходе EO.
3E_RENDРандеву двух событий (Rendezvous of two events). Выходное событие EO генерируется только после поступления обоих входных событий EI1 и EI2. Вход R сбрасывает ожидание.
4E_PERMITРазрешающее распространение события (Permissive propagation). Событие EI пропускается на выход EO только при PERMIT = TRUE.
5E_SELECTВыбор между двумя событиями (Selection between two events). При G = FALSE на выход проходит EI0, при G = TRUEEI1.
6E_SWITCHКоммутация (демультиплексирование) события (Switching/demultiplexing). При G = FALSE событие EI направляется на EO0, при G = TRUE — на EO1.
7E_DELAYЗадержка распространения события (Delayed propagation). Событие на EO генерируется через время DT после START. Событие STOP отменяет задержку.
8E_RESTARTГенерация событий перезапуска (Generation of restart events). Выходы COLD (холодный перезапуск) и WARM (тёплый перезапуск) ресурса.
9E_CYCLEПериодическая (циклическая) генерация события (Periodic/cyclic generation). Событие на EO повторяется с периодом DT после START и до STOP.
10E_TRAINГенерация конечной последовательности событий (Finite train of events). N событий с периодом DT, начиная с START, до STOP или до исчерпания счётчика N.
11E_TABLEГенерация конечной последовательности с переменными интервалами (Table-driven). Интервалы задаются массивом DT[4], количество событий — N.
12E_N_TABLEГенерация конечной последовательности раздельных событий (Table-driven, separate events). Каждое из N событий выводится на свой выход EO0..EO3.
13E_SRБистабильный элемент с приоритетом установки (Event-driven bistable, set-dominant). Вход S устанавливает Q := TRUE, вход R сбрасывает Q := FALSE. Событие на EO при изменении Q.
14E_RSБистабильный элемент с приоритетом сброса (Event-driven bistable, reset-dominant). Аналогично E_SR, но приоритет отдаётся входу R.
15E_D_FFD-триггер (Data latch bistable). По событию CLK значение входа D фиксируется на выходе Q. Событие EO генерируется при изменении Q.
16E_R_TRIGДетектор нарастающего фронта булевого сигнала (Boolean rising edge detection). Составной ФБ на базе E_D_FF и E_SWITCH.
17E_F_TRIGДетектор спадающего фронта булевого сигнала (Boolean falling edge detection). Составной ФБ на базе E_D_FF и E_SWITCH.
18E_CTUСобытийный счётчик вверх (Event-driven up counter). Вход CU увеличивает CV, вход R сбрасывает. Q := (CV >= PV).

A.3 Графическая нотация E_SPLIT и E_MERGE

Для блоков E_SPLIT и E_MERGE могут использоваться сокращённые графические обозначения. Например, неявное (implicit) представление на рисунке A.1b эквивалентно явному (explicit) представлению на рисунке A.1a.

Рисунок A.1 — Разделение и слияние событий

Рисунок A.1 — Разделение и слияние событий (Event split and merge)


Приложение B (нормативное) — Текстовый синтаксис

B.1 Техника описания синтаксиса

Текстовые конструкции Приложения B определяются в терминах синтаксиса (Syntax), задающего допустимые комбинации символов, и семантики (Semantics), определяющей значения этих комбинаций.

Синтаксис определяется набором:

  • Терминальных символов (Terminal Symbols) — строки в одинарных или двойных кавычках (например, "ABC" или 'ABC'). Специальный терминальный символ NIL обозначает пустую строку.
  • Нетерминальных символов (Non-terminal Symbols) — строки из строчных букв, цифр и подчёркиваний, начинающиеся со строчной буквы.
  • Правил вывода (Production Rules) — в форме расширенной грамматики (Extended Grammar).

Формат правил вывода:

non_terminal_symbol::= extended_structure

Расширенные структуры строятся по следующим правилам:

  • (S) — группировка (само S)
  • {S} — замыкание (Closure): ноль или более повторений S
  • [S] — необязательность (Option): ноль или одно вхождение S
  • S1 | S2 — альтернатива (Alternation): S1 или S2
  • S1 S2 — конкатенация (Concatenation): S1, за которым следует S2

Конкатенация имеет приоритет над альтернативой: S1 | S2 S3 эквивалентно S1 | (S2 S3).

B.2 Спецификации типов функциональных блоков и подприложений

B.2.1 Спецификация типа функционального блока

Синтаксис объявления типа функционального блока (Function Block Type Declaration):

fb_type_declaration::=
'FUNCTION_BLOCK' fb_type_name
fb_interface_list
[fb_internal_variable_list] <только для базовых ФБ>
[fb_instance_list] <только для составных ФБ>
[plug_list]
[socket_list]
[fb_connection_list] <только для составных ФБ>
[fb_ecc_declaration] <только для базовых ФБ>
{fb_algorithm_declaration} <только для базовых ФБ>
[fb_service_declaration]
'END_FUNCTION_BLOCK'

fb_interface_list::=
[event_input_list]
[event_output_list]
[input_variable_list]
[output_variable_list]

event_input_list::=
'EVENT_INPUT'
{event_input_declaration}
'END_EVENT'

event_output_list::=
'EVENT_OUTPUT'
{event_output_declaration}
'END_EVENT'

event_input_declaration::= event_input_name [ ':' event_type ]
['WITH' input_variable_name {',' input_variable_name}] ';'

event_output_declaration::= event_output_name [ ':' event_type ]
['WITH' output_variable_name {',' output_variable_name}] ';'

input_variable_list::=
'VAR_INPUT' {input_var_declaration ';'} 'END_VAR'

output_variable_list::=
'VAR_OUTPUT' {output_var_declaration ';'} 'END_VAR'

fb_internal_variable_list::=
'VAR' {internal_var_declaration ';'} 'END_VAR'

Объявления переменных:

input_var_declaration::=
input_variable_name {',' input_variable_name} ':' var_spec_init

output_var_declaration::=
output_variable_name {',' output_variable_name} ':' var_spec_init

internal_var_declaration::=
internal_variable_name {',' internal_variable_name}
':' var_spec_init

Списки экземпляров ФБ, разъёмов (Plugs) и гнёзд (Sockets):

fb_instance_list::= 'FBS'
{fb_instance_definition ';'}
'END_FBS'

fb_instance_definition::= fb_instance_name ':' fb_type_name [parameters]

plug_list::= 'PLUGS'
{plug_name ':' adapter_type_name [parameters] ';'}
'END_PLUGS'

socket_list::= 'SOCKETS'
{socket_name ':' adapter_type_name [parameters] ';'}
'END_SOCKETS'

Списки соединений:

fb_connection_list::=
[event_conn_list]
[data_conn_list]
[adapter_conn_list]

event_conn_list::=
'EVENT_CONNECTIONS'
{event_conn}
'END_CONNECTIONS'

event_conn::= event_conn_source 'TO' event_conn_destination ';'

data_conn_list::=
'DATA_CONNECTIONS'
{data_conn}
'END_CONNECTIONS'

data_conn::= data_conn_source 'TO' data_conn_destination ';'

adapter_conn_list::=
'ADAPTER_CONNECTIONS'
{adapter_conn}
'END_CONNECTIONS'

adapter_conn::=
((fb_instance_name '.' plug_name) | socket_name)
'TO' ((fb_instance_name '.' socket_name) | plug_name) ';'

Синтаксис ECC (Execution Control Chart)

fb_ecc_declaration::=
'EC_STATES'
{ec_state} <первое состояние — начальное>
'END_STATES'
'EC_TRANSITIONS'
{ec_transition}
'END_TRANSITIONS'

ec_state::= ec_state_name
[':' ec_action {',' ec_action}] ';'

ec_action::= algorithm_name | ('->' ec_action_output)
| (algorithm_name '->' ec_action_output)

ec_transition::=
ec_state_name
'TO' ec_state_name
':=' ec_transition_condition ';'

ec_transition_condition::= '1'
| ec_transition_event | '[' guard_condition ']'
| ec_transition_event '[' guard_condition ']'

Синтаксис алгоритмов

fb_algorithm_declaration::=
'ALGORITHM' algorithm_name 'IN' language_type ':'
[temp_var_decls]
algorithm_body
'END_ALGORITHM'

Синтаксис сервисных последовательностей

fb_service_declaration::=
'SERVICE' service_interface_name '/' service_interface_name
{service_sequence}
'END_SERVICE'

service_sequence::=
'SEQUENCE' sequence_name
{service_transaction ';'}
'END_SEQUENCE'

service_transaction::=
[input_service_primitive] '->' output_service_primitive
{'->' output_service_primitive}

B.2.2 Спецификация типа подприложения

subapplication_type_declaration::=
'SUBAPPLICATION' subapp_type_name
subapp_interface_list
[fb_instance_list]
[subapp_instance_list]
[plug_list]
[socket_list]
[subapp_connection_list]
'END_SUBAPPLICATION'

B.3 Элементы конфигурации

Синтаксис конфигурации системы (System Configuration):

system_configuration::= 'SYSTEM' system_name
{application_configuration}
device_configuration
{device_configuration}
[mappings]
[segments]
[links]
'END_SYSTEM'

application_configuration::=
'APPLICATION' application_name
[fb_instance_list]
[subapp_instance_list]
[subapp_connection_list]
'END_APPLICATION'

device_configuration::=
'DEVICE' device_name ':' device_type_name [parameters]
[resource_type_list]
{resource_configuration}
[fb_instance_list]
[config_connection_list]
'END_DEVICE'

resource_configuration::=
'RESOURCE' resource_instance_name ':' resource_type_name [parameters]
[fb_type_list]
[fb_instance_list]
[config_connection_list]
'END_RESOURCE'

Отображения (Mappings), сегменты (Segments) и связи (Links):

mappings::= 'MAPPINGS' mapping {mapping} 'END_MAPPINGS'

mapping::= fb_instance_reference 'ON' fb_resource_reference ';'

segments::= 'SEGMENTS'
segment {segment}
'END_SEGMENTS'

segment::= segment_name ':' segment_type_name [parameters] ';'

links::= 'LINKS'
link {link}
'END_LINKS'

link::= resource_hierarchy '=>' segment_name [parameters] ';'

B.4 Общие элементы

Если синтаксические правила для нетерминальных символов не заданы в Приложении B, применяются соответствующие правила из Приложения B стандарта IEC 61131-3:2003.

B.5 Вспомогательные продукции для команд управления

data_type_list::= 'DATA_TYPES' {data_type_name ';'} 'END_DATA_TYPES'

connection_definition::=
connection_start_point ' ' connection_end_points

fb_instance_reference::= [app_hierarchy_name] fb_instance_name

fb_resource_reference::= resource_hierarchy ['.' fb_instance_name]

fb_status::= 'IDLE' | 'RUNNING' | 'STOPPED' | 'KILLED'

B.6 Тегированные типы данных

tagged_type_declaration::=
'TYPE'
asn1_tag type_declaration ';'
{asn1_tag type_declaration ';'}
'END_TYPE'

asn1_tag::= '[' ['APPLICATION' | 'PRIVATE'] (integer | hex_integer) ']'

B.7 Типы адаптерных интерфейсов

adapter_type_declaration::=
'ADAPTER' adapter_type_name
fb_interface_list
[fb_service_declaration]
'END_ADAPTER'

adapter_type_name::= identifier

Приложение C (справочное) — Объектные модели

C.1 Нотация моделей

Приложение C представляет объектные модели (Object Models) для некоторых классов, которые могут использоваться в системах инженерной поддержки (Engineering Support Systems, ESS) для проектирования, реализации, ввода в эксплуатацию и эксплуатации систем промышленных измерений и управления (Industrial-Process Measurement and Control Systems, IPMCS), построенных согласно архитектуре данного стандарта.

Нотация, используемая в Приложении C, — это унифицированный язык моделирования (Unified Modeling Language, UML). Подробная документация UML доступна по адресу http://www.omg.org/uml/.

C.2 Модели ESS

C.2.1 Обзор ESS

Рисунок C.1 даёт обзор основных классов системы ESS и их соответствие классам объектов в IPMCS.

Рисунок C.1 — Обзор ESS

Рисунок C.1 — Обзор ESS (ESS overview)

Основные классы ESS:

КлассОписание
DeclarationАбстрактный суперкласс для объявлений (Declarations).
EditorЭкземпляры этого класса обеспечивают функции редактирования объявлений для поддержки варианта использования EDIT.
LibraryElementАбстрактный суперкласс объектов, которые могут храниться в репозиториях и импортироваться/экспортироваться в текстовом или XML-синтаксисе. Имеют атрибуты supplier и version.
RepositoryЭкземпляры этого класса обеспечивают постоянное хранение и извлечение элементов библиотеки. Могут также предоставлять услуги контроля версий.
SystemManagerЭкземпляры обеспечивают функции для поддержки вариантов использования INSTALL и OPERATE.
TesterРасширение SystemManager для поддержки операций варианта использования TEST.
ToolМоделирует обобщённое поведение программных инструментов для инженерной поддержки IPMCS.

C.2.2 Элементы библиотеки

Рисунок C.2 показывает подклассы LibraryElement.

Рисунок C.2 — Элементы библиотеки

Рисунок C.2 — Элементы библиотеки (Library elements)

КлассСинтаксическая продукция
DataTypeDeclarationtype_declaration
FBTypeDeclarationfb_type_declaration
AdapterTypeDeclarationadapter_type_declaration
SubapplicationTypeDeclarationsubapplication_type_declaration
ResourceTypeDeclarationresource_type_specification
DeviceTypeDeclarationdevice_type_specification
SystemConfigurationsystem_configuration

C.2.3 Объявления

Рисунок C.3 показывает иерархию классов объявлений, которыми могут оперировать программные инструменты.

Рисунок C.3 — Объявления

Рисунок C.3 — Объявления (Declarations)

Основные подклассы:

  • NamedDeclaration и ConnectionDeclaration — два основных подвида Declaration
  • DataConnectionDeclaration, EventConnectionDeclaration — подвиды ConnectionDeclaration
  • EventDeclaration (с подклассами EventInputDeclaration и EventOutputDeclaration)
  • AlgorithmDeclaration, LibraryElement, ResourceConfiguration, DeviceConfiguration
  • VariableDeclaration (с подклассами InputVariableDeclaration, OutputVariableDeclaration, InternalVariableDeclaration)
  • FBInstanceDeclaration
КлассСинтаксическая продукция
AdapterConnectionDeclarationadapter_conn
AdapterTypeDeclarationadapter_type_declaration
AlgorithmDeclarationfb_algorithm_declaration
DataConnectionDeclarationdata_conn
DeviceConfigurationdevice_configuration
EventConnectionDeclarationevent_conn
EventInputDeclarationevent_input_declaration
EventOutputDeclarationevent_output_declaration
FBInstanceDeclarationfb_instance_definition
InputVariableDeclarationinput_var_declaration
InternalVariableDeclarationinternal_var_declaration
OutputVariableDeclarationoutput_var_declaration
PlugDeclarationчасть plug_list
ResourceConfigurationresource_instance
SocketDeclarationчасть socket_list

C.2.4 Объявления сети функциональных блоков

Рисунок C.4 показывает связи между элементами объявлений сети функциональных блоков (Function Block Network Declarations).

Рисунок C.4 — Объявления сети ФБ

Рисунок C.4 — Объявления сети функциональных блоков (Function block network declarations)

Класс FBNetworkDeclaration агрегирует:

  • FBInstanceDeclaration — экземпляры ФБ
  • DataConnectionDeclaration — соединения данных
  • EventConnectionDeclaration — событийные соединения
  • AdapterConnectionDeclaration — адаптерные соединения

C.2.5 Объявления типов функциональных блоков

Рисунок C.5 показывает связи между элементами объявлений типов ФБ (Function Block Type Declarations).

Рисунок C.5 — Объявления типов ФБ

Рисунок C.5 — Объявления типов функциональных блоков (Function block type declarations)

Рисунок C.5 состоит из двух частей:

C.5a — Композиция: FBTypeDeclaration агрегирует EventInputDeclaration (0..*), EventOutputDeclaration (0..*), InputVariableDeclaration (0..*), OutputVariableDeclaration (0..*), SocketDeclaration (0..*), PlugDeclaration (0..*) и ServiceDeclaration (0..1). Связи WITH соединяют события с переменными.

C.5b — Иерархия классов: FBTypeDeclaration имеет три подкласса:

  • BasicFBTypeDeclaration — агрегирует AlgorithmDeclaration (0..*), ECCDeclaration (0..1), InternalVariableDeclaration (0..*)
  • SIFBTypeDeclaration (тип ФБ интерфейса сервисов)
  • CompositeFBTypeDeclaration — агрегирует FBNetworkDeclaration (1)

C.3 Модели IPMCS

Рисунок C.6 даёт обзор основных классов системы промышленных измерений и управления (IPMCS).

Рисунок C.6 — Обзор IPMCS

Рисунок C.6 — Обзор IPMCS (IPMCS overview)

Класс IPMCSОписаниеСоответствующий класс ESS
DataTypeЭкземпляр этого класса — тип данных (Data Type).DataTypeDeclaration
DeviceЭкземпляр этого класса представляет устройство (Device).DeviceConfiguration
FBInstanceЭкземпляр этого класса — экземпляр ФБ (Function Block Instance).FBInstanceDeclaration
FBManagerЭкземпляр этого класса предоставляет сервисы управления (Clause 6).SystemManager
FBTypeЭкземпляр этого класса — тип ФБ (Function Block Type).FBTypeDeclaration
ManagedConnectionДоступ по комбинации источника и назначения через FBManager.ConnectionDeclaration
ManagedObjectАбстрактный суперкласс управляемых объектов. Могут иметь атрибуты supplier и version.нет
NamedObjectАбстрактный суперкласс объектов, доступных по имени через FBManager.NamedDeclaration
ResourceЭкземпляр этого класса представляет ресурс (Resource).ResourceConfiguration
SystemЭкземпляр этого класса представляет систему IPMCS.SystemConfiguration

Рисунок C.7 показывает связи между элементами экземпляра ФБ и связанного типа ФБ.

Рисунок C.7 — Типы и экземпляры ФБ

Рисунок C.7 — Типы и экземпляры функциональных блоков (Function block types and instances)

На рисунке C.7 показано, что FBType агрегирует InputVariableDeclaration, OutputVariableDeclaration, EventInputDeclaration и EventOutputDeclaration (из ESS), а также CompiledCode. FBInstance содержит EventInput (0..*), EventOutput (0..*), InputVariable (0..*), OutputVariable (0..*) и InternalVariable (0..*).


Приложение D (справочное) — Связь с IEC 61131-3

D.1 Общие сведения

Функции (Functions) и функциональные блоки (Function Blocks), определённые в IEC 61131-3, могут использоваться для объявления алгоритмов (Algorithms) в базовых типах ФБ согласно п. 5.2.1. Подраздел D.2 определяет правила преобразования функций и типов ФБ IEC 61131-3 в простые типы ФБ интерфейса сервисов (Simple Service Interface Function Block Types) для использования в приложениях и типах ресурсов. Подраздел D.3 определяет событийно-управляемые версии функций и ФБ IEC 61131-3 для тех же целей.

D.2 «Простые» функциональные блоки

Функции и ФБ IEC 61131-3 могут быть преобразованы в «простые» ФБ по следующим правилам:

a) Простые ФБ представляются как ФБ интерфейса сервисов (Service Interface Function Blocks) для взаимодействия, инициируемого приложением.

b) Имя типа (Type Name) простого ФБ — это имя преобразуемого типа IEC 61131-3 с префиксом FB_ (например, FB_ADD_INT). Для функций может использоваться префикс F_.

c) Входные и выходные переменные (Variables) и их типы данных (Data Types) соответствуют преобразуемому типу IEC 61131-3.

d) Событийные входы INIT/INITO используются с простыми ФБ, полученными из типов ФБ IEC 61131-3, и не используются с ФБ из функций.

Рисунок D.1 — Пример «простого» типа ФБ

Рисунок D.1 — Пример «простого» типа функционального блока (Example of a "simple" function block type)

Поведение экземпляров простых типов ФБ определяется следующими правилами:

  • e) Инициализация — согласно п. 2.4.2 IEC 61131-3:2003 для переменных.
  • f) Появление примитива INIT+ эквивалентно «холодному перезапуску» по IEC 61131-3:2003, за которым следует примитив INITO+ со STATUS = 0.
  • g) Примитив INIT- или REQ- не вызывает эффекта, кроме примитива INITO- или CNF- со STATUS = 1.
  • h) Примитив REQ+ вызывает выполнение алгоритма.
  • i) Успешное выполнение алгоритма в ответ на REQ+ приводит к CNF+ со STATUS = 0.
  • j) Ошибка при выполнении приводит к CNF- со STATUS по Таблице D.1.

Таблица D.1 — Семантика значений STATUS

ЗначениеСемантика
0Нормальная работа (Normal operation)
1Распространение INIT- или REQ-
2Ошибка преобразования типа (Type conversion error)
3Числовой результат выходит за диапазон типа данных
4Деление на ноль (Division by zero)
5Селектор (K) вне диапазона для функции MUX
6Недопустимая позиция символа
7Результат превышает максимальную длину строки
8Одновременно истинные, неприоритизированные переходы в разветвлении выбора
9Ошибка конкуренции управления действиями
10Возврат из функции без присвоения значения
11Невозможность завершения итерации
12Недопустимый индекс массива
13Ошибка размера массива

D.3 Событийно-управляемые функции и функциональные блоки

Функции IEC 61131-3 могут быть преобразованы в ФБ для эффективного использования в событийно-управляемых системах со следующими изменениями:

a) Имя типа — с дополнительным префиксом E_ (например, E_ADD_INT).

b) Примитив CNF+ или CNF- не следует за выполнением алгоритма, если результат не изменяет значение выхода функции.

Для ФБ IEC 61131-3, имеющих внутреннее состояние, такие блоки должны быть специально преобразованы для событийно-управляемых систем. Например, ФБ E_DELAY из Таблицы A.1 может использоваться для многих функций задержки таймерных ФБ IEC 61131-3.

D.4 Соответствие IEC 61131-3

Реализации данного стандарта должны соответствовать требованиям пп. 1.5.1, 2.1, 2.2, 2.3 и 2.4 IEC 61131-3:2003, а также связанным элементам Приложения B IEC 61131-3:2003 для синтаксиса и семантики текстового представления общих элементов, с исключениями, описанными в п. D.5.

D.5 Исключения

Реализации данного стандарта не должны использовать нотацию переменных прямого представления (Directly Represented Variable), определённую в п. 2.4.1.1 IEC 61131-3:2003. Однако литерал типа STRING или WSTRING, содержащий строку с синтаксисом и семантикой нотации переменных прямого представления, может использоваться как параметр ФБ интерфейса сервисов.

D.6 Взаимодействие с программируемыми контроллерами

D.6.1 Обзор

Программируемый контроллер (Programmable Controller) может выступать в роли сервера (Server) в понимании IEC 61131-5, а устройство (Device) стандарта IEC 61499 — в роли клиента (Client). Взаимодействие осуществляется через экземпляры типов ФБ, определённых в Приложении D, которые моделируются как типы коммуникационных ФБ (Communication Function Block Types).

D.6.2 Соглашения о сервисах

Для ФБ Приложения D вход PARAMS типа ANY заменён на вход ID типа WSTRING, содержащий зависящее от реализации (Implementation-dependent) представление пути к интересующей переменной на сервере.

Вход TYPE типа WSTRING определяет имя типа данных (например, "BOOL" или "ANALOG_16_INPUT_DATA").

Вход TASK типа WSTRING определяет путь к задаче на сервере.

D.6.3 Типы функциональных блоков

D.6.3.1 READ

Экземпляр типа ФБ READ может использоваться клиентским устройством IEC 61499 для чтения программных переменных или переменных статуса с сервера IEC 61131-3.

Рисунок D.2 — Тип ФБ READ

Рисунок D.2 — Тип функционального блока READ (Function block type READ)

Исходный код типа ФБ READ:

FUNCTION_BLOCK READ (* Read server status or program variable *)
EVENT_INPUT
INIT WITH QI,ID,TYPE; (* Initialize/Terminate Service *)
REQ WITH QI; (* Service Request *)
END_EVENT

EVENT_OUTPUT
INITO WITH QO,STATUS; (* Initialize/Terminate Confirm *)
CNF WITH QO,STATUS,RD; (* Confirmation of Requested Service *)
END_EVENT

VAR_INPUT
QI: BOOL; (* Event Input Qualifier *)
ID: WSTRING; (* Path to variable to be read *)
TYPE: WSTRING; (* Data type of RD variable *)
END_VAR

VAR_OUTPUT
QO: BOOL; (* 1=Normal operation, 0=Abnormal operation *)
STATUS: INT;
RD: ANY; (* Variable data from IEC 61131 device *)
END_VAR

SERVICE CLIENT/SERVER
SEQUENCE normal_establishment
CLIENT.INIT+(ID,TYPE) -> SERVER.initRead(ID,TYPE) -> CLIENT.INITO+();
END_SEQUENCE

SEQUENCE unsuccessful_establishment
CLIENT.INIT+(ID,TYPE) -> SERVER.initRead(ID,TYPE) -> CLIENT.INITO-(STATUS);
END_SEQUENCE

SEQUENCE request_read
CLIENT.REQ+() -> SERVER.reqRead(ID) -> CLIENT.CNF+(RD);
END_SEQUENCE

SEQUENCE request_inhibited
CLIENT.REQ-() -> CLIENT.CNF-(STATUS);
END_SEQUENCE

SEQUENCE request_error
CLIENT.REQ+() -> SERVER.reqRead(ID) -> CLIENT.CNF-(STATUS);
END_SEQUENCE

SEQUENCE client_initiated_termination
CLIENT.INIT-() -> SERVER.terminateRead(ID) -> CLIENT.INITO-(STATUS);
END_SEQUENCE

SEQUENCE server_initiated_termination
SERVER.readTerminated(ID,STATUS) -> CLIENT.INITO-(STATUS);
END_SEQUENCE
END_SERVICE
END_FUNCTION_BLOCK
D.6.3.2 UREAD

Экземпляр типа ФБ UREAD может использоваться клиентским устройством IEC 61499 для запроса асинхронного уведомления об изменении программной переменной или переменной статуса на сервере IEC 61131-3. Уведомление приходит через событие IND блока.

Рисунок D.3 — Тип ФБ UREAD

Рисунок D.3 — Тип функционального блока UREAD (Function block type UREAD)

D.6.3.3 WRITE

Экземпляр типа ФБ WRITE может использоваться клиентским устройством IEC 61499 для записи значений переменных на сервер IEC 61131-3.

Рисунок D.4 — Тип ФБ WRITE

Рисунок D.4 — Тип функционального блока WRITE (Function block type WRITE)

D.6.3.4 TASK

Экземпляр типа ФБ TASK может использоваться клиентским устройством IEC 61499 для запуска выполнения задачи на сервере IEC 61131-3.

Рисунок D.5 — Тип ФБ TASK

Рисунок D.5 — Тип функционального блока TASK (Function block type TASK)

D.6.4 Соответствие

Спецификации Приложения D могут быть указаны в профилях соответствия (Compliance Profiles) согласно правилам IEC 61499-4.

Таблица D.6 — Функции интероперабельности IEC 61499

Описание
1Тип ФБ READ
2Тип ФБ UREAD
3Тип ФБ WRITE
4Тип ФБ TASK

Приложение E (справочное) — Обмен информацией

E.1 Использование средств прикладного уровня

Подпункт 7.1.3.2 ISO/IEC 7498-1:1994 определяет ряд средств, предоставляемых прикладными сущностями (Application-Entities) для обмена информацией между прикладными процессами (Application-Processes). Для предоставления этих средств прикладные сущности используют прикладные протоколы (Application-Protocols) и услуги представления (Presentation Services).

Коммуникационные ФБ (Communication Function Blocks), определённые в п. E.2, могут использовать эти средства следующим образом:

a) Коммуникационные ФБ используют средства передачи информации (Information Transfer) для синхронизации взаимодействующих приложений (через события REQ, CNF, IND, RSP) и передачи данных (через входы SD и выходы RD).

b) Средства инициализации сервиса используются при событиях INIT и INITO для:

  • идентификации партнёров по коммуникации
  • определения допустимого качества обслуживания
  • соглашения об обработке ошибок
  • аспектов безопасности
  • идентификации абстрактного синтаксиса

c) Средства выбора режима диалога (Mode of Dialog) могут использоваться конкретными типами ФБ.

E.2 Типы коммуникационных функциональных блоков

E.2.1 Общие сведения

В данном разделе определяются обобщённые типы коммуникационных ФБ для однонаправленных (Unidirectional) и двунаправленных (Bidirectional) транзакций. Адаптация этих типов зависит от реализации (Implementation-dependent).

E.2.2 Функциональные блоки для однонаправленных транзакций

Рисунки E.1–E.4 определяют типы и сервисные последовательности ФБ для однонаправленных транзакций через коммуникационное соединение (Communication Connection). Соединение состоит из одного экземпляра типа PUBLISH и одного или нескольких экземпляров типа SUBSCRIBE.

Рисунок E.1 — Спецификации типов для однонаправленных транзакций

Рисунок E.1 — Спецификации типов для однонаправленных транзакций (Type specifications for unidirectional transactions)

примечание

Типы данных и семантика входа PARAMS и выхода STATUS зависят от реализации (Implementation-dependent). Количество (m) и типы принимаемых данных RD_1,...,RD_m соответствуют количеству и типам передаваемых данных SD_1,...,SD_m.

Рисунок E.2 — Установление соединения для однонаправленных транзакций

Рисунок E.2 — Установление соединения для однонаправленных транзакций (Connection establishment for unidirectional transactions)

Рисунок E.3 — Нормальная однонаправленная передача данных

Рисунок E.3 — Нормальная однонаправленная передача данных (Normal unidirectional data transfer)

Рисунок E.4 — Разрыв соединения при однонаправленной передаче данных

Рисунок E.4 — Разрыв соединения при однонаправленной передаче данных (Connection release in unidirectional data transfer)

Показаны четыре варианта разрыва: инициированный издателем (publisher_initiated_disconnect), инициированный подписчиком (subscriber_initiated_disconnect), системный разрыв со стороны издателя и системный разрыв со стороны подписчика.

E.2.3 Функциональные блоки для двунаправленных транзакций

Рисунки E.5–E.8 определяют типы и сервисные последовательности ФБ для двунаправленных транзакций. Соединение состоит из одного экземпляра типа CLIENT и одного экземпляра типа SERVER.

Рисунок E.5 — Спецификации типов для двунаправленных транзакций

Рисунок E.5 — Спецификации типов для двунаправленных транзакций (Type specifications for bidirectional transactions)

Рисунок E.6 — Установление соединения для двунаправленной транзакции

Рисунок E.6 — Установление соединения для двунаправленной транзакции (Connection establishment for bidirectional transaction)

Показаны четыре варианта: нормальное установление (normal_establishment), отказ сервера (server_rejected_establishment), отказ клиента (client_rejected_establishment), удалённый отказ (remote_establishment_rejection).

Рисунок E.7 — Двунаправленная передача данных

Рисунок E.7 — Двунаправленная передача данных (Bidirectional data transfer)

Рисунок E.8 — Разрыв соединения при двунаправленной передаче данных

Рисунок E.8 — Разрыв соединения при двунаправленной передаче данных (Connection release in bidirectional data transfer)

Показаны три варианта: инициированный клиентом (client_initiated_disconnect), инициированный сервером (server_initiated_disconnect) и системный (system_initiated_disconnect).

E.3 Синтаксисы передачи

E.3.1 Предпосылки

Синтаксис передачи (Transfer Syntax) определяется в терминах абстрактного синтаксиса (Abstract Syntax), описывающего типы передаваемых данных, и набора правил кодирования (Encoding Rules) для закодированного представления экземпляров этих типов данных.

Подраздел E.3.2 использует абстрактную синтаксическую нотацию ASN.1 (Abstract Syntax Notation One, ISO/IEC 8824-1) для определения синтаксиса IEC61499-FBDATA.

В Приложении E определены два набора правил кодирования:

a) Подраздел E.3.3.1 определяет правила BASIC кодирования, используя правила из ISO/IEC 8825-1.

b) Подраздел E.3.3.2 определяет правила COMPACT кодирования, оптимизированные для минимизации числа октетов.

E.3.2 Абстрактный синтаксис IEC61499-FBDATA

Синтаксис передачи, полученный применением правил COMPACT-кодирования (E.3.3.2) к абстрактному синтаксису E.3.2, рекомендуется для:

  • передачи значений от входов SD коммуникационного ФБ к выходам RD на противоположном конце коммуникационного соединения;
  • определения соответствия количества и типов переменных SD и RD.

Модуль ASN.1:

IEC61499-FBDATA DEFINITIONS::=

BEGIN

EXPORTS FBDataSequence, FBData, ElementaryData, BOOL, FixedLengthInteger,
FixedLengthReal, TIME, AnyDate, AnyString, FixedLengthBitString,
SignedInteger, UnsignedInteger, REAL, LREAL, DATE, TIME_OF_DAY,
DATE_AND_TIME, STRING, WSTRING, BYTE, WORD, DWORD, LWORD,
DirectlyDerivedData, EnumeratedData, SubrangeData, ARRAY, STRUCT;

FBDataSequence::= [APPLICATION 23] IMPLICIT SEQUENCE OF FBData

FBData::= CHOICE{ElementaryData, DerivedData}

ElementaryData::= CHOICE{
BOOL,
FixedLengthInteger,
FixedLengthReal,
TIME,
AnyDate,
AnyString,
FixedLengthBitString}

FixedLengthInteger::= CHOICE{SignedInteger, UnsignedInteger}

SignedInteger::= CHOICE{SINT, INT, DINT, LINT}

UnsignedInteger::= CHOICE{USINT, UINT, UDINT, ULINT}

FixedLengthReal::= CHOICE{REAL, LREAL}

AnyDate::= CHOICE{DATE, TIME_OF_DAY, DATE_AND_TIME}

AnyString::= CHOICE{STRING, WSTRING}

FixedLengthBitString::= CHOICE{BYTE, WORD, DWORD, LWORD}

BOOL::= CHOICE{BOOL0, BOOL1}

BOOL0::= [APPLICATION 0] IMPLICIT NULL
BOOL1::= [APPLICATION 1] IMPLICIT NULL

SINT::= [APPLICATION 2] IMPLICIT INTEGER(-128..127)
INT::= [APPLICATION 3] IMPLICIT INTEGER(-32768..32767)
DINT::= [APPLICATION 4] IMPLICIT INTEGER(-2147483648..2147483647)
LINT::= [APPLICATION 5]
IMPLICIT INTEGER(-9223372036854775808..9223372036854775807)

USINT::= [APPLICATION 6] IMPLICIT INTEGER(0..255)
UINT::= [APPLICATION 7] IMPLICIT INTEGER(0..65535)
UDINT::= [APPLICATION 8] IMPLICIT INTEGER(0..4294967295)
ULINT::= [APPLICATION 9] IMPLICIT INTEGER(0..18446744073709551615)

REAL::= [APPLICATION 10] IMPLICIT OCTET STRING (SIZE(4))
LREAL::= [APPLICATION 11] IMPLICIT OCTET STRING (SIZE(8))

TIME::= [APPLICATION 12] IMPLICIT LINT -- Duration in 1us units

DATE::= [APPLICATION 13] IMPLICIT ULINT -- See Table E.1
TIME_OF_DAY::= [APPLICATION 14] IMPLICIT ULINT -- See Table E.1
DATE_AND_TIME::= [APPLICATION 15] IMPLICIT ULINT -- See Table E.1

STRING::= [APPLICATION 16] IMPLICIT OCTET STRING -- 1 octet/char
BYTE::= [APPLICATION 17] IMPLICIT BIT STRING (SIZE(8))
WORD::= [APPLICATION 18] IMPLICIT BIT STRING (SIZE(16))
DWORD::= [APPLICATION 19] IMPLICIT BIT STRING (SIZE(32))
LWORD::= [APPLICATION 20] IMPLICIT BIT STRING (SIZE(64))
WSTRING::= [APPLICATION 21] IMPLICIT OCTET STRING -- 2 octets/char

DerivedData::= CHOICE{
DirectlyDerivedData,
EnumeratedData,
SubrangeData,
ARRAY,
STRUCT}

DirectlyDerivedData::= [typeID] IMPLICIT ElementaryData
EnumeratedData::= [typeID] IMPLICIT UINT
SubrangeData::= [typeID] IMPLICIT FixedLengthInteger

ARRAY::= CHOICE {ArrayVariable, TypedArray}
ArrayVariable::= [APPLICATION 22] IMPLICIT FBDataSequence -- same type
TypedArray::= [typeID] IMPLICIT FBDataSequence -- same type

STRUCT::= [typeID] IMPLICIT SEQUENCE -- different types

END

E.3.3 Правила кодирования

E.3.3.1 Кодирование BASIC

Кодирование BASIC является результатом применения базовых правил кодирования (Basic Encoding Rules) ISO/IEC 8825-1 к типам данных, определённым в E.3.2.

E.3.3.2 Кодирование COMPACT

Кодирование COMPACT является результатом модификации правил BASIC-кодирования:

a) «Октеты длины» (Length octets) не включаются в кодирование для типов с фиксированной длиной (Таблица E.1).

b) Длина и кодирование «октетов содержимого» (Contents octets) для типов из Таблицы E.1 определяются по ISO/IEC 8825-1.

c) Кодирование переменных типов TIME, DirectlyDerivedData, EnumeratedData или SubrangeData следует правилам базового типа.

d) «Октеты типа» (Type octets) не включаются для отдельных элементов STRUCT (кроме BOOL).

e) Кодирование STRING и WSTRING — примитивное.

f) Кодирование элементов ARRAY — конструктивное (Constructed), с длиной ARRAY в виде 16-битного беззнакового целого без идентификатора.

Таблица E.1 — COMPACT-кодирование типов данных фиксированной длины

Тип данныхДлина (октетов)Правило кодирования
BOOL0(1) Кодируется одним идентификационным октетом: BOOL0 (FALSE) или BOOL1 (TRUE).
SINT1(2) Знаковое целое кодируется как беззнаковое со сдвигом N - N_min.
INT2(2)
DINT4(2)
LINT8(2)
USINT1(3) Беззнаковое целое — биты пронумерованы, значение = сумма 2^N для установленных бит.
UINT2(3)
UDINT4(3)
ULINT8(3)
REAL4(4) 32-битный одинарной точности по ISO/IEC/IEEE 60559.
LREAL8(4) 64-битный двойной точности по ISO/IEC/IEEE 60559.
DATE8(5) Значение ULINT: мс с 1970-01-01.
TIME8(7) Как LINT, в единицах 1 мкс.
TIME_OF_DAY12(5) Значение ULINT: мс с полуночи.
DATE_AND_TIME20(5) Значение ULINT: мс от 1970-01-01-00:00:00.000 до текущей даты.
BYTE1(6) Битовая строка — примитивное кодирование.
WORD2(6)
DWORD4(6)
LWORD8(6)

Приложение F (нормативное) — Текстовые спецификации

Приложение F содержит текстовые спецификации в синтаксисе Приложения B для всех типов функциональных блоков и адаптерных типов, представленных в данном стандарте. Содержимое Приложения F является нормативным в той мере, в какой это определено в описании каждого соответствующего типа ФБ или адаптерного типа.

примечание

Спецификации упорядочены по алфавиту имени типа.

E_CTU — Событийный счётчик вверх

FUNCTION_BLOCK E_CTU (* Event-Driven Up Counter *)
EVENT_INPUT
CU WITH PV; (* Count Up *)
R; (* Reset *)
END_EVENT
EVENT_OUTPUT
CUO WITH Q,CV; (* Count Up Output Event *)
RO WITH Q,CV; (* Reset Output Event *)
END_EVENT
VAR_INPUT
PV: UINT; (* Preset Value *)
END_VAR
VAR_OUTPUT
Q: BOOL; (* CV>=PV *)
CV: UINT;
END_VAR
EC_STATES
START;
CU: CU -> CUO;
R: R -> RO;
END_STATES
EC_TRANSITIONS
START TO CU:= CU [CV<65535];
CU TO START:= 1;
START TO R:= R;
R TO START:= 1;
END_TRANSITIONS
ALGORITHM CU IN ST: (* Count Up *)
CV:= CV + 1;
Q:= (CV >= PV);
END_ALGORITHM
ALGORITHM R IN ST: (* Reset *)
CV:= 0;
Q:= FALSE;
END_ALGORITHM
END_FUNCTION_BLOCK

E_CYCLE — Периодическая генерация события

FUNCTION_BLOCK E_CYCLE (* Periodic (cyclic) Generation of an Event *)
EVENT_INPUT
START WITH DT;
STOP;
END_EVENT
EVENT_OUTPUT
EO; (* Periodic event at period DT, starting at DT after GO *)
END_EVENT
VAR_INPUT
DT: TIME; (* Period between events *)
END_VAR
FBS
DLY: E_DELAY;
END_FBS
EVENT_CONNECTIONS
START TO DLY.START;
STOP TO DLY.STOP;
DLY.EO TO DLY.START;
DLY.EO TO EO;
END_CONNECTIONS
DATA_CONNECTIONS
DT TO DLY.DT;
END_CONNECTIONS
END_FUNCTION_BLOCK

E_D_FF — D-триггер

FUNCTION_BLOCK E_D_FF (* Event-driven Data(D)Latch *)
EVENT_INPUT
CLK WITH D; (* Data Clock *)
END_EVENT
EVENT_OUTPUT
EO WITH Q; (* Output Event when Q output changes *)
END_EVENT
VAR_INPUT
D: BOOL; (* Data Input *)
END_VAR
VAR_OUTPUT
Q: BOOL; (* Latched Data *)
END_VAR
EC_STATES
Q0; (* Q is FALSE initially *)
RESET: LATCH -> EO; (* Reset Q and issue EO *)
SET: LATCH -> EO; (* Latch and issue EO *)
END_STATES
EC_TRANSITIONS
Q0 TO SET:= CLK [D];
SET TO RESET:= CLK [NOT D];
RESET TO SET:= CLK [D];
END_TRANSITIONS
ALGORITHM LATCH IN ST:
Q:=D;
END_ALGORITHM
END_FUNCTION_BLOCK

E_DELAY — Задержка распространения события

FUNCTION_BLOCK E_DELAY
(* Delayed propagation of an event - Cancellable *)
EVENT_INPUT
START WITH DT; (* Begin Delay *)
STOP; (* Cancel Delay *)
END_EVENT
EVENT_OUTPUT
EO; (* Delayed Event *)
END_EVENT
VAR_INPUT
DT: TIME; (* Delay Time *)
END_VAR
SERVICE E_DELAY/RESOURCE
SEQUENCE event_delay
E_DELAY.START(DT) ->E_DELAY.EO();
END_SEQUENCE
SEQUENCE delay_canceled
E_DELAY.START(DT);
E_DELAY.STOP();
END_SEQUENCE
SEQUENCE no_multiple_delay
E_DELAY.START(DT);
E_DELAY.START(DT);
->E_DELAY.EO();
END_SEQUENCE
END_SERVICE
END_FUNCTION_BLOCK

E_DEMUX — Демультиплексор событий

FUNCTION_BLOCK E_DEMUX (* Event demultiplexer *)
EVENT_INPUT
EI WITH K; (* Event to demultiplex *)
END_EVENT
EVENT_OUTPUT
EO0;
EO1;
EO2;
EO3; (* Number of outputs is implementation dependent *)
END_EVENT
VAR_INPUT
K: UINT; (* Event index, maximum is implementation dependent *)
END_VAR
EC_STATES
START; (* Initial State *)
TRIGGERED; (* Intermediate state after EI arrives *)
EO0: -> EO0;
EO1: -> EO1;
EO2: -> EO2;
EO3: -> EO3;
END_STATES
EC_TRANSITIONS
START TO TRIGGERED:= EI;
TRIGGERED TO EO0:= [K=0];
TRIGGERED TO EO1:= [K=1];
TRIGGERED TO EO2:= [K=2];
TRIGGERED TO EO3:= [K=3];
TRIGGERED TO START:= [K>3];
EO0 TO START:= 1;
EO1 TO START:= 1;
EO2 TO START:= 1;
EO3 TO START:= 1;
END_TRANSITIONS
END_FUNCTION_BLOCK

E_F_TRIG — Детектор заднего фронта булевой переменной

FUNCTION_BLOCK E_F_TRIG (* Boolean falling edge detection *)
EVENT_INPUT
EI WITH QI; (* Event Input *)
END_EVENT
EVENT_OUTPUT
EO; (* Event Output *)
END_EVENT
VAR_INPUT
QI: BOOL; (* Boolean input for falling edge detection *)
END_VAR
FBS
D: E_D_FF;
SW: E_SWITCH;
END_FBS
EVENT_CONNECTIONS
EI TO D.CLK;
D.EO TO SW.EI;
SW.EO0 TO EO;
END_CONNECTIONS
DATA_CONNECTIONS
QI TO D.D;
D.Q TO SW.G;
END_CONNECTIONS
END_FUNCTION_BLOCK

E_MERGE — Слияние событий

FUNCTION_BLOCK E_MERGE (* Merge (OR) of multiple events *)
EVENT_INPUT
EI1; (* First input event *)
EI2; (* Second input event *)
END_EVENT
EVENT_OUTPUT EO; (* Output Event *)
END_EVENT
EC_STATES
START; (* Initial State *)
EO: (* Issue EO Event *)
->EO;
END_STATES
EC_TRANSITIONS
START TO EO:= EI1;
START TO EO:= EI2;
EO TO START:= 1;
END_TRANSITIONS
END_FUNCTION_BLOCK

E_N_TABLE — Генерация конечной последовательности раздельных событий по таблице

FUNCTION_BLOCK E_N_TABLE (* Generation of a finite train of separate events,
table driven *)
EVENT_INPUT
START WITH DT, N;
STOP;
END_EVENT
EVENT_OUTPUT
EO0; (* N events at periods DT, starting at DT[0] after START *)
EO1;
EO2;
EO3; (* Extensible *)
END_EVENT
VAR_INPUT
DT: TIME[3]; (* Periods between events *)
N: UINT; (* Number of events to generate (=3 in this example) *)
END_VAR
SERVICE E_N_TABLE/RESOURCE
SEQUENCE typical_operation
E_N_TABLE.START(DT,N) -> E_N_TABLE.EO0() -> E_N_TABLE.EO1() ->
E_N_TABLE.EO2() -> E_N_TABLE.EO3();
END_SEQUENCE
END_SERVICE
END_FUNCTION_BLOCK

E_PERMIT — Разрешающее распространение события

FUNCTION_BLOCK E_PERMIT (* Permissive propagation of an event *)
EVENT_INPUT EI WITH PERMIT; (* Event input *)
END_EVENT
EVENT_OUTPUT EO; (* Event output *)
END_EVENT
VAR_INPUT PERMIT: BOOL; END_VAR
EC_STATES
START; (* Initial State *)
EO: (* Issue EO Event *)
->EO;
END_STATES
EC_TRANSITIONS
START TO EO:= EI [PERMIT];
EO TO START:= 1;
END_TRANSITIONS
END_FUNCTION_BLOCK

E_R_TRIG — Детектор переднего фронта булевой переменной

FUNCTION_BLOCK E_R_TRIG (* Boolean rising edge detection *)
EVENT_INPUT
EI WITH QI; (* Event Input *)
END_EVENT
EVENT_OUTPUT
EO; (* Event Output *)
END_EVENT
VAR_INPUT
QI: BOOL; (* Boolean input for rising edge detection *)
END_VAR
FBS
D: E_D_FF;
SW: E_SWITCH;
END_FBS
EVENT_CONNECTIONS
EI TO D.CLK;
D.EO TO SW.EI;
SW.EO1 TO EO;
END_CONNECTIONS
DATA_CONNECTIONS
QI TO D.D;
D.Q TO SW.G;
END_CONNECTIONS
END_FUNCTION_BLOCK

E_REND — Рандеву двух событий

FUNCTION_BLOCK E_REND (* Rendezvous of two events *)
EVENT_INPUT
EI1; (* First Event Input *)
EI2; (* Second Event Input *)
R; (* Reset Event *)
END_EVENT
EVENT_OUTPUT
EO; (* Rendezvous Output Event *)
END_EVENT
EC_STATES
START; (* Initial State *)
EI1; (* EI1 has arrived, wait for EI2 or R *)
EO: (* Issue rendezvous event *)
->EO;
EI2; (* EI2 has arrived, wait for EI1 or R *)
END_STATES
EC_TRANSITIONS
START TO EI1:= EI1;
EI1 TO START:= R;
START TO EI2:= EI2;
EI2 TO START:= R;
EI1 TO EO:= EI2;
EI2 TO EO:= EI1;
EO TO START:= 1;
END_TRANSITIONS
END_FUNCTION_BLOCK

E_RESTART — Генерация событий перезапуска

FUNCTION_BLOCK E_RESTART (* Generation of Restart Events *)
EVENT_OUTPUT
COLD; (* Cold Restart *)
WARM; (* Warm Restart *)
END_EVENT
SERVICE RESOURCE/E_RESTART
SEQUENCE cold_restart ->E_RESTART.COLD(); END_SEQUENCE
SEQUENCE warm_restart ->E_RESTART.WARM(); END_SEQUENCE
END_SERVICE
END_FUNCTION_BLOCK

E_RS — Бистабильный элемент (приоритет сброса)

FUNCTION_BLOCK E_RS (* Event-driven bistable *)
EVENT_INPUT
S; (* Set Event *)
R; (* Reset Event *)
END_EVENT
EVENT_OUTPUT
EO WITH Q; (* Output Event *)
END_EVENT
VAR_OUTPUT
Q: BOOL; (* Current Output State *)
END_VAR
EC_STATES
Q0; (* Q is FALSE initially *)
RESET: RESET -> EO; (* Reset Q and issue EO *)
SET: SET -> EO; (* Set Q and issue EO *)
END_STATES
EC_TRANSITIONS
Q0 TO SET:= S;
SET TO RESET:= R;
RESET TO SET:= S;
END_TRANSITIONS
ALGORITHM SET IN ST: (* Set Q *)
Q:=TRUE;
END_ALGORITHM
ALGORITHM RESET IN ST: (* Reset Q *)
Q:=FALSE;
END_ALGORITHM
END_FUNCTION_BLOCK

E_SR — Бистабильный элемент (приоритет установки)

Реализация E_SR идентична E_RS. Оба типа E_SR и E_RS реализованы для совместимости с типами SR и RS стандарта IEC 61131-3, хотя в событийно-управляемой модели нет «доминирования» входов R и S, поскольку они управляются событиями, а не уровнями сигнала.

FUNCTION_BLOCK E_SR (* Event-driven bistable *)
EVENT_INPUT
S; (* Set Event *)
R; (* Reset Event *)
END_EVENT
EVENT_OUTPUT
EO WITH Q; (* Output Event *)
END_EVENT
VAR_OUTPUT
Q: BOOL; (* Current Output State *)
END_VAR
EC_STATES
Q0; (* Q is FALSE initially *)
RESET: RESET -> EO; (* Reset Q and issue EO *)
SET: SET -> EO; (* Set Q and issue EO *)
END_STATES
EC_TRANSITIONS
Q0 TO SET:= S;
SET TO RESET:= R;
RESET TO SET:= S;
END_TRANSITIONS
ALGORITHM SET IN ST: (* Set Q *)
Q:=TRUE;
END_ALGORITHM
ALGORITHM RESET IN ST: (* Reset Q *)
Q:=FALSE;
END_ALGORITHM
END_FUNCTION_BLOCK

E_SELECT — Выбор между двумя событиями

FUNCTION_BLOCK E_SELECT (* Selection between two events *)
EVENT_INPUT
EI0 WITH G; (* Input event, selected when G=0 *)
EI1 WITH G; (* Input event, selected when G=1 *)
END_EVENT
EVENT_OUTPUT EO; (* Output Event *)
END_EVENT
VAR_INPUT G: BOOL; (* Select EI0 when G=0, EI1 when G=1 *)
END_VAR
EC_STATES
START; (* Initial State *)
EO: -> EO; (* Issue Output Event *)
END_STATES
EC_TRANSITIONS
START TO EO:= EI0 [NOT G];
START TO EO:= EI1 [G];
EO TO START:= 1;
END_TRANSITIONS
END_FUNCTION_BLOCK

E_SPLIT — Разделение события

FUNCTION_BLOCK E_SPLIT (* Split an event *)
EVENT_INPUT
EI; (* Input event *)
END_EVENT
EVENT_OUTPUT
EO1; (* First output event *)
EO2; (* Second output event, etc. *)
END_EVENT
EC_STATES
START; (* Initial State *)
EO: (* Extensible *)
->EO1, (* Output first event *)
->EO2; (* Output second event, etc. *)
END_STATES
EC_TRANSITIONS
START TO EO:= EI;
EO TO START:= 1;
END_TRANSITIONS
END_FUNCTION_BLOCK

E_SWITCH — Коммутация события

FUNCTION_BLOCK E_SWITCH (* Switch (demultiplex) an event *)
EVENT_INPUT EI WITH G; (* Event Input *)
END_EVENT
EVENT_OUTPUT
EO0; (* Output, switched from EI when G=0 *)
EO1; (* Output, switched from EI when G=1 *)
END_EVENT
VAR_INPUT G: BOOL; (* Switch EI to EI0 when G=0, to EI1 when G=1 *)
END_VAR
EC_STATES
START; (* Initial State *)
G0: (* Issue EO0 when EI arrives with G=0 *)
->EO0;
G1: (* Issue EO1 when EI arrives with G=1 *)
->EO1;
END_STATES
EC_TRANSITIONS
START TO G0:= EI [NOT G];
G0 TO START:= 1;
START TO G1:= EI [G];
G1 TO START:= 1;
END_TRANSITIONS
END_FUNCTION_BLOCK

E_TRAIN — Генерация конечной последовательности событий

FUNCTION_BLOCK E_TRAIN (* Generation of a finite train of events *)
EVENT_INPUT
START WITH DT, N;
STOP;
END_EVENT
EVENT_OUTPUT
EO WITH CV; (* N events at period DT, starting at DT after START *)
END_EVENT
VAR_INPUT
DT: TIME; (* Period between events *)
N: UINT; (* Number of events to generate *)
END_VAR
VAR_OUTPUT
CV: UINT; (* EO index (0..N-1) *)
END_VAR
FBS
CTR: E_CTU;
GATE: E_SWITCH;
DLY: E_DELAY;
END_FBS
EVENT_CONNECTIONS
START TO CTR.R;
STOP TO DLY.STOP;
DLY.EO TO EO;
DLY.EO TO CTR.CU;
CTR.CUO TO GATE.EI;
CTR.RO TO GATE.EI;
GATE.EO0 TO DLY.START;
END_CONNECTIONS
DATA_CONNECTIONS
DT TO DLY.DT;
N TO CTR.PV;
CTR.Q TO GATE.G;
CTR.CV TO CV;
END_CONNECTIONS
END_FUNCTION_BLOCK

E_TABLE — Генерация конечной последовательности с переменными интервалами

FUNCTION_BLOCK E_TABLE (* Generation of a finite train of events,
table driven *)
EVENT_INPUT
START WITH DT, N;
STOP; (* Cancel *)
END_EVENT
EVENT_OUTPUT
EO WITH CV; (* N events at periods DT, starting at DT[0] after START *)
END_EVENT
VAR_INPUT
DT: TIME[4]; (* Periods between events *)
N: UINT; (* Number of events to generate *)
END_VAR
VAR_OUTPUT
CV: UINT; (* Current event index, 0..N-1 *)
END_VAR
FBS
CTRL: E_TABLE_CTRL;
DLY: E_DELAY;
END_FBS
EVENT_CONNECTIONS
START TO CTRL.INIT;
CTRL.CLKO TO DLY.START;
DLY.EO TO EO;
DLY.EO TO CTRL.CLK;
STOP TO DLY.STOP;
END_CONNECTIONS
DATA_CONNECTIONS
DT TO CTRL.DT;
N TO CTRL.N;
CTRL.DTO TO DLY.DT;
CTRL.CV TO CV;
END_CONNECTIONS
END_FUNCTION_BLOCK

E_TABLE_CTRL — Контроллер для E_TABLE

FUNCTION_BLOCK E_TABLE_CTRL (* Control for E_TABLE *)
EVENT_INPUT
INIT WITH DT, N;
CLK;
END_EVENT
EVENT_OUTPUT
CLKO WITH DTO, CV;
END_EVENT
VAR_INPUT
DT: TIME[4]; (* Array length is implementation dependent *)
N: UINT; (* Actual number of time steps *)
END_VAR
VAR_OUTPUT
DTO: TIME; (* Current delay interval *)
CV: UINT; (* Current event index, 0..N-1 *)
END_VAR
EC_STATES
START;
INIT0: INIT;
INIT1: -> CLKO;
STEP: STEP -> CLKO;
END_STATES
EC_TRANSITIONS
START TO INIT0:= INIT;
INIT0 TO INIT1:= [N>0];
INIT0 TO START:= [N=0]; (* Don't run if N=0 *)
INIT1 TO START:= 1;
START TO STEP:= CLK [CV < MIN(3,N-1)];
STEP TO START:= 1;
END_TRANSITIONS
ALGORITHM STEP IN ST:
CV:= CV+1;
DTO:= DT[CV];
END_ALGORITHM
ALGORITHM INIT IN ST:
CV:= 0;
DTO:= DT[0];
END_ALGORITHM
END_FUNCTION_BLOCK

FB_ADD_INT — Сложение INT (пример «простого» ФБ)

Пример преобразования функции IEC 61131-3 ADD_INT в «простой» тип ФБ IEC 61499 (см. Приложение D, раздел D.2).

FUNCTION_BLOCK FB_ADD_INT (* INT Addition *)
EVENT_INPUT
REQ WITH QI, IN1, IN2;
END_EVENT
EVENT_OUTPUT
CNF WITH QO, STATUS, OUT;
END_EVENT
VAR_INPUT
QI: BOOL; (* Event Qualifier *)
IN1: INT; (* Augend *)
IN2: INT; (* Addend *)
END_VAR
VAR_OUTPUT
QO: BOOL; (* Output Qualifier *)
STATUS: UINT; (* Operation Status *)
OUT: INT; (* Sum *)
END_VAR
VAR
RESULT: DINT;
END_VAR
EC_STATES
START;
REQ: REQ -> CNF;
END_STATES
EC_TRANSITIONS
START TO REQ:= REQ;
REQ TO START:= 1;
END_TRANSITIONS
ALGORITHM REQ IN ST:
QO:= QI;
IF QI THEN
STATUS:= 0;
RESULT:= INT_TO_DINT(IN1) + INT_TO_DINT(IN2);
IF (RESULT > 32767) OR (RESULT < -32768) THEN
QO = FALSE;
STATUS = 3;
IF (RESULT > 32767) THEN OUT:= 32767;
ELSE OUT:= -32768;
END_IF;
ELSE OUT:= RESULT;
END_IF;
ELSE STATUS = 1;
END_IF;
END_ALGORITHM
END_FUNCTION_BLOCK

INTEGRAL_REAL — Интегратор вещественных чисел

Базовый ФБ, реализующий численное интегрирование входного сигнала XIN с периодом дискретизации CYCLE. Вход HOLD позволяет приостановить интегрирование.

FUNCTION_BLOCK INTEGRAL_REAL
EVENT_INPUT
INIT: INIT_EVENT WITH CYCLE;
EX WITH HOLD, XIN;
END_EVENT
EVENT_OUTPUT
INITO: INIT_EVENT WITH XOUT;
EXO WITH XOUT;
END_EVENT
VAR_INPUT
HOLD: BOOL; (* 0 = Run, 1 = Hold *)
XIN: REAL; (* Integrand *)
CYCLE: TIME; (* Sampling period *)
END_VAR
VAR_OUTPUT
XOUT: REAL; (* Integrated output *)
END_VAR
VAR DT: REAL; END_VAR
EC_STATES
START; (* EC Initial state *)
INIT:INIT -> INITO; (* EC State with Algorithm and EC Action *)
MAIN: MAIN -> EXO;
END_STATES
EC_TRANSITIONS
START TO INIT:= INIT; (* An EC Transition *)
START TO MAIN:= EX;
INIT TO START:= 1;
MAIN TO START:= 1;
END_TRANSITIONS
ALGORITHM INIT IN ST:
XOUT:= 0.0;
DT:= TIME_TO_REAL(CYCLE);
END_ALGORITHM
ALGORITHM MAIN IN ST:
IF NOT HOLD THEN
XOUT:= XOUT + XIN * DT;
END_IF;
END_ALGORITHM
END_FUNCTION_BLOCK

PI_REAL — Пропорционально-интегральный регулятор

Составной ФБ, реализующий ПИ-регулятор на основе компонентных ФБ PID_CALC и INTEGRAL_REAL.

FUNCTION_BLOCK PI_REAL
EVENT_INPUT
INIT WITH KP, KI, CYCLE;
EX WITH HOLD, PV, SP, KP, KI, CYCLE;
END_EVENT
EVENT_OUTPUT
INITO WITH XOUT;
EXO WITH XOUT;
END_EVENT
VAR_INPUT
HOLD: BOOL; (* Hold when TRUE *)
PV: REAL; (* Process variable *)
SP: REAL; (* Set point *)
KP: REAL; (* Proportionality constant *)
KI: REAL; (* Integral constant,1/s *)
CYCLE: TIME; (* Sampling period *)
END_VAR
VAR_OUTPUT
XOUT: REAL;
END_VAR
FBS
CALC: PID_CALC;
INTEGRAL_TERM: INTEGRAL_REAL;
END_FBS
EVENT_CONNECTIONS
INIT TO CALC.INIT;
EX TO CALC.PRE;
CALC.POSTO TO EXO;
INTEGRAL_TERM.INITO TO INITO;
CALC.INITO TO INTEGRAL_TERM.INIT;
CALC.PREO TO INTEGRAL_TERM.EX;
INTEGRAL_TERM.EXO TO CALC.POST;
END_CONNECTIONS
DATA_CONNECTIONS
HOLD TO INTEGRAL_TERM.HOLD;
PV TO CALC.PV;
SP TO CALC.SP;
KP TO CALC.KP;
KI TO CALC.KI;
CYCLE TO INTEGRAL_TERM.CYCLE;
CALC.XOUT TO XOUT;
CALC.ETERM TO INTEGRAL_TERM.XIN;
INTEGRAL_TERM.XOUT TO CALC.ITERM;
0 TO CALC.TD;
0 TO CALC.DTERM;
END_CONNECTIONS
END_FUNCTION_BLOCK

PI_REAL_APPL — Подприложение ПИ-регулятора

Пример подприложения (Subapplication), реализующего ПИ-регулятор с использованием компонентных ФБ FB_SUB_REAL, ACCUM_REAL и PI_CALC.

SUBAPPLICATION PI_REAL_APPL (* A Subapplication *)
EVENT_INPUT
INIT;
EX;
END_EVENT
EVENT_OUTPUT
INITO;
EXO;
END_EVENT
VAR_INPUT
HOLD: BOOL; (* Hold when TRUE *)
PV: REAL; (* Process variable *)
SP: REAL; (* Set point *)
KP: REAL; (* Proportional gain *)
KI: REAL; (* Integral gain = Sample period/Reset time *)
X0: REAL; (* Initial integrator output *)
END_VAR
VAR_OUTPUT XOUT: REAL; END_VAR
FBS
ETERM: FB_SUB_REAL;
INTEGRATOR: ACCUM_REAL;
CALC: PI_CALC;
END_FBS
EVENT_CONNECTIONS
INIT TO INTEGRATOR.INIT;
INTEGRATOR.INITO TO INITO;
EX TO ETERM.REQ;
ETERM.CNF TO INTEGRATOR.EX;
INTEGRATOR.EXO TO CALC.EX;
CALC.EXO TO EXO;
END_CONNECTIONS
DATA_CONNECTIONS
X0 TO INTEGRATOR.X0;
HOLD TO INTEGRATOR.HOLD;
PV TO ETERM.IN1;
SP TO ETERM.IN2;
KP TO CALC.KP;
KI TO CALC.KI;
ETERM.OUT TO INTEGRATOR.XIN;
ETERM.OUT TO CALC.ETERM;
INTEGRATOR.XOUT TO CALC.ITERM;
CALC.XOUT TO XOUT;
1 TO ETERM.QI;
END_CONNECTIONS
END_SUBAPPLICATION

MANAGER — Интерфейс сервисов управления

FUNCTION_BLOCK MANAGER (* Management Service Interface *)
EVENT_INPUT
INIT WITH QI, PARAMS; (* Service Initialization *)
REQ WITH QI, CMD, OBJECT; (* Service Request *)
END_EVENT
EVENT_OUTPUT
INITO WITH QO, STATUS; (* Initialization Confirm *)
CNF WITH QO, STATUS, RESULT; (* Service Confirmation *)
END_EVENT
VAR_INPUT
QI: BOOL; (* Event Input Qualifier *)
PARAMS: WSTRING; (* Service Parameters *)
CMD: UINT; (* Enumerated Command *)
OBJECT: BYTE[512]; (* Command Object *)
END_VAR
VAR_OUTPUT
QO: BOOL; (* Event Output Qualifier *)
STATUS: UINT; (* Service Status *)
RESULT: BYTE[512]; (* Result Object *)
END_VAR
SERVICE MANAGER/resource
SEQUENCE normal_establishment
MANAGER.INIT+(PARAMS) -> resource.initManagement() -> MANAGER.INITO+();
END_SEQUENCE
SEQUENCE unsuccessful_establishment
MANAGER.INIT+(PARAMS) -> resource.initManagement(PARAMS) -> MANAGER.INITO-(STATUS);
END_SEQUENCE
SEQUENCE normal_command_sequence
MANAGER.REQ+(CMD,OBJECT) -> resource.performCommand(CMD,OBJECT) ->
MANAGER.CNF+(STATUS,RESULT);
END_SEQUENCE
SEQUENCE command_error
MANAGER.REQ+(CMD,OBJECT) -> resource.performCommand(CMD,OBJECT) ->
MANAGER.IND-(STATUS);
END_SEQUENCE
SEQUENCE application_initiated_termination
MANAGER.INIT-() -> resource.terminateService() -> MANAGER.INITO-(STATUS);
END_SEQUENCE
SEQUENCE resource_initiated_termination
resource.serviceTerminated(STATUS) -> MANAGER.INITO-(STATUS);
END_SEQUENCE
END_SERVICE
END_FUNCTION_BLOCK

LD_UNLD — Адаптерный тип LOAD/UNLOAD

ADAPTER LD_UNLD (* LOAD/UNLOAD Adapter Interface *)
EVENT_INPUT
UNLD; (* UNLOAD Request *)
END_EVENT
EVENT_OUTPUT
LD WITH WO,WKPC; (* LOAD Request *)
CNF WITH WO,WKPC; (* UNLD Confirm *)
END_EVENT
VAR_OUTPUT
WO: BOOL; (* Workpiece present *)
WKPC: COLOR; (* Workpiece Color *)
END_VAR
SERVICE PLUG/SOCKET
SEQUENCE normal_operation
PLUG.LD(WO,WKPC) -> SOCKET.LD(WO,WKPC);
SOCKET.UNLD() -> PLUG.UNLD();
PLUG.CNF() -> SOCKET.CNF();
END_SEQUENCE
END_SERVICE
END_ADAPTER

REQUESTER — Интерфейс запросчика сервиса

ФБ сервисного интерфейса для запроса сервисов от ресурса. Обеспечивает инициализацию соединения, передачу данных и обработку ошибок.

FUNCTION_BLOCK REQUESTER
(* Service Requester Interface *)
EVENT_INPUT
INIT WITH QI, PARAMS; (* Service Initialization *)
REQ WITH QI, SD_1, SD_m; (* Service Request *)
END_EVENT
EVENT_OUTPUT
INITO WITH QO, STATUS; (* Initialization Confirm *)
CNF WITH QO, STATUS, RD_1, RD_n; (* Service Confirmation *)
END_EVENT
VAR_INPUT
QI: BOOL; (* Event Input Qualifier *)
PARAMS: ANY; (* Service Parameters *)
SD_1: ANY; (* Data to transfer, extensible *)
SD_m: ANY; (* Last data item to transfer *)
END_VAR
VAR_OUTPUT
QO: BOOL; (* Event Output Qualifier *)
STATUS: ANY; (* Service Status *)
RD_1: ANY; (* Received data, extensible *)
RD_n: ANY; (* Last received data item *)
END_VAR
SERVICE REQUESTER/RESOURCE
SEQUENCE normal_establishment
REQUESTER.INIT+(PARAMS) -> REQUESTER.INITO+();
END_SEQUENCE
SEQUENCE unsuccessful_establishment
REQUESTER.INIT+(PARAMS) -> REQUESTER.INITO-(STATUS);
END_SEQUENCE
SEQUENCE normal_data_transfer
REQUESTER.REQ+(SD_1,...,SD_m) -> REQUESTER.CNF+(RD_1,...,RD_n);
END_SEQUENCE
SEQUENCE data_transfer_error
REQUESTER.REQ+(SD_1,...,SD_m) -> REQUESTER.CNF-(STATUS);
END_SEQUENCE
SEQUENCE application_initiated_termination
REQUESTER.INIT-() -> REQUESTER.INITO-(STATUS);
END_SEQUENCE
SEQUENCE resource_initiated_termination
-> REQUESTER.INITO-(STATUS);
END_SEQUENCE
END_SERVICE
END_FUNCTION_BLOCK

XBAR_MVCA — Конвейер с адаптерами

Составной ФБ, моделирующий конвейер (cross-bar) с адаптерными интерфейсами LD_UNLD для загрузки и выгрузки деталей. Демонстрирует использование адаптерных соединений (sockets и plugs).

FUNCTION_BLOCK XBAR_MVCA (* XBAR_MVC + Adapters *)
EVENT_INPUT
INIT WITH VF,VR,DTL,DT,BKGD,LEN,DIA,DIR; (* Initialize *)
END_EVENT
EVENT_OUTPUT
INITO;
END_EVENT
VAR_INPUT
VF: INT:= 20; (* ADVANCE speed in +%/s *)
VR: INT:= -40; (* RETRACT speed in -%/s *)
DTL: TIME:= t#750ms; (* LOAD Delay *)
DT: TIME:= t#250ms; (* Simulation Interval *)
BKGD: COLOR:= COLOR#blue; (* Transfer Bar Color *)
LEN: UINT:= 5; (* Bar Length in Diameters *)
DIA: UINT:= 20; (* Workpiece diameter *)
DIR: UINT; (* Orientation: 0=L/R, 1=T/B, 2=R/L, 3=B/T *)
END_VAR
SOCKETS
LDU_SKT: LD_UNLD;
END_SOCKETS
PLUGS
LDU_PLG: LD_UNLD;
END_PLUGS
FBS
MVC: XBAR_MVC;
END_FBS
EVENT_CONNECTIONS
INIT TO MVC.INIT;
MVC.INITO TO INITO;
MVC.LOADED TO LDU_SKT.UNLD;
LDU_SKT.LD TO MVC.LOAD;
MVC.ADVANCED TO LDU_PLG.LD;
LDU_PLG.UNLD TO MVC.UNLOAD;
MVC.UNLOADED TO LDU_PLG.CNF;
END_CONNECTIONS
DATA_CONNECTIONS
LDU_SKT.WO TO MVC.WI;
LDU_SKT.WKPC TO MVC.LDCOL;
MVC.WO TO LDU_PLG.WO;
MVC.WKPC TO LDU_PLG.WKPC;
VF TO MVC.VF;
VR TO MVC.VR;
DTL TO MVC.DTL;
DT TO MVC.DT;
BKGD TO MVC.BKGD;
LEN TO MVC.LEN;
DIA TO MVC.DIA;
DIR TO MVC.DIR;
END_CONNECTIONS
END_FUNCTION_BLOCK

Приложение G (справочное) — Атрибуты

G.1 Общие принципы

Атрибуты (Attributes) могут быть связаны с типами данных (Data Types), переменными (Variables), приложениями (Applications), а также с типами (Types) и экземплярами (Instances) функциональных блоков (Function Blocks), устройств (Devices), ресурсов (Resources) и их компонентами. Атрибуты имеют значения, которые могут изменяться и быть доступны в различных точках жизненного цикла типа или экземпляра ФБ.

Помимо описания алгоритмов (Algorithms) ФБ, дополнительная информация, необходимая для поддержки использования ФБ в течение его жизненного цикла, может предоставляться путём присоединения атрибутов к компонентам типов или экземпляров ФБ.

Атрибуты могут применяться к элементам, таким как типы данных, переменные и параметры, используемым в спецификации типов или экземпляров ФБ. Графические элементы языка могут требовать дополнительных атрибутов для хранения информации о положении, цвете, размере и т.д.

Атрибуты могут также применяться непосредственно к типам и экземплярам ФБ, например, для хранения версии спецификации типа ФБ.

Некоторые атрибуты могут использоваться на протяжении всего жизненного цикла ФБ. Другие атрибуты могут существовать только на определённых этапах жизненного цикла.

Определённые атрибуты ФБ могут быть установлены в связанных ресурсах и быть доступны в течение жизни распределённого приложения. Такие атрибуты обычно используются для обеспечения доступа к значениям параметров ФБ со стороны внешних устройств, например, для ограничения значений параметров заранее определёнными безопасными пределами.

G.2 Определения атрибутов

Определение атрибута (Attribute Definition) предоставляет информацию, указанную в Таблице G.1.

Таблица G.1 — Элементы определения атрибутов

ЭлементПример
Имя (Name)DESCRIPTION
Тип данных (Data type)WSTRING(30)
Значение по умолчанию (Default value)""
Связанный элемент (Associated element)Типы ФБ / Экземпляры ФБ
Использование (Usage)Конфигурация / Время выполнения

Каждый атрибут имеет имя и тип данных ассоциированного значения. Атрибут может иметь значение по умолчанию, которое будет использоваться до присвоения значения на определённом этапе жизненного цикла.

Атрибуты сами могут требовать дополнительной информации — так называемые податрибуты (Sub-attributes).

G.3 Примеры

Пример атрибута типа данных (Data Type Attribute):

  • Max_System_Value — определяет максимальное поддерживаемое значение числового типа данных. Применяется к обобщённому типу ANY_NUM, так что все числовые типы, такие как INT и REAL, наследуют этот атрибут. Стандартные значения для некоторых типов данных приведены в Таблице E.1.

Примеры атрибутов переменных (Variable Attributes):

  • Diagnostic_Access — определяет, доступно ли значение переменной системе диагностики времени выполнения.
  • Write_Access — определяет уровень доступа для изменения значения переменной, например: 'Operator', 'System', 'Diagnostics'.
  • Units — единицы измерения, применимые к переменной, например: 'l', 'm/s', 'cm'.
  • Usage — многострочное текстовое описание использования переменной.

Примеры атрибутов типов ФБ (Function Block Type Attributes):

  • Usage_Class — описывает общее назначение ФБ, например: 'Input', 'Output', 'Control'.
  • Version — номер версии определения типа ФБ, например: '1.2'.
  • Help — многострочное текстовое описание, доступное в различных точках жизненного цикла.

Атрибуты, связанные с планированием алгоритмов (Scheduling Attributes):

  • ExecutionTime — атрибут типа TIME, определяющий наихудшее время выполнения конкретного алгоритма конкретного типа ФБ в конкретном типе ресурса.
  • Priority — атрибут, связанный с событийным соединением (Event Connection) внутри ресурса. Может наследоваться от типа ресурса. Используется ресурсом с вытесняющей многозадачностью (Pre-emptive Multitasking) для определения приоритета выполнения алгоритма.

G.4 Источники атрибутов

Атрибуты могут происходить из следующих основных источников:

  • Неявные (Implicit) — такие как имена типов ФБ, имена экземпляров, имена переменных и их типы данных; определяются как часть обычного процесса объявления.
  • Стандартные (Standard) — требуемые стандартом: версии типов ФБ, максимальные диапазоны параметров, описания параметров и т.д.
  • Специфичные для продукта (Product-specific) — предоставленные системным вендором: коды продуктов типов ФБ, аппаратные адреса экземпляров ФБ и т.д.
  • Специфичные для приложения (Application-specific) — определённые разработчиком системы: дополнительный идентификатор экземпляра ФБ, альтернативное описание параметра на национальном языке, отказоустойчивое значение по умолчанию для выходных параметров и т.д.

G.5 Наследование атрибутов

Элементы ФБ наследуют атрибуты от более примитивных элементов. Например, переменная (Variable) в объявлении типа ФБ наследует атрибуты своего типа данных, а экземпляр ФБ — атрибуты связанного типа ФБ.

Типы данных наследуют атрибуты вниз по иерархии обобщённых типов IEC 61131-3. Например, атрибуты, применённые к ANY_REAL, также применяются к LREAL и REAL.

G.6 Синтаксис объявления

Объявление типа атрибута (Attribute Type) использует тот же синтаксис, что и объявление типа данных в IEC 61131-3, с тем отличием, что ключевые слова ATTRIBUTE...END_ATTRIBUTE используются вместо TYPE...END_TYPE. Например:

ATTRIBUTE DESCRIPTION: WSTRING(30); END_ATTRIBUTE

Присвоение значения экземпляру атрибута (Attribute Instance) использует синтаксис присвоения начального значения переменной по IEC 61131-3 со следующими расширениями:

a) Имя экземпляра атрибута совпадает с именем соответствующего типа атрибута.

b) Тип данных не указывается для экземпляра атрибута.

c) Присвоение значения заключается в конструкцию pragma, определённую в IEC 61131-3.

d) Несколько присвоений значений атрибутов, разделённых точкой с запятой, могут включаться в одну конструкцию pragma.

e) Конструкция pragma должна располагаться так, чтобы объявление, к которому она применяется, определялось однозначно.

Пример применения этих правил:

FUNCTION_BLOCK PID
{DESCRIPTION:= "Proportional + Integral + Derivative Control";
AUTHOR:= "JHC"; VERSION:= "19990103/JHC"}
INPUT_EVENT
INIT WITH QI, PARAMS; {DESCRIPTION:= "Initialization Request"}
...etc.

Ссылки

Библиография стандарта IEC 61499-1:2012:

  • IEC 60050-351:2006, International Electrotechnical Vocabulary -- Part 351: Control technology
  • IEC 61131-5:2000, Programmable controllers -- Part 5: Communications
  • IEC 61499 (all parts), Function blocks
  • IEC 61499-2:2012, Function blocks -- Part 2: Software tools requirements
  • IEC 61499-4, Function blocks -- Part 4: Rules for compliance profiles
  • ISO/IEC 7498-4, Information processing systems -- Open systems interconnection -- Basic reference model -- Part 4: Management framework
  • ISO/IEC 8825-1:2008, Information technology -- ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)
  • ISO/IEC 10040:1998, Information technology -- Open Systems Interconnection -- Systems management overview
  • ISO/IEC/IEEE 60559, Information technology -- Microprocessor systems -- Floating-point arithmetic
  • ISO 2382 (all parts), Information technology -- Vocabulary