• Регистрация
Andrey Ermakov
Andrey Ermakov +56.93
В жизни все не так, как на самом деле.

Генерация кода reusable

17.12.2020
Добрый день.  Тут пробовал в домашнем проекте генрацию кода С из модели, в целом все работает замечательно, но есть один вопрос, на который не могу найти ответ, а вопрос связан с принципом по кот...

Добрый день. 

Тут пробовал в домашнем проекте генрацию кода С из модели, в целом все работает замечательно, но есть один вопрос, на который не могу найти ответ, а вопрос связан с принципом по которому Embedded Coder решает создать копию данных или нет.

Собственно есть ПИд регулятор которой оформлен как Reference Subsystem.

Генерирую из него код с настройками Reusable получается вызов PID  к коде следующего вида

  /* Outputs for Atomic SubSystem: '<S121>/Pid_Vq' */
  PidReg(&Pid_Vq, &Pid_Vq);

Понятна форма, так как идея Simulink от входа к выходу не желает использовать работу по указателю на прямую( Для встроенной системы типовое же поведение).

В теле же самой функции я вижу следующее

void PidReg(const PID_st *IN, PID_st *OUT)
{
  real32_T local_Product_nj;
  real32_T local_Sum_d;
  PID_st local_BusAssignment_l;
  real32_T local_Merge_a_tmp;

  /* Outputs for Atomic SubSystem: '<S24>/PidReg' */
  /* Sum: '<S27>/Sum' */
  local_Product_nj = IN->Ref - IN->Fdb;

  /* Sum: '<S35>/Satt+' incorporates:
   *  Product: '<S35>/Product1'
   *  Product: '<S35>/err*Ki'
   *  Sum: '<S35>/Ui+'
   */
  local_Sum_d = (local_Product_nj * IN->Ki + IN->Ui) + IN->SatErr * IN->Kc;

  /* Product: '<S36>/Product' */
  local_Product_nj *= IN->Kp;

  /* Sum: '<S29>/OutPreSat' */
  local_Merge_a_tmp = local_Product_nj + local_Sum_d;

  /* BusAssignment: '<S29>/Bus Assignment' */
  local_BusAssignment_l = *IN;
  local_BusAssignment_l.Up = local_Product_nj;
  local_BusAssignment_l.OutPreSat = local_Merge_a_tmp;
  local_BusAssignment_l.Ui = local_Sum_d;

  /* If: '<S26>/If' incorporates:
   *  Inport: '<S30>/In1'
   *  Inport: '<S31>/In1'
   *  Inport: '<S32>/In1'
   *  RelationalOperator: '<S26>/OutPreSat > OutMax'
   *  RelationalOperator: '<S26>/OutPreSat<OutMin'
   *  SignalConversion generated from: '<S26>/Bus Selector'
   *  Sum: '<S29>/OutPreSat'
   */
  if (local_Merge_a_tmp > local_BusAssignment_l.OutMax) {
    /* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem' incorporates:
     *  ActionPort: '<S30>/Action Port'
     */
    local_Product_nj = local_BusAssignment_l.OutMax;

    /* End of Outputs for SubSystem: '<S26>/If Action Subsystem' */
  } else if (local_Merge_a_tmp < local_BusAssignment_l.OutMin) {
    /* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem2' incorporates:
     *  ActionPort: '<S32>/Action Port'
     */
    local_Product_nj = local_BusAssignment_l.OutMin;

    /* End of Outputs for SubSystem: '<S26>/If Action Subsystem2' */
  } else {
    /* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem1' incorporates:
     *  ActionPort: '<S31>/Action Port'
     */
    local_Product_nj = local_Merge_a_tmp;

    /* End of Outputs for SubSystem: '<S26>/If Action Subsystem1' */
  }

  /* End of If: '<S26>/If' */

  /* BusAssignment: '<S26>/Bus Assignment' incorporates:
   *  Sum: '<S26>/Sum'
   */
  local_BusAssignment_l.Out = local_Product_nj;
  local_BusAssignment_l.SatErr = local_Product_nj - local_Merge_a_tmp;

  /* BusAssignment: '<S28>/Bus Assignment' */
  *OUT = local_BusAssignment_l;

  /* If: '<S28>/If' incorporates:
   *  RelationalOperator: '<S28>/Relational Operator'
   */
  if (local_BusAssignment_l.defaultBit > 0U) {
    /* Outputs for IfAction SubSystem: '<S28>/Ui=0' incorporates:
     *  ActionPort: '<S33>/Action Port'
     */
    /* BusAssignment: '<S28>/Bus Assignment' incorporates:
     *  Constant: '<S28>/Constant'
     *  Inport: '<S33>/In1'
     */
    OUT->Ui = 0.0F;

    /* End of Outputs for SubSystem: '<S28>/Ui=0' */
  } else {
    /* BusAssignment: '<S28>/Bus Assignment' incorporates:
     *  BusAssignment: '<S29>/Bus Assignment'
     */
    OUT->Ui = local_Sum_d;
  }

  /* End of If: '<S28>/If' */
  /* End of Outputs for SubSystem: '<S24>/PidReg' */
}

Вот создание буферной переменной PID_st local_BusAssignment_l; не совсем понятно.

Ведь можно было просто сделать обмен указателями.

Буду признателен если кто то прокомментирует и возможно укажет, где почитать про правила при кодгенерации) 

Теги

      17.12.2020

      Комментарии

      • Хасбулат Нурмагомедов
        Хасбулат Нурмагомедов +43.63
        17.12.2020 21:31

        Богато живете - "Тут пробовал в домашнем проекте генрацию кода С из модели".

        • Andrey Ermakov
          Andrey Ermakov +56.93
          18.12.2020 04:06

          К сожалению единственное где могу попробовать) На работе про такое слыхом не слыхивали.

          По существу то есть чего?

          • Хасбулат Нурмагомедов
            Хасбулат Нурмагомедов +43.63
            18.12.2020 08:19

            Вы и без меня всё знаете, мне приходила ссылка на Ваш вебинар.