Main Content

Simulink コード インポーター ウィザードを使用したカスタム コードのインポート

この例では、ヒート ポンプ コントローラーの C コードを使用して、Simulink® コード インポーター ウィザードでカスタムの C/C++ コードを Simulink ライブラリにインポートする方法を示します。また、MATLAB® で Simulink コード インポーター コマンド ライン インターフェイスを使用して、等価のアクションを実行する方法も示します。詳細については、Create Block Library from C/C++ Codeを参照してください。

ヒート ポンプ コントローラーのカスタム コード

以下の C コード ソースとヘッダー ファイルには、ヒート ポンプ コントローラーの完全なコードが含まれています。

以下のソース ファイルは、src ディレクトリ内にあります。

  • tempController.c

  • utils.c

以下のヘッダー ファイルは、include ディレクトリ内にあります。

  • tempController.h

  • utils.h

  • controllerTypes.h

ファイル tempController.c には、ヒート ポンプ ユニットのカスタム C コード用のアルゴリズムが含まれています。このファイル内の関数 Controller は、室温 (Troom_in) と設定温度 (Tset) を入力として使用します。出力は、ファン、ヒート ポンプおよびヒート ポンプの方向 (暖房または冷房) を制御する信号を含む pump_control_bus 型の構造体です。pump_control_bus 構造体には、fan_cmdpump_cmdpump_dir のフィールドがあります。pump_control_bus 構造体の型は、ファイル controllerTypes.h で定義されています。

次の表は、Controller アルゴリズムの出力をまとめたものです。

Temperature ConditionSystem StateFan CommandPump CommandPump Direction|Troom_in - Tset| < DeltaT_fanIdle00IDLEDelatT_fan <= |Troom_in - Tset| < DeltaT_pumpFan only10IDLE|Troom_in - Tset| >= DeltaT_pump and Tset < Troom_inCooling11COOLING|Troom_in - Tset| >= DeltaT_pump and Tset > Troom_inHeating11HEATING

関数 Controller は、utils.c ファイルで定義されている、2 つのユーティリティ関数 absoluteTempDifference および pumpDirection を使用します。関数 absoluteTempDifference は、TsetTroom_in 間の差の絶対値を double として返します。関数 PumpDirection は、これら pumpDirection 型列挙値の 1 つを返します。

Temperature ConditionPump DirectionTset < Troom_inCOOLINGTset > Troom_inHEATING

PumpDirection enum type は、ファイル controllerTypes.h で定義されています。

コード インポーター ウィザードを開く

コード インポーター ウィザードを開くには、src および include フォルダーが保存される空の Simulink ライブラリを作成して保存します。この例では、ライブラリに heatpumpController という名前を付けて保存します。

次に、[モデル化] タブで [設計]、[コード インポーター] を選択します。

Simulink ライブラリの指定

[ようこそ] ページが読み込まれたら、[開始] をクリックしてインポート プロセスを開始します。

[設定] ページで、次を行います。

  1. [Simulink ライブラリ ファイル名] には、保存されたライブラリ名が自動的に入力されます。この例では heatpumpController です。

  2. [出力フォルダー] には、保存された Simulink ライブラリの場所が自動的に入力されます。

オプションで、[生成されたライブラリを Simulink ライブラリ ブラウザーに追加する] を選択して slblocks.m ファイルを作成します。

slblocks.m ファイルは、生成されたライブラリを Simulink ライブラリ ブラウザーに追加するために使用されます。詳細については、ライブラリ ブラウザーへのライブラリの追加を参照してください。

ci_wizard_settings.png

[次へ] をクリックして続行します。

メモ: 以下の MATLAB コードはこのステップと等価です。

obj = Simulink.CodeImporter('heatpumpController');
obj.LibraryFileName = 'heatpumpController';
obj.OutputFolder = '$pwd$'; %This evaluates to the pwd

インポートするカスタム コードの指定

[カスタム コードの指定] ページで、以下を実行します。

  1. [言語] で、C を選択します。

  2. [インターフェイス ヘッダー] で、必要なヘッダー ファイルを指定します。この例では、tempController.h を指定します。

  3. [ソース ファイル] で、必要なソース ファイルを指定します。この例では、src フォルダーにある tempController.c ファイルと utils.c ファイルの場所を .\src\tempController.c; .\src\utils.c として指定します。

  4. [インクルード ディレクトリ] で、必要なインクルード ディレクトリを指定します。この例では、.\include を指定します。

