Запустите исполняемый файл для различных различных значений параметров, не перекомпилировав код

В этом примере показано, как сгенерировать исполняемый файл, который запускается для различного набора различных значений параметров, не будучи должен перекомпилировать код для каждого множества значений.

В этом примере вы создаете исполняемый файл, который представляет переходной процесс линейной системы с ПИД-регулятором. В исполняемом файле параметры ПИДа, пропорциональная составляющая и интегральная составляющая, заданы как различные параметры, которые имеют несколько значений, чтобы угодить нескольким требованиям. Каждое значение сопоставлено с различным выражением управления. Когда вы запускаете исполняемый файл, Simulink® оценивает выражения условия. На основе выражения условия, которое оценивает к true, все значения параметров усиления, сопоставленные с тем выражением условия, становятся активными, и исполняемый файл запускается только для того набора значений усиления. Можно затем изменить значение различной контрольной переменной, чтобы запустить исполняемый файл для различного набора значений параметров усиления. Вы не обязаны перекомпилировать код, чтобы создать исполняемый файл для различного набора значений параметров усиления.

Обзор различных параметров

Различные параметры могут иметь несколько значений. Каждое значение различного параметра сопоставлено с различным выражением условия. В процессе моделирования значение различного параметра сопоставило с условием, которое оценивает к true активное значение того параметра. Значение сопоставило с условием, которое оценивает к false неактивное значение того различного параметра. Для получения дополнительной информации смотрите Параметры Варианта Использования к Параметрам блоков Повторного использования с Различными Значениями.

Изменчивость и представление различных параметров в сгенерированном коде зависят от ActivationTime и Спецификации propery, вы задаете. Время активации определяет, включать ли только активный выбор или и активный и неактивный выбор в коде. Класс памяти определяет, представлять ли параметры как встроенные или настраиваемые переменные. Для получения дополнительной информации см. Опции, чтобы Представлять Различные Параметры в Сгенерированном коде (Embedded Coder).

Если вы задаете время активации как startup, сгенерированный код включает и активные и неактивные значения различных параметров. Значения заключены в регулярный if условия модели инициализируют функцию кода. Когда вы запускаете исполняемый файл, который создается из кода, if условия условно выполняются в начале выполнения. На основе условия, которое оценивает к true, исполняемый файл определяет активные значения различных параметров. Если вы включаете все значения в исполняемый файл, то вы не должны перекомпилировать код каждый раз, когда вы изменяете значение различной контрольной переменной. Вы создаете исполняемый файл только однажды. Можно затем изменить значение различной контрольной переменной и затем запустить исполняемый файл для различного набора активных значений.

Необходимое условие

Прежде чем вы запустите этот пример, мы рекомендуем, чтобы вы завершили Опции, чтобы Представлять Различные Параметры в Сгенерированном коде (Embedded Coder).

Исследуйте модель

Откройте модель.

mdl = 'slexVariantParametersStartup';
open_system(mdl)

Блок PID Controller имеет два различных параметра, Пропорциональные (P) и Интеграл (I). Параметры заданы как Simulink.VariantVariable объекты Kp и Ki. Kp и Ki имейте несколько значений, и сопоставлены с Simulink.VariantControl объект VCtrl, как задано в slexVariantParameterGain.m файл. В этом файле, время активации VCtrl задан как startup. Так, исполняемый файл, который вы создаете из этой модели, определяет активное значение Kp и Ki в начале его выполнения путем чтения значения VCtrl от slexVariantParametersStartup_VCtrl.txt файл. С тех пор, значение VCtrl задан как 1, исполняемый файл вычисляет переходной процесс для значений, сопоставленных с VCtrl == 1. Вычислить переходной процесс для различного значения VCtrl, измените значение VCtrl в slexVariantParametersStartup_VCtrl.txt файл и запуск исполняемый файл снова.

Создайте и рассмотрите сгенерированный код с регулярным if Условия и utAssert Функция

Прежде чем вы сгенерируете код и создадите исполняемый файл из модели, вы сначала проверяете, что у вас есть разрешение записи в вашей текущей папке.

1. На панели инструментов Simulink, на вкладке Apps, нажимают Embedded Coder. На вкладке C Code нажмите Build. Для получения дополнительной информации смотрите, Генерируют Код Используя Embedded Coder® (Embedded Coder).

