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

Этот пример показывает, как выполнить симуляцию с плавающей и фиксированной точками системы управления расходом топлива, разработанной с использованием 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');

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

Советник с фиксированной точкой использовался для преобразования контроллера из реализации с плавающей точкой в эквивалентную реализацию с фиксированной точкой. Для получения дополнительной информации о fxpdemo_fpa Fixed-Point Advisor см. раздел. Можно также оптимизировать и исследовать проект с фиксированной точкой с помощью Fixed-Point Tool. Для получения дополнительной информации о Fixed-Point Tool см. 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'. Кроме того, можно установить для них значение double.

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: ''

Просмотр входа контроллера

Блоки преобразования типа данных изолируют объект от контроллера. Этот шаг расчета также преобразуется из непрерывного в дискретный с помощью блока Rate Transition Block.

open_system('sldemo_fuelsys/To Controller')

Просмотр контроллер выхода

Блок преобразования типа данных изолирует контроллер от объекта. Кроме того, шаг расчета преобразуется из дискретного во непрерывное время с помощью блока Rate Transition Block.

open_system('sldemo_fuelsys/To Plant')

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

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

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

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