# Глава 3:Библиотека интерфейсных блок-функций для пакета Driver Toolkit

В этой главе:

- Описание библиотеки интерфейсных блок- функций - drivers.lib
    Назначение
    Состав библиотеки и описание выполняемых функций
      Установка инициативных аналоговых каналов (Proxy_ai)
      Установка инициативных дискретных каналов (Proxy_di)
      Получить данные по одному каналу аналогового ввода (Read_single_AI )
      Получить данные по одному каналу дискретного ввода (Read_single_DI )
      Получить данные по группе каналов аналогового ввода (Read_group_AI )
      Получить данные по группе каналов дискретного ввода (Read_group_DI )
      Получить данные по группе счетно-импульсных каналов (Read_CNT )
      Поcлать данные в канал аналогового вывода (Write_AO)
      Поcлать данные в канал дискретного вывода (Write_DO)
      Получить адрес области данных с результатами преобразований (GetDMAbuffer)
      Завершение работы драйвера (Term_drv )
- Пример проекта c использованием интерфейсных блок-функций CACSD RTWin
    Общее описание проекта
    Порядок создания проекта
      Конфигурирование драйверов
      Создание объекта RTWin для связи с драйвером
      Описание панели визуализации
      Конфигурирование проекта
  Пример работающего демопроекта

## Описание библиотеки интерфейсных блок-функций - drivers.lib

### Назначение

В состав этой библиотеки входят блок-функции , которые позволяют реализовать интерфейс между стандартными пользовательскими объектами RTWin и драйверами пакета Driver Toolkit .

### Состав библиотеки и описание выполняемых функций

После инсталляции Driver Toolkit к перечню библиотек , доступных в редакторе объектов objectedit, добавится библиотека drivers , которая появиться отдельным пунктом в окне выбора типа блок- функций . Механизм работы с блок - функциями описан в [1]. Вид окна выбора блок- функций drivers показан на рисунке .

В состав библиотеки входят следующие блок- функции :

Установка инициативных аналоговых каналов (Proxy_ai)

Назначение :

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

Параметры :

Driver - имя драйвера ;

Drv_global_name - имя запускаемой копии драйвера.

h_first - номер первого канала группы со статусом инициативный .

h_last - номер последнего канала группы со статусом инициативный .

Входы :

рroxy - значение proxy ,которое нужно передать драйверу

Выходы :

Отсутствуют.

Установка инициативных дискретных каналов ( Proxy_di)

Назначение :

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

Параметры :

Driver - имя драйвера ;

drv_global_name - имя запускаемой копии драйвера.

h_first - номер первого канала группы со статусом инициативный .

h_last - номер последнего канала группы со статусом инициативный .

Входы :

Proxy - значение proxy , которое нужно передать драйверу .

Выходы :

Отсутствуют .

| Механизм инициативных каналов , с использованием proxy , состоит в следующем : в обычном режиме драйвер передает данные клиенту по запросу последнего . Но в случае , если клиенту необходимо получать данные только при их изменении и сразу по возникновению измненения , то используется механизм с инициативными каналами . При старте объект должен создать proxy при помощи стандартной блок - функции Proxy , а при помощи блок - функций Proxy_ai и Proxy_di драйверу передается значение proxy_pid и определяются каналы драйвера , которые должны быть инициативными . Тогда сразу же по изменению данных в канале драйвер пошлет proxy объекту и тот запросит данные у драйвера.

Получить данные по одному каналу аналогового ввода (Read_single_AI )

Назначение :

чтение одиночного канала аналогового ввода .

Параметры :

Driver - имя драйвера ;

Driver_copy - имя запускаемой копии драйвера.

Numb_channel - номер канала аналогового канала .

Входы :

Event - инициирует чтение канала .

Выходы :

Data - значение считанного канала

Получить данные по одному каналу дискретного ввода (Read_single_DI )

Назначение :

чтение одиночного канала дискретного ввода .

Параметры :

Driver - имя драйвера ;

