Для использования оптимизации читаемости в коде необходимо иметь лицензию Embedded Coder ®. Эти оптимизации появляются только в коде, генерируемом для встроенного режима реального времени (ert) цель.
Примечание
Эти оптимизации не применяются к файлам MATLAB ®, вызываемым из функционального блока MATLAB.
Дополнительные сведения см. в разделе Настройка целевого файла системы.
При создании кода для встроенных целей в реальном времени можно выбрать преобразование if-elseif-else логика решения для switch-case заявления. Это преобразование может повысить читаемость кода.
Например, когда функциональный блок MATLAB содержит длинный список условий, switch-case структура:
Сокращение использования скобок и фигурных скобок
Минимизация повторения в созданном коде
Следующая процедура описывает преобразование сгенерированного кода для функционального блока MATLAB из if-elseif-else кому switch-case заявления.
| Шаг | Задача | Ссылка |
|---|---|---|
| 1 | Убедитесь, что блок соответствует правилам преобразования. | Проверка содержимого блока |
| 2 | Включите преобразование. | Включение преобразования |
| 3 | Создайте код для модели. | Создание кода для модели |
Для выполнения преобразования должны быть сохранены следующие правила. LHS и RHS относятся соответственно к левой и правой сторонам состояния.
| Конструкция | Правила, которым необходимо следовать |
|---|---|
| Функциональный блок MATLAB | В дополнение к условиям по умолчанию должно быть два или более уникальных условия. Дополнительные сведения см. в разделе Как преобразование обрабатывает повторяющиеся условия. |
| Каждое условие | Должен проверять только равенство. |
Необходимо использовать одну и ту же переменную или выражение для LHS. Примечание Можно сторнировать LHS и RHS. | |
| Каждый LHS | Должна быть единственной переменной или выражением, а не составным оператором. |
Не может быть константой. | |
Должен иметь целочисленный или перечисляемый тип данных. | |
Не должно иметь побочных эффектов при моделировании. Например, LHS может считывать, но не записывать глобальные переменные. | |
| Каждый RHS | Должно быть константой. |
Должен иметь целочисленный или перечисляемый тип данных. |
Если функциональный блок MATLAB имеет повторяющиеся условия, преобразование сохраняет только первое условие. Созданный код отбрасывает другие экземпляры повторяющихся условий.
После удаления дубликатов должны существовать два или более уникальных условия. В противном случае преобразование не выполняется, и созданный код содержит экземпляры повторяющихся условий.
В следующих примерах показано, как преобразование обрабатывает повторяющиеся условия.
| Пример сгенерированного кода | Код после преобразования |
|---|---|
if (x == 1) {
block1
} else if (x == 2) {
block2
} else if (x == 1) { // duplicate
block3
} else if (x == 3) {
block4
} else if (x == 1) { // duplicate
block5
} else {
block6
} | switch (x) {
case 1:
block1; break;
case 2:
block2; break;
case 3:
block4; break;
default:
block6; break;
} |
if (x == 1) {
block1
} else if (x == 1) { // duplicate
block2
} else {
block3
} | Не изменяется, поскольку существует только одно уникальное условие |
Предположим, что имеется следующая модель с функциональным блоком MATLAB. Предположим, что тип выходных данных - double и тип входных данных: Controller, определяемый перечисляемый тип.