ci_wizard_specify.png

次に、[次へ] をクリックします。

[解析] ページで [次へ] をクリックします。

メモ: 以下のコードはこのステップと等価です。

% The src and include directories should be located in pwd
obj.CustomCode.InterfaceHeaders = 'tempController.h';
obj.CustomCode.Language = 'C';
obj.CustomCode.SourceFiles = {'.\src\tempController.c', '.\src\utils.c'};
obj.CustomCode.IncludePaths = '.\include';

% Analyze the specified custom code
obj.parse();

インポート設定の指定

インポートする関数の指定

[インポート] ページで、Simulink ライブラリにインポートする関数を選択します。この例では Controller を選択します。次に、[次へ] をクリックします。

ブロックの端子仕様の設定

前のページで選択した各関数について、ウィザードで関数の端子仕様が生成されます。選択された端子は、生成された C Caller ブロックに使用されます。

この例では、端子仕様テーブルに、関数 Controller の仮引数 TsetTroom_inout が一覧表示されます。

引数 out のラベルを control_out に変更します。[次へ] をクリックします。

メモ: 以下のコードはこのステップと等価です。

% Requires a successful obj.parse() to get the function objects
fcnObj = obj.ParseInfo.getFunctions();

%fcnObj = 
%
%  Function with properties:
%
%                 Name: "Controller"
%           CPrototype: "pump_control_bus Controller(real_T Tset, real_T Troom_in);"
%    PortSpecification: [1×1 Simulink.CodeImporter.SimulinkPortSpecification]
%              IsEntry: 1
%            IsDefined: 1
%               IsStub: 0
%          ArrayLayout: NotSpecified
%      IsDeterministic: 0

fcnObj.PortSpecification.ReturnArgument.Label = 'control_out';

インポートする型の指定

次に、Simulink にインポートする型を選択します。インポート対象として選択した関数に型が必要な場合は、その型が選択されてグレー表示になります。この例では、pump_control_bus が必要です。ウィザードにより、この型を含む Simulink データ ディクショナリが作成され、ディクショナリは生成されたライブラリにリンクされます。

[次へ] をクリックします。

ライブラリの更新設定の指定

この例では保存された Simulink ライブラリを使用しているため、このページを使って、ライブラリで実行される更新操作を確認できます。

  1. [上書き] を選択して任意の既存のブロックを削除し、選択したカスタム コード関数用に新しい C Caller ブロックを作成します。

  2. [更新] を選択して既存のブロックを保持し、選択したカスタム コード関数用に新しい C Caller ブロックを作成します。

この例では [更新] を選択してから、[次へ] をクリックします。

テスト ハーネスの作成

このオプションは、Simulink Test™ ライセンスがある場合にのみ利用できます。

Simulink テスト マネージャーを使用してインポートされたカスタム コード関数をテストするには、[インポートされたすべての関数にテスト ハーネスを自動的に作成] を選択します。作成されたライブラリ内の各ブロックは内部のテスト ハーネスに付加されます。

この例では [スキップ] を選択します。[次へ] をクリックして Simulink ライブラリを生成します。

コードがインポートされた後に、pump_control_busSimulink.Bus オブジェクトとして定義する、Simulink データ ディクショナリに付加されるライブラリがウィザードで作成されます。

メモ: 以下のコードはこのステップと等価です。

% Requires Simulink Test license to generate the test harness
obj.Options.CreateTestHarness = true;
obj.import('Functions', 'Controller', ...
           'Types', 'pump_control_bus', ...
           'Overwrite', 'off');          

既存のプロジェクト ファイル (PRJ ファイル) がある場合は、[追加] を選択し、必要なプロジェクト ファイルを選択して、生成されたファイルをそのプロジェクトに追加することができます。

[終了] をクリックしてウィザードを閉じます。

[終了] をクリックするときに、現在のインポート設定を JSON ファイルに保存するかどうか選択します。このファイルを使用して、現在のインポート設定が指定されたコード インポーター ウィザードを読み込むことができます。

参考

| | |