Типы модулей

Исходя из вышесказанного, можно перечислить все имеющиеся в RTWin типы модулей. Модули, в зависимости от своего функционального назначения, могут быть одного из следующих типов:

Объект

Объект - модуль проекта, реализующий заданный пользователем алгоритм функционирования СКУ. Объект это наиболее универсальный тип модуля. Он позволяет решить широкий спектр задач, среди которых: математические модели процессов, работа с устройствами ввода/вывода и файлами, подготовка данных для отображения, организация связи с другими программами и т.д. На схеме СКУ объект показывается синим цветом.

Как уже упоминалось выше, каждый объект СКУ в системе RTWin реализован как самостоятельный загружаемый и исполняемый программный модуль (задача) в среде многозадачной операционной системы QNX. Следует особо отметить, что для каждого объекта генерируется полный исходный текст на языке программирования Си.

Какие файлы соответствуют объекту ?

Для каждого объекта, создаваемого в редакторе, генерируются следующие файлы в директории src/ проекта:

init_[ИмяОбъекта].c процедура инициализации объекта
handler_[ИмяОбъекта].c процедура обработки объекта
tdef_[ИмяОбъекта].h объявления типов данных
import_[ИмяОбъекта].h объявления глобальных переменных как внешних (extern)
vars_[ИмяОбъекта].h объявления глобальных переменных

Для каждой копии объекта на объектной схеме генерируются следующие файлы в директории src/ проекта:

main_[ИмяКопии].c запуск и цикл обработки
[ИмяКопии].mk для использования утилитой make

Для каждой копии объекта на объектной схеме создается файл загружаемого модуля в директории проекта:

ИмяКопии исполняемая программа

Как создавать объекты

RTWin предоставляет интерактивные средства для полного цикла создания объекта, начиная от описания алгоритма функционирования в виде последовательности блок-функций до генерации C-кода и компиляции готового модуля. Инструментальным средством для создания объектов в RTWin является редактор объектов. С помощью редактора объектов создается описание определенного типа объекта. Затем в редакторе схем объекты размещаются на модульной схеме проекта.


Модульная схема проекта может содержать несколько копий объекта данного типа, каждой из которых присваивается уникальное имя.

Окно редактора объектов выглядит следующим образом:

Реализуемый объектом алгоритм представляется в виде совокупности блок-функций (блоков), имеющих входы/выходы и связанных между собой.

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

Цикл разработки объекта

Примерный цикл разработки объекта включает следующие основные этапы:

  1. Разработка алгоритма с учетом имеющегося набора блок-функций
  2. Создание нового объекта
  3. Расстановка блоков
  4. Редактирование входов, выходов и параметров блоков (в том числе и написание функций обработки для блоков типа С-функция)
  5. Соединение блоков между собой
  6. Генерация текста программы на языке Си
  7. В редакторе схем вставить объект(ы) данного типа в модульную схему
  8. В редакторе схем выполнить компиляцию (Make Application)
  9. В случае наличия сообщений компилятора об ошибках в файлах, содержащих исходный текст пользовательских функций обработки для блоков типа С-функция, устранить ошибки и вернуться к пункту 8
  10. Запуск проекта из редактора схем
  11. При необходимости произвести редактирование объекта и генерацию текста программы и вернуться к пункту 8.

Библиотеки блок-функций

Все блок-функции объединены в библиотеки. Библиотека системных блоков (System ) является внутренней библиотекой редактора. Эта библиотека не может быть изменена пользователем. Все остальные библиотеки являются внешними по отношению к редактору объектов и полностью открыты для пользователя. Пользователь может добавлять или удалять блоки в существующих библиотеках, а также создавать новые блоки и библиотеки. Внешние библиотеки блок-функций находятся в директории /usr/rtw/lib/fblib . Список библиотек блок-функций, которые открываются при запуске редактора объектов, содержится в файле LibList . Перечень поставляемых библиотек приведен в Приложении А.

Как работает объект ?

Каждому из имеющихся на модульной схеме проекта объектов соответствует в итоге отдельная программа (загружаемый модуль). После запуска программы :

  1. Объект регистрируется у главного администратора проекта
  2. Выполняется процедура инициализации объекта. На этом шаге вызываются функции инициализации блоков (см. описание блока С-функция в главе Редактор объектов)
  3. Если в объекте есть блоки инициализации (Initialize object) , то последовательно для каждого из них :
  4. Цикл обработки событий. Объект переходит в состояние ожидания событий, при наступлении которых происходит срабатывание одного из блоков и вызов процедура обработки объекта. К таким событиям относятся:
  5. После ввода пользователем команды завершения работы проекта объект выходит из цикла обработки событий. Если в объекте есть блоки завершения (Terminate object), то последовательно для каждого из них :
  6. Работа программы завершается.

Последовательность выполнения блок-функций

