При наличии ПО Embedded Coder ® можно создать общую библиотеку - динамическую библиотеку ссылок Windows ® (.dll), общий объект UNIX ® (.so) или динамическая библиотека Macintosh OS X (.dylib) - из компонента модели. Можно интегрировать общую библиотеку в приложение, работающее на компьютере разработки Windows, UNIX или Macintosh OS X. Использование общих библиотек:
Добавление программного компонента в приложение для моделирования системы
Повторное использование программных модулей среди приложений на компьютере разработчика
Скрытие интеллектуальной собственности, связанной с программным обеспечением, которым вы предоставляете общий доступ поставщикам
При создании общей библиотеки генератор кода экспортирует:
Переменные и сигналы типа ExportedGlobal как данные
Структура модели в реальном времени () в качестве данныхmodel_M
Функции, необходимые для выполнения кода модели
Чтобы создать общую библиотеку из компонента модели и использовать библиотеку, выполните задачи, перечисленные в этой таблице.
| Задача | Действие | Дополнительные сведения |
|---|---|---|
| 1 | Просмотрите оценку внешних признаков кода и требований к интеграции. | |
| 2 | Сконфигурируйте модель для создания кода. | Создание кода, соответствующего внешнему коду и конфигурации модели |
| 3 | Настройте модель для генератора кода, чтобы создать общую библиотеку и инициировать создание кода. | Создание общих библиотек |
| 4 |
Убедитесь, что созданная общая библиотека соответствует требованиям. Например, просмотрите отчет о создании кода и список символов в библиотеке.
| |
| 5 | Используйте общую библиотеку в коде приложения. | Создание кода приложения, использующего созданные общие библиотеки |
| 6 | Скомпилировать и связать код приложения, загружающего и использующего созданную общую библиотеку. | Создание интегрированного кода в среде Simulink |
| 7 | Убедитесь, что исполняемая программа работает так, как ожидалось. |
При конфигурировании модели для генерации кода выберите целевой системный файл. ert_shrlib.tlc.
Создайте модель. Генератор кода создает исходный код для модели и общую библиотечную версию кода. Генератор кода помещает исходный код в папку создания кода и общую библиотеку (.dll, .so, или .dylib ) в текущей рабочей папке. Генератор кода также производит и сохраняет .lib для поддержки неявного связывания.
Этот пример кода приложения создается для примера Интерфейс с имитатором компьютера разработки с помощью общей библиотеки.
Создайте файл заголовка приложения, содержащий объявления типов для внешнего ввода и вывода модели. Например:
#ifndef _APP_MAIN_HEADER_
#define _APP_MAIN_HEADER_
typedef struct {
int32_T Input;
} ExternalInputs_rtwdemo_shrlib;
typedef struct {
int32_T Output;
} ExternalOutputs_rtwdemo_shrlib;
#endif /*_APP_MAIN_HEADER_*/В исходном коде приложения C динамически загрузите общую библиотеку. Используйте условные операторы предварительной обработки для вызова команд, специфичных для платформы. Например:
#if (defined(_WIN32)||defined(_WIN64)) /* WINDOWS */
#include <windows.h>
#define GETSYMBOLADDR GetProcAddress
#define LOADLIB LoadLibrary
#define CLOSELIB FreeLibrary
#else /* UNIX */
#include <dlfcn.h>
#define GETSYMBOLADDR dlsym
#define LOADLIB dlopen
#define CLOSELIB dlclose
#endif
int main()
{
void* handleLib;
...
#if defined(_WIN64)
handleLib = LOADLIB("./rtwdemo_shrlib_win64.dll");
#else #if defined(_WIN32)
handleLib = LOADLIB("./rtwdemo_shrlib_win32.dll");
#else /* UNIX */
handleLib = LOADLIB("./rtwdemo_shrlib.so", RTLD_LAZY);
#endif
#endif
...
return(CLOSELIB(handleLib));
}Из исходного кода приложения C получить доступ к экспортированным данным и функциям, сгенерированным из модели. Код использует крючки для добавления определяемого пользователем кода инициализации, шага и окончания.
int32_T i;
...
void (*mdl_initialize)(boolean_T);
void (*mdl_step)(void);
void (*mdl_terminate)(void);
ExternalInputs_rtwdemo_shrlib (*mdl_Uptr);
ExternalOutputs_rtwdemo_shrlib (*mdl_Yptr);
uint8_T (*sum_outptr);
...
#if (defined(LCCDLL)||defined(BORLANDCDLL))
/* Exported symbols contain leading underscores
when DLL is linked with LCC or BORLANDC */
mdl_initialize =
(void(*)(boolean_T))GETSYMBOLADDR(handleLib ,
"_rtwdemo_shrlib_initialize");
mdl_step =
(void(*)(void))GETSYMBOLADDR(handleLib ,
"_rtwdemo_shrlib_step");
mdl_terminate =
(void(*)(void))GETSYMBOLADDR(handleLib ,
"_rtwdemo_shrlib_terminate");
mdl_Uptr =
(ExternalInputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib ,
"_rtwdemo_shrlib_U");
mdl_Yptr =
(ExternalOutputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib ,
"_rtwdemo_shrlib_Y");
sum_outptr =
(uint8_T*)GETSYMBOLADDR(handleLib , "_sum_out");
#else
mdl_initialize =
(void(*)(boolean_T))GETSYMBOLADDR(handleLib ,
"rtwdemo_shrlib_initialize");
mdl_step =
(void(*)(void))GETSYMBOLADDR(handleLib ,
"rtwdemo_shrlib_step");
mdl_terminate =
(void(*)(void))GETSYMBOLADDR(handleLib ,
"rtwdemo_shrlib_terminate");
mdl_Uptr =
(ExternalInputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib ,
"rtwdemo_shrlib_U");
mdl_Yptr =
(ExternalOutputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib ,
"rtwdemo_shrlib_Y");
sum_outptr =
(uint8_T*)GETSYMBOLADDR(handleLib , "sum_out");
#endif
if ((mdl_initialize &&
mdl_step &&
mdl_terminate &&
mdl_Uptr &&
mdl_Yptr &&
sum_outptr)) {
/* user application
initialization function */
mdl_initialize(1);
/* insert other user defined
application initialization code here */
/* user application
step function */
for(i=0;i<=12;i++){
mdl_Uptr->Input = i;
mdl_step();
printf("Counter out(sum_out):
%d\tAmplifier in(Input):
%d\tout(Output):
%d\n", *sum_outptr, i,
mdl_Yptr->Output);
/* insert other user defined
application step function
code here */
}
/* user application
terminate function */
mdl_terminate();
/* insert other user defined
application termination
code here */
}
else {
printf("Cannot locate the specified
reference(s) in the shared library.\n");
return(-1);
}Создание кода для ert_shrlib.tlc системный целевой файл экспортирует следующие данные:
Переменные и сигналы типа ExportedGlobal
Структура модели в реальном времени (model_M)
Создание кода для ert_shrlib.tlc системный целевой файл поддерживает только язык C (а не C++). При выборе ert_shrlib.tlc, выбор языка недоступен на панели Создание кода (Code Generation) в диалоговом окне Параметры конфигурации (Configuration Parameters).
Чтобы восстановить моделирование модели с помощью созданной общей библиотеки, автор приложения должен поддерживать время между системными вызовами и вызовами функции общей библиотеки в исходном приложении. Время должно быть согласованным, чтобы можно было сравнить результаты моделирования и интеграции. Дополнительные рекомендации по моделированию применяются при создании общей библиотеки из модели, которая включает параметры конфигурации модели Поддержка: непрерывное время и Функция единого вывода/обновления. Дополнительные сведения см. в разделе Зависимости функции одиночного вывода/обновления (Simulink Coder).