exponenta event banner

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

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

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

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

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

  • tempController.c

  • utils.c

Файлы заголовков находятся в include каталог:

  • tempController.h

  • utils.h

  • controllerTypes.h

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

Эта таблица суммирует выходные данные Controller алгоритм.

Температурный     ConditionSystem StateFan CommandPump CommandPump Direction'Troom_in - Tset | < DeltaT_fanIdle00IDLEDelatT_fan <= |Troom_in - Tset | <  DeltaT_pumpFan only10IDLE'Troom_in - Tset | > = DeltaT_pump и Tset < Troom_inCooling11COOLING'Troom_in - Tset | > = DeltaT_pump и Tset > Troom_inHeating11HEATING

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

Температурный режим Направление насоса Набор < Troom_inCOOLINGTset > Troom_inHEATING

PumpDirection enum type определен в файле controllerTypes.h.

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

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

Затем на вкладке Моделирование выберите Конструктор > Импортер кода.

Укажите библиотеку Simulink

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

На странице «Параметры»:

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

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

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

slblocks.m используется для добавления созданной библиотеки в браузер библиотеки Simulink. Дополнительные сведения см. в разделе Добавление библиотеки в обозреватель библиотек.

Нажмите кнопку Далее, чтобы продолжить.

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

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

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

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

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

  2. Для заголовков интерфейса укажите требуемые файлы заголовков. В этом примере укажите 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. Выберите Overwrite, чтобы удалить все существующие блоки и создать новые блоки C Caller для выбранных функций пользовательского кода.

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

В этом примере выберите Обновить и нажмите кнопку Далее.

Создание тестового кабеля

Этот параметр доступен только при наличии лицензии 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-файла) можно выбрать «Добавить», выбрать требуемый файл проекта и добавить созданный файл в этот проект.

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

После нажатия кнопки Готово (Finish) выберите, следует ли сохранить текущие настройки импорта в файл JSON. Этот файл можно использовать для загрузки мастера импорта кода с текущими параметрами импорта.

См. также

| | |