Последовательность действий для получения алгоритмов математических процедур из моделей Simulink 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Последовательность действий для получения алгоритмов математических процедур из моделей Simulink



В данном приложении приводится описание:

־ особенностей представления данных в программе Simulink;

־ требований к построению моделей в Simulink;

־ последовательности действий, позволяющей получать содержащиеся в Simulink алгоритмы в виде кода на языке Си, доступном для дальнейшего использования без ядра Simulink.

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

1)  Формат сигнала.

Сигнал может быть трех форматов: Scalar (скаляр), Vector (вектор) и Matrix (матрица). Под скаляром понимается матрица [1;1], под вектором – матрица, имеющая один столбец или одну строку. Размерностью сигнала называют параметры матрицы [x;y], где x – количество строк, а y – количество столбцов матрицы.

В качестве источников сигналов при построении моделей в Simulink необходимо использовать блок из библиотеки Simulink/Ports & Subsystems (или аналогичный блок из библиотеки Simulink/Sourses) – In1. Блоки источников необходимо называть именем In и индексом, соответствующим номеру входа (т.е. первый вход – In1, десятый – In10). Индекс в названии блока всегда должен совпадать с номером блока (устанавливается в Parameters->Port number).

2) Тип элементов сигнала.

Типы данных сигнала, используемые в Simulink, и соответствующие им типы данных в Си приведены в таблице В.1.

Таблица В.1 – Соотношение типов данных сигнала, используемых в Simulink и в Си

Типы данных в Simulink Тип данных в Си
int8_T char
unit8_T, byte_T unsigned char
int16_T short
unit16_T unsigned short
int32_T, int_T, boolean_T int
uint32_T unsigned int
real32_T float
real_T, real64_T  double

 

Параметры блока In1 (меню Parameters, открывающееся при двойном щелчке манипулятора “Мышь”) показаны на рисунке В.1.:

1) Port number – номер входа;

2) Port dimensions (-1 for dynamically sized) – формат сигнала. При использовании формата сигнала скаляр используется значение по умолчанию – “-1”. При использовании формата сигнала вектор необходимо указать длину вектора (например, 5 – строка или столбец из пяти цифр). При использовании формата сигнала матрица необходимо указать размерность матрицы следующим образом [x;y], где x и y – количество строк и столбцов соответственно;

3) Sample time (-1 for inherited) – скорость поступления входных данных (оставить по умолчанию равным “-1”);

4) Show additional parameters – элемент управления Check box, позволяющий задавать дополнительные параметры. При нажатии на него можно изменять следующие параметры:

- Data type – тип данных;

- Signal type – тип сигнала (не должен быть комплексным);

Значения параметров Sampling mode и Interpolate date должны соответствовать значениям по умолчанию.

В качестве приемников сигналов необходимо использовать блок из библиотеки Simulink/Ports & Subsystems (или аналогичный блок из библиотеки Simulink/Sinks) - Out1. Блоки приемников необходимо называть именем Out и индексом, соответствующим номеру выхода (т.е. первый выход – Out1, десятый – Out10). Индекс в названии блока всегда должен совпадать с номером блока (устанавливается в Parameters->Port number). Параметры блока Out1 определяются автоматически на основании параметров выходного сигнала.

Рисунок В.1 – Окно параметров блока In1

На рисунке В.2 представлен пример модели Example, построенной в Simulink, которая имеет один вход (In1) и один выход (Out1). В дальнейшем все действия будут поясняться на примере этой модели.

 

Рисунок В.2 – Пример модели, построенной в Simulink

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

Настройки параметров моделирования в Simulink вызываются командой Simulation Parameters меню Simulation окна модели (рисунок В.3).

Рисунок В.3 – Выбор меню параметров моделирования в Simulink

Вызываемое окно Simulation Parameters включает в себя пять вкладок: Solver (Параметры решения обыкновенных дифференциальных уравнений или Решение ОДУ), Workspace I/O (Импорт и экспорт данных рабочей области), Diagnostics (Диагностика), Advanced (Экспертные настройки) и Real-Time Workshop (Мастерская реального времени). Необходимо изменить настройки первой, четвертой и пятой вкладки, остальные вкладки не влияют на процесс создания кода:

