## Библиотека системных блок-функций

Библиотека системных блок-функций (System) является внутренней библиотекой редактора объектов и содержит базовый набор блок-функций, достаточный для построения объектов любой сложности. Данная библиотека не может быть модифицирована пользователем. Ниже приводится описание всех входящих в данную библиотеку блоков.

### Вход объекта (Input)

Назначение :

Определяет вход объекта

Входы :

Отсутствуют

Выходы :

Определяются выбором типа данных канала и заданным вариантом разложения на поля и элементы массива.

Параметры :

Параметром является тип данных канала.

Нажатие на кнопку Select/Modify вызывает окно выбора пользовательского типа данных Type Selector, описанное выше.

### Выход объекта (Output)

Назначение :

Определяет выход объекта

Входы :

Определяются выбором типа данных канала и заданным вариантом разложения на поля и элементы массива.

Выходы :

Отсутствуют

Параметры :

Параметром является тип данных канала. Смотрите описание блока Вход объекта.

### Сообщение от устройства (Proxy)

Назначение :

Работа с внешними устройствами и устройствами ввода-вывода по событию (прерыванию). На этапе инициализации объекта создается прокси (proxy)

Входы :

Отсутствуют

Выходы :

Event ( LOGIC ) приход сообщения от устройства. При запуске объекта на этом выходе будет ноль. В дальнейшем, в процессе работы объекта, при наступлении события по этому выходу будет приходить единица.

proxy_pid ( WORD ) идентификационный номер прокси (pid). При запуске объекта уже содержит номер, который в дальнейшем не изменяется.

Параметры :

Отсутствуют

### Блок инициализации объекта (Initialize object)

Назначение :

Вызывает выполнение процедуры обработки объекта сразу после запуска.

Входы :

Отсутствуют

Выходы :

Initialize (LOGIC) Инициализация объекта. При запуске объекта на этом выходе выставляется 1 и выполняется процедура обработки объекта.

Параметры :

Отсутствуют

### Блок завершения объекта(Terminate object)

Назначение :

Вызывает выполнение процедуры обработки объекта непосредственно перед завершением работы программы.

Входы :

Отсутствуют

Выходы :

Terminate ( LOGIC ) Завершение объекта. При окончании работы объекта на этом выходе выставляется 1 и выполняется процедура обработки объекта.

Параметры :

Отсутствуют

### Таймер (Timer)

Назначение :

Запуск таймера в объекте.

Входы :

Отсутствуют

Выходы

Timer ( LOGIC ) Срабатывание таймера. При срабатывании таймера на этом выходе выставляется 1 и выполняется процедура обработки объекта.

timer_period ( DOUBLE )Период срабатывания таймера.

Параметры

Период срабатывания таймера. Устанавливается в секундах и миллисекундах.

Для редактирования нажмите на соответствующее поле

| Первое срабатывание произойдет по истечении заданного периода после запуска объекта

### Инициализируемая Структура (Init Structure)

Назначение :

Уникальная настройка для каждой копии объекта

Входы :

Read ( LOGIC ) По появлению 1 на этом входе выставляются признаки передачи данных для выходов блока.

Выходы :

Определяются выбором типа структуры канала и заданным вариантом разложения на поля и элементы массива.

Параметры :

Параметром является тип данных структуры.

### Условный цикл ( While )

Назначение :

Организует цикл обработки блоков. Цикл выполняется если на входе блока 1 и до тех пор, пока на вход блока не придет 0.

Входы :

While( LOGIC ) Условие выполнение цикла. Цикл выполняется пока на входе 1

Выходы

Отсутствуют

Параметры :

Отсутствуют

### Повторять ( Repeat )

Назначение :

Организует цикл обработки блоков. Цикл повторяется заданное число раз.

Входы :

Count( LOGIC ) Количество выполнений цикла. Цикл не выполняется, если на входе 0.

Выходы

Value ( DWORD ) Значение переменной цикла. Изменяется от 1 до Count с шагом 1.