Генератор кода создает исполняемый файл, генерирует Отчет Генерации кода и помещает исполняемый файл в рабочую папку. На Windows® исполняемым файлом является slexVariantParametersStartup.exe. На Linux® исполняемым файлом является slexVariantParameterStartup. В качестве альтернативы введите эту команду в Командном окне MATLAB®, чтобы создать исполняемый файл.

slbuild(mdl);
### Starting build procedure for: slexVariantParametersStartup
### Generating code and artifacts to 'Model specific' folder structure
### Generating code into build folder: /tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw
### Invoking Target Language Compiler on slexVariantParametersStartup.rtw
### Using System Target File: /mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/ert/ert.tlc
        ### Loading TLC function libraries
.......
### Generating TLC interface API for custom data
.
### Initial pass through model to cache user defined code
.
### Caching model source code
..............................................
### Writing header file slexVariantParametersStartup_types.h
### Writing header file slexVariantParametersStartup.h
### Writing header file rtwtypes.h
### Writing header file builtin_typeid_types.h
### Writing header file multiword_types.h
.
### Writing source file slexVariantParametersStartup.c
### Writing header file slexVariantParametersStartup_private.h
### Writing header file rt_assert.h
### Writing header file rt_nonfinite.h
### Writing source file rt_nonfinite.c
.
### Writing header file rtGetInf.h
### Writing source file rtGetInf.c
### Writing header file rtGetNaN.h
### Writing source file rtGetNaN.c
### Writing source file ert_main.c
.
### TLC code generation complete.
.### Saving binary information cache.
### Using toolchain: GNU gcc/g++ | gmake (64-bit Linux)
### Creating '/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw/slexVariantParametersStartup.mk' ...
### Building 'slexVariantParametersStartup': "/mathworks/devel/bat/BR2021bd/build/matlab/bin/glnxa64/gmake"  -f slexVariantParametersStartup.mk all
gmake[5]: Entering directory `/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw'
gcc -c -fwrapv -fPIC -O0 -msse2 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTERMFCN=1 -DONESTEPFCN=1 -DMAT_FILE=1 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0  -DTID01EQ=1 -DMODEL=slexVariantParametersStartup -DNUMST=2 -DNCSTATES=0 -DHAVESTDIO -DMODEL_HAS_DYNAMICALLY_LOADED_SFCNS=0 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw -I/mathworks/devel/bat/BR2021bd/build/matlab/extern/include -I/mathworks/devel/bat/BR2021bd/build/matlab/simulink/include -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src/ext_mode/common -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/ert -o "rt_logging.o" "/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src/rt_logging.c"
gcc -c -fwrapv -fPIC -O0 -msse2 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTERMFCN=1 -DONESTEPFCN=1 -DMAT_FILE=1 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0  -DTID01EQ=1 -DMODEL=slexVariantParametersStartup -DNUMST=2 -DNCSTATES=0 -DHAVESTDIO -DMODEL_HAS_DYNAMICALLY_LOADED_SFCNS=0 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw -I/mathworks/devel/bat/BR2021bd/build/matlab/extern/include -I/mathworks/devel/bat/BR2021bd/build/matlab/simulink/include -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src/ext_mode/common -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/ert -o "rtGetInf.o" "/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw/rtGetInf.c"
gcc -c -fwrapv -fPIC -O0 -msse2 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTERMFCN=1 -DONESTEPFCN=1 -DMAT_FILE=1 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0  -DTID01EQ=1 -DMODEL=slexVariantParametersStartup -DNUMST=2 -DNCSTATES=0 -DHAVESTDIO -DMODEL_HAS_DYNAMICALLY_LOADED_SFCNS=0 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw -I/mathworks/devel/bat/BR2021bd/build/matlab/extern/include -I/mathworks/devel/bat/BR2021bd/build/matlab/simulink/include -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src/ext_mode/common -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/ert -o "rtGetNaN.o" "/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw/rtGetNaN.c"
gcc -c -fwrapv -fPIC -O0 -msse2 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTERMFCN=1 -DONESTEPFCN=1 -DMAT_FILE=1 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0  -DTID01EQ=1 -DMODEL=slexVariantParametersStartup -DNUMST=2 -DNCSTATES=0 -DHAVESTDIO -DMODEL_HAS_DYNAMICALLY_LOADED_SFCNS=0 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw -I/mathworks/devel/bat/BR2021bd/build/matlab/extern/include -I/mathworks/devel/bat/BR2021bd/build/matlab/simulink/include -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src/ext_mode/common -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/ert -o "rt_nonfinite.o" "/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw/rt_nonfinite.c"
gcc -c -fwrapv -fPIC -O0 -msse2 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTERMFCN=1 -DONESTEPFCN=1 -DMAT_FILE=1 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0  -DTID01EQ=1 -DMODEL=slexVariantParametersStartup -DNUMST=2 -DNCSTATES=0 -DHAVESTDIO -DMODEL_HAS_DYNAMICALLY_LOADED_SFCNS=0 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw -I/mathworks/devel/bat/BR2021bd/build/matlab/extern/include -I/mathworks/devel/bat/BR2021bd/build/matlab/simulink/include -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src/ext_mode/common -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/ert -o "slexVariantParametersStartup.o" "/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw/slexVariantParametersStartup.c"
gcc -c -fwrapv -fPIC -O0 -msse2 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTERMFCN=1 -DONESTEPFCN=1 -DMAT_FILE=1 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0  -DTID01EQ=1 -DMODEL=slexVariantParametersStartup -DNUMST=2 -DNCSTATES=0 -DHAVESTDIO -DMODEL_HAS_DYNAMICALLY_LOADED_SFCNS=0 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw -I/mathworks/devel/bat/BR2021bd/build/matlab/extern/include -I/mathworks/devel/bat/BR2021bd/build/matlab/simulink/include -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src/ext_mode/common -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/ert -o "slexVariantParametersStartup_VCtrl.o" "/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_VCtrl.c"
gcc -c -fwrapv -fPIC -O0 -msse2 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTERMFCN=1 -DONESTEPFCN=1 -DMAT_FILE=1 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0  -DTID01EQ=1 -DMODEL=slexVariantParametersStartup -DNUMST=2 -DNCSTATES=0 -DHAVESTDIO -DMODEL_HAS_DYNAMICALLY_LOADED_SFCNS=0 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195 -I/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw -I/mathworks/devel/bat/BR2021bd/build/matlab/extern/include -I/mathworks/devel/bat/BR2021bd/build/matlab/simulink/include -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/src/ext_mode/common -I/mathworks/devel/bat/BR2021bd/build/matlab/rtw/c/ert -o "ert_main.o" "/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw/ert_main.c"
### Creating standalone executable ../slexVariantParametersStartup ...
g++  -o ../slexVariantParametersStartup rt_logging.o rtGetInf.o rtGetNaN.o rt_nonfinite.o slexVariantParametersStartup.o slexVariantParametersStartup_VCtrl.o ert_main.o  
### Created: ../slexVariantParametersStartup
### Successfully generated all binary outputs.
gmake[5]: Nothing to be done for `all'.
gmake[5]: Leaving directory `/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw'
### Successful completion of build procedure for: slexVariantParametersStartup
### Simulink cache artifacts for 'slexVariantParametersStartup' were created in '/tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup.slxc'.

Build Summary

Top model targets built:

Model                         Action                       Rebuild Reason                                    
=============================================================================================================
slexVariantParametersStartup  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 25.973s

2. На вкладке C Code выберите Open Report.

3. Выберите slexVariantParametersStartup.c файл. В этом файле модель инициализирует функцию, включает:

a. Символьные имена для всех значений Kp и Ki заключенный в регулярный if условия. Они if условия оценены, когда вы запускаете исполняемый файл.

if (get_VCtrl() == 1)
{
 Ki = 4.5;
 Kp = 0.15;
}
else if (get_VCtrl() == 2)
{
 Ki = 4.0;
	Kp = 0.5;
}
else if (get_VCtrl() == 3)
{
 Ki = 3.5;
 Kp = 0.75;
}
else if (get_VCtrl() == 4)
{
 Ki = 3.0;
 Kp = 1.0;
}

b. utAssert функция, чтобы убедиться при наименьшем количестве одного различного условия оценивает к true при выполнении исполняемого файла.

utAssert((get_VCtrl() == 1) || (get_VCtrl() == 2) || (get_VCtrl() == 3) || (get_VCtrl() ==  4));

4. В model_step функция, имена символа Kp и Ki используются, чтобы сформировать уравнение.

void slexVariantParameters_step(void)
{
 ...
 slexVariantParametersStartup_Y.Out1 = 0.5 *
 slexVariantParametersStartup_DW.DiscreteTransferFcn_states[1];
Add = (real_T)!(slexVariantParametersStartup_M->Timing.t[0] < 1.0) -slexVariantParametersStartup_Y.Out1;
rtb_FilterCoefficient = (0.0 * Add -
slexVariantParametersStartup_DW.Filter_DSTATE) * 100.0;
slexVariantParametersStartup_B.Sum = (Kp * Add +
slexVariantParametersStartup_DW.Integrator_DSTATE) + rtb_FilterCoefficient;
rtb_IntegralGain = Ki * Add;
...
}

Установите активные значения различных параметров на этапе запуска модели

Идентифицируйте версию MATLAB на вашей машине. ispc возвращает логический 1 TRUE) если версия MATLAB для платформы Microsoft® Windows®. В противном случае это возвращает логический 0 ложь). На Windows® исполняемым файлом является slexVariantParametersStartup.exe. На Linux® исполняемым файлом является slexVariantParameterStartup. Чтобы запустить сгенерированный исполняемый файл, введите эту команду в командное окно MATLAB.

if ispc
exeName = [mdl, '.exe'];
else
exeName = ['./', mdl];
end
system(exeName);
** created slexVariantParametersStartup.mat **

В начале выполнения исполняемый файл вызывает модель, инициализируют функцию. Исполняемый файл читает значение VCtrl от slexVariantParametersStartup_VCtrl.txt файл, чтобы оценить if условия в функции. Начиная со значения VCtrl установлен в 1 в slexVariantParametersStartup_VCtrl.txt файл, if условие для VCtrl == 1 оценивает к true. Сгенерированный исполняемый файл условно запущен для значений параметров коэффициента ПИД, которые сопоставлены с VCtrl == 1 и создает slexVariantParametersStartup.mat MAT-файл как выход. MAT-файл содержит значения для переменных rt_tout и rt_yout, где rt_yout представляет линейный переходной процесс в блоке Out1 выходного порта для каждого временного шага rt_tout.

Можно загрузить переменные из MAT-файла путем ввода этой команды:

load slexVariantParametersStartup.mat;

Чтобы построить линейный переходной процесс, используйте эту функцию:

plot(rt_tout, rt_yout.signals.values, 'x-');

Теперь измените значение VCtrl в slexVariantParametersStartup_VCtrl.txt файл к 2. Запустите исполняемый файл снова, чтобы наблюдать изменение в переходном процессе.

Установите различные активные значения для различных параметров, не перекомпилировав код

slexVariantStartup_script.m скрипт реализует логику, чтобы построить линейный переходной процесс для различных значений пропорциональной составляющей и параметров интегральной составляющей путем изменения значения VCtrl использование for цикл.

Когда вы запускаете скрипт:

В первой итерации исполняемые запуски и модель инициализируют функцию, вызывается. Исполняемый файл читает значение VCtrl как 1 от slexVariantParametersStartup_VCtrl.txt файл, чтобы оценить if условия в модели инициализируют функцию. Условие VCtrl == 1 оценивает к true, пропорциональные значения и значения интегральной составляющей, которые сопоставлены с VCtrl == 1 становится активным. Исполняемый файл вычисляет переходной процесс для тех значений и создает slexVariantParametersStartup.mat MAT-файл, который содержит переходной процесс, вычисленный для каждого временного шага.

В следующей итерации, значении VCtrl увеличен до 2. Исполняемый файл вычисляет переходной процесс для присваиваемых значений и добавляет недавно расчетный переходной процесс к MAT-файлу.

Точно так же исполняемый файл вычисляет переходной процесс для значений, сопоставленных с условиями VCtrl == 3 и VCtrl == 4.

Скрипт строит линейный переходной процесс как показано.

run slexVariantParameters_script.m;
### Starting build procedure for: slexVariantParametersStartup
### Generating code and artifacts to 'Model specific' folder structure
### Generating code into build folder: /tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup_ert_rtw
### Generated code for 'slexVariantParametersStartup' is up to date because no structural, parameter or code replacement library changes were found.
### Skipping makefile generation and compilation because /tmp/BR2021bd_1724986_151598/publish_examples2/tpe10c481c/ex18167195/slexVariantParametersStartup is up to date
### Successful completion of build procedure for: slexVariantParametersStartup

Build Summary

0 of 1 models built (1 models already up to date)
Build duration: 0h 0m 2.6648s
** created slexVariantParametersStartup.mat **

** created slexVariantParametersStartup.mat **

** created slexVariantParametersStartup.mat **

** created slexVariantParametersStartup.mat **

Смотрите также