| Идентификатор: Заголовок | cgsl_0201: Избыточная задержка блока и блоки памяти | ||
|---|---|---|---|
| Описание | При подготовке модели к созданию кода | ||
| A | Удалите резервные блоки задержки и памяти. | ||
| Объяснение | A | Блоки задержки избыточных блоков и памяти используют дополнительную глобальную память. Удаление избыточности из модели уменьшает использование памяти без влияния на поведение модели. | |
| Последнее изменение | R2013a | ||
| Пример | Рекомендуется: Сводные задержки подразделения
void Reduced(void)
{
ConsolidatedState_2 = Matrix_UD_Test - (Cal_1 * DWork.UD_3_DSTATE + Cal_2 *
DWork.UD_3_DSTATE);
DWork.UD_3_DSTATE = ConsolidatedState_2;
} | ||
Не рекомендуется: задержки избыточных блоков
void Redundant(void)
{
RedundantState = (Matrix_UD_Test - Cal_2 * DWork.UD_1B_DSTATE) - Cal_1 *
DWork.UD_1A_DSTATE;
DWork.UD_1B_DSTATE = RedundantState;
DWork.UD_1A_DSTATE = RedundantState;
} | |||
Блоки единичной задержки и памяти проявляют коммутативные и распределительные алгебраические свойства. Когда блоки являются частью уравнения с одним управляющим сигналом, можно переместить блоки единичной задержки и памяти в новое положение в уравнении без изменения результата.
Для верхнего пути в предыдущем примере уравнения для блоков:
Для нижнего пути уравнения:
В отличие от этого, при добавлении вторичного сигнала к уравнениям расположение блока «Единичная задержка» влияет на результат. Как показано в следующем примере, расположение блока «Единичная задержка» влияет на результаты из-за перекоса временной выборки между верхним и нижним путями.
В случаях с одним источником и несколькими адресатами сравнение является более сложным. Например, в следующей модели можно преобразовать два блока единичной задержки в одну единичную задержку.
С точки зрения черного ящика эти две модели эквивалентны. Однако с точки зрения памяти и вычислений между двумя моделями существуют различия. {
real_T rtb_Gain4;
rtb_Gain4 = Cal_1 * Redundant;
Y.Redundant_Gain = Cal_2 * rtb_Gain4;
Y.Redundant_Int = DWork.Int_A;
Y.Redundant_Int_UD = DWork.UD_A;
Y.Redundant_Gain_UD = DWork.UD_B;
DWork.Int_A = 0.01 * rtb_Gain4 + DWork.Int_A;
DWork.UD_A = Y.Redundant_Int;
DWork.UD_B = Y.Redundant_Gain;
}{
real_T rtb_Gain1;
real_T rtb_UD_C;
rtb_Gain1 = Cal_1 * Reduced;
rtb_UD_C = DWork.UD_C;
Y.Reduced_Gain_UD = Cal_2 * DWork.UD_C;
Y.Reduced_Gain = Cal_2 * rtb_Gain1;
Y.Reduced_Int = DWork.Int_B;
Y.Reduced_Int_UD = DWork.Int_C;
DWork.UD_C = rtb_Gain1;
DWork.Int_B = 0.01 * rtb_Gain1 + DWork.Int_B;
DWork.Int_C = 0.01 * rtb_UD_C + DWork.Int_C;
}В этом случае исходная модель более эффективна. В первом примере кода существуют три глобальные переменные, две из блоков единичной задержки (DWork.UD_A и DWork.UD_B) и одна из дискретного интегратора времени (DWork.Int_A). Второй пример кода показывает уменьшение до одной глобальной переменной, генерируемой единичными задержками (Dwork.UD_C), но существуют две глобальные переменные из-за избыточных блоков дискретного интегратора времени (DWork.Int_B и DWork.Int_C). Путь блока дискретного интегратора времени вводит дополнительную локальную переменную (rtb_UD_C) и два дополнительных вычисления. Напротив, рефакторированная модель (вторая) ниже является более эффективной.
{
real_T rtb_Gain4_f:
real_T rtb_Int_D;
rtb_Gain4_f = Cal_1 * U.Input;
rtb_Int_D = DWork.Int_D;
Y.R_Int_Out = DWork.UD_D;
Y.R_Gain_Out = DWork.UD_E;
DWork.Int_D = 0.01 * rtb_Gain4_f + DWork.Int_D;
DWork.UD_D = rtb_Int_D;
DWork.UD_E = Cal_2 * rtb_Gain4_f;
}{
real_T rtb_UD_F;
rtb_UD_F = DWork.UD_F;
Y.Gain_Out = Cal_2 * DWork.UD_F;
Y.Int_Out = DWork.Int_E;
DWork.UD_F = Cal_1 * U.Input;
DWork.Int_E = 0.01 * rtb_UD_F + DWork.Int_E;
}Код для рефакторированной модели более эффективен, поскольку ответвления от корневого сигнала не имеют избыточной единичной задержки. | |||