В этом примере показано, как использовать 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