メインコンテンツ

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

Simulink とターゲット ハードウェアの間のエクスターナル モードの接続性の設定

R2026a

エクスターナル モード シミュレーションについて、target 名前空間を使用して Simulink® とターゲット ハードウェアの間の接続性を指定できます。

次の図は、エクスターナル モード シミュレーションのコンポーネントの概要を示したものです。

target 名前空間は、コンポーネントの実装用のクラスを提供します。次の表に主なクラスを示します。

コンポーネントクラス目的
ターゲット ハードウェアtarget.BoardMATLAB® にターゲット ハードウェアの記述を提供します。
展開ツール target.SystemCommandExecutionTool

次の目的でクラスを使用できます。

  • 開発用コンピューターからターゲット アプリケーションを実行するためのシステム コマンドを取得する。

  • ターゲット アプリケーションの実行サービスの実装を記述する。

  • ターゲット アプリケーションの実行を管理するツール用の MATLAB サービス インターフェイスを提供する。

[カスタム ハードウェア上で実行] アプリの [監視と調整]、[展開]、[接続]、および [開始] の機能を提供するには、target.ExecutionTool を使用する必要があります。

target.ExecutionService
target.ExecutionTool
接続性 target.ExternalModeSimulink とターゲット ハードウェアの間のデータ転送用の通信プロトコルを提供します。
target.CommunicationInterfaceターゲット ハードウェアに通信チャネルと rtiostream API (Embedded Coder) 実装の詳細を提供します。
target.TargetConnectionターゲット ハードウェアへの開発用コンピューターの接続に関する詳細を提供します。

XCP エクスターナル モード シミュレーションの接続性のカスタマイズ

ERT (ert.tlc) および GRT (grt.tlc) システム ターゲット ファイルを使用して生成されるコードについて、XCP 通信プロトコルを使用したエクスターナル モード シミュレーションを実行できます。

  • 開発用コンピューター上。

  • 他のターゲット ハードウェア上 (サポート パッケージを使用)。

カスタム ターゲット ハードウェアのシステム ターゲット ファイルが ERT または GRT システム ターゲット ファイルから派生している場合、target 名前空間のクラスを使用して接続性をカスタマイズします。たとえば target.ExternalMode や target.CommunicationInterface です。

