Этот пример использует код С для контроллера теплового насоса, чтобы показать, как использовать мастер импорта кода 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
алгоритм.
The Controller
функция использует две служебные функции, absoluteTempDifference
и pumpDirection
, которые определены в utils.c
файл. The absoluteTempDifference
функция возвращает абсолютное различие между Tset
и Troom_in
в виде двойника. The pumpDirection
функция возвращает одно из следующих PumpDirection
введите значения перечисления.
The PumpDirection
перечисление type
определяется в файле controllerTypes.h
.
Чтобы открыть мастер импорта кода, создайте пустую библиотеку Simulink, где src
и include
папки находятся и сохраняют их. В данном примере библиотека сохранена как heatpumpController
.
Затем на вкладке Modeling выберите проект > Code Importer.
После загрузки страницы приветствия нажмите кнопку Пуск, чтобы начать процесс импорта.
На странице Настройки:
Имя файла библиотеки Simulink автоматически заполняется сохраненным именем библиотеки, в этом случае heatpumpController
.
Папка 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
На странице «Задать пользовательский код»:
Для параметра «Язык» выберите C
.
Для заголовков Interface укажите необходимые файлы заголовков. В данном примере задайте tempController.h
.
Для исходных файлов укажите необходимые исходные файлы. В данном примере задайте tempController.c
и utils.c
расположение файлов в папке src следующим .\src\tempController.c; .\src\utils.c
.
Для параметра «Включить директории» укажите требуемые директории включения. В данном примере задайте .\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, эта страница позволяет вам подтвердить выполнение операции обновления в библиотеке.
Выберите Перезапись, чтобы удалить все существующие блоки и создать новые блоки C Caller для выбранных функций пользовательского кода.
Выберите 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. Можно использовать этот файл для загрузки мастера импорта кода с текущими параметрами импорта.
Добавление библиотек в браузер библиотек | Вызывающий абонент на C | Импорт пользовательского кода C/C + + с помощью импортера кода Simulink | Интеграция кода С с использованием блоков вызывающего абонента C