Driver_copy - имя запускаемой копии драйвера.

Numb_channel - номер канала дискретного канала .

Входы :

Event - инициирует чтение канала .

Выходы :

Data - значение считанного канала

Получить данные по группе каналов аналогового ввода (Read_group_AI )

Назначение :

чтение группы каналов аналогового ввода . Количество одновременно считываемых каналов не более 16 .

Параметры :

Driver - имя драйвера ;

Driver_copy - имя запускаемой копии драйвера.

Channel_first - номер первого канала группы .

Channel_last - номер последнего канала группы .

Входы :

Event - инициирует чтение группы каналов .

Выходы :

Data[01 - Data[16] - значения считанных аналоговых данных по группе каналов .

Получить данные по группе каналов дискретного ввода (Read_group_DI )

Назначение :

чтение группы каналов дискретного ввода . Количество одновременно считываемых каналов не более 16 .

Параметры :

Driver - имя драйвера ;

Driver_copy - имя запускаемой копии драйвера.

Channel_first - номер первого канала группы .

Channel_last - номер последнего канала группы .

Входы :

Event - инициирует чтение группы каналов .

Выходы :

Data[01 - Data[15] - значения считанных дискретных данных по группе каналов .

Получить данные по группе счетно -импульсных каналов (Read_CNT )

Назначение :

чтение группы счетно-импульсных каналов . Количество одновременно считываемых каналов не более 16 .

Параметры :

Driver - имя драйвера ;

Driver_copy - имя запускаемой копии драйвера.

Channel_first - номер первого канала группы .

Channel_last - номер последнего канала группы .

Входы :

Event - инициирует чтение группы каналов .

Выходы :

Data[n11 - Data[n2] - значения считанных счетно-импульсных данных по группе каналов .

Поcлать данные в канал аналогового вывода ( Write_AO )

Назначение :

передача значения в канал аналогового выхода .

Параметры :

Driver - имя драйвера ;

Driver_copy - имя запускаемой копии драйвера.

Numb_channel - номер канала аналогового вывода .

Входы :

Datat - значение которое нужно передать на аналоговый выход .

Выходы :

kod - значение кода операции передачи данных .

Поcлать данные в канал дискретного вывода (Write_DO)

Назначение :

передача значения в канал дискретного выхода .

Параметры :

Driver - имя драйвера ;

Driver_copy - имя запускаемой копии драйвера.

Numb_channel - номер канала дискретного вывода .

Входы :

Datat - значение которое нужно передать на дискретный выход .

Выходы :

kod - значение кода операции передачи данных .

Получить адрес области данных с результатами преобразований (GetDMAbuffer)

Назначение :

функция возвращает адрес буфера , в котором хранятся данные считывания каналов в режиме DMA.

Параметры :

Driver - имя драйвера ;

Driver_copy - имя запускаемой копии драйвера.

Входы :

Event - инициирует выполнение функции .

Выходы :

buffer - указатель на область разделяемой памяти .

Завершение работы драйвера (Term_drv )

Назначение :

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

Параметры :

Driver - имя драйвера ;

Driver_copy - имя запускаемой копии драйвера.

Входы :

Event - инициирует выполнение функции .

Выходы :

Отсутствует .

## Пример проекта c использованием интерфейсных блок-функций в CACSD RTWin

Для использования готовых драйверов пакета Driver Toolkit в проекте CACSD RTWin ( при условии , что пакет инсталлирован ) необходимо :

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

### Общее описание демо-проекта

В примере будет по шагам описано создание проекта , в котором необходимо получать данные от датчиков через многофункциональную плату УСО PCL-818L фирмы Advantech и подавать управляющие воздействия на исполнительные механизмы через выходы этой же платы .

Опрос ведется по 6 аналоговым входам ; 6 - дискретным входам , с отображением данных на информационной панели оператора .

Управляющие воздействия с операторской панели управления подаются на 1 аналоговый выход и 6 дискретных выходов .

Метод опрос аналоговых входов выбран через механизм прерываний , номер прерывания 5 , дискретные каналы опрашиваются по внутреннему таймеру драйвера с частотой 1/c .

Дополнительно определяем пятый канал дискретного ввода , как инициативный .

Базовый адрес платы - 300h.

Интерфейсная панель оператора показана на рисунке .

### Порядок создания проекта

### Шаг 1:Конфигурирование драйверов

Открыв новый проект DemoDrv в окне схемного редактора , как это описано в [1] , через меню Edit вызываем редактор drvedit для конфигурирования драйверов . В окне редактора выбираем драйвер 818L и нажимаем кнопку Insert . В диалоговом окне вводится имя копии драйвера , по которому драйвер можно идентифицировать в проекте . Это значение используется в большинстве блок - функций в качестве второго параметра.

Вид интерфейсного окна показан на рисунке .

В нашем примере это единственный драйвер , поэтому дальше можно переходить к конфигурированию драйвера под проект .

Выбираем копию драйвера с именем 818L_1 и нажимаем кнопку

Edit , чтобы попасть в окно конфигурирования драйвера .

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

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

Интерес в плане редактирования параметров представляет секция
Channel , в которой перечислены все каналы и описаны их Параметры . Интерфейсное окно отличается тем , что редактируются Параметры канала группой . Типичными параметрами для каналов являются значения шкал , которые необходимы для приведения данных к физической величине .

В нашем примере мы выберем :

Шкалу датчиков : 0 - 5 мА ;

Шкалу платы : 0 - 5 В ;

Физическую : 0 - 100 %С .

Окно редактирования показано на рисунке .

Для завершения работы с сохранением результатов редактирования нажмите кнопку Done , для отказа - Cancel .

После редактирования в файле rtstart.cfg проекта DemoDrv появится строка для запуска драйвера 818L .

818L -p DemoDrv -n 818L_1 -t 818L

А конфигурация для данного драйвера находится в конфигурационном файле : /usr/rtw/apps/DemoDrv/drv/818L/818L_1/driver.inf

### Шаг 2:Создание объекта RTWin для связи с драйвером

.На этом этапе надо создать объект RTWin , который бы получал данные от драйвера и передавал бы дальше другим объектам проекта , в частности в панель визуализации . А также принимал данные с панели управления и посылал драйверу . Для этого необходимо вызвать редактор объектов objectedit и создать новый объект ( в нашем примере ObjDrv ) .

Для получения данных с панели управления вводим в объект семь
блок- функций типа Input , шесть с типом type_byte для дискретных сигналов и один с типом type_float для аналогового выхода .

Для передачи полученных данных от драйвера в другие объекты вводим в объект ObjDrv блок-функцию OutPut ( типа array type_byte[16 ] ) - для дискретных входов и блок -функцию OutPut (типа array type_float [16] ) - для аналоговых входов . Использование выходов с типом данных в виде массива не обязательно и введено для компактности . Можно на каждый канал ввести свою блок - функцию OutPut .

Введем также стандартные блок - функции Initialize - для выполнения инициализационных действий при старте объекта и Time r - для осуществления периодичного опроса драйвера .

Структура объекта показана на рисунке .

#### Шаг 3

Теперь , исходя из требования , что дискретный канал номер 5 - должен быть инициативным , необходимо ввести в объект стандартную блок-функцию Proxy и блок-функцию Proxy_di .

Значение с выхода proxy_pid блока Proxy подать на вход proxy блока Proxy_di .

В параметрах функции Proxy_di необходимо установить значения показанные на рисунке .

#### Шаг 4

Для чтения 5 дискретных каналов вводим блок-функцию read_group_DI .
Для чтения одного инициативного канала вводим блок-функцию read_single_DI .

Для чтения 6 аналоговых входов вводим блок-функцию read_group_AI

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

Вход функций группового чтения trigge r соединяем с выходом timer_event блока Timer , а вход trigger функции чтения одного дискретного канала N 5 соединяем с выходом proxy_event блока Proxy . Таким образом первая будут запрашивать данные у драйвера по таймеру , а последняя - по приходу proxy .

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

Рисунок показывает фрагмент конфигурирования .

#### Шаг 5

Для передачи управляющих сигналов драйверу вводим шесть блок-функций записи в дискретный канал write_DO и одну блок-функцию записи в аналоговый канал write_AO

Параметры функций устанавливаются аналогично блок- функциям чтения . Входы функций соединяем с выходами соответствующих блок-функций типа Input .

Пример показан на рисунке .

#### Шаг 6

После определения всех связей в объекте ObjDrv выполняется операция make build и далее результаты редактирования сохраняюся .

### Шаг 7:Описание панели визуализации

Для реализации интерфейсной части проекта необходимо создать в

Application Builder объект Picture , в котором разместим :

- 6 виджетов Rectangle , которые будут изменять цвет в зависимости от значений дискретных каналов ( белый - 0 ; красный - 1 ) :
- 6 пар виджетов Rectangle , где один прямоугольник пары изменяет свой размер по высоте в зависимости от значения аналогового сигнала , а второй - имеет высоту равную высоте первого при максимальном значении сигнала . Таким образом
  эмитируется динамический столбик . Дополнительно для большей информативности надо вставить внутрь области прямоугольника виджет Text для вывода текущих значений аналоговых каналов .
- 6 виджетов типа Button On/Off для эмуляции управляющих сигналов Вкл. / Выкл.
- 1 виджет типа ScroolBar для эмуляции подачи управляющего аналогового сигнала .

После сохранения созданного интерфейсного окна , вид которого показан в начале главы , можно сконфигурировать в RTWin объект типа cpanel с именем DemoPaneDrv .

#### Шаг 8

Вызвав редактор ресурсов контрольной панели Control Panel Editor , импортируем картинку созданную в Application Builder и описываем необходимые входные и выходные каналы , в соответствии с требованиями нашего проекта .

Для этого в окне редактора панелей вводим :

- 1 входной канал типа Type_byte array[6] для получения данных от драйвера по дискретным каналам ;
- 1 входной канал типа Type_float array [6] - для аналоговых входов .
  Выходных каналов надо ввести
- 6 типа Type_byte - для съема дискретных управляющих сигналов ;
- 1 типа Type_float - для аналогового управляющего сигнала .

После этого в редакторе панелей привязываем каналы к ресурсам виджетов панели , устанавливая однозначное соответствие между значениями данных в канале и соответствующими ресурсами панели отображения для входных каналов и - наоборот для
выходных каналов .
Рисунок показан ниже.

### Шаг 9:Конфигурирование проекта

После создания объекта ObjDrv и панели отображения DemoPaneDrv - надо вставить их в схему проекта при помощи редактора схем и создать все необходимые связи между объектами , что и показано на рисунке .

#### Шаг 10

Необходимо выполнить в редакторе схем пункт Make Application для завершения создания демо - проекта . При успешном выполнении этого шага - проект готов к запуску на выполнение .

#### Шаг 11

Запускаем на выполнение демо - проект прямо из редактора схем , открыв меню Application и выбрав пункт Run .

| В случае отсутствия платы УСО PCL-818L можно использовать эмулятор драйвера drvemul . Для этого в конфигурационном файле Rtstart.cfg в строке на запуск драйвера надо заменить 818L на drvemul . Пример : drvemul -p DemoDrv -n 818L_1 -t 818L

### Пример выполнения демо - проекта

После запуска на выполнение демо-проекта на мониторе появятся два окна . Одно - это панель управления проекта , а второе - окно универсального графического эмулятора драйвера .

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

Окно эмулятора драйвера в режиме эмуляции выходного аналогового канала платы PCL-818L .

Окно эмулятора драйвера в режиме эмуляции входных дискретных каналов платы PCL-818L .

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

Проект DemoDrv поставляется в составе пакета Driver Toolkit и может служить примером создания пользователем собственных приложений .