exponenta event banner

Примеры устаревших инструментов кода

Для создания полностью встроенных C MEX S-функций для устаревшего или пользовательского кода можно использовать инструмент кода Simulink ® Legacy Code Tool. S-функции оптимизированы для встраиваемых компонентов, таких как драйверы устройств и таблицы поиска, и они вызывают существующие функции C или C++. В этих примерах показано, как использовать устаревший инструмент кода для интеграции различных внешних функций.

Интеграция внешних функций C, передающих входные аргументы по значению и адресу

В этом примере показано, как использовать устаревший инструмент кода для интеграции устаревших функций C, которые передают свои входные аргументы по значению в зависимости от адреса.

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из прежних версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототипы унаследованных функций, вызываемых в этом примере:

  • FLT filterV1 (конст-сигнал FLT, конст-сигнал FLT prevSignal, конст-коэффициент усиления FLT)

  • FLT filterV2 (сигнал const FLT *, сигнал const FLT prevSignal, коэффициент усиления const FLT)

FLT - это typedef для плавания. Устаревший исходный код находится в файлах your_types.h, myfilter.h, filterV1.c и filterV2.c.

Обратите внимание на разницу в OutputFcnSpec, определенную в двух структурах; первый случай указывает, что первый входной аргумент передается по значению, а второй - по указателю.

defs = [];

