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

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

Откройте и скомпилируйте модель

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');

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

Советник Фиксированной точки использовался, чтобы преобразовать контроллер от реализации с плавающей точкой до эквивалентной реализации фиксированной точки. См. fxpdemo_fpa для деталей Советника Фиксированной точки. Можно также оптимизировать и исследовать проект фиксированной точки с помощью Fixed-Point Tool. См. fxpdemo_feedback для деталей Fixed-Point Tool.

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

Эта модель использует четыре масштабирования в своих расчетах:

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

  • s16En3 (подписал 16-битную, двоичную точку 3 масштабирования),

  • s16En7 (подписал 16-битную, двоичную точку 7 масштабирований),

  • s16En15 (подписал 16-битную, двоичную точку 15 масштабирований),

Просмотрите эти объекты в MATLAB® Workspace.

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 числовые типы. В модели с обратной связью, такой как этот, заботу нужно соблюдать, чтобы иметь такую гибкость. В этом примере, данные о двойной точности преобразован в и от объекта с помощью блоков преобразования типа данных. С обеих сторон контроллера, тип выходных данных блоков преобразования собирается Наследоваться: Наследуйтесь через обратное распространение. Это позволяет системе управления изменять реализацию типа данных, не конфликтуя с типами данных объекта.

Специальные замечания для сигналов шины 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'
        SampleTime: -1
              Unit: 'deg'
       Description: ''

  BusElement with properties:

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

  BusElement with properties:

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

  BusElement with properties:

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

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

Блоки Преобразования типа данных изолируют объект от диспетчера. Шаг расчета также преобразован от непрерывного до дискретного использования Блока Перехода Уровня.

open_system('sldemo_fuelsys/To Controller')

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

Блок Data Type Conversion изолирует контроллер от объекта. Шаг расчета также преобразован от дискретного до непрерывного времени с помощью Блока Перехода Уровня.

open_system('sldemo_fuelsys/To Plant')

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

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

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

Сгенерируйте производство код C/C++ с помощью Embedded Coder®. * Производство генерация кода C/C++ - Система управления Состава топливно-воздушной смеси с диаграммами Stateflow (Simulink Coder) * производство Фиксированной точки генерация кода C/C++ - Система управления Состава топливно-воздушной смеси с Данными Фиксированной точки (Embedded Coder)