Main Content

coder.mapping.api.get

モデルのコード マッピングの取得

R2020b 以降

    説明

    coderMapObj = coder.mapping.api.get(simulinkModel) は指定されたモデルに対してアクティブなコード マッピングを coderMapObj オブジェクトとして返します。コード マッピングはモデル データ要素と関数を C または C++ コード生成の構成に関連付けます。モデルに複数のコード マッピングがある場合、アクティブなコード マッピングはアクティブなシステム ターゲット ファイルに関連付けられたマッピングです。

    コード マッピングが存在しない場合、エラーが生成されます。モデルの Coder アプリを開くと、Simulink® はコード マッピング オブジェクトを作成します。モデルの Coder アプリを開いていない場合は、関数 coder.mapping.utils.create を呼び出してコード マッピング オブジェクトを作成できます。

    coderMapObj = coder.mapping.api.get(simulinkModel,codeMappingType) は指定されたコード マッピング タイプに対応するモデルのコード マッピングを coderMapObj オブジェクトとして返します。

    coderDataDictObj = coder.mapping.api.get(coderDictionary) は、coderDictionary で指定された共有ディクショナリ内のデータと関数の既定値を取得および設定するために使用できるオブジェクト coderDataDictObj を返します。

    メモ

    • オブジェクト coderMapObj を使用してディクショナリに加えた変更を保存するには、同じディクショナリに対して一般ディクショナリ オブジェクト Simulink.data.Dictionary を作成して使用します。

    • この関数の構文は、データ インターフェイス ディクショナリでのみサポートされています。

    すべて折りたたむ

    プログラム インターフェイスを使用して、Simulink モデルのコード マッピング オブジェクトを作成および使用します。

    モデル NoCoderMapping を読み込みます。

    simulinkModel = "NoCoderMapping";
    load_system(simulinkModel);

    try-catch ブロックを使用して、モデル用にコード マッピング オブジェクトが存在するかどうかを判別します。try ブロック内で、関数 coder.mapping.api.get を使用して既存のオブジェクトの取得を試みます。catch ブロック内で、関数 coder.mapping.utils.create を使用して新しいコード マッピング オブジェクトを作成します。コード マッピング オブジェクトを変数 codeMapObj に保存します。

    モデルに既存のコード マッピング オブジェクトがあったかどうかを示す出力メッセージを追加します。

    try
      codeMapObj = coder.mapping.api.get(simulinkModel);
              fprintf("" + ...
                " ========================================================\n" + ...
                " The model already had code mappings.\n" + ...
                " ========================================================\n");
    catch
              fprintf("" + ...
                " ==========================================\n" + ...
                " The model does not have code mappings.\n" + ...
                " Creating new code mappings for the model.\n" + ...
                " ==========================================\n");
      codeMapObj = coder.mapping.utils.create(simulinkModel);
    end
     ==========================================
     The model does not have code mappings.
     Creating new code mappings for the model.
     ==========================================
    

    モデルの入力端子 inport_1 のストレージ クラスを取得します。

    getInport(codeMapObj,"inport_1","StorageClass")
    ans = 
    'Auto'
    

    入力端子 inport_1 のストレージ クラスを ExportedGlobal に設定します。

    setInport(codeMapObj,"inport_1",StorageClass="ExportedGlobal")

    同じ try-catch ブロックを使用して、関数 coder.mapping.api.get でモデルの既存のコード マッピングをどのように取得できるようになったかを確認します。

    try
      codeMapObj = coder.mapping.api.get(simulinkModel);
              fprintf("" + ...
                " ========================================================\n" + ...
                " The model already had code mappings.\n" + ...
                " ========================================================\n");
    catch
              fprintf("" + ...
                " ==========================================\n" + ...
                " The model does not have code mappings.\n" + ... 
                " Creating new code mappings for the model.\n" + ...
                " ==========================================\n");
      codeMapObj = coder.mapping.utils.create(simulinkModel);
    end
     ========================================================
     The model already had code mappings.
     ========================================================
    

    モデルの入力端子 inport_1 のストレージ クラスを取得します。これは、以前に設定したストレージ クラスであることに注意してください。

    getInport(codeMapObj,"inport_1","StorageClass")
    ans = 
    'ExportedGlobal'
    

    モデルを保存せずに閉じます。

    close_system(simulinkModel,false)

    "Embedded Coder® ディクショナリ" を使用してコード マッピング オブジェクトをプログラムによって取得して使用します。

    コマンドが [コード マッピング] エディターとモデル ディクショナリにどのように反映されるかを対話的に確認するには、[データの既定の設定] タブが選択された状態で [コード マッピング] エディターが開いていて、[データの既定の設定] セクションが選択された状態でモデル ディクショナリが開いていることを確認してください。[コード マッピング] エディターを開く方法については、コード マッピング エディター – C を開くを参照してください。モデル ディクショナリを開く方法については、Embedded Coder ディクショナリ を開くを参照してください。

    モデルとディクショナリのファイル名を保存してから、モデル ECoderMapAPI を開きます。

    simulinkModel = "ECoderMapAPI";
    dict_name = "ECoderDataDict.sldd";
    load_system(simulinkModel);

    共有ディクショナリのコード マッピングを使用するには、共有ディクショナリを使用するようにモデルを構成します。

    set_param(simulinkModel,EmbeddedCoderDictionary="ECoderDataDict.sldd");

    Get を使用してモデルのコード マッピング オブジェクトを取得し、そのオブジェクトを使用して以下を行います。

    • モデルのすべてのルートレベルの端子のストレージ クラスとして Model default を指定する。

    • ルートレベルの端子の既定のストレージ クラスとして Dictionary default を指定する。

    modelCodeMapObj = coder.mapping.api.get(simulinkModel);
    setInport(modelCodeMapObj,find(modelCodeMapObj,"Inports"),StorageClass="Model default")
    setOutport(modelCodeMapObj,find(modelCodeMapObj,"Outports"),StorageClass="Model default")
    setDataDefault(modelCodeMapObj,"Inports",StorageClass="Dictionary default")
    setDataDefault(modelCodeMapObj,"Outports",StorageClass="Dictionary default")

    コーダー ディクショナリには、モデルのコード マッピングで使用できる定義などが含まれます。コード マッピング API を使用すると、共有コーダー ディクショナリ内のデータおよび関数の既定の設定を取得および制御できます。

    ディクショナリ ECoderDataDict.sldd のコード マッピング オブジェクトを取得します。このオブジェクトを使用して、ディクショナリのデータおよび関数の既定の設定を表示および制御します。

    coderMapDictObj = coder.mapping.api.get(dict_name);

    同じ共有ディクショナリの一般ディクショナリ オブジェクトを取得します。このオブジェクトを使用して、コード マッピングに関係のない、ディクショナリの一般的な要素を制御します。この例では、ディクショナリのコード マッピング オブジェクトを使用してディクショナリに変更を加えた後にディクショナリを保存するために、この一般ディクショナリ オブジェクトが必要になります。

    dictObj = Simulink.data.dictionary.open(dict_name);

    ディクショナリのコード マッピング オブジェクトを使用して、入力端子の既定のストレージ クラスを Localizable に設定し、出力端子の既定のストレージ クラスを Volatile に設定します。

    setDataDefault(coderMapDictObj,"Inports",StorageClass="Localizable");
    setDataDefault(coderMapDictObj,"Outports",StorageClass="Volatile");

    既定のストレージ クラスが意図したとおりに設定されていることを確認します。

    getDataDefault(coderMapDictObj,"Inports","StorageClass")
    ans = 
    'Localizable'
    
    getDataDefault(coderMapDictObj,"Outports","StorageClass")
    ans = 
    'Volatile'
    

    変数 Localizable と変数 Volatile は、生成されたモデル ヘッダー ファイルの別個のセクションで宣言されます。ヘッダー ファイル名を変数 model_h_file に格納します。

    model_h_file = fullfile(simulinkModel+"_ert_rtw",simulinkModel+".h")
    model_h_file = 
    "ECoderMapAPI_ert_rtw/ECoderMapAPI.h"
    

    モデルからコードを生成します。

    evalc("slbuild(simulinkModel)");

    以下に、ヘッダー ファイル内のルートレベルの入力端子および出力端子の宣言を示します。

    /* Declaration for custom storage class: Localizable */
    extern real_T in_port_1;               /* '<Root>/in_port_1' */
    extern real_T in_port_2;               /* '<Root>/in_port_2' */
    extern real_T in_port_3;               /* '<Root>/in_port_3' */
    extern real_T in_port_4;               /* '<Root>/in_port_4' */
    
    /* Declaration for custom storage class: Volatile */
    extern volatile real_T out_port_1;     /* '<Root>/out_port_1' */
    extern volatile real_T out_port_2;     /* '<Root>/out_port_2' */
    extern volatile real_T out_port_3;     /* '<Root>/out_port_3' */
    extern volatile real_T out_port_4;     /* '<Root>/out_port_4' */
    

    端子は、ディクショナリのデータの既定の設定で指定されたストレージ クラスです。

    ヘッダー ファイルを開くには、MATLAB® コマンド ウィンドウに次のコマンドを入力します。

    edit(model_h_file)
    

    ディクショナリのコード マッピング オブジェクトを指定して関数 setDataDefault を使用して、ディクショナリ内の入力端子と出力端子の既定のストレージ クラスを切り替えます。

    setDataDefault(coderMapDictObj,"Inports",StorageClass="Volatile");
    setDataDefault(coderMapDictObj,"Outports",StorageClass="Localizable");

    既定のストレージ クラスが意図したとおりに設定されていることを確認します。

    getDataDefault(coderMapDictObj,"Inports","StorageClass")
    ans = 
    'Volatile'
    
    getDataDefault(coderMapDictObj,"Outports","StorageClass")
    ans = 
    'Localizable'
    

    モデルからコードを再度生成します。

    evalc("slbuild(simulinkModel)");

    ヘッダー ファイル内の入力端子と出力端子の宣言が、構成したストレージ クラスで更新されました。

    /* Declaration for custom storage class: Localizable */
    extern real_T out_port_1;              /* '<Root>/out_port_1' */
    extern real_T out_port_2;              /* '<Root>/out_port_2' */
    extern real_T out_port_3;              /* '<Root>/out_port_3' */
    extern real_T out_port_4;              /* '<Root>/out_port_4' */
    
    /* Declaration for custom storage class: Volatile */
    extern volatile real_T in_port_1;      /* '<Root>/in_port_1' */
    extern volatile real_T in_port_2;      /* '<Root>/in_port_2' */
    extern volatile real_T in_port_3;      /* '<Root>/in_port_3' */
    extern volatile real_T in_port_4;      /* '<Root>/in_port_4' */
    

    一般ディクショナリ オブジェクト dictObj を使用して、ディクショナリに加えた変更を保存し、ディクショナリを閉じます。

    saveChanges(dictObj);
    close(dictObj);

    プログラム インターフェイスを使用して、Simulink モデルのさまざまなタイプのコード マッピング オブジェクトを取得して使用します。

    モデル CoderMapAPI を読み込みます。

    codeMapModel = "CoderMapAPI";
    load_system(codeMapModel);

    関数 coder.mapping.api.get を使用して、このモデルの Simulink® Coder™ および Embedded Coder® マッピング オブジェクトを取得して保存します。

    simCodeMapObj = coder.mapping.api.get(codeMapModel,"SimulinkCoderC");
    eCodeMapObj = coder.mapping.api.get(codeMapModel,"EmbeddedCoderC");

    すべてのルートレベルの入力端子名を保存します。

    in_port_names = "in_port_"+(1:4)'
    in_port_names = 4x1 string
        "in_port_1"
        "in_port_2"
        "in_port_3"
        "in_port_4"
    
    

    コード マッピング オブジェクトごとに、入力端子のストレージ クラスを設定するインライン関数を定義します。関数 arrayfun を使用して、Simulink コード マッピング オブジェクトのすべてのルートレベルの入力端子のストレージ クラスを ImportedExtern に設定し、Embedded Coder マッピング オブジェクトのルートレベルの入力端子のストレージ クラスを ImportedExternPointer に設定します。

    configSimCoderPortStoreClassFcn = @(port_name) setInport(simCodeMapObj,port_name,StorageClass="ImportedExtern");
    configECoderPortStoreClassFcn = @(port_name) setInport(eCodeMapObj,port_name,StorageClass="ImportedExternPointer");
    arrayfun(configSimCoderPortStoreClassFcn,in_port_names);
    arrayfun(configECoderPortStoreClassFcn,in_port_names);

    コード マッピング オブジェクトごとに、入力端子のストレージ クラスを表示するインライン関数を定義します。

    dispSimCoderPortStoreClassFcn = @(port_name) disp(getInport(simCodeMapObj,port_name,"StorageClass"));
    dispECoderPortStoreClassFcn = @(port_name) disp(getInport(eCodeMapObj,port_name,"StorageClass"));

    各コード マッピング オブジェクトのルートレベルの入力端子のストレージ クラスを表示します。

    arrayfun(dispSimCoderPortStoreClassFcn,in_port_names);
    ImportedExtern
    ImportedExtern
    ImportedExtern
    ImportedExtern
    
    arrayfun(dispECoderPortStoreClassFcn,in_port_names);
    ImportedExternPointer
    ImportedExternPointer
    ImportedExternPointer
    ImportedExternPointer
    

    ImportedExtern および ImportedExternPointer ストレージ クラスをもつルートレベルの入力端子は、モデルの生成されたプライベート ヘッダー ファイル内の別個のセクションで宣言されます。両方のヘッダー ファイルでこれらのセクションを確認できるように、2 つのシステム ターゲット ファイルのヘッダー ファイル名を保存します。

    priv_h_simcoder_file = fullfile(codeMapModel+"_grt_rtw",codeMapModel+"_private.h")
    priv_h_simcoder_file = 
    "CoderMapAPI_grt_rtw/CoderMapAPI_private.h"
    
    priv_h_ecoder_file = fullfile(codeMapModel+"_ert_rtw",codeMapModel+"_private.h")
    priv_h_ecoder_file = 
    "CoderMapAPI_ert_rtw/CoderMapAPI_private.h"
    

    モデルのターゲット ファイルを grt.tlc に設定し、モデルからコードを生成します。

    set_param(codeMapModel,SystemTargetFile="grt.tlc")
    evalc("slbuild(codeMapModel)");

    以下に、grt.tlc ヘッダー ファイル priv_h_simcoder_file 内のルートレベルの入力端子の宣言を示します。

    /* Imported (extern) block signals */
    extern real_T in_port_1;               /* '<Root>/in_port_1' */
    extern real_T in_port_2;               /* '<Root>/in_port_2' */
    extern real_T in_port_3;               /* '<Root>/in_port_3' */
    extern real_T in_port_4;               /* '<Root>/in_port_4' */
    

    ルートレベルの入力端子は、ImportedExtern セクションで宣言されます。

    ヘッダー ファイルを開くには、MATLAB® コマンド ウィンドウに次のコマンドを入力します。

    edit(priv_h_simcoder_file)
    

    次に、モデルのターゲット ファイルを ert.tlc に設定し、モデルからコードを生成します。

    set_param(codeMapModel,SystemTargetFile="ert.tlc")
    evalc("slbuild(codeMapModel)");

    以下に、ert.tlc ヘッダー ファイル priv_h_ecoder_file 内のルートレベルの入力端子の宣言を示します。

    /* Imported (extern) pointer block signals */
    extern real_T *in_port_1;              /* '<Root>/in_port_1' */
    extern real_T *in_port_2;              /* '<Root>/in_port_2' */
    extern real_T *in_port_3;              /* '<Root>/in_port_3' */
    extern real_T *in_port_4;              /* '<Root>/in_port_4' */
    

    このヘッダー ファイルのルートレベルの入力端子は、ImportedExternPointer セクションで宣言されます。

    ヘッダー ファイルを開くには、MATLAB コマンド ウィンドウに次のコマンドを入力します。

    edit(priv_h_ecoder_file)
    

    入力引数

    すべて折りたたむ

    コード マッピング オブジェクトを返す対象の Simulink モデル。ハンドル、またはモデル名 (.slx ファイル拡張子なし) あるいはモデル ファイルの相対パスまたは絶対パス (.slx ファイル拡張子を含む) を含む文字ベクトルまたは string スカラーとして指定します。

    メモ

    モデルが (たとえば、load_system を使用して) 読み込まれていなければなりません。

    例: "configModel"

    データ型: char | string | handle

    コード マッピング オブジェクトを返す対象のデータ インターフェイス ディクショナリ。Simulink.data.Dictionary オブジェクト、またはディクショナリ ファイルの相対パスまたは絶対パス (.sldd ファイル拡張子を含む) を含む文字ベクトルまたは string スカラーとして指定します。

    例: "exCodeDefs.sldd"

    データ型: char | string | Simulink.data.Dictionary

    指定されたモデルまたはディクショナリに対して返すコード マッピングのタイプ。表内の値のいずれかとして指定します。コード マッピングを使用すると、モデルをプラットフォームに適したコード生成構成に関連付けることができます。指定されたマッピング タイプが存在しない場合は、エラーが生成されます。

    コード マッピング タイプコード生成の構成詳細
    "SimulinkCoderC"C 言語ラピッド プロトタイピング プラットフォームSimulink Coder™ および C 言語
    "EmbeddedCoderC"C 言語生成プラットフォームEmbedded Coder® および C 言語
    "EmbeddedCoderCPP"C++ 言語生成プラットフォームEmbedded Coder および C++ 言語

    出力引数

    すべて折りたたむ

    モデルのコード マッピング オブジェクト。CodeMapping オブジェクトまたは CodeMappingCPP として返されます。

    出力入力オブジェクトコード マッピング タイプ
    coder.mapping.api.CodeMappingSimulink モデル"SimulinkCoderC" または "EmbeddedCoderC"
    coder.mapping.api.CodeMappingCPPSimulink モデル"EmbeddedCoderCPP"

    Embedded Coder データ ディクショナリ。coder.mapping.api.CoderDictionary オブジェクトとして返されます。

    バージョン履歴

    R2020b で導入