exponenta event banner

Система контроля расхода топлива с фиксированной точкой

В этом примере показано, как выполнить моделирование с плавающей и фиксированной точками системы управления расходом топлива, разработанной с использованием Simulink ® и Stateflow ®. Контроллер использует числовые типы Simulink для простого переключения между моделированием с плавающей и фиксированной точками. Для ознакомления с моделью управления расходом топлива см. Моделирование отказоустойчивой системы управления топливом.

Открытие и компиляция модели

Модель sldemo_fuelsys представляет собой замкнутую систему, содержащую «установку» и «контроллер». В этом примере растение является корневой моделью, а контроллер - подсистемой «fuel_rate_control». Установка используется для непрерывной проверки конструкции контроллера. Этот завод также облегчает преобразование плавающей точки в тип с фиксированной точкой. Первоначально модель конфигурируется для моделирования с плавающей запятой, как видно по отображению типа данных на сигнальных линиях. Рассмотрим типы данных для первых двух уровней иерархии.

Откройте sldemo_fuelsys через fxpdemo_fuelsys и скомпилируйте схему, чтобы увидеть типы данных сигнала. Первоначально контроллер сконфигурирован для использования типов данных с одной точностью.

fxpdemo_fuelsys

sldemo_fuelsys([],[],[],'compile');
sldemo_fuelsys([],[],[],'term');

Просмотр системы управления расходом топлива с плавающей запятой

open_system('sldemo_fuelsys/fuel_rate_control');

Просмотр расчета воздушного потока с плавающей точкой

open_system('sldemo_fuelsys/fuel_rate_control/airflow_calc');

Просмотр расчета топлива с плавающей запятой

open_system('sldemo_fuelsys/fuel_rate_control/fuel_calc');

Просмотр логики управления с плавающей запятой

open_system('sldemo_fuelsys/fuel_rate_control/control_logic');

Теперь давайте уберем загромождение окна.

close_system('sldemo_fuelsys/fuel_rate_control/airflow_calc');
close_system('sldemo_fuelsys/fuel_rate_control/fuel_calc');
close_system('sldemo_fuelsys/fuel_rate_control/control_logic');
hDemo.rt=sfroot;hDemo.m=hDemo.rt.find('-isa','Simulink.BlockDiagram');
hDemo.c=hDemo.m.find('-isa','Stateflow.Chart','-and','Name','control_logic');
hDemo.c.visible=false;
close_system('sldemo_fuelsys/fuel_rate_control');

Переключение типов данных с плавающей точки на фиксированную точку

Fixed-Point Advisor использовался для преобразования контроллера из реализации с плавающей запятой в эквивалентную реализацию с фиксированной запятой. Подробные сведения о консультанте по фиксированным точкам см. в разделе fxpdemo_fpa. Также можно оптимизировать и исследовать конструкцию с фиксированной точкой с помощью инструмента «Фиксированная точка». Подробные сведения об инструменте «Фиксированная точка» см. в разделе fxpdemo_feedback.

Завод моделируется с использованием типов данных двойной точности. Как уже упоминалось, подсистема «fuel_rate_control» сконфигурирована таким образом, что легко переключаться между типами данных с плавающей и фиксированной точками. Это делается путем настройки блоков для ссылки на числовые типы Simulink в рабочем пространстве MATLAB ®.

В этой модели для вычислений используются четыре масштаба:

  • u8En7 (без знака 8-битное, двоичное точечное 7 масштабирование)

  • s16En3 (со знаком 16 бит, двоичное масштабирование точки 3)

  • s16En7 (со знаком 16-битное, двоичное точечное 7 масштабирование)

  • s16En15 (со знаком 16 бит, двоичное точечное масштабирование 15)

Просмотрите эти объекты в рабочей области MATLAB ®.

whos u8En7 s16En3 s16En7 s16En15
  Name         Size            Bytes  Class                   Attributes

  s16En15      1x1                91  Simulink.NumericType              
  s16En3       1x1                91  Simulink.NumericType              
  s16En7       1x1                91  Simulink.NumericType              
  u8En7        1x1                91  Simulink.NumericType              

Для моделирования с плавающей запятой числовые типы устанавливаются в одну точность. Свойство DataTypeMode числового объекта Simulink имеет значение Single. Можно также задать их двойными.

u8En7   = fixdt('single');
s16En3  = fixdt('single'); %#ok
s16En7  = fixdt('single'); %#ok
s16En15 = fixdt('single'); %#ok
disp(u8En7)
  NumericType with properties:

    DataTypeMode: 'Single'
         IsAlias: 0
       DataScope: 'Auto'
      HeaderFile: ''
     Description: ''

Модель сконфигурирована для регистрации данных моделирования для сигналов верхнего уровня, посредством чего результат моделирования сохраняется в переменных sldemo_fuelsys_output рабочей области. Результат моделирования будет сохранен в hDemo.flt_out для последующего сравнения с моделированием с фиксированной точкой.

set_param('sldemo_fuelsys','StopTime','8')
sim('sldemo_fuelsys')
hDemo.flt_out = sldemo_fuelsys_output;

Для переключения на моделирование с фиксированной точкой числовые типы Simulink устанавливаются в значения с фиксированной точкой. В частности, DataTypeMode настроен на использование двоичного масштабирования точек.

