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