Этот пример показывает, как реализовать построение 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 смотрите, Улучшают Удобочитаемость Кода для Блок-схем.