Main Content

生成された ASAP2 ファイルのカスタマイズ

ASAP2 ファイルのフィールドをカスタマイズするには、次のいずれかの方法でコード ジェネレーターを使用します。

基底クラスを使用した ASAP2 フィールドのカスタマイズ

  1. 基底クラスからオブジェクトを作成します。

    obj = coder.asap2.UserCustomizeBase;

  2. オブジェクト フィールドを変更します。

    obj.HeaderComment = 'Header comment';
    obj.ModParComment = 'Mod Par comment';
    obj.ModCommonComment = 'Mod Common comment';
    obj.ASAP2FileName = 'File name';
    obj.ByteOrder = 'BYTEORDER MSB_LAST';

  3. ASAP2 ファイルを生成する関数にオブジェクトを渡します。

    coder.asap2.export(modelName,CustomizationObject=obj);

基底クラスからの派生による ASAP2 セクションのカスタマイズ

  1. 基底クラス coder.asap2.UserCustomizeBase から派生させます。派生ファイルは、MATLAB パス上の任意の場所に配置できます。

  2. ヘッダー セクションを編集するには、関数 writeHeader を使用します。

  3. 関数 writeHardwareInterface を使用して、ASAP2 ファイルの MOD_PAR および MOD_COMMON の各フィールドで構成されるハードウェア インターフェイス セクションを編集します。

  4. ASAP2 ファイルの先頭にテキストを追加するには、関数 writeFileHead を使用します。

  5. ASAP2 ファイルの末尾にテキストを追加するには、関数 writeFileTail を使用します。

    たとえば、派生クラス TestASAP2Customization を生成するコードは、次のようになる場合があります。

    classdef TestASAP2Customization < coder.asap2.UserCustomizeBase
        %   Customization class for asap2 file
        methods
            function header = writeHeader(obj)
                header = sprintf(['  /begin HEADER ' 'test Header text'  '\n',...
                    'header test comments from user\n',...
                    '  /end HEADER']);
            end
    
            function hardwareInterface = writeHardwareInterface(obj)
                hardwareInterface = sprintf(['    /begin MOD_PAR "' 'UserDefined' '"\n',...
                    '      test comments from user\n',...
                    '    /end MOD_PAR\n\n',...
                    '    /begin MOD_COMMON "'  'UserDefined MOD_COMMON' '"\n',...
                    '      user defined values for MOD_COMMON\n',...
                    '     ' obj.ByteOrder '\n',...
                    '     /end MOD_COMMON']);
            end
            
            function fileTail = writeFileTail(obj)
                fileTail = sprintf(['/* This File can be used for ' ,...
                    'calibration .*/\n'...
                    '/* EOF ',obj.ASAP2FileName, '*/']);
            end
            
            function fileHeader = writeFileHead(obj)
                fileHeader = sprintf(['/******************************************************************************\n',...
                    ' This is a a2l file which can be used for calibration with INCA or CANAPE\n',...
                    ' ******************************************************************************/'
                    ]);
            end
        end
    end

  6. 派生クラスからオブジェクトを作成します。たとえば、次のコマンドは TestASAP2Customization からオブジェクトを作成します。

    obj = TestASAP2Customization;

  7. ASAP2 ファイルを生成する関数にオブジェクトを渡します。

    coder.asap2.export(modelName,CustomizationObject=obj);

カスタム計算メソッド名のカスタマイズ

生成された ASAP2 ファイルでは、電子コントロール ユニット (ECU) の測定量とキャリブレーション量の内部表現が、計算メソッドによって物理モデル指向表現に変換されます。Simulink® Coder™ ソフトウェアを使用して、計算メソッドの名前をカスタマイズできます。より直感的で ASAP2 ファイルの可読性を高める名前、または社内要件を満たす名前を付けることができます。

計算メソッド名をカスタマイズするには、MATLAB® 関数 getCompuMethodName を使用します。これは、matlabroot/toolbox/rtw/targets/asap2/asap2/user/getCompuMethodName.m で定義されます。

関数 getCompuMethodName は、計算メソッド名を作成します。関数のプロトタイプは次のとおりです。

cmName = getCompuMethodName(dataTypeName, cmUnits)

ここで

  • dataTypeName は計算メソッドに関連付けられているデータ型の名前です。

  • cmUnitsSimulink.Parameter オブジェクトまたは Simulink.Signal オブジェクトの Unit プロパティで指定された単位 (rpmm/s など) です。

  • cmName は構成された計算メソッド名を返します。

この関数で返される既定の名前の形式は、次のとおりです。

<localPrefix><datatype>_<cmUnits>

