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