Этот пример принимает, что вы сгенерировали код Структурированного текста от Simulink® модель. Если вы еще не сделали так, смотрите, Генерируют Структурированный текст от Окна модели.
Пример в этой теме показывает сгенерированный код для IDE Версии 2.3 CoDeSys. Сгенерированный код для других платформ IDE выглядит по-другому.
Откройте plcdemo_multirate модель. Эта модель имеет две частоты дискретизации.
Откройте приложение PLC Coder. Кликните по вкладке PLC Code.
Нажмите Generate PLC Code.
Программное обеспечение Simulink PLC Coder™ генерирует код Структурированного текста и помещает его в .current_folder/plcsrc/plcdemo_multirate.exp
Если у вас нет plcdemo_multirate.exp файл, открытый, открытый это в MATLAB® редактор и исследует код Структурированного текста.
Сгенерированный код содержит глобальную переменную счетчика временного шага:
VAR_GLOBAL
plc_ts_counter1: DINT;
END_VARВ этом примере существует два уровня, и высокая скорость дважды с такой скоростью, как низкая скорость, таким образом, количества счетчика временного шага к 1, затем сбрасывает:
IF plc_ts_counter1 >= 1 THEN
plc_ts_counter1 := 0;
ELSE
plc_ts_counter1 := plc_ts_counter1 + 1;
END_IF;Сгенерированный код для блоков, запускающихся на более медленных уровнях, выполняется условно на основе соответствующих значений счетчика временного шага. В этом примере, сгенерированном коде для Gain1, Unit Delay1, и Sum1 выполняет любой временной шаг, когда plc_ts_counter1 = 0, потому что те блоки, запущенные на низкой скорости. Сгенерированный код для Gain, Unit Delayсумма, и Sum2 выполняет каждый временной шаг потому что те блоки, запущенные на высокой скорости.
SS_STEP:
(* Gain: '<S1>/Gain' incorporates:
* Inport: '<Root>/U1'
* Sum: '<S1>/Sum'
* UnitDelay: '<S1>/Unit Delay' *)
rtb_Gain := (U1 - UnitDelay_DSTATE) * 0.5;
(* Outport: '<Root>/Y1' *)
Y1 := rtb_Gain;
IF plc_ts_counter1 = 0 THEN
(* UnitDelay: '<S1>/Unit Delay1' *)
UnitDelay1 := UnitDelay1_DSTATE;
(* Gain: '<S1>/Gain1' incorporates:
* Inport: '<Root>/U2'
* Sum: '<S1>/Sum1' *)
rtb_Gain1 := (U2 - UnitDelay1) * 0.5;
(* Outport: '<Root>/Y2' *)
Y2 := rtb_Gain1;
END_IF;
(* Outport: '<Root>/Y3' incorporates:
* Sum: '<S1>/Sum2'
* UnitDelay: '<S1>/Unit Delay' *)
Y3 := UnitDelay_DSTATE - UnitDelay1;
(* Update for UnitDelay: '<S1>/Unit Delay' *)
UnitDelay_DSTATE := rtb_Gain;
IF plc_ts_counter1 = 0 THEN
(* Update for UnitDelay: '<S1>/Unit Delay1' *)
UnitDelay1_DSTATE := rtb_Gain1;
END_IF;В общем случае для подсистемы с n различными шагами расчета, сгенерированный код имеет n-1 переменные счетчика временного шага, соответствуя n-1 более медленные уровни. Код, сгенерированный от частей модели, запускающейся на более медленных уровнях, выполняется условно, на основе соответствующих значений счетчика временного шага.