exponenta event banner

Проведение модульного тестирования импортированного пользовательского кода с помощью команд API

В этом примере показано, как использовать API для импорта пользовательского кода C для контроллера теплового насоса в Simulink для тестирования установки. Модульные тесты тестируют одну или несколько функций в изоляции от пользовательской библиотеки кодов. Для модульных тестов импортер кода Simulink Test создает тестовую изолированную среду и библиотеку, содержащую блок Caller 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 функция:

Температурный     ConditionSystem StateFan CommandPump CommandPump Direction'Troom_in - Tset | < DeltaT_fanIdle00IDLEDelatT_fan <= |Troom_in - Tset | <  DeltaT_pumpFan only10IDLE'Troom_in - Tset | > = DeltaT_pump и Tset < Troom_inCooling11COOLING'Troom_in - Tset | > = DeltaT_pump и Tset > Troom_inHeating11HEATING

heatpumpController функция использует две служебные функции, absoluteTempDifference и pumpDirection, которые определены в utils.c файл. absoluteTempDifference функция возвращает абсолютную разницу между Tset и Troom_in как двойник. pumpDirection функция возвращает одно из следующих значений: PumpDirection значения перечисления типов:

Температурный режим Направление насоса Набор < Troom_inCOOLINGTset > Troom_inHEATING

PumpDirection enum 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 с именем heatpumpController, который содержит внутренний тестовый жгут, который можно использовать для выполнения модульного тестирования на heatpumpController. Библиотека присоединена к словарю данных Simulink, который определяет pump_control_bus и PumpDirection в качестве Simulink.Bus объект и сигнал перечисления Simulink соответственно.

Блок вызывающего абонента C подключается к внутреннему тестовому жгуту для модульного тестирования heatpumpController функция.

Порты ввода и вывода в блоке вызывающего абонента C

Потому что вы установили CustomCode.GlobalVariableInterface кому true перед импортом, import функция создает заглушки для absoluteTempDifference и pumpDirection глобальные переменные в auto_stub.c и создает для них порты. Дополнительные сведения см. в разделе Включение глобальных переменных в качестве функциональных интерфейсов.

Это блок вызывающего абонента C, 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 с именем heatpumpController с обновленными портами и внутренний тестовый жгут, присоединенный к блоку C Caller, также обновляется.

Функция импорта обновляет существующую библиотеку и импортирует heatpumpController функция. Как и при использовании автоматически созданных заглушек, библиотека присоединяется к словарю Simulink Data Dictionary, определяющему pump_control_bus и PumpDirection в качестве Simulink.Bus объект и сигнал перечисления Simulink соответственно.

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

См. также

| | | | | | |

Связанные темы