Параметры :

Начальное значение для входа.

### Цикл с шагом ( Loop )

Назначение :

Организует цикл обработки блоков. Цикл повторяется заданное число раз.

Входы :

From ( DOUBLE ) Начальное значение переменной цикла

To ( DOUBLE ) Конечное значение переменной цикла

Step ( DOUBLE ) Шаг приращения переменной цикла

Выходы :

Value ( DWORD ) Значение переменной цикла. Изменяется от From до To с шагом Step.

Параметры :

Начальное значение для входа.

### Граница цикла ( Next )

Назначение :

Ограничивает область цикла обработки блоков.

Входы :

Отсутствуют

Выходы :

Отсутствуют

Параметры :

Отсутствуют

### Продолжить ( Continue )

Назначение :

Условный переход к следующему повтору цикла обработки блоков.

Входы :

Next ( LOGIC ) Если на входе 1 то перейти к следующему повтору цикла.

Выходы :

Отсутствуют

Параметры :

Отсутствуют

### Прервать (Break)

Назначение :

Условный выход из цикла обработки блоков

Входы :

Next ( LOGIC ) Если на входе 1 то выход из цикла обработки блоков.

Выходы :

Отсутствуют

Параметры :

Отсутствуют

### Если(If)

Назначение :

Организует область выполнения блоков по условию.

Входы

If ( LOGIC ) Если на входе 1 то условие истинно.

Выходы :

Отсутствуют

Параметры :

Отсутствуют

### Если нет, то(ElseIf)

Назначение :

Организует область выполнения блоков по условию.

Входы

Отсутствуют

Выходы :

Отсутствуют

Параметры :

Отсутствуют

### Конец условия (EndIf)

Назначение :

Ограничивает область выполнения блоков по условию.

Входы

Отсутствуют

Выходы :

Отсутствуют

Параметры :

Отсутствуют

### Стоп ( Stop )

Назначение :

Условный выход из процедуры обработки объекта.

Входы :

Next ( LOGIC ) Если на входе 1 то выход из процедуры обработки объекта.

Выходы :

Отсутствуют

Параметры :

Отсутствуют

### Табличная функция (Table function )

Назначение :

Табличная функция, определенная пользователем.

Входы :

Определяются пользователем.

Выходы :

Определяются пользователем.

Параметры :

В окне редактирования параметров задается табличная функция. Каждому входу и выходу блока соответствует столбец таблицы. При включенной кнопке State в таблицу добавляются столбцы для анализа и присвоения значения состояния таблицы. Значения состояния сохраняются во внутренней переменной функции. В этом случае мы получаем возможность реализовать алгоритм работы конечного автомата.

Столбцы таблицы делятся на входные - входы блока и левый столбец STATE, и выходные - выходы блока и правый столбец STATE. Таблица может содержать произвольное количество строк. В каждой клетке таблицы для входных столбцов задаются проверяемые условия, а для выходных столбцов - присваиваемые значения.

Обработка таблицы производится построчно. Считается, что значение строки истинно, если выполняются условия для всех входных столбцов данной строки. Присвоение новых значений выходам блока и переменной STATE происходит только в случае истинного значения строки.

Если включена кнопка Exclusive, то при первом истинном значении строки обработка прекращается и последующие строки рассмотрению не подлежат.

Если кнопка Exclusive не включена, то рассматриваются все строки и в итоге на выходе появится результат соответствующий последней истинной строке.

Для добавления новой строки следует нажать кнопку Insert

Для задания значений в конкретной ячейке необходимо выбрать требуемую ячейку, после чего дальнейшее редактирование производится в нижней части окна, под областью таблицы. Имя выбранного столбца будет указано в полеName, а в поле Typeбудет показан тип данных.

Каждая ячейка входного столбца может содержать совокупность двух равноправных логических условий объединенных по "И" или по "ИЛИ", т.е.:

условие1 [&& условие2] или условие1 [|| условие2]

