Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

燃料比制御システムでの固定小数点

この例では、Simulink® と Stateflow® を使用して設計された燃料比制御システムで、浮動小数点シミュレーションと固定小数点シミュレーションを実行する方法を説明します。コントローラーが Simulink 数値型を利用して、浮動小数点シミュレーションと固定小数点シミュレーションを容易に切り替えます。燃料比制御モデルをよく理解するには、フォールトトレラント燃料制御システムのモデル化を参照してください。

モデルを開いてコンパイル

sldemo_fuelsys モデルは、"プラント" と "コントローラー" を含む閉ループ システムです。この例では、プラントがルート モデルで、コントローラーが "fuel_rate_control" サブシステムです。プラントは、コントローラーの設計を連続的に検証するために使用します。このプラントを使用すると、浮動小数点型を固定小数点型に容易に変換できます。当初、このモデルは浮動小数点シミュレーション向けに設定されています。このことは、信号線上のデータ型表示からわかります。階層の最初の 2 レベルのデータ型を見てみましょう。

fxpdemo_fuelsys を介して sldemo_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 を参照してください。固定小数点ツールを使用して、固定小数点設計の最適化と調査を行うこともできます。固定小数点ツールの詳細は、fxpdemo_feedback を参照してください。

このプラントは、倍精度データ型を使用してシミュレーションを行います。前述のとおり、"fuel_rate_control" サブシステムは、浮動小数点データ型と固定小数点データ型間の切り替えを容易に実行できるように設計されています。これを実行するには、MATLAB® ワークスペースで Simulink の数値型を参照するようにブロックを設定します。

このモデルでは、以下の 4 つのスケーリングを計算に使用します。

  • u8En7 (符号なし 8 ビット、2 進小数点 7 のスケーリング)

  • s16En3 (符号付き 16 ビット、2 進小数点 3 のスケーリング)

  • s16En7 (符号付き 16 ビット、2 進小数点 7 のスケーリング)

  • s16En15 (符号付き 16 ビット、2 進小数点 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              

浮動小数点シミュレーションの場合、数値タイプは単精度に設定されます。Simulink 数値オブジェクトの DataTypeMode プロパティは、'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 の数値型が固定小数点値に設定されます。具体的には、2 進小数点スケーリングを使用するように 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 数値タイプを使用して、浮動小数点データと固定小数点データ間を切り替えるようにモデルを設定できることがわかりました。このモデルのような閉ループ モデル内では、このような柔軟性を備えるように注意を払わなければなりません。この例では、Data Type Conversion ブロックを使用して倍精度データとプラント間の変換が行われます。コントローラーの両側で、変換ブロックの出力データ型が [Inherit:Inherit via back propagation] に設定されています。これにより、プラント データ型と競合することなく、制御装置がデータ型実装を変更できるようになります。

Simulink バス信号に関する特別な考慮事項

このモデルで使用される、次の Simulink バス オブジェクトのデータ型の構成にも注意してください: EngSensors。個々のバス要素データ型が、前述と同じ Simulink 数値オブジェクトを使用して指定されています。このバスには、4 つの要素があります。

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

コントローラー入力変換の表示

Data Type Conversion ブロックがコントローラーからプラントを分離します。サンプル時間も、Rate Transition ブロックを使用して連続時間から離散時間に変換されます。

open_system('sldemo_fuelsys/To Controller')

コントローラー出力変換の表示

Data Type Conversion ブロックがプラントからコントローラーを分離します。サンプル時間も、Rate Transition ブロックを使用して離散時間から連続時間に変換されます。

open_system('sldemo_fuelsys/To Plant')

例に関連するモデル、図およびワークスペース変数を閉じます。

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

おわりに

Embedded Coder® を使用して、量産 C/C++ コードを生成できます。sldemo_fuelsys を使用した固定小数点に関連する例の詳細については、以下を参照してください