記事一覧

MATLABのRealtime workshopに対応したカスタムブロックをつくる

●この記事は MCC Advent Calendar 2017 - Adventar の22日目の記事です。

MatlabのSimulinkで作った回路は,通常,そのPC上でしか実行できません.しかし,Realtime-workshopというものを使うと,回路図からCのコードを生成し,マイコン用の実行ファイルを生成するといったことができます.
前回の記事で作成したカスタムブロックを使います.

これをマイコンなどで実行できるようにしましょう.

必要なものは,
  • C言語のソース(前回作成済)
  • TLCファイル
となります.TLCファイルというものが追加で必要になります.

TLCファイルはなんなのか,というと,コード生成の規則を記述するようです.

構文はよく理解していない所が多く,サンプルやMath worksの公式サイトを見ながら書きました.

%implements "Rot2" "C"

%% -----Headers for embbeding-----
%openfile Buffer
#include "Sub.h"
%closefile Buffer
%

%% -----Sources for embbeding-----
%openfile Buffer
#include "Sub.c"
%closefile Buffer
%

%function Start(block, system) Output
Construct();
%endfunction
%function Terminate(block, system) Output
Destruct();
%endfunction

%% -----Function: Outputs-----
%function Outputs(block, system) Output
%assign a = LibBlockInputSignal (0, "", "", 0)
%assign pu = LibBlockInputSignalAddr(1,"", "", 0)
%assign py = LibBlockOutputSignalAddr(0, "", "", 0)

Rot(%, %, %);
%endfunction


まず最初の行で「Rot2」というs-function名と,「C言語で書かれている」という情報を与えます.

その次のブロックでは,読み込むヘッダを記述します.

その次のブロックでは,読み込むCファイルを記述します.

さらにその次は,「mdlStart」関数での処理を記述します.つまり,tlcファイルにも同じ処理を二度書きします

つづけて,「mdlTerminate」関数での処理,

「mdlOutput」関数での処理を記述します.

LibBlockInputSignalでブロックの入力信号を取得し,
LibBlockInputSignalAddrでそのポインタを得るようです.
LibBlockOutputSignalAddrは出力のポインタです.

コメントは%%の行です.

このときのディレクトリは以下のとおり.
FolderRot2TLC.png


ビルド


mdlファイルを開き,この状態にもっていきます.
Simulink2dRotCirc.png

シミュレーション -> シミュレーションパラメータ -> Real-time Workshopを開き,
システムターゲットファイルで参照を選びます.
そこで,今回はgrtを選んでみます.
RTWSelect.png

そして,さっきの回路図上で「Ctrl+B」を押し,ビルドします.

すると,Matlabのコマンドウインドウに,コンパイラーのメッセージがずらーっと出ます.
MatlabBuildMsg.png

最後に「Successful」のような,成功を示すメッセージが出ていればOKです.
このフォルダにModel.exe(ビルドしたモデルと同じファイル名になる)ができているはずです.

これで成功になります(.exeが出たのは,システムターゲットがPCっだからです(grtを選びましたね).マイコンならマイコン用のコンパイラを使えばその実行ファイルも作れます).

Comments

Post a comment

Private comment