Импорт пользовательского кода с помощью мастера импорта кода Simulink

Этот пример использует код С для контроллера теплового насоса, чтобы показать, как использовать мастер импорта кода Simulink ® для импорта пользовательского кода C/C + + в библиотеку Simulink. В примере также показано, как выполнить эквивалентные действия с помощью интерфейса командной строки Simulink Code Importer в MATLAB ®. Для получения дополнительной информации см. «Импорт пользовательского кода C/C + + с использованием импортера кода Simulink».

Пользовательский код контроллера теплового насоса

Эти исходный код С и файлы заголовков содержат полный код для контроллера теплового насоса.

Исходные файлы находятся в src директория:

  • tempController.c

  • utils.c

Заголовочные файлы находятся в include директория:

  • tempController.h

  • utils.h

  • controllerTypes.h

Файл tempController.c содержит алгоритм для пользовательского кода С для модуля теплового насоса. The Controller функция в этом файле использует комнатную температуру (Troom_in) и заданную температуру (Tset) как входы. Выходные выходы pump_control_bus тип структуры с сигналами, которые управляют вентилятором, тепловым насосом и направлением теплового насоса (тепло или охлаждение). The pump_control_bus структура имеет следующие поля: fan_cmd, pump_cmd, и pump_dir. The pump_control_bus тип структуры определяется в файле controllerTypes.h.

В этой таблице результирующие выходные данные Controller алгоритм.

Температурное условиеСостояние системы  Команда вентилятора Команда насоса Направление насоса|Troom_в - Tset| < DeltaT_поклонникIdle00IDLEDelatT_вентилятор < = |Troom_в - Tset| < DeltaT_насосFan only10IDLE|Troom_в - Tset| > = DeltaT_насос и Tset < Troom_вCooling11COOLING|Troom_в - Tset| > = DeltaT_насос и Tset > Троом_вHeating11HEATING

The Controller функция использует две служебные функции, absoluteTempDifference и pumpDirection, которые определены в utils.c файл. The absoluteTempDifference функция возвращает абсолютное различие между Tset и Troom_in в виде двойника. The pumpDirection функция возвращает одно из следующих PumpDirection введите значения перечисления.

Температурное условие Направление насосаTset < Троом_вCOOLINGTset > Троом_вHEATING

The PumpDirection перечисление type определяется в файле controllerTypes.h.

Откройте мастер импорта кода

Чтобы открыть мастер импорта кода, создайте пустую библиотеку Simulink, где src и include папки находятся и сохраняют их. В данном примере библиотека сохранена как heatpumpController.

Затем на вкладке Modeling выберите проект > Code Importer.

Задайте библиотеку Simulink

После загрузки страницы приветствия нажмите кнопку Пуск, чтобы начать процесс импорта.

На странице Настройки:

  1. Имя файла библиотеки Simulink автоматически заполняется сохраненным именем библиотеки, в этом случае heatpumpController.

  2. Папка Output автоматически заполняется расположением сохраненной библиотеки Simulink.

Для создания файла slblocks.m выберите «Добавить сгенерированную библиотеку в браузер библиотеки Simulink».

The slblocks.m Файл используется для добавления сгенерированной библиотеки в браузер библиотеки Simulink. Для получения дополнительной информации см. раздел «Добавление библиотеки в браузер библиотек».

Для продолжения нажмите кнопку Далее.

Примечание: Следующий код MATLAB эквивалентен этому шагу.

obj = Simulink.CodeImporter('heatpumpController');
obj.LibraryFileName = 'heatpumpController';
obj.OutputFolder = '$pwd$'; %This evaluates to the pwd

Укажите пользовательский код для импорта

На странице «Задать пользовательский код»:

  1. Для параметра «Язык» выберите C.

  2. Для заголовков Interface укажите необходимые файлы заголовков. В данном примере задайте tempController.h.

  3. Для исходных файлов укажите необходимые исходные файлы. В данном примере задайте tempController.c и utils.c расположение файлов в папке src следующим .\src\tempController.c; .\src\utils.c.

  4. Для параметра «Включить директории» укажите требуемые директории включения. В данном примере задайте .\include.

