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

2.5. Проектирование интерфейсов

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

2.5.1. Проектирование внутренних интерфейсов

Основой нашей программы составляет Dll, которая содержит создаваемые и используемые нами математические процедуры. Эта Dll создается программой КМС, верифицируется программой ТМС и используется в программе МОПИ. Далее мы опишем интерфейс нашей Dll.

Dll экспортирует две функции, с помощью которых можно создать экземпляр класса System, который предоставляет доступ к COM-интерфейсу, через который можно использовать содержащуюся в Dll математическую процедуру:

  1. CreateSystem. Функция, создающая в программе экземпляр класса System.

BOOL CreateSystem (System **sys);

Параметры:

sys – указатель на указатель на виртуальный класс System.

Возвращаемое значение - true, если экземпляр класса System создан и false – если нет.

  1. 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();

Функция инициализации модели.

  1. void UnInitialize();

Функция деинициализации модели.

  1. void Operate(LPVOID *pin, LPVOID *pout)

Функция обмена данными с моделью:

pin – указатель на входные значения;

pout – указатель на выходные значения.

  1. void Reset();

Функция приведения внутреннего состояния модели в исходное состояние.

  1. void ModelName(char** MN);

Функция, возвращающая имя модели. MN – строка, содержащая имя модели.

  1. void ModelInfo(char** MI);

Функция, возвращающая описание модели. MI – строка, содержащая описание модели.

  1. void GetNumberInput(int* NumberIn);

Функция, возвращающая количество входов модели. NumberIn – число используемых входов.

  1. void GetNumberOutput(int* NumberOut);

Функция, возвращающая количество выходов модели. NumberOut – число используемых выходов.

  1. void GetInputInfo(unsigned n, rtS* S);

Функция, возвращающая параметры входных сигналов:

n – номер входного сигнала, параметры которого должны быть получены;

S – структура типа rtS, содержащая информацию о входном сигнале, с номером n.

  1. 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

1

unsigned char

2

short

3

unsigned short

4

int

5

unsigned int

6

float

7

double

8

Если возвращаемое значение равно 0, то был задан номер несуществующего сигнала.

Таблица 2.2 – Соответствие форматов сигнала в Simulink значениям элемента FormatSignal структуры rtS

Тип данных в С++

Значения возвращаемые FormatSignal

Scalar

1

Vector

2

Matrix

3

Если возвращаемое значение равно 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