Последовательность выполнения блок-функций определяется их взаимным расположением в ячейках. Возможны два варианта:

Последовательность выполнения блок-функций задается для каждого объекта в отдельности. У пользователя существуют следующие возможности изменить порядок обработки:

  1. организация циклов обработки блоков с использованием специальных блоков ( Loop , Repeat , While , Next , Break , Continue )
  2. использование блоков проверки условия If , ElseIf , EndIf
  3. выход из процедуры обработки объекта с помощью блока условного выхода ( Stop ).

В область цикла попадают все блоки, расположенные между блоком начала цикла (Loop, Repeat или While) и блоком, ограничивающим область цикла (Next).

Если в объекте задано несколько циклов, то их области обработки не должны пересекаться. Вложенные циклы разрешаются. Если блок Next отсутствует, то область цикла ограничена последней ячейкой объекта.

В область выполнения по условию попадают блоки, расположенные между блоком If и блоком ElseIf или EndIf. При наличии блока ElseIf блоки, расположенные между ним и блоком EndIf, выполняются, если условие ложно.


Связи между блоками не влияют на порядок их обработки


Процедура обработки объекта

Последовательно для каждого из блоков выполняются следующие действия :

  1. Проверяется наличие признака прихода данных для входов блока. Если у всех входов блока этот признак отсутствует, то происходит переход к следующему блоку. Если выставлен признак прихода данных хотя бы для одного входа, то выполняется дальнейшая обработка блока.
  2. Вызывается функция обработки блока, внутри которой могут быть выставлены признаки передачи данных для выходов блока. Для блока выход объекта (Output) функция обработки осуществляет передачу данных другому объекту или панели управления.
  3. Проверяется наличие признака передачи данных для каждого из выходов блока. Если у выхода выставлен признак передачи данных, то для всех соединенных с ним входов выполняется:
  4. После этого признак передачи данных для выхода снимается.
  5. Снимаются признаки прихода данных для входов.

С-функция

Блок С-функция позволяет реализовать любую процедуру обработки данных. Для данного блока пользователь может задать произвольный набор входов, выходов, параметров и функции инициализации и обработки. Для адресации входов и выходов блока внутри функций используется ряд специальных макроопределений:

RIC(имя_входа) кол-во элементов массива (если задан массив входов)
RID(имя_входа) значение входа
RIF(имя_входа) признак прихода данных
ROC(имя_выхода) кол-во элементов массива (если задан массив выходов)
ROD(имя_выхода) значение выхода
ROF(имя_выхода) признак передачи данных

Рассмотрим простейший пример блока данного вида, реализующего функцию определения максимального из значений на входах. Пусть оператор имеет имя c_code_3_B, массив входов in и выход out .

Исходный текст данной функции будет выглядеть так:

void Max(__Max *ts_ptr)
{
short i;
ROD(out) = RID(in)[0];
for(i=1; i < RIC(in); i++)
ROD(out) = max(RID(in)[i],ROD(out));
ROF(out) = 1;
}

Кроме того, в RTWin предусмотрена возможность создания на основе блока С-функция новых библиотек блоков в интерактивном режиме. Для создания нового блока необходимо описать требуемую функцию преобразования данных в виде исходного текста на языке программирования Си (пример такого описания был рассмотрен выше), и определить для вновь создаваемого блока уникальное имя и пиктограмму. После этого полученный новый блок может быть добавлен в меню, содержащее перечень всех блоков, и может быть использован для описания объекта наравне с блоками из системной библиотеки. Таким образом, может быть создан расширенный набор блоков, что позволяет адаптировать систему RTWin для решения определенного класса задач в какой-либо специальной области, а также существенно ускорить и облегчить процесс описания объекта.

Сообщение от устройства

Блок Сообщение от устройства (Proxy) позволяет организовать работу с внешними устройствами и устройствами ввода-вывода, или внешними программами, по событию (прерыванию). Для этого используется предоставляемый ОС QNX особый вид сообщения - прокси (proxy). Приход этого сообщения сигнализирует о наступлении события (прерывания). По приходу прокси выставляется 1 на соответствующем выходе блока Proxy, и объект может отреагировать на событие.

Панель управления

Панели управления предназначены для:

На схеме СКУ панель управления показывается зеленым цветом.

Инструментальными средствами для создания панелей управления служат входящий в RTWin редактор панелей управления. Панели управления создаются в два этапа. Сначала создается внешний вид панели управления. Изображение создается с использованием графических примитивов. Каждый графический примитив (widget) имеет определенный набор ресурсов. К таким ресурсам относятся: цвет, координаты, размеры, форма курсора, текстовая строка и т. д. В зависимости от типа графического примитива этот набор может меняться. Используя возможности, предоставляемые редактором панелей управления, можно с различными уровнями абстракции изобразить любой технологический процесс или агрегат. Ниже приведен пример внешнего вида панели управления, созданной на Молдавском металлургическом заводе :

