Интеграция устаревших методов объектов C++ с помощью инструмента «Устаревший код».
С помощью инструмента «Унаследованный код» можно выполнять следующие действия:
Предоставьте спецификацию устаревшей функции.
Создайте S-функцию C++ MEX, которая вызывает унаследованный код во время моделирования.
Скомпилировать и построить сгенерированную S-функцию для моделирования.
Создайте блочный файл TLC и дополнительный файл rtwmakecfg.m, который вызывает устаревший код во время создания кода.
В качестве аргумента для функций, поставляемых с инструментом Legacy Code Tool, используется определенная структура данных или массив структур. Структура данных инициализируется вызовом функции legacy_code () с использованием «initialize» в качестве первого входа. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Определение унаследованного класса C++ в этом примере:
class adder {
private:
int int_state;
public:
adder();
int add_one(int increment);
int get_val();
};Устаревший исходный код находится в файлах adder_cpp.h и adder_cpp.cpp.
% rtwdemo_sfun_adder_cpp def = legacy_code('initialize'); def.SFunctionName = 'rtwdemo_sfun_adder_cpp'; def.StartFcnSpec = 'createAdder()'; def.OutputFcnSpec = 'int32 y1 = adderOutput(int32 u1)'; def.TerminateFcnSpec = 'deleteAdder()'; def.HeaderFiles = {'adder_cpp.h'}; def.SourceFiles = {'adder_cpp.cpp'}; def.IncPaths = {'rtwdemo_lct_src'}; def.SrcPaths = {'rtwdemo_lct_src'}; def.Options.language = 'C++'; def.Options.useTlcWithAccel = false;
Для генерации C-MEX S-функции в соответствии с описанием, предоставленным входным аргументом «def», снова вызовите функцию legacy_code () с первым входным набором «sfcn _ cmex _ generate». S-функция вызывает унаследованные функции во время моделирования. Исходный код S-функции находится в rtwdemo_sfun_adder_cpp.cpp файла.
legacy_code('sfcn_cmex_generate', def);
После создания исходного файла C-MEX S-функции для компиляции S-функции для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».
legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_adder_cpp
mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples5/tpc56de889/ex06428671', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples5/tp66b2afce_86d9_4640_b52a_2acaaab738b2', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/adder_cpp.cpp')
Building with 'g++'.
MEX completed successfully.
mex('rtwdemo_sfun_adder_cpp.cpp', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples5/tpc56de889/ex06428671', '-cxx', '/tmp/BR2021ad_1584584_202060/publish_examples5/tp66b2afce_86d9_4640_b52a_2acaaab738b2/adder_cpp.o')
Building with 'g++'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_adder_cpp
### Exit
После компиляции S-функции и ее использования в моделировании можно снова вызвать функцию legacy_code (). Задайте для первого входа значение «» sfcn _ tlc _ generate «» для создания файла блока TLC, поддерживающего создание кода с помощью Simulink ® Coder™. Если файл блока TLC не создан и вы пытаетесь создать код для модели, которая включает в себя S-функцию, генерация кода завершается неудачей. Файл блока TLC для S-функции: rtwdemo_sfun_adder_cpp.tlc.
legacy_code('sfcn_tlc_generate', def);
После создания файла блока TLC можно снова вызвать функцию legacy_code (). Установите первый вход в значение rtwmakecfg _ generate, чтобы создать файл rtwmakecfg.m, поддерживающий создание кода с помощью Simulink ® Coder™. Если требуемые исходные и заголовочные файлы для S-функции находятся не в той же папке, что и S-функция, и требуется добавить эти зависимости в make-файл, созданный во время генерации кода, создайте файл rtwmakecfg.m.
legacy_code('rtwmakecfg_generate', def);
После компиляции источника S-функции C-MEX снова можно вызвать функцию legacy_code (). Установите первый вход в «slblock _ generate» для создания маскированного S-функционального блока, который сконфигурирован для вызова этой S-функции. Программа помещает блок в новую модель. Блок можно скопировать в существующую модель.
% legacy_code('slblock_generate', def);
Модель rtwdemo_lct_cpp показывает интеграцию с унаследованным кодом.
open_system('rtwdemo_lct_cpp') sim('rtwdemo_lct_cpp')