ここで

  • <local_Prefix> は、ローカル接頭辞 CM_ であり、これは matlabroot/toolbox/rtw/targets/asap2/asap2/user/getCompuMethodName.m で定義されます。

  • <datatype><cmUnits> は、関数 getCompuMethodName に指定された引数です。

cmUnits の特殊文字は、ASAP2 ファイルの計算メソッド名でサポートされません。以下の表に示すように、特殊文字は変換されます。

特殊文字変換
%_percent_
-_dash_
/_per_
*_into_
°_deg_

たとえば、dataTypeName 引数 'int16'cmUnits 引数 'm/s' を使用して関数 getCompuMethodName を呼び出してから、myModel という名前のモデル用の ASAP2 ファイルを生成した場合、計算メソッド名は次のように生成ファイルに表示されます。

/begin COMPU_METHOD
   /* Name of CompuMethod */ myModel_CM_int16_m_per_s
   /* Units */ "m/s"
   ...
/end COMPU_METHOD

グループ化した特性および測定の各オブジェクトのエクスポート

R2021b 以降、ASAP2 ファイルの特性および測定の各オブジェクトは、そのプロパティに基づいてグループ化できます。既定では、生成された ASAP2 ファイルには、モデル内のサブシステムに基づく GROUPSSUB_GROUPS が含まれます。

  1. sldemo_fuelsys モデルを開きます。

    open_system("sldemo_fuelsys")

  2. モデルを作成します。

  3. Generate Calibration Files ツールまたは次のコマンドを使用して ASAP2 ファイルを生成します。

    coder.asap2.export("sldemo_fuelsys")

    モデル アーキテクチャに基づいてデータ要素がグループ化されます。最上位モデルは GROUP と表現され、モデル内のサブシステムは SUB_GROUPS と表現されます。生成されたファイルには、以下の行が含まれます。

     /begin GROUP
        /* Name                   */      sldemo_fuelsys
        /* Long identifier        */      "sldemo_fuelsys"
        /* Root                   */      ROOT
        /begin SUB_GROUP
          rtB.es_o
          sldemo_fuelsys_Dashboard
          sldemo_fuelsys_Engine_Gas_Dynamics
          sldemo_fuelsys_Throttle_Command
          sldemo_fuelsys_To_Controller
          sldemo_fuelsys_To_Plant
          sldemo_fuelsys_fuel_rate_control
        /end SUB_GROUP
      /end GROUP

  4. scalar オブジェクトを ASAP2 ファイル内にある GROUP_TYPE_SCALAR という名前のグループにグループ化するには、次のコマンドを使用します。

    coder.asap2.export("sldemo_fuelsys",CustomizeGroupsBy={'SCALAR'})

また、array 型のオブジェクト、およびテーブルの次元に基づいて、ルックアップ テーブルを MAPCURVECUBOIDCUBE_4、および CUBE_5 にグループ化できます。

レコード レイアウトの生成

  1. sldemo_fuelsys モデルを開きます。

    open_system("sldemo_fuelsys")

  2. モデルを作成します。

  3. 次のコマンドを使用して ASAP2 ファイルを生成します。

    coder.asap2.export("sldemo_fuelsys",IncludeAllRecordLayouts=true)

  4. ASAP2 ファイルのバージョンに従って、RecordLayouts.a2l ファイルが生成されます。ASAP2 ファイルで、次の行を確認します。

    /include "RecordLayouts.a2l"

  5. 生成された RecordLayouts.a2l ファイルには、モデル内に存在するデータ型のレコード レイアウトが含まれます。

    メモ

    RecordLayouts.a2l ファイルは ASAP2 ファイルと同じフォルダー内にある必要があります。

  6. coder.asap2.export("sldemo_fuelsys",IncludeAllRecordLayouts=false) では個別のレコード レイアウト ファイルを生成せず、エクスポートされたデータ オブジェクトのデータ型のレコード レイアウトを ASAP2 ファイルに含めます。

    /begin  RECORD_LAYOUT Scalar_FLOAT32_IEEE
        FNC_VALUES 1 FLOAT32_IEEE COLUMN_DIR DIRECT
      /end  RECORD_LAYOUT 
    
      /begin  RECORD_LAYOUT Scalar_FLOAT64_IEEE
        FNC_VALUES 1 FLOAT64_IEEE COLUMN_DIR DIRECT
      /end  RECORD_LAYOUT
    ...

ヒント

ASA2P ファイルで、モデル引数として使用されるルックアップ テーブルの形状を保持するには、LookUp Table ブロックが参照モデル内にあることを確認します。Lookup table object を最上位モデルからインスタンス パラメーター値として渡します。

