Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом Картавенко М.В. End.doc
Скачиваний:
31
Добавлен:
09.12.2018
Размер:
1.71 Mб
Скачать

Приложение г Пример работы с Dll, содержащей математическую процедуру обработки данных

Пример написан на языке С++. В качестве примера показан файл с именем Test.cpp. Dll имеет 3 входа (1 – скалярный, 2 –векторный [3;1], 3- матричный [4;2]) и 3 выхода (1 – скалярный, 2 –векторный [3;1], 3- матричный [4;2]). Все передаваемые значения имеют тип double.

#include "system.h" //Файл с виртуальным классом System

typedef BOOL (__stdcall* LPFNCREATE)(System **);

typedef void (__stdcall* LPFNDESTROY)(System *);

void main()

{

LPFNCREATE CreateSystem = 0;

LPFNDESTROY DestroySystem = 0;

HINSTANCE hDLL;

hDLL = LoadLibrary("Test"); //Загрузка Dll

if (!hDLL)

{

cout << "Cannot load library"<<endl;

return 0;

}

//Подключение функций

CreateSystem = (LPFNCREATE)GetProcAddress(hDLL,"CreateSystem");

DestroySystem = (LPFNDSTROY)GetProcAddress(hDLL,"DestroySystem");

if (!CreateSystem)

{

cout << "Cannot get CreateSystem pinter"<<endl;

FreeLibrary(hDLL);

return 0;

}

if (!DestroySystem)

{

cout << "Cannot get DestroySystem printer"<<endl;

FreeLibrary(hDLL);

return 0;

}

System *psys=0;

BOOL res = CreateSystem(&psys); //Создание класса System

if (!res)

cout <<"cannot create system!"<<endl;

rtS st;

rtS st2;

char *InfoName;

char *ModelInfo;

psys->ModelName(&InfoName); //Получение имени Dll

cout<< InfoName <<endl;

psys->ModelInfo(&ModelInfo); //Получение информации о модели

cout<< ModelInfo<<"\n"<<endl;

int ni;

int no;

psys->GetNumberInput(&ni); //Получение количества входов

psys->GetNumberOutput(&no); //Получение количества выходов

cout<<"Input"<<" "<<ni <<endl;

cout<<"Output"<<" "<<no <<endl;

psys->GetInputInfo(1, &st); //Параметры 1-го входа

psys->GetOutputInfo(1, &st2); //Параметры 1-го выхода

psys->Initialize(); //Инициализация модели

double Out1; //Скаляр

double Out2[3]; //Вектор

double Out3[4*2]; //Матрица

double In1[3] [1] = {2,2,2};

double In2[3] [3] = {{1,2,3},{4,5,6},{7,8,9}};

double In3[3] [8] = {{2,3,3,4,1,5,2,6}, {11,12,13,14,15,16,17,18}, {21,22,23,24,25,26,27,28}};

LPVOID Op[3];

LPVOID Lp[3];

for (int i=0; i<3; i++)

{

Lp[0] = (LPVOID)&In1[i];

Lp[1] = (LPVOID)&In2[i];

Lp[2] = (LPVOID)&In3[i];

Op[0] = (LPVOID)&Out1;

Op[1] = (LPVOID)&Out2[0];

Op[2] = (LPVOID)&Out3[0];

psys->Operate(&Lp[0],&Op[0]);

}

psys->UnInitialize();

DestroySystem(psys);

FreeLibrary(hDLL);

}

Приложение д

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

Для верификации Dll нужно создать набор тестовых файлов. Они используются программой для сравнения данных, получаемых при работе математической процедуры в Simulink и при работе этой же процедуры в Dll. Результатом работы программы ТМС является сообщение о том, правильно или неправильно работает алгоритм в Dll.

Для создания эталонных файлов необходимо построить тестовую модель. Тестовая модель создается из исходной модели путем изменения параметров модели Simulink:

  1. к каждому блоку внешнего источника сигнала In1 подключается блок From Workspace из библиотеки Simulink/Sourses. Имя каждого блока From Workspace должно совпадать с именем блока In1, к которому он подключен;

  2. в качестве источников сигналов вместо блоков In1 из Simulink/Ports & Subsystems используется любой блок источника дискретных сигналов из библиотеки Simulink/Sourses;

  3. в качестве блока приемников сигналов вместо блоков Out1 из Simulink/Ports & Subsystems используется блок From Workspace из библиотеки Simulink/Sourses. Имя каждого блока From Workspace должно совпадать с именем блока Out1, вместо которого он подключен;

  4. в параметрах всех блоков From Workspace в выпадающем списке Save format должно быть установлено значение Array.

Примеры исходной и тестовой моделей приведены на рисунках Е.1 и Е.2.

Рисунок Е.1 – Исходная модель

Рисунок Е.2 – Тестовая модель

После того, как тестовая модель была построена, ее нужно запустить на выполнение. В результате работы модели в рабочем пространстве Matlab (Workspace) будут созданы переменные с именами, соответствующими именам источников и приемников сигналов. После этого в командном окне (Command window) нужно ввести переменные varIn и varOut, значения которых должны быть равны количеству входных и выходных сигналов соответственно (в примерах на рисунках 5 и 6 varIn=3 и varOut=3). Затем нужно запустить на выполнение файл Save_signal.m командой run Save_signal в командном окне Matlab.

В результате в текущей директории Matlab будут созданы тестовые файлы для Dll. Количество файлов равно количеству входных и выходных сигналов в Dll, а имена совпадают с именами входных (In1.kcm, In2.kcm,…) и выходных (Out1.kcm, Out2.kcm,…) сигналов.

Тестовые файлы с расширением kcm записываются в бинарном виде и имеют следующую структуру:

  1. идентификатор "Input_signal" для файлов In и "Output_signal" для файлов Out (тип char). Идентификатор занимает 12 байт для файлов In и 13 байт для файлов Out;

  2. размер заголовка (тип double) – 8 байт;

  3. версия тестового файла (тип double) – 8 байт;

  4. количество данных в файле (тип double) – 8 байт;

  5. формат сигнала (тип double) – 8 байт;

  6. размерность, число строк (тип double) – 8 байт;

  7. размерность, число столбцов (тип double) – 8 байт;

  8. тип элементов данных (тип double) – 8 байт;

  9. шаг моделирования (тип double) – 8 байт;

  10. записываемые данные.

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

1 Программное средство – объект, состоящий из программ, процедур, правил, а также, если предусмотрено, сопутствующих им документации и данных, относящихся к функционированию системы обработки информации (ГОСТ 28806-90).

1 Получаемые значения могут называться «наблюдениями», «наблюдаемыми значениями», «индивидуальными показателями» и т.д.

1 dynamic-link library – динамически компонуемая библиотека

1 Будем различать психолога создающего математические процедуры (проектировщик системы) и психолога, использующего уже готовые математические процедуры (пользователь системы).

1 Эти программы необходимы для создания Dll с алгоритмами математической обработки данных, при использовании уже созданных Dll эти программы не требуются

92