В этом примере показано, как использовать мастер импорта кода для импорта пользовательского кода С для контроллера теплового насоса в Simulink для модульного тестирования. Модульные тесты тестируют одну или несколько функций в изоляции от библиотеки пользовательских кодов. Для модульных тестов мастер импорта кода Simulink Test генерирует тестовую песочницу и библиотеку, содержащую блок C Caller для каждой указанной функции из пользовательского кода. Для получения дополнительной информации смотрите Импорт и проверку Пользовательского кода C/C + +.
Этот пример использует только tempController.c
файл для создания и импорта тестовой песочницы в Simulink. Вы используете песочницу для выполнения модульного тестирования только на heatpumpController
функция в tempController.c
файл, а не полный код. Генерация песочницы автоматически создает заглушки для служебных функций, используемых heatpumpController
функция, absoluteTempDifference
и pumpDirection
. Поскольку служебные функции не определены в tempController.c
файл и utilities.c
файл не включен, импортер кода создает заглушки, поэтому код не ошибается.
Полный код для контроллера теплового насоса находится в следующих файлах источника кода С и заголовках:
Исходные файлы находятся в src
директория:
tempController.c
utils.c
Заголовочные файлы находятся в include
директория:
tempController.h
utils.h
controllerTypes.h
The tempController.c
файл содержит алгоритм для пользовательского кода С для модуля теплового насоса. The heatpumpController
функция в этом файле использует комнатную температуру (Troom_in
) и заданную температуру (Tset
) как входы. Выходные выходы pump_control_bus
тип структуры с сигналами, которые управляют вентилятором, тепловым насосом и направлением теплового насоса (тепло или охлаждение). Поля в pump_control_bus
структура fan_cmd
, pump_cmd
, и pump_dir
. The pump_control_bus
тип структуры определяется в controllerTypes.h
файл. Выходные выходы heatpumpController
функция является:
Выходные выходы heatpumpController
алгоритм суммирован в следующей таблице:
The heatpumpController
функция использует две служебные функции, absoluteTempDifference
и pumpDirection
, которые определены в utils.c
файл. The absoluteTempDifference
функция возвращает абсолютное различие между Tset
и Troom_in
в виде двойника. The pumpDirection
функция возвращает одно из следующих PumpDirection
введите значения перечисления:
The PumpDirection
перечисление type
определяется в controllerTypes.h
файл.
Чтобы открыть мастер импорта кода Simulink Test C/C + +, сначала откройте Simulink Test Manager.
sltest.testmanager.view
Затем выберите New > Test для кода C/C + +.
Откроется мастер и откроется вкладка Добро пожаловать. Нажмите кнопку Пуск, чтобы начать процесс импорта.
На вкладке Settings:
Введите имя файла библиотеки Simulink. Сгенерированная библиотека Simulink, тестовые директории песочницы и тестовый файл (MLDATX) используют это имя. Введите heatpumpController
.
Укажите папку Output, в которой можно сохранить сгенерированные программные продукты. Введите имя папки с возможностью записи.
Выберите Код С Модульного тестирования в качестве проверки метода.
Метод модульного тестирования кода С проверяет один файл C или подмножество вашего пользовательского кода в изоляции. Этот метод создает тестовую песочницу из указанного исходного файла или файлов и импортирует тестовую песочницу в Simulink. Поскольку тестовая песочница содержит только подмножество файлов C, мастер импорта кода автоматически создает заглушки для всех неопределенных символов, используемых в файлах C. Этот метод поддерживает тестирование только кода С Для получения информации об интеграционной проверке смотрите TestType
свойство sltest.CodeImporter
.
Нажмите кнопку Далее.
На вкладке «Задать пользовательский код»:
В Исходных файлах укажите исходный файл, содержащий функцию для импорта для модульного тестирования. Введите .\src\tempController.c
.
В разделе Включить каталоги укажите директории, от которых зависят указанные исходные файлы. Введите .\include
.
Defines задает специфические для компилятора определения. В данном примере оставьте это поле пустым.
Нажмите кнопку Далее.
На вкладке Analyze задайте настройки песочницы.
Каждый из трех тестовых режимов песочницы имеет настройки, которые определяют, как мастер импорта кода генерирует песочницу и программные продукты песочницы.
Выберите Сгенерировать агрегированный заголовок. Этот тестовый режим песочницы генерирует минимальный агрегированный заголовочный файл для указанного исходного файла. Агрегированный файл заголовка содержит все объявления символов, используемых указанным исходным файлом.
Выберите только Копировать исходные файлы. Для этой опции мастер импорта кода копирует указанный исходный файл в песочницу src
директория.
Для получения информации о других выходных тестовых режимах и настройках песочницы, смотрите свойства sltest.CodeImporter.SandboxSettings
.
Нажмите кнопку Далее, чтобы создать тестовую песочницу с заданными настройками.
Заданное имя файла библиотеки определяет имя сгенерированной песочницы. В данном примере имя песочницы heatpumpController_sandbox
.
Этот пример использует tempController.c
и выполняет модульное тестирование только на heatpumpController
функция. Генерация песочницы автоматически создает заглушки для absoluteTempDifference
и pumpDirection
служебные функции, используемые heatpumpController
function, Поскольку служебные функции не определены в tempController.c
файл, заглушки препятствуют ошибке кода.
При создании песочницы отображений экран подтверждения.
Выходная папка sandbox содержит следующие подпапки:
src: Эта папка содержит скопированный исходный файл или файлы, который для этого примера является tempController.c
.
include
: В зависимости от тестового режима изолированной программной среды эта папка содержит либо aggregatedHeader.h
или interfaceHeader.h
файл. Этот пример использует aggregatedHeader.h
файл. Папка также содержит и копии других заголовочных файлов, необходимых для компиляции указанного исходного файла или файлов. The aggregatedHeader.h
файл содержит все объявления символов, используемых указанным исходным файлом. The interfaceHeader.h
содержит объявления функций, глобальных переменных и типов, используемых указанными исходными файлами. Simulink использует сгенерированный файл заголовка интерфейса в процессе импорта.
autostub
: Эта папка содержит auto_stub.c
и auto_stub.h
файлы, которые содержат автоматически сгенерированные заглушки для absoluteTempDifference
и pumpDirection
функции утилиты .
manualstub
: Эта папка содержит man_stub.c
и man_stub.h
файлы, которые определяют любые вручную заданные заглушки. По умолчанию эти файлы не определяют никаких функций.
ПРИМЕЧАНИЕ. Не изменяйте файлы в src
, include
, или autosub
папки сгенерированной песочницы.
После создания песочницы можно просмотреть созданные файлы:
Щелкните Auto stub source и Auto stub header, чтобы открыть 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
function, и еще шесть из автоматически сгенерированных заглушек. Поскольку вы выбрали Включить глобальные переменные в качестве функционального интерфейса, мастер создает порты, которые генерируются из заглушек для 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, содержащий эти типы, и связывает словарь с сгенерированной библиотекой.
Нажмите кнопку Далее, чтобы отобразить сводные данные сгенерированной библиотеки. Еще раз нажмите кнопку Далее, чтобы продолжить.
Выберите Автоматически создать тестовую обвязку для всех импортированных функций.
Нажмите кнопку Далее, чтобы сгенерировать библиотеку Simulink.
После импорта кода мастер создает библиотеку, присоединенную к словарю данных Simulink, который задает pump_control_bus
и PumpDirection
как Simulink.Bus
объект и сигнал перечисления Simulink, соответственно.
Блок C Caller, созданный в библиотеке Simulink:
Щелкните в правом нижнем углу блока, чтобы открыть его внутреннюю тестовую обвязку:
На странице Успешный импорт кода щелкните Изменить папку 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» выберите «Перезаписать».
Нажмите кнопку Далее на остальных страницах, пока вы не достигнете страницы успешного импорта кода.
Затем нажмите Конец. При необходимости нажмите кнопку Да в открывшемся диалоговом окне, чтобы сохранить текущие параметры импорта в виде файла JSON, который используется для перезагрузки параметров в другой сеанс мастера импорта кода.
В Диспетчере тестов на панели Test Browser разверните тестовый файл heatpumpController и тестовый набор heatpumpController/heatpumpController. Затем выберите heatpumpController_Harness1 тест.
В разделе «Тестируемая система» разверните раздел «Симуляция Setting and Релиза Overrides» и установите значение Времени остановки 200.
В разделе Inputs, в нижней части таблицы External Inputs, нажмите Add, чтобы открыть диалоговое окно Add Input.
В спецификации входного файла введите heatpumpControllerHarnessInput.xlsx
.
В разделе «Вход отображений» выберите Block Name
в режиме Mapping Mode и нажмите Map Inputs. После отображения входов в таблице Состояние соответствия, нажмите кнопку ОК.
В разделе «Логические и временные оценки» добавьте оценки для каждого температурного условия:
Для получения информации об оценках см. «Оценка временной логики при помощи временных оценок».
На панели «Символы» добавьте определения символов:
Нажмите запуск, чтобы запустить тест.
Когда тест завершится, на панели Результаты и Программные продукты разверните раздел Результаты. Все оценки проходят.
Чтобы просмотреть результаты покрытия, выберите heatpumpController_Harness1 в разделе Результаты и разверните раздел Результаты покрытия. Покрытие составляет 100% для обоих tempController.c
и man_stub.c
файлы.