この例では、XCP ベースのエクスターナル モード シミュレーションの接続性をカスタマイズする方法を示します。Simulink とターゲット ハードウェアの間の接続性を設定するには、次を行います。

  1. MATLAB にターゲット ハードウェアの記述を提供する target.Board オブジェクトを作成します。コード生成をサポートするために、オブジェクトをプロセッサに関連付けます。

    processor = target.get('Processor', 'Intel-x86-64 (Windows64)');
    board = target.create('Board', ...
                    'Name', 'Example Intel Board', ...
                    'Processors', processor);
  2. 次のいずれかのクラスを使用します。

    • target.ExecutionTool — [カスタム ハードウェア上で実行] アプリの [監視と調整]、[展開]、[接続]、および [開始] の機能に必要な getApplicationStatus メソッドを提供します。

    • target.SystemCommandExecutionTool — getApplicationStatus メソッドはこのクラスでは使用できません。[カスタム ハードウェア上で実行] アプリの [監視と調整]、[展開]、[接続]、および [開始] の機能は完全にはサポートされません。

    手順 3 と手順 4 では、ターゲット アプリケーションをターゲット ハードウェアにダウンロードできるツールが利用可能であることが前提となります。

  3. MyImplementationClass というクラスで MATLAB サービス インターフェイスを実装します。疑似コードの実装の例については、実行ツール テンプレートを参照してください。

    classdef MyImplementationClass < target.ExecutionTool
        properties (Access=private)
        …
        end
    
        methods
        …
        end
    
        methods (Access=private)          
        …
        end
    end

    ターゲット アプリケーションの実行に関する詳細を含む target.ExecutionService オブジェクトを作成します。このオブジェクトで、ターゲット アプリケーションをターゲット ハードウェアで実行するために必要なツールを記述します。

    matlabExecution = ...
                      target.create('ExecutionService', ...
                                    'Name', 'My Application Launcher');
    matlabExecution.APIImplementation = ...
                      target.create('APIImplementation', ...
                                    'Name', 'MyServiceImplementation');
    matlabExecution.APIImplementation.BuildDependencies = ...
                      target.create('MATLABDependencies');
    matlabExecution.APIImplementation.BuildDependencies.Classes = ...
                                    {'MyImplementationClass'};
    matlabExecution.APIImplementation.API = ...
                      target.get('API', 'ExecutionTool');

    target.ExecutionService オブジェクトを target.Board オブジェクトに関連付けます。

    board.Tools.ExecutionTools = matlabExecution;

  4. 開発用コンピューターからターゲット アプリケーションを実行するためのシステム コマンドを取得する target.SystemCommandExecutionTool オブジェクトを作成します。

    executionTool = target.create('SystemCommandExecutionTool', ...
                    'Name', 'My Execution Tool');            
    executionTool.StartCommand.String = 'customDownloadTool';
    executionTool.StartCommand.Arguments = {'$(EXE)'};

    target.SystemCommandExecutionTool オブジェクトを target.Board オブジェクトに関連付けます。

    board.Tools.ExecutionTools = executionTool;

  5. ターゲット ハードウェアに通信チャネルと rtiostream API (Embedded Coder) 実装の詳細を提供する target.CommunicationInterface オブジェクトを作成します。

    rtiostream API について、BuildDependencies オブジェクトを使用して、ターゲット アプリケーションでコンパイルするソース ファイルを指定します。この例では、開発用コンピューターでエクスターナル モード シミュレーションを実行できる付属の TCP/IP rtiostream 実装ソース ファイルを使用します。ターゲット ハードウェアについては、独自の rtiostream 実装を提供します。

    buildDependencies = target.create('BuildDependencies', ...
                    'SourceFiles', ...
                    {fullfile('$(MATLAB_ROOT)', ...
                                  'toolbox', 'coder', ...
                                  'rtiostream', ...
                                  'src', ...
                                  'rtiostreamtcpip', ...
                                  'rtiostream_tcpip.c')});
    
    apiImplementation = target.create('APIImplementation', ...
                    'Name', 'TCP x86 RTIOStream Implementation', ...
                    'API', target.get('API', 'rtiostream'), ...
                    'BuildDependencies', buildDependencies);
    
    tcpComms = target.create('CommunicationInterface', ...
                    'Name', 'Windows TCP Interface', ...
                    'Channel', 'TCPChannel', ...
                    'APIImplementations', apiImplementation);
    TCP チャネルを指定するために、この例では名前と値の引数 'Channel', 'TCPChannel' を使用します。シリアル通信チャネルの場合は、名前と値の引数 'Channel', 'RS232Channel' を使用して指定できます。

    target.CommunicationInterface オブジェクトを target.Board オブジェクトに関連付けます。

    board.CommunicationInterfaces = tcpComms;

  6. Simulink とターゲット ハードウェアの間のデータ転送用の通信プロトコルを提供するオブジェクトを作成します。

    1. target.XCPPlatformAbstraction クラスを使用して、XCP プラットフォーム抽象化レイヤーのカスタム実装を利用します。このレイヤーで、静的なメモリ アロケーターとその他のプラットフォーム抽象化機能を提供します。

      xcpPlatformAbstraction = target.create('XCPPlatformAbstraction', ...
                      'Name', 'XCP Platform Abstraction');
      
      xcpPlatformAbstraction.BuildDependencies.Defines = {'XCP_CUSTOM_PLATFORM'};
      customPlatformAbstractionPath = 'pathToImplementationFolder';
      xcpPlatformAbstraction.BuildDependencies.SourceFiles = ...
                      {fullfile(customPlatformAbstractionPath, 'myXCPPlatform.c')};
      xcpPlatformAbstraction.BuildDependencies.IncludePaths = ...
                      {customPlatformAbstractionPath};
    2. target.XCPTCPIPTransport クラスを使用して、ASAM の仕様に従って通信メディアに対してメッセージを送受信する XCP トランスポート層を実装します。この例では、トランスポート プロトコルは TCP/IP です。シリアル トランスポートの場合は、target.XCPTCPIPTransport を target.XCPSerialTransport に置き換えます。

      xcpTransport = target.create('XCPTCPIPTransport', ...
                      'Name', 'XCP Transport');

    3. ターゲット ハードウェアの XCP プロトコル スタックを表す target.XCP オブジェクトを作成します。

      xcpConfiguration = target.create('XCP', ...
                      'Name', 'XCP Configuration', ...
                      'XCPTransport', xcpTransport, ...
                      'XCPPlatformAbstraction', xcpPlatformAbstraction);

    4. XCP プロトコル スタックで利用できる XCP エクスターナル モード接続性オプションを表すオブジェクトを作成します。

      extModeConnectivity = ... 
                   target.create('XCPExternalModeConnectivity', ...                
                   'Name', 'External Mode Connectivity', ...
                   'XCP', xcpConfiguration);

      メモ

      XCP スタックによってターゲット ハードウェア リソースの使用をより詳細に制御する場合は、XCP パラメーター MaxCTOSize、MaxDTOSize、および MaxODTEntrySizeDAQ の値を指定できます。以下に例を示します。

      extModeConnectivity.XCP.XCPTransport.MaxCTOSize = 16
      extModeConnectivity.XCP.XCPTransport.MaxDTOSize = 256
      extModeConnectivity.XCP.XCPTransport.MaxODTEntrySizeDAQ = 128

    5. エクスターナル モード プロトコル スタック オブジェクトを作成します。

      externalMode = target.create('ExternalMode', ...
                      'Name', 'External Mode', ...
                      'Connectivities', extModeConnectivity);

      メモ

      このオブジェクトは単一の target.create の呼び出しで作成できます。

      externalMode = target.create('ExternalMode', ...
              'Name', 'External Mode', ...
              'XCPTransportLayer', 'TCP', ...
              'Defines', {'XCP_CUSTOM_PLATFORM'}, ...
              'SourceFiles', {fullfile('pathToImplementationFolder', 'myXCPPlatform.c')}, ...
              'IncludePaths', {'pathToImplementationFolder'});
    6. オブジェクトをターゲット ハードウェアでサポートされる通信プロトコルのリストに追加します。

      board.CommunicationProtocolStacks = externalMode;
      

  7. Simulink とターゲット ハードウェアの間の接続を指定するオブジェクトを作成します。

    connection = target.create('TargetConnection', ...
                          'Name', 'Host Process Connection', ...
                          'Target', board, ...
                          'CommunicationType', 'TCPChannel', ...
                          'IPAddress', 'localhost', ... 
                          'Port', '17725')

  8. ボード オブジェクトと接続オブジェクトを内部データベースに追加し、すべての MATLAB セッションでオブジェクトを保持します。

    target.add(board, 'UserInstall', true);
    target.add(connection, 'UserInstall', true);

  9. Simulink エディターの [ハードウェア] タブで、[ボード] リストから [Example Intel Board] を選択します。

    または、コンフィギュレーション パラメーター HardwareBoard を使用できます。コマンド ウィンドウで次のように入力します。

    set_param(gcs,'HardwareBoard','Example Intel Board')

  10. [接続] リストから、TCP/IP アドレス localhost およびポート番号 17725 に対応する接続を選択します。

    または、モデル パラメーター HardwareConnection を使用できます。コマンド ウィンドウで次のように入力します。

    set_param(gcs,'HardwareConnection','TargetConnection-Host Process Connection')
    他の場所で定義された接続について、この表は HardwareConnection に指定できる引数の値を示します。

    定義場所指定
    [MEX ファイルの引数] フィールドTargetConnection-External Mode Connection
    [AUTOSAR コード生成オプション] ペインTargetConnection-Adaptive AUTOSAR Connection
    Linux ランタイム マネージャーの [ターゲットの構成] セクションの [名前] フィールドTargetConnection-Linux Runtime Manager Connection for targetName。ここで targetName は [名前] フィールドの値

