メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

デバイス ドライバー ブロックを使用したシミュレーション

エクスターナル モード

エクスターナル モードでは、ホスト コンピューター上の Simulink® が、実行時にハードウェア ボード上に展開されたモデルと通信できます。また、ソースの出力を可視化したり、Sink ブロックの効果をリアルタイムで表示したりする簡単な方法も提供されます。

エクスターナル モードは、ホスト コンピューターおよびハードウェア ボード上に通信サービスを作成します。2 つのサービスにより、Simulink エンジンとハードウェア ボードに展開された生成コードとの間に通信チャネルが確立されます。通信サービスは、ハードウェア ボード上のモデル プロセスをコードから、またデータ パケットの形式設定、送信、および受信を行うトランスポート層から分離します。ホスト コンピューター上の通信サービスは、トランスポート層を介してデータ パケットを受信し、Simulink モデルの表示を更新します。この図は、エクスターナル モードの通信サービスがホスト コンピューター上の Simulink とハードウェア ボード上に展開されたコードとの間に作成する接続を示しています。

A transport layer connects the Host Computer to the Hardware Board.

デバイス ドライバー ブロックを含む単純なモデルをエクスターナル モードで実行することにより、ハードウェア ボードからのデータを直接確認できます。

エクスターナル モード シミュレーションの詳細については、エクスターナル モード シミュレーションによるパラメーター調整、信号監視、コード実行プロファイリングを参照してください。

ノーマル モード

ノーマル モードでは、Simulink モデルは完全にシミュレーションで動作し、MATLAB System ブロック内の C/C++ デバイス ドライバー コードはまったく実行されません。ただし、Simulink モデルでは通常、シミュレーション中に人工的に生成されたデータまたは以前に記録されたデータを生成するためにソース ブロックが必要となります。シミュレートされたデータを使用すると、モデルをハードウェア ボードに展開する前に、改善されたアルゴリズムの開発、テスト、およびデバッグを行うことができます。デバイス ドライバーの Sink ブロックでは、ノーマル モード シミュレーションで動作し、Terminator ブロックの動作を想定するために変更を行う必要はありません。対照的に、デバイス ドライバーのソース ブロックでは、実行時に生成されたデータまたはモデルのシミュレーション時にベース MATLAB® ワークスペースから取得されたデータを出力するために stepImpl メソッドを変更する必要があります。

実行時のデータ生成

次のコードは、デバイス ドライバー ブロックが各シミュレーション タイム ステップでランダムに生成された論理値を返すように stepImpl メソッドを変更する方法の例を示しています。

methods(Access=protected)
    ...
    function stepImpl(obj,u) %#ok<INUSD>
        if isempty(coder.target)
            % Generate random data during simulation
            y = rand > 0.5;
        else
            % Call C-function implementing device output
            coder.ceval('writeDigitalPin', 9, u);
        end
    end
    ...
end

stepImpl メソッドは、coder.target が空を返したときにコードを実行するように変更されています。空の値は、モデルがハードウェアに展開されていないことを示します。

MATLAB ワークスペースからのデータの取得

多くの場合、ランダムに生成されたデータを出力するデバイス ドライバーのソース ブロックでは、シミュレーションでモデルを正確に評価するには不十分です。以前に取得または生成されたデータが必要です。

この動作を実現するには、次のように MATLAB ワークスペースからデータ変数を取得するように stepImpl メソッドを変更します。

properties (Access = private)
    Count = 1
end
methods(Access=protected)
    ...
    function stepImpl(obj,u) %#ok<INUSD>
        if isempty(coder.target)
            % Generate random data during simulation
            x = evalin('base','x');
            y = x(obj.Count);
            obj.Count = obj.Count + 1;
            if obj.Count > numel(x)
                obj.Count = 1;
            end        
        else
            % Call C-function implementing device output
            coder.ceval('writeDigitalPin', 9, u);
        end
    end
    ...
end

その他のシミュレーション モード

アクセラレータ モードやラピッド アクセラレータ モードなど、利用可能な他のシミュレーション モードでは、デバイス ドライバー ブロックに含まれる C/C++ コードをコンパイルして実行します。これらのシミュレーション モードでは、空のマクロを含めるように C/C++ ヘッダーを変更する必要があります。

参考

| |