В этом примере показано, как выполнить с плавающей точкой и симуляцию фиксированной точки топливной системы управления уровня созданный с использованием 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 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, используемого в этой модели: 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')
Блок 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®. Для связанных примеров фиксированной точки с помощью sldemo_fuelsys, смотрите
Производство генерация кода C/C++ - Система управления Состава топливно-воздушной смеси с диаграммами Stateflow (Embedded Coder)
Производство фиксированной точки генерация кода C/C++ - Система управления Состава топливно-воздушной смеси с Данными Фиксированной точки (Embedded Coder)