Развивающимся перспективным направлением в проектировании систем управления является методика проектирования на основе абстрактных функциональных блоков (ФБ) [1]. ФБ служат основой для построения приложений, распределенных между отдельными узлами управляющей сети. Распределенная информационно-управляющая система представляет собой, в данном случае, совокупность ФБ, связанных управляющими и информационными связями. Каждый блок отвечает за выполнение какой-либо части управляющего алгоритма. Таким образом, здесь имеет место объектно-ориентированный подход к созданию приложений. Существует возможность создания своих блоков их последующего использования при проектировании, а также расширения функциональности уже существующих [2, 3].
ФБ представляет собой программный модуль, выполняющий определенный алгоритм при поступлении события на соответствующий вход этого блока. Приложение состоит из нескольких таких блоков соединенных связями по данным и событиям. Для описания типов ФБ используются языковые средства, описанные в стандарте IEC 61131, а также язык XML. Взаимодействие функциональных блоков основано на передаче управляющих сигналов – событий через соединение событий и передаче необходимых данных через соединение данных.
ФБ описывается объявлением внешнего интерфейса, диаграммой управления исполнением и алгоритмами, выполняемыми в соответствии с диаграммой. Алгоритмы могут быть написаны как на языках стандарта IEC 61131, так и обычных языках структурного программирования [1].
На сегодняшний день существует несколько программных продуктов поддерживающих стандарт IEC61499 среди них можно выделить среду Function Block Development Kit (FBDK) и программный продукт IsaGRAF 5 [4].
Перечисленные программные продукты не позволяют создавать имитационные модели распределенных систем управления для получения характеристик их функционирования. Использование средств имитационного моделирования при проектировании распределенных систем управления с применением методики на основе абстрактных функциональных блоков дает возможность получать информацию о поведении, как отдельного элемента системы, так и о системе в целом, что позволяет упростить и сократить цикл разработки распределенных систем управления.
Рассмотрим конкретный пример разработки с использованием ФБ системы массового обслуживания, состоящей из очереди и обслуживающего прибора. Блок очереди (QUEUE) представлен на рис. 1.
Рис. 1. Функциональный блок типа «ОЧЕРЕДЬ»
Он предназначен для сбора статистических данных и управления поступлением заявок извне, а также управляет загрузкой заявки из очереди в обслуживающий прибор [5, 6]. Для включения новой заявки в очередь используется событийный вход Z_IN, управляющий входом поступления заявок Z_NUM_IN. Этим же сигналом устанавливается количество каналов соответствующего обслуживающего прибора равное значению на входе NUM_CH. Событийный вход INIT используется для задания длины очереди MAX_LENGTH.
Событие на выходе Z_ENTER, предназначенном для уведомления блока статистики о появлении в очереди новой заявки. Выход данных LENGTH используется для выдачи, текущей длина очереди, а на выходе Z_NUM_OUT – значение номера заявки присвоенного ей на входе Z_NUM_IN. Событие на выходе Z_LEAVE появляется, когда обслуживающий прибор пуст и готов к обслуживанию новой заявки. Событие FREE_OP сообщает об освобождении обслуживающего прибора. Событие на выходе Q_FULL уведомляет блок статистики о достижении очередью состояния, когда очередь занята полностью. Выход события Z_REJEKT сигнализирует о том, что вновь поступившая заявка застигла очередь заполненной и была удалена из СМО без обслуживания.
Программа, описывающая функционирование ФБ QUEUE, представлена на языке XML
<FBType Name=»QUEUE» Comment=»Model for a Rotating Shaft» >
<Identification Standard=»61499–1» />
<InterfaceList>
<EventInputs>
<Event Name=»INIT» Comment=»Запуск иициализации, установка максимальной длины очереди» >
<With Var=»NUM_CH» />
<With Var=»MAX_LENGTH» />
</Event>
<Event Name=»Z_IN» Comment=»Появление заявки» >
<With Var=»Z_NUM_IN» />
</Event>
<Event Name=»FREE_OP» Comment=»Обслуживающий прибор свободен» >
</Event>
</EventInputs>
<EventOutputs>
<Event Name=»Z_ENTER» Comment=»заявка вошла в очередь» >
<With Var=»LENGTH» />
<With Var=»Z_NUM_OUT» />
</Event>
<Event Name=»Z_LEAVE» Comment=»Заявка покинула очередь» >
<With Var=»Z_NUM_OUT» />
</Event>
<Event Name=»Q_FULL» Comment=»Очередь заполнена» >
<With Var=»LENGTH» />
</Event>
<Event Name=»Z_REJEKT» Comment=»Заявка отклонена» >
<With Var=»LENGTH» />
<With Var=»Z_NUM_OUT» />
</Event>
</EventOutputs>
<InputVars>
<VarDeclaration Name=»MAX_LENGTH» Type=»INT» Comment=»Максимальная длина очереди» />
<VarDeclaration Name=»Z_NUM_IN» Type=»INT» Comment=»Номер поступающей заявки» />
<VarDeclaration Name=»NUM_CH» Type=»INT» Comment=»Количество каналов в соответствующем обслуживающем приборе» />
</InputVars>
<OutputVars>
<VarDeclaration Name=»LENGTH» Type=»INT» Comment=»Текущая длина очереди»/>
<VarDeclaration Name=»Z_NUM_OUT» Type=»INT» Comment=»Номер заявки покидающей очередь» />
</OutputVars>
</InterfaceList>
</FBType>
Функциональный блок обслуживающего прибора представлен на рис. 2.
Рис. 2. Функциональный блок обслуживающего прибора
Вход данных NUM_CH используется для задания количества каналов обслуживающего прибора [5, 6]. Для включения заявки в обслуживающий прибор используется вход Z_IN. При появлении события на данном входе считывается значение на входе данных Z_NUM_IN, которое содержит номер заявки, а также устанавливается время обработки заявки равное значению на входе данных GEN. Вход TIMER используется для реализации задержки подсчётом событий от таймера. После завершения обработки заявки выдаётся событие на выходе Z_LEAVE и выдается номер заявки на выходе Z_NUM_OUT, а также выдаётся текущее значение количества занятых каналов с выхода CUR_NUM.
Программа, описывающая функционирование ФБ SD, представлена на языке XML.
<FBType Name=»SD» Comment=»Блока обслуживающего прибора» >
<Identification Standard=»61499–1» />
<InterfaceList>
<EventInputs>
<Event Name=»INIT» Comment=»Запуск иициализации, установка максимальной длины очереди» >
<With Var=»NUM_CH» />
</Event>
<Event Name=»Z_IN» Comment=»Появление заявки» >
<With Var=»GEN» />
<With Var=»Z_NUM_IN» />
</Event>
<Event Name=»TIMER» Comment=»Обслуживающий прибор свободен» >
</Event>
</EventInputs>
<EventOutputs>
<Event Name=»Z_LEAVE» Comment=»заявка закончила обслуживание» >
<With Var=»Z_NUM_OUT» />
<With Var=»CUR_NUM» />
</Event>
</EventOutputs>
<InputVars>
<VarDeclaration Name=»NUM_CH» Type=»INT» Comment=»Количество каналов» />
<VarDeclaration Name=»GEN» Type=»INT» Comment=»Количество каналов»/>
<VarDeclaration Name=»Z_NUM_IN» Type=»INT» Comment=»Имя заявки поступившей на обслуживание» />
</InputVars>
<OutputVars>
<VarDeclaration Name=»CUR_NUM» Type=»INT» Comment=»Текущее количество занятых каналов» />
<VarDeclaration Name=»Z_NUM_OUT» Type=»INT» Comment=»Имя выходящей заявки» />
</OutputVars>
</InterfaceList>
</FBType>