Структура сгенерированного кода для многоскоростных моделей

Этот пример принимает, что вы сгенерировали код Структурированного текста из модели Simulink®. Если вы еще не сделали так, смотрите, Генерируют Структурированный текст от Окна модели.

Пример в этой теме показывает сгенерированный код для IDE Версии 2.3 CoDeSys. Сгенерированный код для других платформ IDE выглядит по-другому.

  1. Откройте модель plcdemo_multirate. Эта модель имеет две частоты дискретизации.

  2. Щелкните правой кнопкой по блоку SimpleSubsystem и выберите PLC Code> Generate Code for Subsystem.

    Программное обеспечение Simulink PLC Coder™ генерирует код Структурированного текста и помещает его в current_folder/plcsrc/plcdemo_multirate.exp.

  3. Если вы не имеете файла 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 более медленные уровни. Код, сгенерированный от частей модели, запускающейся на более медленных уровнях, выполняется условно, на основе соответствующих значений счетчика временного шага.