u8En7   = fixdt(0,8,7);
s16En3  = fixdt(1,16,3);
s16En7  = fixdt(1,16,7);
s16En15 = fixdt(1,16,15);
disp(u8En7)
  NumericType with properties:

      DataTypeMode: 'Fixed-point: binary point scaling'
        Signedness: 'Unsigned'
        WordLength: 8
    FractionLength: 7
           IsAlias: 0
         DataScope: 'Auto'
        HeaderFile: ''
       Description: ''

Повторно запустите моделирование для реализации с фиксированной точкой. На сигналах отображаются типы данных с фиксированной точкой. Результат моделирования будет сохранен в hDemo.fxp_out.

if ~hasFixedPointDesigner()
    DAStudio.error('Simulink:fixedandfloat:FxDLicenseRequired');
end
sim('sldemo_fuelsys')
hDemo.fxp_out = sldemo_fuelsys_output;

Просмотр системы контроля расхода топлива с фиксированной точкой

open_system('sldemo_fuelsys/fuel_rate_control');

Просмотр расчета воздушного потока с фиксированной точкой

open_system('sldemo_fuelsys/fuel_rate_control/airflow_calc');

Просмотр расчета топлива с фиксированной точкой

open_system('sldemo_fuelsys/fuel_rate_control/fuel_calc');

Сравнение результата с плавающей и фиксированной точками

Сравним результат моделирования расхода топлива и соотношения топлива в воздухе.

figure('Tag','CloseMe');
subplot(2,1,1);
plot(hDemo.flt_out.get('fuel').Values.Time, hDemo.flt_out.get('fuel').Values.Data,'r-');
hold
plot(hDemo.fxp_out.get('fuel').Values.Time, hDemo.fxp_out.get('fuel').Values.Data,'b-');
ylabel('FuelFlowRate (g/sec)');
title('Fuel Control System: Floating-Point vs. Fixed-Point Comparison');
legend('float','fixed')
axis([0 8 .75 2.25]);
subplot(2,1,2);
plot(hDemo.flt_out.get('air_fuel_ratio').Values.Time, hDemo.flt_out.get('air_fuel_ratio').Values.Data,'r-');
hold
plot(hDemo.fxp_out.get('air_fuel_ratio').Values.Time, hDemo.fxp_out.get('air_fuel_ratio').Values.Data,'b-');
ylabel('Air/Fuel Ratio');
xlabel('Time (sec)')
legend('float','fixed','Location','SouthEast')
axis([0 8 11 16]);
Current plot held
Current plot held

Использование гибкой стратегии ввода данных

Вы видели, что модель можно настроить для переключения между данными с плавающей и фиксированной точками с использованием числовых типов Simulink. Внутри модели с замкнутым контуром, такой как эта, необходимо соблюдать такую гибкость. В этом примере данные двойной точности преобразуются в завод и из завода с использованием блоков преобразования типов данных. На обеих сторонах контроллера тип выходных данных блоков преобразования имеет значение Inherit: Inherit посредством обратного распространения. Это позволяет системе управления изменять реализацию типа данных без конфликта с типами данных завода.

Особые соображения по сигналам шины Simulink

Также примечательна конфигурация типов данных для объекта шины Simulink, используемого в данной модели: EngSensors. Отдельные типы данных элементов шины задаются с использованием тех же цифровых объектов Simulink, что и ранее. Эта шина имеет четыре элемента.

disp(EngSensors.Elements(1))
disp(EngSensors.Elements(2))
disp(EngSensors.Elements(3))
disp(EngSensors.Elements(4))
  BusElement with properties:

              Name: 'throttle'
        Complexity: 'real'
        Dimensions: 1
          DataType: 's16En3'
               Min: []
               Max: []
    DimensionsMode: 'Fixed'
              Unit: 'deg'
       Description: ''

  BusElement with properties:

              Name: 'speed'
        Complexity: 'real'
        Dimensions: 1
          DataType: 's16En3'
               Min: []
               Max: []
    DimensionsMode: 'Fixed'
              Unit: 'rad/s'
       Description: ''

  BusElement with properties:

              Name: 'ego'
        Complexity: 'real'
        Dimensions: 1
          DataType: 's16En7'
               Min: []
               Max: []
    DimensionsMode: 'Fixed'
              Unit: 'V'
       Description: ''

  BusElement with properties:

              Name: 'map'
        Complexity: 'real'
        Dimensions: 1
          DataType: 'u8En7'
               Min: []
               Max: []
    DimensionsMode: 'Fixed'
              Unit: 'bar'
       Description: ''

Просмотр преобразования входных данных контроллера

Блоки преобразования типов данных изолируют установку от контроллера. Время выборки также преобразуется из непрерывного в дискретный с использованием блока изменения скорости.

open_system('sldemo_fuelsys/To Controller')

Просмотр преобразования выходных данных контроллера

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

open_system('sldemo_fuelsys/To Plant')

Закройте модель, фигуры и переменные рабочей области, связанные с примером

close_system('sldemo_fuelsys',0);
close(findobj(0,'Tag','CloseMe'));
clear hDemo

Заключительные замечания

Можно создать производственный код C/C + + с помощью Embedded Coder ®. Связанные примеры использования sldemo_fuelsys с фиксированной точкой см. в разделе