構造体と 64 ビット整数の除外

R2022a 以降では、生成された A2L ファイルで構造体要素と 64 ビット整数を除外できます。既定では、構造体と 64 ビット整数は A2L ファイルに含まれます。

  1. sldemo_fuelsys モデルを開きます。

    open_system("sldemo_fuelsys")

  2. モデルを作成します。

  3. 次のコマンドを使用して ASAP2 ファイルを生成します。

    coder.asap2.export("sldemo_fuelsys", SupportStructureElements=false, ...
    Support64bitIntegers=false)

    生成された ASAP2 ファイルには 64 ビット整数と構造体要素が含まれていません。

メモ

R2022a 以降では、ASAP2 ファイルでポインター変数は生成されません。

既定のイベント リストを含む ASAP2 の生成

R2022a 以降では、マルチレート モデルについて、ASAP2 ファイルに、DEFAULT_EVENT_LIST をもつ IF_DATA セクションが含まれ、キャリブレーション ツールでデータ要素の各ラスター値を表示できます。

  1. sldemo_fuelsys モデルを開きます。

    open_system("sldemo_fuelsys")

  2. モデルを作成します。

  3. Generate Calibration Files ツールまたは次のコマンドを使用して ASAP2 ファイルを生成します。

    coder.asap2.export("sldemo_fuelsys")

  4. このモデルの単一レートは、0.01 です。生成されたファイルでは測定値が次のように定義されます。

       /begin MEASUREMENT
        /* Name                   */      rtB.es_o.throttle
        /* Long identifier        */      ""
        /* Data type              */      FLOAT32_IEEE
        /* Conversion method      */      sldemo_fuelsys_CM_single
        /* Resolution (Not used)  */      0      
        /* Accuracy (Not used)    */      0      
        /* Lower limit            */      -3.4E+38
        /* Upper limit            */      3.4E+38
        ECU_ADDRESS                       0x0000 /* @ECU_Address@rtB.es_o.throttle@ */
      /end MEASUREMENT

  5. 次のコマンドを使用してモデルをマルチレート モデルに変換します。

    blockName = ['sldemo_fuelsys' '/EGO Fault Switch'];
    set_param(blockName, 'SampleTime', '0.02');

  6. モデルを作成します。

  7. 次のコマンドを使用して ASAP2 ファイルを生成します。

    coder.asap2.export("sldemo_fuelsys")

  8. 生成されたファイルでは測定値が次のように定義されます。

       /begin MEASUREMENT 
        /* Name                   */      rtB.es_o.throttle
        /* Long identifier        */      ""
        /* Data type              */      FLOAT32_IEEE
        /* Conversion method      */      sldemo_fuelsys_CM_single
        /* Resolution (Not used)  */      0      
        /* Accuracy (Not used)    */      0      
        /* Lower limit            */      -3.4E+38
        /* Upper limit            */      3.4E+38
        ECU_ADDRESS                       0x0000 /* @ECU_Address@rtB.es_o.throttle@ */
        /begin IF_DATA XCP
          /begin DAQ_EVENT VARIABLE
              /begin DEFAULT_EVENT_LIST
                EVENT  0x0001
              /end DEFAULT_EVENT_LIST
          /end DAQ_EVENT
         /end IF_DATA
      /end MEASUREMENT 

ECU アドレス拡張の指定

R2022a 以降では、EcuAddressExtension プロパティの整数値を指定して、ASAP2 ファイルで追加のアドレス情報を指定できます。既定では、追加のアドレス情報は提供されません。

  1. sldemo_fuelsys モデルを開きます。

    open_system("sldemo_fuelsys")

  2. モデルを作成します。

  3. 次のコマンドを使用して ASAP2 ファイルを生成します。

    coder.asap2.export("sldemo_fuelsys",EcuAddressExtension=4)

    特性、測定、および軸ポイントの ECU_ADDRESS_EXTENSION キー ワードが ASAP2 ファイルに含まれ、追加のアドレス情報を指定できます。

     /begin MEASUREMENT 
       /* Name                   */      rtB.MinMax
       /* Long identifier        */      ""
       /* Data type              */      FLOAT64_IEEE
       /* Conversion method      */      sldemo_fuelsys_CM_double
       /* Resolution (Not used)  */      0      
       /* Accuracy (Not used)    */      0      
       /* Lower limit            */      -1.7E+308
       /* Upper limit            */      1.7E+308
       ECU_ADDRESS                       0x0000 /* @ECU_Address@rtB.MinMax@ */
       ECU_ADDRESS_EXTENSION 4
     /end MEASUREMENT 

参考

関連するトピック