Затем нажмите кнопку Далее.

Нажмите кнопку Далее на странице Анализ.

Примечание: Следующий код эквивалентен этому шагу.

% The src and include directories should be located in pwd
obj.CustomCode.InterfaceHeaders = 'tempController.h';
obj.CustomCode.Language = 'C';
obj.CustomCode.SourceFiles = {'.\src\tempController.c', '.\src\utils.c'};
obj.CustomCode.IncludePaths = '.\include';

% Analyze the specified custom code
obj.parse();

Задание параметров импорта

Задайте функции для импорта

На странице Импорт выберите функции для импорта в библиотеку Simulink. В данном примере выберите Controller. Затем нажмите кнопку Далее.

Установите спецификации блочного порта

Для каждой функции, выбранной на предыдущей странице, мастер генерирует спецификацию порта функции. Выбранные порты используются для сгенерированного блока C Caller.

В этом примере таблица спецификаций портов приводит формальные аргументы Tset, Troom_in, и out для Controller функция.

Измените метку out аргумент в control_out. Нажмите кнопку Далее.

Примечание: Следующий код эквивалентен этому шагу.

% Requires a successful obj.parse() to get the function objects
fcnObj = obj.ParseInfo.getFunctions();

%fcnObj = 
%
%  Function with properties:
%
%                 Name: "Controller"
%           CPrototype: "pump_control_bus Controller(real_T Tset, real_T Troom_in);"
%    PortSpecification: [1×1 Simulink.CodeImporter.SimulinkPortSpecification]
%              IsEntry: 1
%            IsDefined: 1
%               IsStub: 0
%          ArrayLayout: NotSpecified
%      IsDeterministic: 0

fcnObj.PortSpecification.ReturnArgument.Label = 'control_out';

Задайте типы для импорта

Затем выберите типы для импорта в Simulink. Если тип требуется для функций, выбранных для импорта, он выбирается и затемняется. В данном примере pump_control_bus обязательно. Мастер создает словарь данных Simulink, содержащий этот тип, и связывает словарь с сгенерированной библиотекой.

Нажмите кнопку Далее.

Задание параметра обновления библиотеки

Поскольку в этом примере используется сохраненная библиотека Simulink, эта страница позволяет вам подтвердить выполнение операции обновления в библиотеке.

  1. Выберите Перезапись, чтобы удалить все существующие блоки и создать новые блоки C Caller для выбранных функций пользовательского кода.

  2. Выберите Update, чтобы сохранить существующие блоки и добавить новые блоки C Caller для выбранных функций пользовательского кода.

В данном примере выберите Update, затем нажмите Next.

Создайте тестовую обвязку

Эта опция доступна только при наличии лицензии Simulink Test™.

Чтобы протестировать импортированную функцию пользовательского кода с помощью Simulink Test Manager, выберите Автоматически создать тестовую обвязку для всех импортированных функций. Каждый блок созданной библиотеки будет присоединен к внутренней тестовой обвязке.

В данном примере выберите Пропустить. Нажмите кнопку Далее, чтобы сгенерировать библиотеку Simulink.

После импорта кода мастер создает библиотеку, присоединенную к словарю данных Simulink, который задает pump_control_bus как Simulink.Bus объект.

Примечание: Следующий код эквивалентен этому шагу.

% Requires Simulink Test license to generate the test harness
obj.Options.CreateTestHarness = true;
obj.import('Functions', 'Controller', ...
           'Types', 'pump_control_bus', ...
           'Overwrite', 'off');          

Если у вас есть существующий файл проекта (PRJ-файл), можно выбрать Add, выбрать нужный файл проекта и добавить сгенерированный файл к этому проекту.

Нажмите кнопку Готово, чтобы закрыть мастер.

Когда вы нажмете конец, выберите, сохранять ли текущие настройки импорта в файл JSON. Можно использовать этот файл для загрузки мастера импорта кода с текущими параметрами импорта.

См. также

| | |