Этот пример показывает, как реализовать построение switch при помощи блоков Simulink, диаграмм Stateflow и блока MATLAB function.
switch (u1)
{
case 2:
y1 = u2;
break;
case 3:
u3;
break;
default:
y1 = u4;
break;
}
Один метод, чтобы создать оператор switch должен использовать блок Switch Case от библиотеки Simulink> Signal Routing.
1. Открытая модель ex_switch_SL в качестве примера.

Модель содержит Подсистему Действия Случая Переключателя. Блок Switch Case берет целочисленный вход, поэтому, входной сигнал, u1 является броском типа к int32.
2. Чтобы создать модель и сгенерировать код, нажмите Ctrl+B.
Код, реализующий построение switch, находится в функции ex_switch_SL_step в ex_switch_SL.c:
/* Exported block signals */
int32_T u1; /* '<Root>/u1' */
/* External inputs (root inport signals with default storage) */
ExternalInputs rtU;
/* External outputs (root outports fed by signals with default storage) */
ExternalOutputs rtY;
/* Model step function */
void ex_switch_SL_step(void)
{
/* SwitchCase: '<Root>/Switch Case' incorporates:
* Inport: '<Root>/u1'
*/
switch (u1) {
case 2:
/* Outputs for IfAction SubSystem: '<Root>/Switch Case Action Subsystem' incorporates:
* ActionPort: '<S1>/Action Port'
*/
/* Outport: '<Root>/y1' incorporates:
* Inport: '<Root>/u2'
* Inport: '<S1>/u2'
*/
rtY.y1 = rtU.u2;
/* End of Outputs for SubSystem: '<Root>/Switch Case Action Subsystem' */
break;
case 3:
/* Outputs for IfAction SubSystem: '<Root>/Switch Case Action Subsystem1' incorporates:
* ActionPort: '<S2>/Action Port'
*/
/* Outport: '<Root>/y1' incorporates:
* Inport: '<Root>/u3'
* Inport: '<S2>/u3'
*/
rtY.y1 = rtU.u3;
/* End of Outputs for SubSystem: '<Root>/Switch Case Action Subsystem1' */
break;
default:
/* Outputs for IfAction SubSystem: '<Root>/Switch Case Action Subsystem2' incorporates:
* ActionPort: '<S3>/Action Port'
*/
/* Outport: '<Root>/y1' incorporates:
* Inport: '<Root>/u4'
* Inport: '<S3>/u4'
*/
rtY.y1 = rtU.u4;
/* End of Outputs for SubSystem: '<Root>/Switch Case Action Subsystem2' */
break;
}
/* End of SwitchCase: '<Root>/Switch Case' */
}
1. Открытая модель ex_switch_ML в качестве примера.

Блок MATLAB function содержит эту функцию:
function y1 = fcn(u1, u2, u3, u4) switch u1 case 2 y1 = u2; case 3 y1 = u3; otherwise y1 = u4; end
2. Чтобы создать модель и сгенерировать код, нажмите Ctrl+B.
Код, реализующий построение switch, находится в функции ex_switch_ML_step в ex_switch_ML.c:
/* External inputs (root inport signals with default storage) */
ExternalInputs rtU;
/* External outputs (root outports fed by signals with default storage) */
ExternalOutputs rtY;
/* Model step function */
void ex_switch_ML_step(void)
{
/* MATLAB Function: '<Root>/MATLAB Function' incorporates:
* Inport: '<Root>/u1'
*/
switch (rtU.u1) {
case 2:
/* Outport: '<Root>/y1' incorporates:
* Inport: '<Root>/u2'
*/
rtY.y1 = rtU.u2;
break;
case 3:
/* Outport: '<Root>/y1' incorporates:
* Inport: '<Root>/u3'
*/
rtY.y1 = rtU.u3;
break;
default:
/* Outport: '<Root>/y1' incorporates:
* Inport: '<Root>/u4'
*/
rtY.y1 = rtU.u4;
break;
}
/* End of MATLAB Function: '<Root>/MATLAB Function' */
}
Если блок MATLAB function или диаграмма Stateflow используют логику решения if-elseif-else, можно преобразовать блок или график к оператору switch при помощи параметра конфигурации. Выберите Параметры конфигурации> Генерация кода>, Стиль кода> Преобразовывает if-elseif-else шаблоны в параметр операторов case оператора switch. Для получения дополнительной информации смотрите Преобразование Код If-Elseif-Else к Операторам case оператора switch (Simulink). Для получения дополнительной информации об этом преобразовании при помощи диаграммы Stateflow смотрите, Улучшают Удобочитаемость Кода для Блок-схем.