exponenta event banner

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

В этом примере предполагается, что из модели Simulink ® создан структурированный текстовый код. Если это еще не сделано, см. раздел Создание структурированного текста в окне модели.

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

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

  2. Откройте приложение «Кодер ПЛК» и перейдите на вкладку «Код ПЛК».

  3. Нажмите «Создать код ПЛК».

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

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