最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Stateflow チャートを使用した空燃比制御システム

Simulink® と Stateflow® を使用して設計された空燃比制御システムのコードを生成します。

図 1、2、3 は、プラントとコントローラーを含む閉ループ システムである sldemo_fuelsys モデルの関連部分を示しています。プラントでは、設計の初期段階でのシミュレーション時にコントローラーを検証します。この例では、関連するコントローラー サブシステム "fuel_rate_control" のコードを生成します。図 1 は、最上位のシミュレーション モデルを示しています。

コマンド rtwdemo_fuelsys を使用してモデル sldemo_fuelsys を開きます。次に、モデルをコンパイルして、信号のデータ型を確認します。

rtwdemo_fuelsys
sldemo_fuelsys([],[],[],'compile');
sldemo_fuelsys([],[],[],'term');

図 1: プラントとコントローラーの最上位モデル

空燃比制御システムは Simulink® と Stateflow® で構成されます。この制御システムはコードを生成するモデルの一部分です。

open_system('sldemo_fuelsys/fuel_rate_control');

図 2: 空燃比コントローラー サブシステム

制御ロジックは、さまざまな動作モードを指定する Stateflow® チャートです。

open_system('sldemo_fuelsys/fuel_rate_control/control_logic');

図 3: 空燃比コントローラーのロジック

これらのウィンドウを閉じます。

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');

Simulink® Coder™ によるモデルの構成とビルド

モデル コンフィギュレーション パラメーター [システム ターゲット ファイル]grt.tlc (Generic Real-Time (GRT)) に設定されている場合、コード ジェネレーターで、Simulink® モデルおよび Stateflow® モデル用の一般的な ANSI® C コードが生成されます。[システム ターゲット ファイル] パラメーターをプログラムにより設定できます。

rtwconfiguredemo('sldemo_fuelsys','GRT');

この例では、空燃比制御システムのみをビルドします。コード生成プロセスが完了すると、コード ジェネレーターには生成コードの詳細をまとめた HTML レポートが表示されます。コードの本体部分は fuel_rate_control.c にあります。

rtwbuild('sldemo_fuelsys/fuel_rate_control');
### Starting build procedure for: fuel_rate_control
### Successful completion of build procedure for: fuel_rate_control

Embedded Coder® によるモデルの構成とビルド

量産 ANSI® C/C++ コードをモデル用に設定してビルドするには、モデル コンフィギュレーション パラメーター [システム ターゲット ファイル]ert.tlc (組み込みリアルタイム (ERT)) に設定します。[システム ターゲット ファイル] パラメーターをプログラムにより設定できます。

rtwconfiguredemo('sldemo_fuelsys','ERT');

ビルド プロセスを繰り返し、生成されたコードを調べます。関連するコード セグメントには [前へ] ボタンと [次へ] ボタンを使用して対話形式で移動できます。チャートのコンテキスト メニュー (Stateflow® ブロックを右クリック) で、[コード生成]、[コードに移動] を選択します。プログラムで実行する場合は、rtwtrace ユーティリティを使用します。

rtwbuild('sldemo_fuelsys/fuel_rate_control');
rtwtrace('sldemo_fuelsys/fuel_rate_control/control_logic')
### Starting build procedure for: fuel_rate_control
### Successful completion of build procedure for: fuel_rate_control

生成されたコードで空燃比制御ロジックを確認します。

rtwdemodbtype('fuel_rate_control_ert_rtw/fuel_rate_control.c',...
    '/* Function for Chart:','case IN_Warmup:',1,0);
/* Function for Chart: '<S1>/control_logic' */
static void Fueling_Mode(const int32_T *sfEvent)
{
  /* This state interprets the other states in the chart to directly control the fueling mode. */
  switch (rtDW.bitsForTID0.is_Fueling_Mode) {
   case IN_Fuel_Disabled:
    rtDW.fuel_mode = DISABLED;

    /* The fuel is completely shut off while in this state. */
    switch (rtDW.bitsForTID0.is_Fuel_Disabled) {
     case IN_Overspeed:
      /* Inport: '<Root>/sensors' */
      /* The speed is dangerously high, so shut off the fuel. */
      if ((rtDW.bitsForTID0.is_Speed == 2) && (rtU.sensors.speed < 603.0F)) {
        if (rtDW.bitsForTID0.is_Fail != 1) {
          rtDW.bitsForTID0.is_Fuel_Disabled = IN_NO_ACTIVE_CHILD;
          rtDW.bitsForTID0.is_Fueling_Mode = IN_Running;
          switch (rtDW.bitsForTID0.was_Running) {
           case IN_Low_Emissions:
            rtDW.bitsForTID0.is_Running = IN_Low_Emissions;
            rtDW.bitsForTID0.was_Running = IN_Low_Emissions;
            rtDW.fuel_mode = LOW;
            switch (rtDW.bitsForTID0.was_Low_Emissions) {
             case IN_Normal:
              rtDW.bitsForTID0.is_Low_Emissions = IN_Normal;
              rtDW.bitsForTID0.was_Low_Emissions = IN_Normal;
              break;

モデルおよびコード生成レポートを閉じます。

clear hDemo;
rtwdemoclean;
close_system('sldemo_fuelsys',0);

関連する例

sldemo_fuelsys を使用した関連する固定小数点の例については、以下を参照してください。