Интеграция внешних методов объекта C++

Интеграция устаревших методов объекта C++ с помощью Legacy Code Tool.

С помощью Legacy Code Tool можно:

  • Предоставьте спецификацию унаследованной функции.

  • Сгенерируйте 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;

Сгенерируйте S-функцию для симуляции

Чтобы сгенерировать S-функцию C-MEX согласно описанию, предоставленному входным параметром 'def', снова вызовите legacy_code функции () с первым входным набором 'sfcn _ cmex _ generate'. S-функция вызывает устаревшие функции во время симуляции. Исходный код для S-функции находится в файле rtwdemo_sfun_adder_cpp.cpp.

legacy_code('sfcn_cmex_generate', def);

Скомпилируйте сгенерированную S-функцию для симуляции

После того, как вы сгенерируете исходный файл S-функции C-MEX, чтобы скомпилировать 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

Сгенерируйте файл блока TLC для генерации кода

После того, как вы скомпилируете S-функцию и используете ее в симуляции, можно вызвать функцию legacy_code () снова. Установите первый вход на 'sfcn _ tlc _ generate', чтобы сгенерировать блочный файл TLC, который поддерживает генерацию кода через Coder™ Simulink ®. Если файл блока TLC не создан и вы пытаетесь сгенерировать код для модели, которая включает S-функцию, генерация кода прекращается. Файл блока TLC для S-функции: rtwdemo_sfun_adder_cpp.tlc.

legacy_code('sfcn_tlc_generate', def);

Сгенерируйте файл rtwmakecfg.m для генерации кода

После создания файла блока TLC можно вызвать функцию legacy_code () снова. Установите первый вход на 'rtwmakecfg _ generate', чтобы сгенерировать файл rtwmakecfg.m, который поддерживает генерацию кода через Coder™ Simulink ®. Если требуемые исходный код и заголовочные файлы для S-функции находятся не в той же папке, что и S-функция, и вы хотите добавить эти зависимости в make-файл, произведенный во время генерации кода, сгенерируйте файл rtwmakecfg.m.

legacy_code('rtwmakecfg_generate', def);

Сгенерируйте маскированный блок s-function для вызова сгенерированной S-функции

После компиляции источника S-функции C-MEX можно вызвать функцию legacy_code () снова. Установите первый вход на 'slblock _ generate', чтобы сгенерировать блок s-function, который сконфигурирован для вызова этой S-функции. Программа помещает блок в новую модель. Можно скопировать блок в существующую модель.

% legacy_code('slblock_generate', def);

Показать сгенерированное интегрирование с унаследованным кодом

Модель rtwdemo_lct_cpp показывает интегрирование с унаследованным кодом.

open_system('rtwdemo_lct_cpp')
sim('rtwdemo_lct_cpp')

См. также

Похожие темы