Читайте также:
|
|
Основой нашей программы составляет Dll, которая содержит создаваемые и используемые нами математические процедуры. Эта Dll создается программой КМС, верифицируется программой ТМС и используется в программе МОПИ. Далее мы опишем интерфейс нашей Dll.
Dll экспортирует две функции, с помощью которых можно создать экземпляр класса System, который предоставляет доступ к COM-интерфейсу, через который можно использовать содержащуюся в Dll математическую процедуру:
1) CreateSystem. Функция, создающая в программе экземпляр класса System.
BOOL CreateSystem (System **sys);
Параметры:
sys – указатель на указатель на виртуальный класс System.
Возвращаемое значение - true, если экземпляр класса System создан и false – если нет.
2) DestroySystem. Функция, удаляющая в программе экземпляр класса System.
void DestroySystem(System *sys);
Параметры:
sys – указатель на виртуальный класс System.
Класс System предназначен для управления математической процедурой, содержащейся в Dll:
class System
{
public:
virtual void __stdcall Initialize() = 0;
virtual void __stdcall UnInitialize() = 0;
virtual void __stdcall Operate(LPVOID *pin, LPVOID *pout) = 0;
virtual void __stdcall Reset() = 0;
virtual void __stdcall ModelName(char** MN) = 0;
virtual void __stdcall ModelInfo(char** MI) = 0;
virtual void __stdcall GetNumberInput(int* NumberIn) = 0;
virtual void __stdcall GetNumberOutput(int* NumberOut) = 0;
virtual void __stdcall GetInputInfo(unsigned n, rtS* S) = 0;
virtual void __stdcall GetOutputInfo(unsigned n, rtS* R) = 0;
};
Описание функций класса System:
1) void Initialize();
Функция инициализации модели.
2) void UnInitialize();
Функция деинициализации модели.
3) void Operate(LPVOID *pin, LPVOID *pout)
Функция обмена данными с моделью:
pin – указатель на входные значения;
pout – указатель на выходные значения.
4) void Reset();
Функция приведения внутреннего состояния модели в исходное состояние.
5) void ModelName(char** MN);
Функция, возвращающая имя модели. MN – строка, содержащая имя модели.
6) void ModelInfo(char** MI);
Функция, возвращающая описание модели. MI – строка, содержащая описание модели.
7) void GetNumberInput(int* NumberIn);
Функция, возвращающая количество входов модели. NumberIn – число используемых входов.
8) void GetNumberOutput(int* NumberOut);
Функция, возвращающая количество выходов модели. NumberOut – число используемых выходов.
9) void GetInputInfo(unsigned n, rtS* S);
Функция, возвращающая параметры входных сигналов:
n – номер входного сигнала, параметры которого должны быть получены;
S – структура типа rtS, содержащая информацию о входном сигнале, с номером n.
10) void GetOutputInfo(unsigned n, rtS* R);
Функция, возвращающая параметры выходных сигналов:
n – номер выходного сигнала, параметры которого должны быть получены;
S – структура типа rtS, содержащая информацию о выходном сигнале, с номером n.
В экспортируемых функциях используется структура rtS, предназначенная для получения из Dll параметров входных и выходных сигналов. Она используется как возвращаемое значение в функциях GetInputInfo и GetOutputInfo.
rtS {
int TypeSignal;
int FormatSignal;
int Size [2];
};
Структура, содержащая информацию о входных сигналах:
־ TypeSignal – тип используемого сигнала (в соответствии с таблицей 2.1);
־ FormatSignal – формат используемого сигнала (в соответствии с таблицей 2.2);
־ Size [2] – массив, содержащий информацию о размерности сигнала, первый элемент обозначает количество строк, второй – столбцов. При формате данных Scalar массив имеет размерность [1;1]. При формате данных Vector одно из значений должно быть равным 1, а другое - быть большим 1. При формате данных Matrix – оба элемента должны быть больше 1. Если массив заполнен нулями, значит, задан несуществующий номер входа или выхода. Выравнивание для структуры равно 8 байтам.
Таблица 2.1 – Соответствие типов данных сигнала в Simulink значениям элемента TypeSignal структуры rtS
Тип данных в С++ | Значения, возвращаемые TypeSignal |
char | |
unsigned char | |
short | |
unsigned short | |
int | |
unsigned int | |
float | |
double |
Если возвращаемое значение равно 0, то был задан номер несуществующего сигнала.
Таблица 2.2 – Соответствие форматов сигнала в Simulink значениям элемента FormatSignal структуры rtS
Тип данных в С++ | Значения возвращаемые FormatSignal |
Scalar | |
Vector | |
Matrix |
Если возвращаемое значение равно 0, то был задан номер несуществующего сигнала.
Для доступа к входным и выходным значениям математической процедуры необходимо знать принцип размещения выходных значений Dll в памяти. Размещение элементов вектора в памяти. Первая строчка – адреса, вторая – элементы.
+ se*1 … + se*(N-1)
a | a | … | a |
где , + se*1, …, + se*(N-1)– адреса элементов вектора;
N – размер вектора;
se – размер одного элемента вектора;
a , a , …, a - элементы вектора.
Размещение элементов матрицы [N;M] в памяти. Первая строчка – адреса, вторая – элементы.
+ 1*se … +(M-1)*se
a | a | … | a |
+ 1*M*se + 1*M*se+1*se … + 1*M*se+(M-1)*se
a | a | … | a |
………………………………………………………
+ (N-1)*M*se + (N-1)*M*se+1*se … + (N-1)*M*se+(M-1)*se
a | a | … | a |
где , + 1*se, …, +(M-1)*se, …, + (N-1)*M*se+(M-1)*se – адреса элементов матрицы;
M – количество столбцов матрицы;
N – количество строк матрицы;
se – размер одного элемента матрицы;
a , a , …, a , … a - элементы матрицы.
Например, матрица размером [2;2] должна быть размещена в памяти следующим образом:
+1 +2 +3
a | a | a | a |
1 строка 2 строка
+(1*M+0)*se
+(0*M+1)*se +(1*M+1)*se
Теперь рассмотрим механизм обмена данными с Dll. Для передачи данных в Dll и приема данных в систему используется функция Operate. В качестве ее параметров используется указатель на массив указателей на первые элементы передаваемых сигналов. В качестве примера на рисунке 2.7 показана передача данных в Dll c тремя входами разных форматов (1-скаляр, 2-вектор, 3-матрица). Пример работы с Dll приведен в приложении Г.
Рисунок 2.7 – Механизм обмена данными с Dll
Дата добавления: 2015-11-14; просмотров: 38 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Обоснование выбора средств разработки | | | Проектирование пользовательского интерфейса |