1) В закладке «Solver» (решение ОДУ) необходимо задать параметры моделирования. Нужно установить значение выпадающего списка Solver options\Type в Fixed-step и discrete (no continuous states). Это позволит создавать модели с фиксированным временем обработки данных (см. рисунок В.4временем обработки данных ()с фиксирыванным его построенной модели, нужно произвести следующую последовательность действий:)

Рисунок В.4 – Настройка параметров моделирования

2) Переключиться на закладку Advanced и установить флажок Inline parameters (встраиваемые параметры) в положение «true» (см. рисунок В.5). Это позволяет при генерации алгоритма на языке Си, использовать константы модели в качестве внедряемых в код значений. В результате скорость выполнения создаваемого алгоритма будет увеличиваться.

Рисунок В.5 – Настройка дополнительных параметров

3) На закладке Real-Time Workshop установить значение выпадающего списка Category в Target configuration (целевая конфигурация) (рисунок В.6). Установить флажок Generate code only (Генерировать только код) в положение «true» и нажать на кнопку «Browse…»

Рисунок В.6 – Настройка типа генерируемого кода

4) В списке, расположенном в окне System Target File Browser нужно выбрать grt.tlc c описанием (description) Visual C/C++ Project Makefile only for the «grt» target (рисунок В.7) и подтвердить свой выбор нажатием кнопки «OK». Тем самым мы выберем компилятор, предназначенный для генерации кода созданной модели на языке Си.

Рисунок В.7  – Выбор используемого компилятора

5) Установить значение выпадающего списка Category в General code generation options и установить флажок Inline invariant signals в положение «true» (рисунок В.8).

Рисунок В.8 – Включение «встраиваемых» сигналов    

6) Установить значение выпадающего списка Category в General code appearance options и установить флажок Generate comments в положение «false» (рисунок В.9).

Рисунок В.9 – Отключение комментариев в создаваемом коде

Если созданная модель готова и отлажена, нужно нажать кнопку Generate code (генерировать код) или при необходимости изменений в модели – нажать OK, внести нужные изменения и нажать кнопку Build All  на панели меню Simulink.

После этого происходит запуск Real-Time Workshop, который создает набор файлов, содержащих описание модели Simulink на языке Си. В текущей директории Matlab создается директория с именем, совпадающим с именем модели Simulink. В нее сохраняются файлы, полученные в результате работы Real-Time Workshop.

Выходными файлами Real-Time Workshop являются файлы, содержащие описание модели Simulink на языке Cи. Для модели с именем Example файлы будут иметь следующие названия: Example.h, Example.cpp, Example.mk, Example_data.c, Example_private.h, Example_types.h, modelsources.txt, rtmodel.h, rtw_proj.tmw.

Если все условия построения модели и установки параметров были выполнены правильно, на выходе Real-Time Workshop получается такой же набор файлов, только вместо имени Example, будет находиться имя той модели, из которой создается код.

Для создания на основе имеющегося кода файла, содержащего исходный алгоритм необходимы только шесть файлов:

־ Example.h (заголовочный файл, содержащий объявление всех структур и прототипов всех функций, используемых моделью). В общем виде файл будет обозначаться как Model.h.

־ Example.c (файл содержит функции ввода данных, их обработки и вывода полученных результатов). В общем виде файл будет обозначаться Model.c.

־ Example_data.c (файл со структурой Parameters, которая содержит параметры блоков модели Simulink). В общем виде файл будет обозначаться Model_data.h.

־ Example_private.h (заголовочный файл, содержащий директивы препроцессора, для проверки размеров типов данных). В общем виде файл будет обозначаться Model_ private.h.

־ Example_types.h (заголовочный файл, содержащий особенности использования переопределенных имен переменных). В общем виде файл будет обозначаться Model_ types.h.

־ rtmodel.h (заголовочный файл, содержащий особенности конфигурации модели).

ПРИЛОЖЕНИЕ Г

Пример работы с 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);

}

 

ПРИЛОЖЕНИЕ Д

ПРИЛОЖЕНИЕ Е



Поделиться:


Последнее изменение этой страницы: 2021-03-10; просмотров: 43; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.225.35.81 (0.052 с.)