% rtwdemo_sfun_filterV1
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_filterV1';
def.OutputFcnSpec = 'single y1 = filterV1(single u1, single u2, single p1)';
def.HeaderFiles   = {'myfilter.h'};
def.SourceFiles   = {'filterV1.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

% rtwdemo_sfun_filterV2
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_filterV2';
def.OutputFcnSpec = 'single y1 = filterV2(single u1[1], single u2, single p1)';
def.HeaderFiles   = {'myfilter.h'};
def.SourceFiles   = {'filterV2.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

Создание S-функций для моделирования

Для генерации C-MEX S-функций в соответствии с описанием, предоставленным входным аргументом «defs», вызовите функцию legacy_code () снова с первым входным набором «sfcn _ cmex _ generate». S-функции вызывают унаследованные функции в моделировании. Исходный код S-функций находится в файлах rtwdemo_sfun_filterV1.c и rtwdemo_sfun_filterV2.c.

legacy_code('sfcn_cmex_generate', defs);

Компиляция сгенерированных S-функций для моделирования

После создания исходных файлов C-MEX S-функций для компиляции S-функций для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', defs);
### Start Compiling rtwdemo_sfun_filterV1
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex19632214', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp10ea571f_5466_40d8_bea0_ec5d12c6970d', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/filterV1.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_filterV1.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex19632214', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp10ea571f_5466_40d8_bea0_ec5d12c6970d/filterV1.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_filterV1
### Exit

### Start Compiling rtwdemo_sfun_filterV2
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex19632214', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp3cbff89f_0f8d_41c1_822e_7d45e8bded4b', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/filterV2.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_filterV2.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex19632214', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp3cbff89f_0f8d_41c1_822e_7d45e8bded4b/filterV2.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_filterV2
### Exit

Создание файлов блоков TLC для создания кода

После компиляции S-функций и их использования в моделировании можно снова вызвать функцию legacy_code () с первым входным набором «sfcn _ tlc _ generate» для создания файлов блоков TLC. Файлы блоков указывают, как созданный код для модели вызывает устаревший код. Если файлы блоков TLC не генерируются и вы пытаетесь создать код для модели, включающей S-функции, генерация кода завершается неудачей. Файлы блоков TLC для S-функций являются rtwdemo_sfun_filterV1.tlc и rtwdemo_sfun_filterV2.tlc.

legacy_code('sfcn_tlc_generate', defs);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', defs);

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

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

legacy_code('slblock_generate', defs);

Показать созданную интеграцию с устаревшим кодом

В rtwdemo_lct_filter модели показана интеграция модели с унаследованным кодом. Подсистема StartFilter служит в качестве кабеля для вызовов унаследованных C-функций через генерацию S-функций, с единичными задержками, служащими для хранения предыдущих выходных значений.

open_system('rtwdemo_lct_filter')
open_system('rtwdemo_lct_filter/TestFilter')
sim('rtwdemo_lct_filter')

Интеграция внешних функций C, передающих выходной аргумент в качестве возвращаемого аргумента

В этом примере показано, как использовать инструмент Legacy Code Tool для интеграции унаследованных функций C, которые передают свои выходные данные в качестве возвращаемого аргумента.

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из предыдущих версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототип устаревших функций, вызываемых в этом примере:

FLT gainScalar (конст. FLT в, конст. усиление FLT)

FLT - это typedef для плавания. Устаревший исходный код находится в файлах your_types.h, gain.h и gainScalar.c.

% rtwdemo_sfun_gain_scalar
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_gain_scalar';
def.OutputFcnSpec = 'single y1 = gainScalar(single u1, single p1)';
def.HeaderFiles   = {'gain.h'};
def.SourceFiles   = {'gainScalar.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

Создание S-функции для моделирования

Для генерации C-MEX S-функции в соответствии с описанием, предоставленным входным аргументом «def», снова вызовите функцию legacy_code () с первым входным набором «sfcn _ cmex _ generate». S-функция вызывает унаследованные функции во время моделирования. Исходный код S-функции находится в rtwdemo_sfun_gain_scalar.c файла.

legacy_code('sfcn_cmex_generate', def);

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

После создания исходного файла C-MEX S-функции для компиляции S-функции для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_gain_scalar
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex09148220', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tpf131ed4a_0f1b_4580_8b13_aaa37bac7e3b', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_gain_scalar.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex09148220', '/tmp/BR2021ad_1584584_202060/publish_examples4/tpf131ed4a_0f1b_4580_8b13_aaa37bac7e3b/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_gain_scalar
### Exit

Создание файла блока TLC для создания кода

После компиляции S-функции и ее использования в моделировании можно снова вызвать функцию legacy_code () с первым входным набором «sfcn _ tlc _ generate» для создания файла блока TLC. В файле блока указывается, как генерируемый код для модели вызывает унаследованный код. Если не создать файл блока TLC и попытаться создать код для модели, включающей S-функцию, создание кода завершится неудачей. Файл блока TLC для S-функции: rtwdemo_sfun_gain_scalar.tlc.

legacy_code('sfcn_tlc_generate', def);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', def);

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

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

legacy_code('slblock_generate', def);

Показать созданную интеграцию с устаревшим кодом

В rtwdemo_lct_gain модели показана интеграция модели с унаследованным кодом. Подсистема StartGain служит в качестве кабеля для вызова унаследованной функции C через генерирующую S-функцию.

open_system('rtwdemo_lct_gain')
open_system('rtwdemo_lct_gain/TestGain')
sim('rtwdemo_lct_gain')

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

Интеграция устаревших методов объектов 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;

Создание S-функции для моделирования

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

legacy_code('sfcn_cmex_generate', def);

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

После создания исходного файла 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

Создание файла блока TLC для создания кода

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

legacy_code('sfcn_tlc_generate', def);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', def);

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

После компиляции источника 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')

Интеграция внешних функций C, передающих входные и выходные аргументы в качестве параметров с типом данных с фиксированной точкой

Интеграция унаследованных функций C, которые передают свои входные и выходные данные, с помощью параметров фиксированного типа данных с помощью инструмента «Унаследованный код».

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из предыдущих версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототип устаревших функций, вызываемых в этом примере:

myFixpt timesS16 (const myFixpt in1, const myFixpt in2, const uint8_T fracLength)

myFixpt логически является фиксированным типом данных, который физически является typedef 16-битным целым числом:

myFixpt = Simulink.NumericType;
myFixpt.DataTypeMode = 'Fixed-point: binary point scaling';
myFixpt.Signed = true;
myFixpt.WordLength = 16;
myFixpt.FractionLength = 10;
myFixpt.IsAlias = true;
myFixpt.HeaderFile = 'timesFixpt.h';

Исходный код из прежних версий находится в файлах startFixpt.h и timesS16.c.

% rtwdemo_sfun_gain_fixpt
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_gain_fixpt';
def.OutputFcnSpec = 'myFixpt y1 = timesS16(myFixpt u1, myFixpt p1, uint8 p2)';
def.HeaderFiles   = {'timesFixpt.h'};
def.SourceFiles   = {'timesS16.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

Создание S-функции для моделирования

Для генерации C-MEX S-функции в соответствии с описанием, предоставленным входным аргументом «def», снова вызовите функцию legacy_code () с первым входным набором «sfcn _ cmex _ generate». S-функция вызывает унаследованные функции во время моделирования. Исходный код S-функции находится в rtwdemo_sfun_gain_fixpt.c файла.

legacy_code('sfcn_cmex_generate', def);

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

После создания исходного файла C-MEX S-функции для компиляции S-функции для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_gain_fixpt
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex05928773', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tpffa46896_ae8c_46b0_bf61_6f4e5d3e21e6', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/timesS16.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_gain_fixpt.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex05928773', '/tmp/BR2021ad_1584584_202060/publish_examples4/tpffa46896_ae8c_46b0_bf61_6f4e5d3e21e6/timesS16.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_gain_fixpt
### Exit

Создание файла блока TLC для создания кода

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

legacy_code('sfcn_tlc_generate', def);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', def);

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

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

legacy_code('slblock_generate', def);

Показать созданную интеграцию с устаревшим кодом

В rtwdemo_lct_fixpt_params модели показана интеграция модели с унаследованным кодом. Подсистема SunFixpt служит в качестве электрического жгута для вызова унаследованной функции C через сгенерированную S-функцию.

open_system('rtwdemo_lct_fixpt_params')
open_system('rtwdemo_lct_fixpt_params/TestFixpt')
sim('rtwdemo_lct_fixpt_params')

Интеграция внешних функций C, передающих входные и выходные аргументы в виде сигналов с фиксированным типом данных

В этом примере показано, как использовать инструмент Legacy Code Tool для интеграции унаследованных функций C, которые передают свои входные и выходные данные с использованием параметров типа данных с фиксированной точкой.

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из прежних версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототип устаревших функций, вызываемых в этом примере:

myFixpt timesS16 (const myFixpt in1, const myFixpt in2, const uint8_T fracLength)

myFixpt логически является типом данных с фиксированной точкой, который физически является typedef 16-битным целым числом:

myFixpt = Simulink.NumericType;
myFixpt.DataTypeMode = 'Fixed-point: binary point scaling';
myFixpt.Signed = true;
myFixpt.WordLength = 16;
myFixpt.FractionLength = 10;
myFixpt.IsAlias = true;
myFixpt.HeaderFile = 'timesFixpt.h';

Исходный код из прежних версий находится в файлах startFixpt.h и timesS16.c.

% rtwdemo_sfun_times_s16
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_times_s16';
def.OutputFcnSpec = 'myFixpt y1 = timesS16(myFixpt u1, myFixpt u2, uint8 p1)';
def.HeaderFiles   = {'timesFixpt.h'};
def.SourceFiles   = {'timesS16.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

Создание S-функции для моделирования

Для генерации C-MEX S-функции в соответствии с описанием, предоставленным входным аргументом «def», снова вызовите функцию legacy_code () с первым входным набором «sfcn _ cmex _ generate». S-функция вызывает унаследованные функции во время моделирования. Исходный код S-функции находится в rtwdemo_sfun_times_s16.c файла.

legacy_code('sfcn_cmex_generate', def);

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

После создания исходного файла C-MEX S-функции для компиляции S-функции для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_times_s16
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex96454812', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tpf321327e_a855_44ec_977a_4ef16c8c0f3d', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/timesS16.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_times_s16.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex96454812', '/tmp/BR2021ad_1584584_202060/publish_examples4/tpf321327e_a855_44ec_977a_4ef16c8c0f3d/timesS16.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_times_s16
### Exit

Создание файла блока TLC для создания кода

После компиляции S-функции и ее использования в моделировании можно снова вызвать функцию legacy_code () с первым входным набором «sfcn _ tlc _ generate» для создания файла блока TLC. В файле блока указывается, как генерируемый код для модели вызывает унаследованный код. Если не создать файл блока TLC и попытаться создать код для модели, включающей S-функцию, создание кода завершится неудачей. Файл блока TLC для S-функции: rtwdemo_sfun_times_s16.tlc.

legacy_code('sfcn_tlc_generate', def);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', def);

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

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

legacy_code('slblock_generate', def);

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

В rtwdemo_lct_fixpt_signals модели показана интеграция модели с унаследованным кодом. Подсистема SunFixpt служит в качестве электрического жгута для вызова унаследованной функции C через сгенерированную S-функцию.

open_system('rtwdemo_lct_fixpt_signals')
open_system('rtwdemo_lct_fixpt_signals/TestFixpt')
sim('rtwdemo_lct_fixpt_signals')

Интеграция внешних функций C с постоянной памятью для конкретного экземпляра

Интеграция устаревших функций C, использующих постоянную память для конкретного экземпляра, с помощью инструмента Legacy Code Tool.

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из прежних версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототипы унаследованных функций, вызываемых в этом примере:

void memory_bus_init (COUNTERBUS * mem, int32_T upper_sat, int32_T lower_sat);

пустота memory_bus_step (COUNTERBUS *вход, COUNTERBUS *мадам, COUNTERBUS *продукция);

mem является постоянной памятью для конкретного экземпляра для применения задержки на один шаг интеграции. COUNTERBUS - это тип структуры, определенный в counterbus.h и реализованный с объектом Simulink.Bus в базовой рабочей области. Устаревший исходный код находится в файлах memory_bus.h и memory_bus.c.

evalin('base','load rtwdemo_lct_data.mat')

% rtwdemo_sfun_work
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_work';
def.InitializeConditionsFcnSpec = ...
    'void memory_bus_init(COUNTERBUS work1[1], int32 p1, int32 p2)';
def.OutputFcnSpec = ...
    'void memory_bus_step(COUNTERBUS u1[1], COUNTERBUS work1[1], COUNTERBUS y1[1])';
def.HeaderFiles   = {'memory_bus.h'};
def.SourceFiles   = {'memory_bus.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

Создание S-функции для моделирования

Для генерации C-MEX S-функции в соответствии с описанием, предоставленным входным аргументом «def», снова вызовите функцию legacy_code () с первым входным набором «sfcn _ cmex _ generate». S-функция вызывает унаследованные функции во время моделирования. Исходный код S-функции находится в rtwdemo_sfun_work.c файла.

legacy_code('sfcn_cmex_generate', def);

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

После создания исходного файла C-MEX S-функции для компиляции S-функции для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_work
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex38707886', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tpfe80f8c8_ce62_44ee_be3d_f75bd74a70a1', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/memory_bus.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_work.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex38707886', '/tmp/BR2021ad_1584584_202060/publish_examples4/tpfe80f8c8_ce62_44ee_be3d_f75bd74a70a1/memory_bus.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_work
### Exit

Создание файла блока TLC для создания кода

После компиляции S-функции и ее использования в моделировании можно снова вызвать функцию legacy_code () с первым входным набором «sfcn _ tlc _ generate» для создания файла блока TLC. В файле блока указывается, как генерируемый код для модели вызывает унаследованный код. Если не создать файл блока TLC и попытаться создать код для модели, включающей S-функцию, создание кода завершится неудачей. Файл блока TLC для S-функции: rtwdemo_sfun_work.tlc.

legacy_code('sfcn_tlc_generate', def);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', def);

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

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

legacy_code('slblock_generate', def);

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

В rtwdemo_lct_work модели показана интеграция модели с унаследованным кодом. Подсистема memory_bus служит в качестве электрического жгута для вызова унаследованной функции C.

open_system('rtwdemo_lct_work')
open_system('rtwdemo_lct_work/memory_bus')
sim('rtwdemo_lct_work')

Интеграция внешних функций C, использующих аргументы структуры

Интеграция устаревших функций C со структурными аргументами, использующими шины Simulink ®, с устаревшим инструментом кода.

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из прежних версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототип устаревших функций, вызываемых в этом примере:

counterbusFcn (COUNTERBUS * u1, int32_T u2, COUNTERBUS * y1, int32_T * y2)

COUNTERBUS - это тип структуры, определенный в counterbus.h и реализованный с объектом Simulink.Bus в базовой рабочей области. Устаревший исходный код находится в файлах counterbus.h и counterbus.c.

evalin('base','load rtwdemo_lct_data.mat')

% rtwdemo_sfun_counterbus
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_counterbus';
def.OutputFcnSpec = ...
    'void counterbusFcn(COUNTERBUS u1[1], int32 u2, COUNTERBUS y1[1], int32 y2[1])';
def.HeaderFiles   = {'counterbus.h'};
def.SourceFiles   = {'counterbus.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

Создание S-функции для моделирования

Для генерации C-MEX S-функции в соответствии с описанием, предоставленным входным аргументом «def», снова вызовите функцию legacy_code () с первым входным набором «sfcn _ cmex _ generate». S-функция вызывает унаследованные функции во время моделирования. Исходный код S-функции находится в rtwdemo_sfun_counterbus.c файла.

legacy_code('sfcn_cmex_generate', def);

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

После создания исходного файла C-MEX S-функции для компиляции S-функции для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_counterbus
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex90330074', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp1e49f975_722b_4ada_9d1a_36476df7170d', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/counterbus.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_counterbus.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex90330074', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp1e49f975_722b_4ada_9d1a_36476df7170d/counterbus.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_counterbus
### Exit

Создание файла блока TLC для создания кода

После компиляции S-функции и ее использования в моделировании можно снова вызвать функцию legacy_code () с первым входным набором «sfcn _ tlc _ generate» для создания файла блока TLC. В файле блока указывается, как генерируемый код для модели вызывает унаследованный код. Если не создать файл блока TLC и попытаться создать код для модели, включающей S-функцию, создание кода завершится неудачей. Файл блока TLC для S-функции: rtwdemo_sfun_counterbus.tlc.

legacy_code('sfcn_tlc_generate', def);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', def);

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

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

legacy_code('slblock_generate', def);

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

В rtwdemo_lct_bus модели показана интеграция модели с унаследованным кодом. Подсистема StartCounter служит в качестве кабеля для вызова унаследованной функции C.

open_system('rtwdemo_lct_bus')
open_system('rtwdemo_lct_bus/TestCounter')
sim('rtwdemo_lct_bus')

Интеграция внешних функций C, передающих входные и выходные аргументы в виде сигналов со сложными данными

Интеграция унаследованных функций C с использованием сложных сигналов с помощью инструмента «Унаследованный код».

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из предыдущих версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототип устаревших функций, вызываемых в этом примере:

void cplx_gain (creal_T * вход, creal_T * усиление, creal_T * выход);

creal_T - комплексное представление двойника. Устаревший исходный код находится в файлах cplxgain.h и cplxgain.c.

% rtwdemo_sfun_gain_scalar
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_cplx_gain';
def.OutputFcnSpec = ...
    ['void cplx_gain(complex<double> u1[1], '...
    'complex<double> p1[1], complex<double> y1[1])'];
def.HeaderFiles   = {'cplxgain.h'};
def.SourceFiles   = {'cplxgain.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

Создание S-функции для моделирования

Для генерации C-MEX S-функции в соответствии с описанием, предоставленным входным аргументом «def», снова вызовите функцию legacy_code () с первым входным набором «sfcn _ cmex _ generate». S-функция вызывает унаследованные функции во время моделирования. Исходный код S-функции находится в rtwdemo_sfun_cplx_gain.c файла.

legacy_code('sfcn_cmex_generate', def);

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

После создания исходного файла C-MEX S-функции для компиляции S-функции для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_cplx_gain
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex97344681', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp4230a205_46c4_40d4_8429_7e362a18bd8a', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/cplxgain.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_cplx_gain.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex97344681', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp4230a205_46c4_40d4_8429_7e362a18bd8a/cplxgain.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_cplx_gain
### Exit

Создание файла блока TLC для создания кода

После компиляции S-функции и ее использования в моделировании можно снова вызвать функцию legacy_code () с первым входным набором «sfcn _ tlc _ generate» для создания файла блока TLC. В файле блока указывается, как генерируемый код для модели вызывает унаследованный код. Если не создать файл блока TLC и попытаться создать код для модели, включающей S-функцию, создание кода завершится неудачей. Файл блока TLC для S-функции: rtwdemo_sfun_cplx_gain.tlc.

legacy_code('sfcn_tlc_generate', def);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', def);

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

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

legacy_code('slblock_generate', def);

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

В rtwdemo_lct_cplxgain модели показана интеграция модели с унаследованным кодом. Подсистема complex_gain служит в качестве электрического жгута для вызова унаследованной функции C посредством генерации S-функции.

if isempty(find_system('SearchDepth',0,'Name','rtwdemo_lct_cplxgain'))
    open_system('rtwdemo_lct_cplxgain')
    open_system('rtwdemo_lct_cplxgain/complex_gain')
    sim('rtwdemo_lct_cplxgain')
end

Интеграция внешних функций C, передающих аргументы, унаследованные измерения

В этом примере показано, как использовать инструмент Legacy Code Tool для интеграции унаследованных функций C, аргументы которых имеют унаследованные измерения.

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из предыдущих версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототипы унаследованных функций, вызываемых в этом примере:

  • void mat_add (real_T * u1, real_T * u2, int32_T nbRows, int32_T nbCols, real_T * y1)

  • пустота mat_mult (real_T * u1, real_T * u2, int32_T nbRows1, int32_T nbCols1, int32_T nbCols2, real_T * y1)

real_T - это typedef для удвоения, а int32_T - это typedef для 32-разрядного целого числа. Устаревший исходный код находится в файлах mat_ops.h и mat_ops.c.

defs = [];

% rtwdemo_sfun_mat_add
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_mat_add';
def.OutputFcnSpec = ['void mat_add(double u1[][], double u2[][], ' ...
                   'int32 u3, int32 u4, double y1[size(u1,1)][size(u1,2)])'];
def.HeaderFiles   = {'mat_ops.h'};
def.SourceFiles   = {'mat_ops.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

% rtwdemo_sfun_mat_mult
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_mat_mult';
def.OutputFcnSpec =  ['void mat_mult(double u1[p1][p2], double u2[p2][p3], '...
                   'int32 p1, int32 p2, int32 p3, double y1[p1][p3])'];
def.HeaderFiles   = {'mat_ops.h'};
def.SourceFiles   = {'mat_ops.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

Создание S-функций для моделирования

Для генерации C-MEX S-функций в соответствии с описанием, предоставленным входным аргументом «defs», вызовите функцию legacy_code () снова с первым входным набором «sfcn _ cmex _ generate». S-функции вызывают унаследованные функции во время моделирования. Исходный код S-функции находится в файлах rtwdemo_sfun_mat_add.c и rtwdemo_sfun_mat_mult.c.

legacy_code('sfcn_cmex_generate', defs);

Компиляция сгенерированных S-функций для моделирования

После создания исходных файлов C-MEX S-функций для компиляции S-функций для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', defs);
### Start Compiling rtwdemo_sfun_mat_add
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex89794148', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp49ef0950_7fe2_4ff0_b1ff_a4ce8281f80c', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/mat_ops.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_mat_add.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex89794148', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp49ef0950_7fe2_4ff0_b1ff_a4ce8281f80c/mat_ops.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_mat_add
### Exit

### Start Compiling rtwdemo_sfun_mat_mult
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex89794148', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp065d8091_18e4_4132_946c_a0c7d2d03ff6', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/mat_ops.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_mat_mult.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex89794148', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp065d8091_18e4_4132_946c_a0c7d2d03ff6/mat_ops.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_mat_mult
### Exit

Создание файлов блоков TLC для создания кода

После компиляции S-функций и их использования в моделировании можно снова вызвать функцию legacy_code () с первым входным набором «sfcn _ tlc _ generate» для создания файлов блоков TLC. Файлы блоков указывают, как созданный код для модели вызывает устаревший код. Если файлы блоков TLC не генерируются и вы пытаетесь создать код для модели, включающей S-функции, генерация кода завершается неудачей. Файлы блоков TLC для S-функций являются rtwdemo_sfun_mat_add.tlc и rtwdemo_sfun_mat_mult.tlc.

legacy_code('sfcn_tlc_generate', defs);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', defs);

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

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

legacy_code('slblock_generate', defs);

Показать созданную интеграцию с устаревшим кодом

В rtwdemo_lct_inherit_dims модели показана интеграция модели с унаследованным кодом. Подсистема StartMatOps служит в качестве кабеля для вызовов унаследованных функций C, с единичными задержками, служащими для хранения предыдущих выходных значений.

open_system('rtwdemo_lct_inherit_dims')
open_system('rtwdemo_lct_inherit_dims/TestMatOps')
sim('rtwdemo_lct_inherit_dims')

Интеграция внешних функций C, передающих аргументы в виде многомерных сигналов

В этом примере показано, как использовать инструмент Legacy Code Tool для интеграции унаследованных функций C с многомерными сигналами.

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из предыдущих версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототип устаревших функций, вызываемых в этом примере:

void array3d_add (real_T * y1, real_T * u1, real_T * u2, int32_T nbRows, int32_T nbCols, int32_T nbPages);

real_T - это typedef для удвоения, а int32_T - это typedef для 32-разрядного целого числа. Устаревший исходный код находится в файлах ndarray_ops.h и ndarray_ops.c.

% rtwdemo_sfun_ndarray_add
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_ndarray_add';
def.OutputFcnSpec =...
    ['void array3d_add(double y1[size(u1,1)][size(u1,2)][size(u1,3)], ',...
    'double u1[][][], double u2[][][], ' ...
    'int32 size(u1,1), int32 size(u1,2), int32 size(u1,3))'];
def.HeaderFiles   = {'ndarray_ops.h'};
def.SourceFiles   = {'ndarray_ops.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

y1 - 3-D выходной сигнал тех же размеров, что и 3-D входной сигнал u1. Обратите внимание, что последние 3 аргумента, переданные унаследованной функции, соответствуют количеству элементов в каждом измерении входного сигнала u1 3-D.

Создание S-функции для моделирования

Для генерации C-MEX S-функции в соответствии с описанием, предоставленным входным аргументом «def», снова вызовите функцию legacy_code () с первым входным набором «sfcn _ cmex _ generate». S-функция вызывает унаследованные функции во время моделирования. Исходный код S-функции находится в rtwdemo_sfun_ndarray_add.c файла.

legacy_code('sfcn_cmex_generate', def);

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

После создания исходного файла C-MEX S-функции для компиляции S-функции для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_ndarray_add
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex14927435', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp6d56cb76_760f_453b_8a21_051a894f9b86', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ndarray_ops.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_ndarray_add.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex14927435', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp6d56cb76_760f_453b_8a21_051a894f9b86/ndarray_ops.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_ndarray_add
### Exit

Создание файла блока TLC для создания кода

После компиляции S-функции и ее использования в моделировании можно снова вызвать функцию legacy_code () с первым входным набором «sfcn _ tlc _ generate» для создания файла блока TLC. В файле блока указывается, как генерируемый код для модели вызывает унаследованный код. Если не создать файл блока TLC и попытаться создать код для модели, включающей S-функцию, создание кода завершится неудачей. Файл блока TLC для S-функции: rtwdemo_sfun_ndarray_add.tlc.

legacy_code('sfcn_tlc_generate', def);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', def);

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

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

legacy_code('slblock_generate', def);

Отображение созданной интеграции с устаревшим кодом

В rtwdemo_lct_ndarray модели показана интеграция модели с унаследованным кодом. Подсистема ndarray_add служит в качестве электрического жгута для вызова унаследованной функции C.

open_system('rtwdemo_lct_ndarray')
open_system('rtwdemo_lct_ndarray/ndarray_add')
sim('rtwdemo_lct_ndarray')

Интеграция внешних функций C, реализующих действия запуска и завершения

Интегрируйте устаревшие функции C, которые запускают и завершают действия с помощью инструмента «Устаревший код».

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из прежних версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототипы унаследованных функций, вызываемых в этом примере:

  • void initFureCounter (счетчик без знака int *)

  • void openLogFile (void * * fid)

  • void incAndLogFureCounter (void * fid, счетчик без знака int *, двойное время)

  • void CloseLogFile (void * * fid)

Устаревший исходный код находится в файлах your_types.h, fault.h и fault.c.

% rtwdemo_sfun_fault
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_fault';
def.InitializeConditionsFcnSpec  = 'initFaultCounter(uint32 work2[1])';
def.StartFcnSpec                 = 'openLogFile(void **work1)';
def.OutputFcnSpec                = ...
    'incAndLogFaultCounter(void *work1, uint32 work2[1], double u1)';
def.TerminateFcnSpec             = 'closeLogFile(void **work1)';
def.HeaderFiles                  = {'fault.h'};
def.SourceFiles                  = {'fault.c'};
def.IncPaths                     = {'rtwdemo_lct_src'};
def.SrcPaths                     = {'rtwdemo_lct_src'};
def.Options.useTlcWithAccel      = false;

Создание S-функции для моделирования

Для генерации C-MEX S-функции в соответствии с описанием, предоставленным входным аргументом «def», снова вызовите функцию legacy_code () с первым входным набором «sfcn _ cmex _ generate». S-функция вызывает унаследованные функции во время моделирования. Исходный код S-функции находится в rtwdemo_sfun_fault.c файла.

legacy_code('sfcn_cmex_generate', def);

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

После создания исходного файла C-MEX S-функции для компиляции S-функции для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_fault
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex46254423', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp38bf5c75_bf4f_4817_b007_fe2f2ddeccfd', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/fault.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_fault.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex46254423', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp38bf5c75_bf4f_4817_b007_fe2f2ddeccfd/fault.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_fault
### Exit

Создание файла блока TLC для создания кода

После компиляции S-функции и ее использования в моделировании можно снова вызвать функцию legacy_code () с первым входным набором «sfcn _ tlc _ generate» для создания файла блока TLC. В файле блока указывается, как генерируемый код для модели вызывает унаследованный код. Если не создать файл блока TLC и попытаться создать код для модели, включающей S-функцию, создание кода завершится неудачей. Файл блока TLC для S-функции: rtwdemo_sfun_fault.tlc.

legacy_code('sfcn_tlc_generate', def);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', def);

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

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

legacy_code('slblock_generate', def);

Отображение созданной интеграции с устаревшим кодом

В rtwdemo_lct_start_term модели показана интеграция модели с унаследованным кодом. Подсистема SunFixpt служит в качестве электрического жгута для вызова унаследованной функции C, и область действия сравнивает выходные данные функции с выходными данными встроенного блока продукта Simulink ®; результаты должны быть идентичными.

open_system('rtwdemo_lct_start_term')
open_system('rtwdemo_lct_start_term/TestFault')
sim('rtwdemo_lct_start_term')

Интеграция внешних функций C, реализующих N-мерные табличные поиски

Интеграция устаревших функций C, реализующих N-мерный табличный поиск, с помощью инструмента Legacy Code Tool.

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из прежних версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототип устаревших функций, вызываемых в этом примере:

FLT directLookupTaureND (const FLT * taureND, const UINT32 nbDims, const UINT32 * taureDims, const UINT32 * taureIdx)

FLT является typedef для плавания, а UINT32 является typedef для неподписанных int32. Устаревший исходный код находится в файлах your_types.h, lookupTable.h и directLookupTaureND.c.

defs = [];
evalin('base','load rtwdemo_lct_data.mat')

% rtwdemo_sfun_dlut3D
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_dlut3D';
def.OutputFcnSpec = 'single y1 = DirectLookupTable3D(single p1[][][], uint32 p2[3], uint32 u1[3])';
def.HeaderFiles   = {'lookupTable.h'};
def.SourceFiles   = {'directLookupTableND.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

% rtwdemo_sfun_dlut4D
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_dlut4D';
def.OutputFcnSpec = 'single y1 = DirectLookupTable4D(single p1[][][][], uint32 p2[4], uint32 u1[4])';
def.HeaderFiles   = {'lookupTable.h'};
def.SourceFiles   = {'directLookupTableND.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

Создание S-функций для моделирования

Для генерации C-MEX S-функций согласно описанию, предоставленному входным аргументом 'defs', вызовите функцию legacy_code () еще раз. Задайте для первого входа значение «» sfcn _ cmex _ generate «». S-функции вызывают унаследованные функции во время моделирования. Исходный код S-функций находится в файлах rtwdemo_sfun_dlut3D.c и rtwdemo_sfun_dlut4D.c.

legacy_code('sfcn_cmex_generate', defs);

Компиляция сгенерированных S-функций для моделирования

После создания исходных файлов S-функций C-MEX для компиляции S-функций для моделирования с помощью Simulink ® снова вызовите функцию legacy_code (). Установите первый вход в «compile».

legacy_code('compile', defs);
### Start Compiling rtwdemo_sfun_dlut3D
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex19426386', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples3/tpdc72babf_259e_4068_8f65_13101afe8968', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/directLookupTableND.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_dlut3D.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex19426386', '/tmp/BR2021ad_1584584_202060/publish_examples3/tpdc72babf_259e_4068_8f65_13101afe8968/directLookupTableND.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_dlut3D
### Exit

### Start Compiling rtwdemo_sfun_dlut4D
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex19426386', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp5e02334a_7851_4a64_93aa_c0908f35b351', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/directLookupTableND.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_dlut4D.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex19426386', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp5e02334a_7851_4a64_93aa_c0908f35b351/directLookupTableND.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_dlut4D
### Exit

Создание файлов блоков TLC для создания кода

После компиляции S-функций и их использования в моделировании можно снова вызвать функцию legacy_code (). Установите первый вход в «sfcn _ tlc _ generate» для создания файлов блоков TLC. Файлы блоков указывают, как созданный код для модели вызывает устаревший код. Если файлы блоков TLC не генерируются и вы пытаетесь создать код для модели, включающей S-функции, генерация кода завершается неудачей. Файлы блоков TLC для S-функций являются rtwdemo_sfun_dlut3D.tlc и rtwdemo_sfun_dlut4D.tlc.

legacy_code('sfcn_tlc_generate', defs);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', defs);

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

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

legacy_code('slblock_generate', defs);

Показать созданную интеграцию с устаревшим кодом

В rtwdemo_lct_lut модели показана интеграция модели с унаследованным кодом. Подсистема StartFixpt служит в качестве электрического жгута для вызова унаследованной функции C, а блоки Display сравнивают выходные данные функции с выходными данными встроенных блоков поиска Simulink ®. Результаты идентичны.

open_system('rtwdemo_lct_lut')
open_system('rtwdemo_lct_lut/TestLut1')
sim('rtwdemo_lct_lut')

Интеграция внешних функций C, передающих аргументы в виде многомерных сигналов

В этом примере показано, как использовать инструмент Legacy Code Tool для интеграции унаследованных функций C с многомерными сигналами.

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из предыдущих версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототип устаревших функций, вызываемых в этом примере:

void array3d_add (real_T * y1, real_T * u1, real_T * u2, int32_T nbRows, int32_T nbCols, int32_T nbPages);

real_T - это typedef для удвоения, а int32_T - это typedef для 32-разрядного целого числа. Устаревший исходный код находится в файлах ndarray_ops.h и ndarray_ops.c.

% rtwdemo_sfun_ndarray_add
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_ndarray_add';
def.OutputFcnSpec =...
    ['void array3d_add(double y1[size(u1,1)][size(u1,2)][size(u1,3)], ',...
    'double u1[][][], double u2[][][], ' ...
    'int32 size(u1,1), int32 size(u1,2), int32 size(u1,3))'];
def.HeaderFiles   = {'ndarray_ops.h'};
def.SourceFiles   = {'ndarray_ops.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

y1 - 3-D выходной сигнал тех же размеров, что и 3-D входной сигнал u1. Обратите внимание, что последние 3 аргумента, переданные унаследованной функции, соответствуют количеству элементов в каждом измерении входного сигнала u1 3-D.

Создание S-функции для моделирования

Для генерации C-MEX S-функции в соответствии с описанием, предоставленным входным аргументом «def», снова вызовите функцию legacy_code () с первым входным набором «sfcn _ cmex _ generate». S-функция вызывает унаследованные функции во время моделирования. Исходный код S-функции находится в rtwdemo_sfun_ndarray_add.c файла.

legacy_code('sfcn_cmex_generate', def);

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

После создания исходного файла C-MEX S-функции для компиляции S-функции для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_ndarray_add
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex14927435', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp6d56cb76_760f_453b_8a21_051a894f9b86', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ndarray_ops.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_ndarray_add.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex14927435', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp6d56cb76_760f_453b_8a21_051a894f9b86/ndarray_ops.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_ndarray_add
### Exit

Создание файла блока TLC для создания кода

После компиляции S-функции и ее использования в моделировании можно снова вызвать функцию legacy_code () с первым входным набором «sfcn _ tlc _ generate» для создания файла блока TLC. В файле блока указывается, как генерируемый код для модели вызывает унаследованный код. Если не создать файл блока TLC и попытаться создать код для модели, включающей S-функцию, создание кода завершится неудачей. Файл блока TLC для S-функции: rtwdemo_sfun_ndarray_add.tlc.

legacy_code('sfcn_tlc_generate', def);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', def);

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

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

legacy_code('slblock_generate', def);

Отображение созданной интеграции с устаревшим кодом

В rtwdemo_lct_ndarray модели показана интеграция модели с унаследованным кодом. Подсистема ndarray_add служит в качестве электрического жгута для вызова унаследованной функции C.

open_system('rtwdemo_lct_ndarray')
open_system('rtwdemo_lct_ndarray/ndarray_add')
sim('rtwdemo_lct_ndarray')

Интеграция внешних функций C с заданным, унаследованным и параметризованным временем образца блока

В этом примере показано, как использовать инструмент Legacy Code Tool для интеграции унаследованных функций C с заданным, наследуемым и параметризованным временем блока.

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

  • Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.

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

  • Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из прежних версий.

Предоставление спецификации устаревших функций

В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототип устаревших функций, вызываемых в этом примере:

FLT gainScalar (конст. FLT в, конст. усиление FLT)

FLT - это typedef для плавания. Устаревший исходный код находится в файлах your_types.h, gain.h и gainScalar.c.

defs = [];

% rtwdemo_sfun_st_inherited
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_st_inherited';
def.OutputFcnSpec = 'single y1 = gainScalar(single u1, single p1)';
def.HeaderFiles   = {'gain.h'};
def.SourceFiles   = {'gainScalar.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

% rtwdemo_sfun_st_fixed
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_st_fixed';
def.OutputFcnSpec = 'single y1 = gainScalar(single u1, single p1)';
def.HeaderFiles   = {'gain.h'};
def.SourceFiles   = {'gainScalar.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
def.SampleTime    = [2 1];
defs = [defs; def];

% rtwdemo_sfun_st_parameterized
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_st_parameterized';
def.OutputFcnSpec = 'single y1 = gainScalar(single u1, single p1)';
def.HeaderFiles   = {'gain.h'};
def.SourceFiles   = {'gainScalar.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
def.SampleTime    = 'parameterized';
defs = [defs; def];

Создание S-функций для моделирования

Для генерации C-MEX S-функций в соответствии с описанием, предоставленным входным аргументом «defs», вызовите функцию legacy_code () снова с первым входным набором «sfcn _ cmex _ generate». S-функции вызывают унаследованные функции во время моделирования. Исходный код S-функций находится в файлах rtwdemo_sfun_st_inherited.c и rtwdemo_sfun_st_fixed.c. rtwdemo_sfun_st_parameterized.c.

legacy_code('sfcn_cmex_generate', defs);

Компиляция сгенерированных S-функций для моделирования

После создания исходных файлов C-MEX S-функций для компиляции S-функций для моделирования с помощью Simulink ® снова вызовите функцию legacy_code () с первым входным набором «compile».

legacy_code('compile', defs);
### Start Compiling rtwdemo_sfun_st_inherited
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex74504488', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp6af2580b_8a65_4c58_b1e0_c3221c42c51f', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_st_inherited.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex74504488', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp6af2580b_8a65_4c58_b1e0_c3221c42c51f/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_st_inherited
### Exit

### Start Compiling rtwdemo_sfun_st_fixed
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex74504488', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp555faf52_30a3_496c_ba92_62d542170b29', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_st_fixed.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex74504488', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp555faf52_30a3_496c_ba92_62d542170b29/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_st_fixed
### Exit

### Start Compiling rtwdemo_sfun_st_parameterized
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex74504488', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp8e5d7fdc_f13c_4c67_82c5_01f22ad2dc83', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_st_parameterized.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex74504488', '/tmp/BR2021ad_1584584_202060/publish_examples4/tp8e5d7fdc_f13c_4c67_82c5_01f22ad2dc83/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_st_parameterized
### Exit

Создание файлов блоков TLC для создания кода

После компиляции S-функций и их использования в моделировании можно снова вызвать функцию legacy_code () с первым входным набором «sfcn _ tlc _ generate» для создания файлов блоков TLC. Файлы блоков указывают, как созданный код для модели вызывает устаревший код. Если файлы блоков TLC не генерируются и вы пытаетесь создать код для модели, включающей S-функции, генерация кода завершается неудачей. Файлы блоков TLC для S-функций являются rtwdemo_sfun_st_inherited.tlc и rtwdemo_sfun_st_fixed.tlc. rtwdemo_sfun_st_parameterized.tlc.

legacy_code('sfcn_tlc_generate', defs);

Создание файла rtwmakecfg.m для создания кода

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

legacy_code('rtwmakecfg_generate', defs);

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

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

legacy_code('slblock_generate', defs);

Показать созданную интеграцию с устаревшим кодом

В rtwdemo_lct_sampletime модели показана интеграция модели с унаследованным кодом. Подсистема sample_time служит в качестве кабеля для вызовов унаследованных функций C, с единичными задержками, служащими для хранения предыдущих выходных значений.

open_system('rtwdemo_lct_sampletime')
open_system('rtwdemo_lct_sampletime/sample_time')
sim('rtwdemo_lct_sampletime')

См. также

Связанные темы