Идентификатор: Заголовок | cgsl_0201: Избыточные блоки Unit Delay и памяти | ||
---|---|---|---|
Описание | При подготовке модели к генерации кода, | ||
A | Удалите резервные блоки Unit Delay и Memory. | ||
Объяснение | A | Резервные блоки Unit Delay и Memory используют дополнительную глобальную память. Удаление избыточностей из модели уменьшает использование памяти, не влияя на поведение модели. | |
Последнее изменение | 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; } | |||
Блоки Unit Delay и Memory проявляют коммутативные и распределительные алгебраические свойства. Когда блоки являются частью уравнения с одним ведущим сигналом, можно переместить блоки Unit Delay и Memory в новое положение уравнения, не меняя результат.
Для верхнего пути в предыдущем примере уравнения для блоков:
Для нижнего пути уравнения:
Напротив, если вы добавляете вторичный сигнал к уравнениям, расположение блока Unit Delay влияет на результат. Как показано в следующем примере, расположение блока Unit Delay влияет на результаты из-за наклона временной выборки между верхним и нижним путями.
В случаях с одним источником и несколькими адресатами сравнение является более комплексным. Для примера в следующей модели можно переформулировать два блока Unit Delay в один модуль задержку.
С точки зрения черного ящика, две модели эквивалентны. Однако с точки зрения памяти и расчетов между этими двумя моделями существуют различия. { 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; } В этом случае исходная модель более эффективна. В первом примере кода существуют три глобальные переменные, две из блоков Unit Delay (DWork.UD_A и DWork.UD_B) и одна из дискретного интегратора времени (DWork.Int_A). Второй пример кода показывает сокращение до одной глобальной переменной, сгенерированной модульными задержками (Dwork.UD_C), но существует две глобальные переменные из-за избыточных блоков Дискретное Время Integrator (DWork.Int_B и DWork.Int_C). Путь блока Дискретное Время Integrator вводит дополнительную локальную переменную (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; } Код для рефакторной модели более эффективен, потому что ветви от корневого сигнала не имеют избыточной единичной задержки. |