TCP/IP またはシリアルのエクスターナル モード シミュレーションの接続性のカスタマイズ

TCP/IP またはシリアルのエクスターナル モード シミュレーションについて、次のワークフローを通じて接続性をカスタマイズできます。

  • トランスポート プロトコルと通信プロトコルを実装する。

  • target 名前空間を使用してターゲット アプリケーションの実行ツールを指定する。

Simulink とターゲット ハードウェアの間の接続性の設定にはXCP エクスターナル モード シミュレーションの接続性のカスタマイズで説明したワークフローを使用しますが、次の点が異なります。

実行ツール テンプレート

この節では、target.ExecutionTool サービス インターフェイスの疑似コードの例を示します。このツールは、ターゲット ハードウェアでアプリケーションを開始して追跡します。

classdef MyExecutionTool < target.ExecutionTool

  methods        
    function errFlag = startApplication(this)
      % Call "customDownloadTool" to download the application.
      [status, result] = ...
       system(sprintf('customDownloadTool %s', this.Application));
      if status == 0
        errFlag = false;                
      else
        disp(result);
        errFlag = true;
      end
    end

    function errFlag = stopApplication(~)
      % Add code here to stop the application, if possible.
      errFlag = false;
    end

    function [status, errFlag] = getApplicationStatus(~)
      % Add code here to return the application status, if known.
      status = target.ApplicationStatus.Unknown;
      errFlag = false;
    end
  end
end

参考

トピック

外部の Web サイト