主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

在 Simulink 和目标硬件之间设置外部模式连接

R2026a

对于外部模式仿真,您可以使用 target 命名空间在 Simulink® 和您的目标硬件之间提供连接。

下图概述外部模式仿真的组成部分。

target 命名空间提供用于组件实现的类。下表列出了主要的类。

组件类目的
目标硬件target.Board向 MATLAB® 提供目标硬件的描述。
部署工具 target.SystemCommandExecutionTool

这些类可用于:

  • 从开发计算机捕获运行目标应用程序的系统命令。

  • 描述目标应用程序的执行服务实现。

  • 为管理目标应用程序执行的工具提供 MATLAB 服务接口。

要提供监控和调节、部署、连接和启动功能,“在自定义硬件上运行”App 需要使用 target.ExecutionTool。

target.ExecutionService
target.ExecutionTool
连接 target.ExternalMode为 Simulink 和目标硬件之间的数据传输提供通信协议。
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. 创建一个 target.Board 对象,为 MATLAB 提供目标硬件的描述。要支持代码生成,请将该对象与处理器相关联。

    processor = target.get('Processor', 'Intel-x86-64 (Windows64)');
    board = target.create('Board', ...
                    'Name', 'Example Intel Board', ...
                    'Processors', processor);
  2. 使用以下类之一:

    • target.ExecutionTool - 提供 getApplicationStatus 方法,这是“在自定义硬件上运行”App 在提供监控和调节、部署、连接和启动功能时所必需的。

    • target.SystemCommandExecutionTool - getApplicationStatus 方法不适用于此类。不完全支持“在自定义硬件上运行”App 的监控和调节、部署、连接和启动功能。

    在步骤 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. 创建一个 target.CommunicationInterface 对象,该对象为目标硬件提供通信通道和 rtiostream API (Embedded Coder) 实现的详细信息。

    对于 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 类实现 XCP 传输层,该传输层根据 ASAM 设定通过通信媒体传输和接收报文。在此示例中,传输协议是 TCP/IP。对于串行传输,将 target.XCPTCPIPTransport 替换为 target.XCPSerialTransport。

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

    3. 创建一个 target.XCP 对象,该对象表示目标硬件的 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

另请参阅

主题

外部网站