Если нажата , то условия объединены по "И", если нажата то условия объединены по "ИЛИФ. Условие в общем случае имеет вид:

оператор операнд

Рассмотрим более подробно, как задать условие.

Группа из четырех кнопок справа определяет тип операнда:

> Const- численная константа;

> Input - текущее значение входа;

> State - текущее значение переменной состояния;

> Empty - игнорировать данное условие.

Второе слева поле содержит непосредственно операнд - число или имя поля.

Самое левое поле содержит оператор отношения.

Оператор | Условное обозначение
равно | ==
больше | >
меньше | <
больше или равно | >=
меньше или равно | <=
не равно | !=

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

Задание значения происходит аналогично заданию условия, за исключением того, поле отношения при этом не используется.

Для ввода заданных условий или значений в клетку таблицы следует нажать кнопку Apply.

### C-функция ( C function)

Назначение :

Функция на языке программирования Cи, определенная пользователем.

Входы :

Определяются пользователем.

Выходы :

Определяются пользователем.

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

Параметры :

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

Столбец Value содержит присваиваемые аргументам значения. Для их редактирования выберите с помощью мыши соответствующее поле и в появившемся окне Value введите требуемое значение. Если в качестве аргумента задан массив, то инициализируется каждый элемент массива.

Редактирование остальных столбцов производится аналогично редактированию входов и выходов блока. В поле с меткойHandler function ввести имя функции обработки блока в формате

[имя_функции]@[имя_файла].с.

Если имя файла не указано, то предполагается файл с тем же именем, что и функция и расширением ".с", т.е. [имя_функции].с.

Поле с меткой Initialization function указывает функцию инициализации и заполняется аналогично. Для ввода и редактирования текста объявленных функций выберите кнопку .

При этом будет запущен текстовый редактор vedit для редактирования указанного файла. Если файл с данным именем отсутствует в директории src/ проекта, то он будет создан. Если в файле отсутствует функция с данным именем, то заготовка для нее добавляется в конец файла.

| Для редактирования текста C-функции из окна Block Editor можно вызывать произвольный текстовый редактор. Для этого следует установить переменную окружения RTWIN_EDIT. Пример: #export RTWIN_EDIT=/home/ved/ved

В тексте функции для доступа к входам, выходам и аргументам используются макросы, определенные в файле

/usr/rtw/lib/codegen/rtw_macros.h

RIC( имя_входа ) кол-во элементов массива (если задан массив входов)

RID( имя_входа ) значение входа

RIF( имя_входа ) призрак прихода данных

ROC( имя_выхода ) кол-во элементов массива (если задан массив выходов)

ROD( имя_выхода ) значение выхода

ROF( имя_выхода ) призрак передачи данных

RPC( имя_аргумента ) кол-во элементов массива (если задан массив аргументов)

RPD( имя_аргумента) значение аргумента

Если задан массив входов, то для его элементов

RID(имя_входа)[индекс] значение входа

RIF(имя_входа)[индекс] призрак прихода данных

Если вход определен как указатель на структуру, то

RID(имя_входа)->имя_поля значение поля структуры

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

Функция обработки будет выглядеть так:

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;

}

После выполнения пункта меню Program/Generate для этого блока будет сгенерирован следующий текст:

в файлеhandler_MyObject.c

...

if( _RIF(c_code_3_B,in)[0] ||

_RIF(c_code_3_B,in)[1] )

{

Max( &_c_code_3_B );

_RIF(c_code_3_B,in)[0]=0;

_RIF(c_code_3_B,in)[1]=0;

if( _ROF(c_code_3_B,out) )

{

_ROF(c_code_3_B,out)=0;

}

}

...

в файле tdef_MyObject.h

...

#define RTDEF_Max

typedef struct {

struct{

short cnt;

char *flag;

double *data;

} I_in;

struct{

char flag;

double data;

} O_out;

> > } __Max;

...

в файле vars_MyObject.h

...

__Max _c_code_3_B;

...

в файле import_MyObject.h

...

extern __Max _c_code_3_B;

...