На втором этапе в редакторе панелей управления производится привязка ресурсов графических примитивов к входам и выходам панели управления. Сначала для панели управления создаются необходимые входы и выходы. Затем в редактор загружается ранее созданная картинка - файлы описания окон формата .wgtp , .wgtd и .wgtw. Редактор панелей управления позволяет задать связь ресурсов графических примитивов с данными, поступающими на вход панели управления. Таким образом, любое изменение состояния управляемого процесса или механизма может быть отображено посредством изменения тех или иных ресурсов. Т.о. изменение данных на входе приводит к динамическому изменению картинки. В картинке могут меняться: текст, цвет, позиция и размеры виджетов, что позволяет получить эффект анимации. Кроме того, могут открываться или закрываться дополнительные окна, выдаваться сообщения. Поступающие на вход данные можно представить в виде графиков и диаграмм. На панели управления могут быть размещены различные органы управления: кнопки, сдвижки (слайдеры), кнопки с фиксированным положением и т.п.

Для каждого органа управления может быть задан уровень доступа - некоторое числовое значение в диапазоне от 0 до 100. В этом случае, только операторы, уровень доступа которых не ниже заданного, смогут использовать эти органы управления. Наряду с указанием уровня доступа, для каждого органа управления может быть задан запрос пароля. Воздействие оператора на органы управления приводит к посылке данных в выходные каналы панели управления и далее в систему.

Как дополнительные средства для организации интерфейса с оператором, редактор панелей управления предоставляет возможность организовать всплывающие окна, меню, окна модального диалога и т.п. Таким образом, с помощью редактора панелей управления может быть описан сценарий работы с оператором.

Изменению данных, получаемых от других модулей, может быть поставлено в соответствие изменение ресурсов графических примитивов. Изменению состояния органов управления может, в свою очередь, быть поставлено в соответствие изменение значения данных, посылаемых другим модулям системы. Так, например, нажатие кнопки на панели управления, или нажатие "горячих клавишФ клавиатуры, можно связать с записью определенных данных в выходные каналы панели управления. С помощью этого механизма в RTWin реализованы воздействия оператора на ход управляемого процесса.

Объект - PhAB приложение

На модульной схеме такой модуль показывается серым цветом и рассматривается как объект особого типа.

Как и другие объекты, он имеет входы и выходы и может быть соединен с другими модулями проекта. Для задания входов и выходов объекта-PhAB приложения используется редактор объектов.

Шлюз

Система RTWin предоставляет возможность передавать данные между одновременно работающими проектами. Для этой цели используются специальные модули - шлюзы (Gate), которые определяют типы данных и имена внешних входов/выходов проекта, а также файлы конфигурации, где указано как внешние входы и выходы различных проектов связаны между собой. На модульной схеме шлюзы изображаются в виде прямоугольников малинового цвета.

Структура файла описания связей

Файл конфигурации описывает связь только между двумя проектами. На текущий момент нет никакого интерактивного инструмента для создания файла описания связей. Структура файла конфигурации очень проста :

PROJECT_1 prj1_name
INSTANCE_NAME_1 prj1_inst_name
PROJECT_2 prj2_name
INSTANCE_NAME_2 prj2_inst_name
LINKS
type prj1_point_name1 prj2_point_name1
. . .
type prj1_point_nameN prj2_point_nameN
END_LINKS

Здесь PROJECT_1 и PROJECT_2 - ключевые слова, указывающие на следующие за ними имена связанных проектов, INSTANCE_NAME_1 и INSTANCE_NAME_2 - ключевые слова, указывающие на уникальные имена копий проектов, LINKS и END_LINKS - ключевые слова, ограничивающие блок описания связей.

Слово type может иметь 2 значения - INPUT и OUTPUT, и указывает на тип модуля связи (вход или выход) 1-го проекта, что определяет тип связи :

Слова prj1_name и prj2_name являются именами проектов, prj1_inst_name и prj2_inst_name -уникальными именами копии проекта, prj1_point_name1 и prj1_point_nameN -имена модулей связи 1-го проекта, prj2_point_name1 и prj2_point_nameN -имена модулей связи 2-го проекта.

Пример написания файла:

PROJECT_1 Prj1 |Имя 1-го проекта
INSTANCE_NAME_1 i1 |Уникальное имя 1-го проекта
PROJECT_2 Prj2 |Имя 2-го проекта
INSTANCE_NAME_2 |Уникальное имя 2-го проекта
LINKS |Блок описания связей
##Тип модуля связи |Имя модуля связи |Имя модуля связи
##1-го проекта |1-го проекта |2-го проекта
OUTPUT out_gate1 In_gate1
OUTPUT str_gate_out in_type_5
INPUT In_gate1 out_gate1
INPUT str_gate out_type_5
INPUT time time
END_LINKS |Конец блока описания связей