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_cmd
、pump_cmd
、pump_dir
のフィールドがあります。pump_control_bus
構造体の型は、ファイル controllerTypes.h
で定義されています。
次の表は、Controller
アルゴリズムの出力をまとめたものです。
関数 Controller
は、utils.c
ファイルで定義されている、2 つのユーティリティ関数 absoluteTempDifference
および pumpDirection
を使用します。関数 absoluteTempDifference
は、Tset
と Troom_in
間の差の絶対値を double として返します。関数 PumpDirection
は、これら pumpDirection
型列挙値の 1 つを返します。
PumpDirection
enum type
は、ファイル controllerTypes.h
で定義されています。
コード インポーター ウィザードを開く
コード インポーター ウィザードを開くには、src
および include
フォルダーが保存される空の Simulink ライブラリを作成して保存します。この例では、ライブラリに heatpumpController
という名前を付けて保存します。
次に、[モデル化] タブで [設計]、[コード インポーター] を選択します。
Simulink ライブラリの指定
[ようこそ] ページが読み込まれたら、[開始] をクリックしてインポート プロセスを開始します。
[設定] ページで、次を行います。
[Simulink ライブラリ ファイル名] には、保存されたライブラリ名が自動的に入力されます。この例では
heatpumpController
です。[出力フォルダー] には、保存された Simulink ライブラリの場所が自動的に入力されます。
オプションで、[生成されたライブラリを Simulink ライブラリ ブラウザーに追加する] を選択して slblocks.m ファイルを作成します。
slblocks.m
ファイルは、生成されたライブラリを Simulink ライブラリ ブラウザーに追加するために使用されます。詳細については、ライブラリ ブラウザーへのライブラリの追加を参照してください。
[次へ] をクリックして続行します。
メモ: 以下の MATLAB コードはこのステップと等価です。
obj = Simulink.CodeImporter('heatpumpController'); obj.LibraryFileName = 'heatpumpController'; obj.OutputFolder = '$pwd$'; %This evaluates to the pwd
インポートするカスタム コードの指定
[カスタム コードの指定] ページで、以下を実行します。
[言語] で、
C
を選択します。[インターフェイス ヘッダー] で、必要なヘッダー ファイルを指定します。この例では、
tempController.h
を指定します。[ソース ファイル] で、必要なソース ファイルを指定します。この例では、src フォルダーにある
tempController.c
ファイルとutils.c
ファイルの場所を.\src\tempController.c; .\src\utils.c
として指定します。[インクルード ディレクトリ] で、必要なインクルード ディレクトリを指定します。この例では、
.\include
を指定します。
次に、[次へ] をクリックします。
[解析] ページで [次へ] をクリックします。
メモ: 以下のコードはこのステップと等価です。
% 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
の仮引数 Tset
、Troom_in
、out
が一覧表示されます。
引数 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 ライブラリを使用しているため、このページを使って、ライブラリで実行される更新操作を確認できます。
[上書き] を選択して任意の既存のブロックを削除し、選択したカスタム コード関数用に新しい C Caller ブロックを作成します。
[更新] を選択して既存のブロックを保持し、選択したカスタム コード関数用に新しい C Caller ブロックを作成します。
この例では [更新] を選択してから、[次へ] をクリックします。
テスト ハーネスの作成
このオプションは、Simulink Test™ ライセンスがある場合にのみ利用できます。
Simulink テスト マネージャーを使用してインポートされたカスタム コード関数をテストするには、[インポートされたすべての関数にテスト ハーネスを自動的に作成] を選択します。作成されたライブラリ内の各ブロックは内部のテスト ハーネスに付加されます。
この例では [スキップ] を選択します。[次へ] をクリックして Simulink ライブラリを生成します。
コードがインポートされた後に、pump_control_bus
を Simulink.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 ファイルに保存するかどうか選択します。このファイルを使用して、現在のインポート設定が指定されたコード インポーター ウィザードを読み込むことができます。
参考
C Caller ブロックを使用した C コードの統合 | C Caller | ライブラリ ブラウザーへのライブラリの追加 | Create Block Library from C/C++ Code