В этом примере показано, как с помощью мастера импорта кода импортировать пользовательский код C для контроллера теплового насоса в Simulink для тестирования установки. Модульные тесты тестируют одну или несколько функций в изоляции от пользовательской библиотеки кодов. Для модульных тестов мастер импорта тестового кода Simulink создает тестовую изолированную среду и библиотеку, содержащую блок Caller C для каждой указанной функции из пользовательского кода. Дополнительные сведения см. в разделе Импорт и тестирование пользовательского кода C/C + +.
В этом примере используется только tempController.c для создания и импорта тестовой изолированной среды в Simulink. Изолированная среда используется для выполнения модульного тестирования только на heatpumpController функции в tempController.c файл, а не полный код. Создание изолированной программной среды автоматически создает заглушки для служебных функций, используемых heatpumpController функция, absoluteTempDifference и pumpDirection. Поскольку функции утилиты не определены в tempController.c файл и utilities.c файл не включен, импортер кода создает заглушки, чтобы код не ошибался.
Полный код контроллера теплового насоса находится в следующих файлах источника и заголовка кода C:
Исходные файлы находятся в src каталог:
tempController.c
utils.c
Файлы заголовков находятся в include каталог:
tempController.h
utils.h
controllerTypes.h
tempController.c содержит алгоритм для пользовательского кода C для блока теплового насоса. heatpumpController функция в этом файле использует комнатную температуру (Troom_inи заданную температуру (Tset) в качестве входных данных. Выходной сигнал: pump_control_bus типовая конструкция с сигналами, которые управляют вентилятором, тепловым насосом и направлением теплового насоса (тепловым или холодным). Поля в pump_control_bus структура являются fan_cmd, pump_cmd, и pump_dir. pump_control_bus тип структуры определен в controllerTypes.h файл. Выходные данные heatpumpController функция:
Выходные данные heatpumpController алгоритм обобщен в следующей таблице:
heatpumpController функция использует две служебные функции, absoluteTempDifference и pumpDirection, которые определены в utils.c файл. absoluteTempDifference функция возвращает абсолютную разницу между Tset и Troom_in как двойник. pumpDirection функция возвращает одно из следующих значений: PumpDirection значения перечисления типов:
PumpDirection enum type определяется в controllerTypes.h файл.
Чтобы открыть мастер импорта кода Simulink Test C/C + +, сначала откройте диспетчер Simulink Test Manager.
sltest.testmanager.view
Затем выберите New > Test for C/C + + code.
Откроется мастер и откроется вкладка Приветствие. Нажмите кнопку Пуск, чтобы начать процесс импорта.
На вкладке «Параметры»:
Введите имя файла библиотеки Simulink. Это имя используется в созданной библиотеке Simulink, каталоге тестовой изолированной среды и тестовом файле (MLDATX). Войти heatpumpController.
Укажите папку вывода для сохранения созданных артефактов. Введите имя папки, доступной для записи.
В качестве метода тестирования выберите C Code Unit Testing.
Метод C Code Unit Testing проверяет один файл C или подмножество пользовательского кода в изоляции. Этот метод создает тестовую изолированную среду из указанного исходного файла или файлов и импортирует тестовую изолированную среду в Simulink. Поскольку тестовая изолированная среда содержит только подмножество файлов C, мастер импорта кода автоматически создает заглушки для всех неопределенных символов, используемых в файлах C. Этот метод поддерживает только тестирование кода C. Для получения информации об интеграционном тестировании см. TestType имущество sltest.CodeImporter.

Нажмите кнопку Далее.
На вкладке «Указать пользовательский код»:
В поле Исходные файлы (Source files) укажите исходный файл, содержащий функцию для импорта для модульного тестирования. Войти .\src\tempController.c.
В поле Включить каталоги укажите каталоги, от которых зависят указанные исходные файлы. Войти .\include.
Определяет специфичные для компилятора определения. В этом примере оставьте это поле пустым.

Нажмите кнопку Далее.
На вкладке «Анализ» задайте параметры изолированной программной среды.
Каждый из трех тестовых режимов «песочницы» имеет параметры, определяющие, как мастер импорта кода создает «песочницу» и артефакты «песочницы».
Выберите Создать агрегированный заголовок. Этот тестовый изолированный режим создает минимальный агрегированный файл заголовка для указанного исходного файла. Агрегированный файл заголовка содержит все объявления символов, используемых указанным исходным файлом.
Выберите Только копировать исходные файлы. Для этого параметра мастер импорта кода копирует указанный исходный файл в изолированную программную среду src каталог.
Для получения информации о других выходных тестовых режимах и настройках изолированной программной среды см. свойства sltest.CodeImporter.SandboxSettings.

Нажмите кнопку Далее, чтобы создать тестовую изолированную среду с заданными параметрами.
Указанное имя файла библиотеки определяет имя созданной изолированной программной среды. В этом примере имя песочницы: heatpumpController_sandbox.
В этом примере используется tempController.c и выполняет модульное тестирование только на heatpumpController функция. Создание изолированной программной среды автоматически создает заглушки для absoluteTempDifference и pumpDirection служебные функции, используемые heatpumpController функция, поскольку функции утилиты не определены в tempController.c , заглушки предотвращают ошибку кода.
При создании изолированной программной среды отображается экран подтверждения.

Выходная папка изолированной программной среды содержит следующие подпапки:
src: Эта папка содержит скопированный исходный файл или файлы, которые в данном примере tempController.c.
include: В зависимости от режима тестовой изолированной программной среды эта папка содержит либо aggregatedHeader.h или interfaceHeader.h файл. В этом примере используется aggregatedHeader.h файл. Папка также содержит и копии других заголовочных файлов, необходимых для компиляции указанного исходного файла или файлов. aggregatedHeader.h содержит все объявления символов, используемых указанным исходным файлом. interfaceHeader.h содержит объявления для функций, глобальных переменных и типов, используемых указанными исходными файлами. Simulink использует созданный файл заголовка интерфейса во время процесса импорта.
autostub: Эта папка содержит auto_stub.c и auto_stub.h файлы, которые содержат автоматически сгенерированные заглушки для absoluteTempDifference и pumpDirection служебные функции.
manualstub: Эта папка содержит man_stub.c и man_stub.h файлы, которые определяют любые указанные вручную заглушки. По умолчанию эти файлы не определяют функции.
ПРИМЕЧАНИЕ: Не изменяйте файлы в src, include, или autosub папки созданной песочницы.
После создания изолированной программной среды можно просмотреть созданные файлы:
Щелкните Источник автоматической заглушки и Заголовок автоматической заглушки, чтобы открыть auto_stub.c и файлы auto_stub.h соответственно. В auto_stub.c, вы можете найти заглушки для служебных функций, используемых heatpumpController, absoluteTempDifference и pumpDirection. В auto_stub.h, вы можете найти extern объявления упорных функций.
Щелкните Заголовок заглушки вручную и Источник заглушки вручную, чтобы открыть man_stub.h и man_stub.c файлы, соответственно. Поскольку для режима «песочницы» выбран параметр «Генерировать агрегированный заголовок», man_stub.h включает в себя aggregatedHeader.h файл. По умолчанию файлы заглушек вручную не имеют определений функций.
Нажмите кнопку Далее.
Когда мастер обнаруживает глобальные переменные в изолированной программной среде или пользовательском коде, можно использовать эти переменные в качестве входных или выходных данных для функции и портов в созданном блоке C Caller. Дополнительные сведения см. в разделе Включение глобальных переменных в качестве функциональных интерфейсов.
Выберите параметр Включить глобальные переменные как интерфейс функции.

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

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

В этом примере в таблице спецификации порта перечислены формальные аргументы: Tset, Troom_in, и out, для heatpumpController и еще шесть из автоматически созданных заглушек. Поскольку в качестве интерфейса функции выбран параметр «Включить глобальные переменные», мастер создает порты, создаваемые из заглушек для absoluteTempDifference и pumpDirection функции. Заглушки находятся в auto_stub.c.
Это автоматически сгенерированные глобальные переменные в auto_stub.c файл:
/*************************************************************************/
/* Generated Global Variables for Stubbed Functions Interface */
/*************************************************************************/
double SLStubIn_absoluteTempDifference_p1;
double SLStubIn_absoluteTempDifference_p2;
double SLStubOut_absoluteTempDifference;
double SLStubIn_pumpDirection_p1;
double SLStubIn_pumpDirection_p2;
PumpDirection SLStubOut_pumpDirection;
double absoluteTempDifference(double absoluteTempDifference_p1, double absoluteTempDifference_p2)
{
SLStubIn_absoluteTempDifference_p1 = absoluteTempDifference_p1;
SLStubIn_absoluteTempDifference_p2 = absoluteTempDifference_p2;
return SLStubOut_absoluteTempDifference;
}
PumpDirection pumpDirection(double pumpDirection_p1, double pumpDirection_p2)
{
SLStubIn_pumpDirection_p1 = pumpDirection_p1;
SLStubIn_pumpDirection_p2 = pumpDirection_p2;
return SLStubOut_pumpDirection;
}
В автоматически созданных заглушках для absoluteTempDifference, глобальные переменные SLStubIn_absoluteTempDifference_p1 и SLStubIn_absoluteTempDifference_p2 сохраните входные аргументы. Функция возвращает значение, сохраненное в SLStubOut_absoluteTempDifference в качестве выхода. Аналогично, pumpDirection сохраняет входные аргументы и возвращает SLStubOut_pumpDirection.
В этом примере: absoluteTempDifference, SLStubIn_absoluteTempDifference_p1 и SLStubIn_absoluteTempDifference_p2 являются выходами. Глобальная переменная SLStubOut_absoluteTempDifference является входом.
Не вносите никаких изменений в спецификацию порта. Нажмите кнопку Далее.
Выберите типы для импорта в Simulink. Потому что pump_control_bus и PumpDirection типы требуются для функции heatpumpController, они выбираются и затемняются. Мастер создает словарь данных Simulink, содержащий эти типы, и связывает словарь с созданной библиотекой.

Нажмите кнопку Далее (Next), чтобы отобразить сводку созданной библиотеки. Для продолжения нажмите кнопку Далее еще раз.
Выберите Автоматически создавать тестовый электрический жгут для всех импортированных функций.

Нажмите кнопку «Далее», чтобы создать библиотеку Simulink.
После импорта кода мастер создает библиотеку, присоединенную к словарю данных Simulink, который определяет pump_control_bus и PumpDirection в качестве Simulink.Bus объект и сигнал перечисления Simulink соответственно.
Блок C Caller, созданный в библиотеке Simulink:

Щелкните в правом нижнем углу блока, чтобы открыть его внутренний тестовый жгут:

На странице Успешный импорт кода (Code Import Successful) щелкните Изменить папку MATLAB на папку вывода.
Не нажимайте кнопку Готово. Перейдите к следующему разделу, чтобы вручную обновить заглушки для неопределенных символов.

Чтобы вручную создать файлы-заглушки для absoluteTempDifference и pumpDirection, перейдите на вкладку «Анализ» на панели инструментов мастера и дважды нажмите кнопку «Далее» для отображения этой страницы:

Импортер кода обнаруживает созданную песочницу. Выберите Перезаписать, а затем нажмите кнопку Далее.
Вне мастера, но оставляя его открытым, скопируйте файлы в updated_manualstub папки песочницы и вставьте их в heatpumpController/manualstub каталог.
В man_stub.c файл, отредактировать определение функции absoluteTempDifference:
double absoluteTempDifference(double Tset, double Troom_in){
return (double)fabs(Tset - Troom_in);
}
и определение функции pumpDirection:
PumpDirection pumpDirection(double Tset, double Troom_in){
return Tset > Troom_in ? HEATING : COOLING;
}
Вернитесь к мастеру импорта кода.

После изменения файлов заглушек вручную вернитесь к мастеру и щелкните Обновить изолированную среду.
Поскольку определения для absoluteTempDifference и pumpDirection функции, нет символов для автоматической заглушки, не создаются артефакты для autostub в изолированной программной среде и она пуста.

Нажмите кнопку Далее, пока не перейдете на страницу спецификации порта блока:

Потому что ручное внедрение absoluteTempDifference и pumpDirection не имеет глобальных переменных, только формальные аргументы и возвращаемый аргумент отображаются как порты.
Нажмите кнопку Далее.
На вкладке «Создание библиотеки Simulink» выберите «Перезаписать».

Нажмите кнопку Далее на остальных страницах, пока не откроется страница Успешный импорт кода.
Затем нажмите кнопку Готово. При необходимости нажмите кнопку Да (Yes) в открывшемся диалоговом окне для сохранения текущих параметров импорта в виде файла JSON, который используется для перезагрузки параметров в другой сеанс мастера импорта кода.
В диспетчере тестов на панели «Обозреватель тестов» разверните тестовый файл heatpumpController и набор тестов heatpumpController/heatpumpController. Затем выберите heatpumpController_Harness1 тестовый случай.
В разделе «Тестируемая система» разверните раздел «Настройка моделирования и переопределения выпуска» и установите для параметра «Время остановки» значение 200.

В разделе Входы (Inputs) в нижней части таблицы Внешние входы (External Inputs) нажмите кнопку Добавить (Add), чтобы открыть диалоговое окно Добавить ввод (Add Input).
В поле «Спецификация входного файла» введите heatpumpControllerHarnessInput.xlsx.
В разделе «Сопоставление входных данных» выберите Block Name в качестве режима сопоставления и щелкните Сопоставить входы (Map Inputs). После того как входные данные появятся в таблице Статус сопоставления (Mapping Status), нажмите кнопку ОК.

В разделе Логические и временные оценки добавьте оценки для каждого температурного условия:

Сведения об оценках см. в разделе Оценка временной логики с помощью временных оценок.
На панели «Символы» добавьте определения символов:


Нажмите кнопку Run (Выполнить), чтобы запустить тест.
По завершении теста на панели «Результаты и артефакты» разверните окно «Результаты». Все оценки проходят.

Чтобы просмотреть результаты покрытия, выберите heatpumpController_Harness1 в разделе Результаты и разверните раздел Результаты покрытия. Покрытие составляет 100% для обоих tempController.c и man_stub.c файлы.