Блок содержит следующий код:
function system = fcn(type)
%#codegen
if (type == Controller.P)
system = 0;
elseif (type == Controller.I)
system = 1;
elseif (type == Controller.PD)
system = 2;
elseif (type == Controller.PI)
system = 3;
elseif (type == Controller.PID)
system = 4;
else
system = 10;
endОпределение перечисляемого типа в Controller.m является:
classdef Controller < Simulink.IntEnumType
enumeration
P(0)
I(1)
PD(2)
PI(3)
PID(4)
UNKNOWN(10)
end
endЕсли вы создаете код для встроенного целевого объекта в реальном времени с помощью настроек по умолчанию, вы увидите следующее:
if (if_to_switch_eml_blocks_U.In1 == P) {
/* '<S1>:1:4' */
/* '<S1>:1:5' */
if_to_switch_eml_blocks_Y.Out1 = 0.0;
} else if (if_to_switch_eml_blocks_U.In1 == I) {
/* '<S1>:1:6' */
/* '<S1>:1:7' */
if_to_switch_eml_blocks_Y.Out1 = 1.0;
} else if (if_to_switch_eml_blocks_U.In1 == PD) {
/* '<S1>:1:8' */
/* '<S1>:1:9' */
if_to_switch_eml_blocks_Y.Out1 = 2.0;
} else if (if_to_switch_eml_blocks_U.In1 == PI) {
/* '<S1>:1:10' */
/* '<S1>:1:11' */
if_to_switch_eml_blocks_Y.Out1 = 3.0;
} else if (if_to_switch_eml_blocks_U.In1 == PID) {
/* '<S1>:1:12' */
/* '<S1>:1:13' */
if_to_switch_eml_blocks_Y.Out1 = 4.0;
} else {
/* '<S1>:1:15' */
if_to_switch_eml_blocks_Y.Out1 = 10.0;
}
Переменная LHS if_to_switch_eml_blocks_U.In1 появляется несколько раз в созданном коде.
Примечание
По умолчанию переменные, отображаемые в блоке, не сохраняют свои имена в созданном коде. Измененные идентификаторы предотвращают конфликты имен.
Комментарии к отслеживанию появляются между каждым набором /* и */ маркеры. Дополнительные сведения об отслеживании см. в разделе Использование отслеживания в функциональных блоках MATLAB.
Убедитесь, что блок соответствует правилам в окне «Правила преобразования».
| Конструкция | Как конструкция следует правилам |
|---|---|
| Функциональный блок MATLAB | В дополнение к условиям по умолчанию существуют пять уникальных условий:
|
| Каждое условие | Каждое условие:
|
| Каждый LHS | Каждый LHS:
|
| Каждый RHS | Каждый RHS:
|
Откройте диалоговое окно «Параметры конфигурации».
На панели «Создание кода» выберите ert.tlc для целевого файла системы.
На этом шаге задается встроенный целевой объект в реальном времени для модели.
На панели Создание кода > Стиль кода установите флажок Преобразовать шаблоны if-elseif-else в операторы switch-case.
Совет
Это преобразование работает на основе модели. Если этот флажок установлен, преобразование применяется к:
Функциональные блоки MATLAB в модели
Функции MATLAB в диаграммах Stateflow ® этой модели
Блок-схемы в блок-схемах Stateflow этой модели
Дополнительные сведения см. в разделе Улучшение читаемости кода для блок-схем.
В окне модели нажмите клавиши CTRL + B.
Код для функционального блока MATLAB использует switch-case заявления вместо if-elseif-else код:
switch (if_to_switch_eml_blocks_U.In1) {
case P:
/* '<S1>:1:4' */
/* '<S1>:1:5' */
if_to_switch_eml_blocks_Y.Out1 = 0.0;
break;
case I:
/* '<S1>:1:6' */
/* '<S1>:1:7' */
if_to_switch_eml_blocks_Y.Out1 = 1.0;
break;
case PD:
/* '<S1>:1:8' */
/* '<S1>:1:9' */
if_to_switch_eml_blocks_Y.Out1 = 2.0;
break;
case PI:
/* '<S1>:1:10' */
/* '<S1>:1:11' */
if_to_switch_eml_blocks_Y.Out1 = 3.0;
break;
case PID:
/* '<S1>:1:12' */
/* '<S1>:1:13' */
if_to_switch_eml_blocks_Y.Out1 = 4.0;
break;
default:
/* '<S1>:1:15' */
if_to_switch_eml_blocks_Y.Out1 = 10.0;
break;
}
switch-case операторы обеспечивают следующие преимущества для улучшения читаемости:
Код сокращает использование скобок и фигурных скобок.
Переменная LHS if_to_switch_eml_blocks_U.In1 появляется только один раз, сводя к минимуму повторение в коде.