В этом примере показано, как использовать API, чтобы импортировать пользовательский код С для контроллера теплового насоса в Simulink для модульного тестирования. Модульные тесты тестируют одну или несколько функций в изоляции от библиотеки пользовательского кода. Для модульных тестов средство импорта Simulink Test кода генерирует тестовую песочницу и библиотеку, содержащую блок C Caller из заданного пользовательского кода.
Полный код для контроллера теплового насоса находится в них код С исходные и заголовочные файлы:
Исходные файлы находятся в src
директория:
tempController.c
utils.c
Заголовочные файлы находятся в include
директория:
tempController.h
utils.h
controllerTypes.h
tempController.c
файл содержит алгоритм для пользовательского кода С для модуля теплового насоса. heatpumpController
функция в том файле использует комнатную температуру (Troom_in
) и установленная температура (Tset
) как входные параметры. Выходом является pump_control_bus
введите структуру с сигналами, которые управляют вентилятором, тепловым насосом и направлением теплового насоса (тепло или холодный). pump_control_bus
структура имеет эти поля: fan_cmd
, pump_cmd
, и pump_dir
. pump_control_bus
тип структуры задан в controllerTypes.h
файл. Выход heatpumpController
функция:
heatpumpController
функционируйте использует две служебных функции, absoluteTempDifference
и pumpDirection
, которые заданы в utils.c
файл. absoluteTempDifference
функция возвращает абсолютную разность между Tset
и Troom_in
как двойное. pumpDirection
функция возвращает один из них PumpDirection
значения перечисления типа:
PumpDirection
перечислимый type
задан в controllerTypes.h
файл.
Этот пример использует только tempController.c
создать и импортировать тестовую песочницу в Simulink. Вы используете песочницу для выполнения модульного тестирования только на heatpumpController
функционируйте а не на полном коде. Генерация песочницы автоматически создает заглушки для служебных функций, используемых heatpumpController
функция, absoluteTempDifference
и pumpDirection
. Поскольку служебные функции не заданы в tempController.c
файл и utilities.c
файл не включен, средство импорта кода создает заглушки, таким образом, код не делает ошибки.
CodeImporter
ОбъектСоздайте экземпляр CodeImporter
объект для контроллера теплового насоса пользовательский код. Установка OutputFolder
свойство к $pwd$
оценивает строку, промежуточную символы $ как выражение MATLAB. Установите OutputFolder
к $pwd$
задавать текущую папку как выходную папку. Установите SourceFiles
свойство к tempController.c
файл в src
директория. Используйте символы $, чтобы задать расположение файла для CustomCode
свойство, также.
obj = sltest.CodeImporter('heatpumpController'); obj.OutputFolder = "$pwd$"; obj.CustomCode.SourceFiles = "$fullfile('src','tempController.c')$"; obj.CustomCode.IncludePaths = fullfile('include'); obj.CustomCode.GlobalVariableInterface = true;
Сконфигурируйте CodeImporter
объект с желаемым тестовым типом и настройками песочницы.
Создать тестовую песочницу для заданного heatpumpController
функция в пользовательском коде, набор TestType
свойство UnitTest
. В данном примере используйте GenerateAggregatedHeader
поиграйте в песочнице режим. Для получения информации о различных режимах песочницы смотрите sltest.CodeImporter.SandboxSettings
.
Установка SandboxSettings.CopySourceFiles
к true
копирует заданный исходный файл в тестовую песочницу.
Обратите внимание на то, что можно использовать GenerateAggregatedHeader
поиграйте в песочнице режим только с одним исходным файлом.
obj.TestType = "UnitTest"; obj.SandboxSettings.Mode = "GenerateAggregatedHeader"; obj.SandboxSettings.CopySourceFiles = true;
Создайте песочницу. Эта тестовая песочница изолируется от исходной библиотеки пользовательского кода. Установка Overwrite
к on
перезаписывает существующий тест sandox, если вы существуете. По умолчанию, Overwrite
off
.
obj.createSandbox('Overwrite','on');
createSandbox
метод создает heatpumpController_sandbox
директория в заданной выходной папке, которая в этом примере является текущей рабочей папкой.
Директория песочницы содержит следующие подкаталоги:
src : Эта директория содержит скопированный исходный файл, tempController.c
.
include
: Эта директория содержит необходимое, включают файлы, чтобы скомпилировать tempController.c
в песочнице src
директория. Эта директория также содержит aggregatedHeader.h
файл, который содержит все необходимые символы, чтобы скомпилировать tempController.c
.
autostub
: Эта директория содержит auto_stub.c
и auto_stub.h
файлы, которые содержат автоматически сгенерированные заглушки для absoluteTempDifference
и pumpDirection
служебные функции.
manualstub
: Эта директория содержит man_stub.c
и man_stub.h
файлы, которые задают любые вручную заданные заглушки. По умолчанию эти файлы не задают функций.
Импортируйте код песочницы в Simulink.
obj.import('Functions','heatpumpController');
import
функция создает песочницу. Это также создает библиотеку, которая содержит блок C Caller под названием heatpumpController
, который содержит внутреннюю тестовую обвязку, которую можно использовать, чтобы выполнить модульное тестирование на heatpumpController
. Библиотека присоединена к Словарю Данных Simulink, который задает pump_control_bus
и PumpDirection
как Simulink.Bus
возразите и Simulink enumertion сигнал, соответственно.
Блок C Caller присоединяется с внутренней тестовой обвязкой для модульного тестирования heatpumpController
функция.
Поскольку вы устанавливаете CustomCode.GlobalVariableInterface
к true
перед импортом, import
функция создает заглушки для absoluteTempDifference
и pumpDirection
глобальные переменные в auto_stub.c
и создает порты для них. Для получения информации смотрите, Включают глобальные переменные, когда функция взаимодействует через интерфейс.
Это - блок C Caller, heatpumpController
, сгенерированный от heatpumpController
функция:
Это автоматически сгенерированные глобальные переменные в auto_stub.c
файл для absoluteTempDifference
и pumpDirection:
/*************************************************************************/ /* 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
.
Чтобы использовать тестовую обвязку, созданную с помощью автоматически созданных заглушек, обратитесь к следующей фигуре. Добавьте шины для вводов и выводов. Чтобы позволить соединить Сигнал Simulink для симуляции, соедините входные параметры для Tset
, Troom_in
и ожидаемые выходные параметры от глобальных переменных, SLStubOut_absoluteTempDifference
и SLStubOut_pumpDirection
Аналогично, соедините выходные параметры как показано на рисунке. Можно использовать вводы и выводы, чтобы наблюдать внутренние значения, переданные heatpumpController
к absoluteTempDifference
и pumpDirecton
подвызовы функции.
В случаях, где, например, вы хотите сгенерировать намеченный выход заглушек, как введено к автоматически сгенерированным портам, можно заменить ручными заглушками заглушки, автоматически сгенерированные, когда песочница была создана. После того, как вы переключитесь на использование ручных заглушек, вы обновляете существующую песочницу и импортируете ее снова.
Можно вручную предоставить определения для автоматически сгенерированных интерфейсных функций путем обновления man_stub.c
и man_stub.h
файлы в manualstub
директория.
manualstubpath = fullfile([obj.LibraryFileName.char '_sandbox'],'manualstub'); helperFunctionToUpdateManualStubs(manualstubpath);
helperFunctionToUpdateManualStubs
функционируйте обновляет ручные тупиковые файлы в тестовой песочнице.
Обновленное функциональное определение 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; }
Чтобы использовать ручные интерфейсные функции, обновите песочницу, чтобы отразить ваши изменения. Установка Overwrite
опция к off
сохраняет изменения, внесенные в manualstub
директория в тестовой песочнице.
obj.createSandbox('Overwrite','off');
После обновления тестовой песочницы автотупиковая директория пуста, потому что вы задали все неопределенные символы в заданном пользовательском коде.
После обновления тестовой песочницы импортируйте код песочницы в Simulink.
obj.import('Functions','heatpumpController');
Библиотека содержит блок C Caller под названием heatpumpController
с обновленными портами и внутренней тестовой обвязкой, присоединенной к блоку C Caller, также обновляется.
Функция импорта обновляет существующую библиотеку и импортирует heatpumpController
функция. Как то, когда вы использовали автоматически сгенерированные заглушки, библиотека присоединена к Словарю Данных Simulink, который задает pump_control_bus
и PumpDirection
как Simulink.Bus
возразите и Simulink enumertion сигнал, соответственно.
Порты блока C Caller отражают изменения, внесенные в тупиковые файлы. Поскольку ручная реализация absoluteTempDifference
и pumpDirection
функции не используют глобальных переменных, блок C Caller только имеет порты для входных параметров и возвращаемого аргумента heatpumpController
функция. Внутренняя тестовая обвязка, присоединенная к блоку C Caller, также обновляется.
Можно использовать созданный тестовый файл MLDATX, чтобы протестировать код. Смотрите Модульное тестирование Поведения на Импортированном Пользовательском коде при помощи Мастера для примера тестирования.
sltest.CodeImporter
| sltest.CodeImporter.SandboxSettings
| createSandbox
| Simulink.CodeImporter.CustomCode
| Simulink.CodeImporter.import
| Simulink.CodeImporter
| Simulink.CodeImporter.ParseInfo
| Simulink.CodeImporter.Options