Этот пример принимает, что вы сгенерировали код Структурированного текста из модели Simulink®. Если вы еще не сделали так, смотрите, Генерируют Структурированный текст от Окна модели.
Пример в этой теме показывает сгенерированный код для IDE Версии 2.3 CoDeSys. Сгенерированный код для других платформ IDE выглядит по-другому.
Откройте модель plcdemo_multirate
. Эта модель имеет две частоты дискретизации.
Щелкните правой кнопкой по блоку SimpleSubsystem
и выберите PLC Code> Generate Code for Subsystem.
Программное обеспечение 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
, Sum
и 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
более медленные уровни. Код, сгенерированный от частей модели, запускающейся на более медленных уровнях, выполняется условно, на основе соответствующих значений счетчика временного шага.