Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №5.pdf
Скачиваний:
3
Добавлен:
27.05.2023
Размер:
798.9 Кб
Скачать

Лабораторная работа №5. Создание dll библиотек для среды радиотехнического моделирования.

1.1Задание для работы

Создать динамическую библиотеку (dll) с 1 радиотехническим устройством для среды имитационного моделирования Спектр-2.

Устройство должно быть во временной (действительной) области. Проверить работоспособность.

1.2Теоретические сведения

1.2.1 Устройства в Спектр-2

Устройства подключаются к среде Спектр-2 в виде динамических библиотек, расположенных в папке devdll. Каждая библиотека может содержать до 256 устройств.

Устройства могут быть 4 категорий:

1.Временная область (действительные отсчеты)

2.Комплексная область (комплексные отсчеты)

3.Частотная область (комплексные отсчеты)

3. Битовая область (целочисленные отсчеты)

Каждое устройство может содержать определенное количество выходов и входов.

Рисунок 1 Устройства временной области

1.2.2 Структура устройства

Для работы каждого устройства предусмотрено наличие двух структур – структуры с параметрами и рабочей структуры.

lpp - Адрес дополнительной структуры пользователя с параметрами устройства.

(От Long Pointer to Parameters)

Если устройству необходимо хранить свои параметры, то разработчик может использовать этот указатель. Ее форма и размер не играют роли. Уметь работать с ней должно только устройство.

lpw - Адрес данных для работы.

2

(От Long Pointer to Work_data)

Ваше устройство может требовать размещения памяти для своих нужд при работе системы. Вы можете это сделать. После размещения присвойте этому полю указатель на размещенную Вами память. Это может быть все что угодно - массив, Ваша структура, класс, шаблонный объект и т.д. Уметь работать с этим блоком памяти должно только Ваше устройство. Блок памяти размещается при старте системы в функции start удаляется при завершении вычислений в функции stop.

Функционал устройства описывается в классе, который наследуется от базового класса DeviceBase. В котором необходимо переопределить ряд виртуальных методов:

1.Функция init – вызывается при установке устройства на рабочее поле. Инициализирует структуру параметров.

virtual DWORD init(HWND hwnd)

{

LPMultiplicationPARAM mp = static_cast<LPMultiplicationPARAM>(init_device(sizeof(MultiplicationPARAM), 1, 1));

mp->a = 10.0; return 1;

}

2.Функция start – вызывается при нажатии «Старт» (запуске системы). Выделает память под рабочую структуру. Устанавливает её как рабочую структуру устройства. Указывает тактовую функцию устройства.

3.Функция stop – вызывается при нажатии «Стоп» (остановке системы). Освобождает память, выделенную под рабочую структуру устройства.

4.Функция get_name – для возврата имени устройства в дерево устройств.

//Имя кубика, которое отображается в дереве слева.

virtual void get_name(char* name) { set_name(name, "Test_dll"); }

5. Функция get_type – для возврата типа устройства.

//!Установка типа кубика(где он будет лежать) Временной тракт, другие virtual DWORD get_type() { return (DBDEV_ROOT_TIME | DBDEV_TIME_OTHER); }

6.Функция init_pins – инициализация входов и выходов (пинов). Задание типа.

//! Инициализация пинов(ножек) 2 выходных пина,(номер, тип, название) virtual void init_pins(LPDEVPIN in, LPDEVPIN out)

{

init_pin(in[1], SADF_TIME, "Вход", "Отсчеты", 2); init_pin(out[1], SADF_TIME, "Выход", 0, 2);

}

7. Функция help – возвращает информацию о устройстве.

3

//! Правой кнопкой по кубику и выбрать справка. Будет окно с текстом. virtual void help(HWND hwnd)

{

MessageBox(hwnd, "Лабораторная работа №5", "", MB_OK | MB_ICONINFORMATION);

}

1.2.3 Тактовая функция

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

//Тактовая функция умножителя на константу

void __stdcall tact_multiplication(LPDEVPROP dp)

{

//Получения указателя на структуру параметров

LPMultiplicationPARAM lpp = static_cast<LPMultiplicationPARAM> (dp->lpp);

//Получение входного отсчета, умножение на число из параметров и передача его на выход

*dp->pins[3].f_out = lpp->a * dp->pins[1].f_in;

}

1.2.4 Экспортируемые функции

Библиотека должна экспортировать две функции

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

Пример:

#define MAX_DEVS 1

DWORD __stdcall devGetDllInfo( char* info )

{

strcpy(info,"Обработка сигналов системы связи ХХХ"); return MAX_DEVS; // Библиотека содержит 12 устройств

}

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

#define ILS_NULL

7000

#define ILS_MY_1ST_DEVICE 7000

Соседние файлы в предмете Программирование на C++