主要内容

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

使用 XCP 通信进行外部模式仿真

R2026a

在外部模式仿真中,您可以实时调节参数并监控目标应用程序信号。使用“在自定义硬件上运行”App,您可以在开发计算机或自定义硬件上设置和运行使用 XCP 通信通道的外部模式仿真。

对于外部模式仿真,您可以:

  1. 在您的开发计算机上编译目标应用程序。

  2. 将目标应用程序部署到目标硬件。

  3. 将 Simulink® 连接到在目标硬件上运行的目标应用程序。

  4. 开始在目标硬件上执行生成的代码。

在开发计算机上运行 XCP 外部模式仿真

配置并运行使用 XCP 通信协议的外部模式仿真。在仿真期间:

  • 使用 Scope 模块、Dashboard 模块和仿真数据检查器监控信号。

  • 使用 Dashboard 模块调节参数。

为 XCP 配置信号监控和参数调节

  1. 为此示例创建一个文件夹。

    mkdir ext_mode_xcp_example
    cd ext_mode_xcp_example

  2. 打开 Simulink 并创建一个简单模型 xcpExample,其中包含以下模块:

    • Sine Wave

    • Gain

    • Scope

    • Half Gauge

    • Knob

  3. 双击 Sine Wave 模块。将采样时间设置为 0.1,然后点击确定。

  4. 双击 Gain 模块。将增益设置为 2,然后点击确定。

  5. 将 Sine Wave 模块连接到 Gain 模块,并命名该连接(例如,命名为 Test Signal)。

  6. 将 Gain 模块连接到 Scope 模块,并命名该连接(例如,命名为 Output Signal)。

  7. 配置 Test Signal 以进行记录:

    1. 选择 Test Signal。

    2. 在信号选项卡的监控部分中,选择记录信号。

    如果不启用信号记录,则无法将 Test Signal 流式传输到仿真数据检查器。

  8. 配置 Half Gauge 模块以监视 Test Signal 的值:

    1. 双击 Half Gauge 模块。

    2. 在 Simulink 编辑器中,选择 Test Signal。

    3. 在“模块参数”对话框中:

      • 将模块连接到 Test Signal。

      • 在最大值字段中,输入一个值,例如 1。

    4. 点击确定。

  9. 配置 Knob 模块以调节 Sine Wave 模块的振幅参数:

    1. 双击 Knob 模块。

    2. 在 Simulink 编辑器中,选择 Sine Wave 模块。

    3. 在“模块参数”对话框中:

      • 将模块连接到 Sine Wave 模块的振幅参数。

      • 在最小值和最大值字段中,分别输入值,例如 0.1 和 1。

    4. 点击确定。

  10. 将模型另存为 xcpExample。

指定硬件并准备模型

  1. 在 Simulink 工具条的 App 选项卡上,在为在硬件上运行进行设置部分中,点击在自定义硬件上运行。在“在自定义硬件上运行”弹出对话框中,点击完成。

  2. 在硬件部分的硬件板字段中,使用默认值无硬件板。

  3. 在准备库的模型配置下,点击硬件设置。这将打开“配置参数”对话框,显示由系统目标文件确定的硬件实现设置。

    1. 在求解器窗格的类型字段中,指定定步长。然后,在求解器详细信息下的定步长(基础采样时间) 字段中,指定 0.1。

    2. 在代码生成 > 优化窗格中,将默认参数行为设置为可调。

    3. 在代码生成 > 接口窗格中,选中外部模式复选框。然后将传输层设置为 XCP on TCP/IP。选择 XCP on TCP/IP 会自动为 MEX 文件名指定 ext_xcp、选中自动分配静态内存复选框并启用最大持续时间。在此示例中,使用默认值最大持续时间。

    4. 如果系统目标文件为 ert.tlc,请在代码生成 > 模板窗格中,选中生成示例主程序复选框,并将目标操作系统设置为 BareBoardExample。代码生成器使用 matlabroot\toolbox\coder\xcp\src\target\ext_mode\include\ext_mode.h 中提供的外部模式抽象层的公开 API 创建一个示例,说明如何为不运行操作系统的裸板卡提供 XCP 外部模式目标连接。

    5. 点击确定以应用更改并关闭对话框。

    在硬件选项卡上,连接字段显示 IP: "localhost" – Port:17725。当您将传输层设置为 XCP on TCP/IP 时,在步骤 c 中指定 Simulink 与您的开发计算机之间的连接。

  4. 保存模型。

编译并运行目标应用程序

在在硬件上运行部分中,执行以下操作:

  1. 要为仿真停止时间指定非默认值,请在停止时间字段中指定您的值,例如 inf。

  2. 点击监控并调节 play icon 以启动该过程。软件将执行以下操作:

    1. 编译目标应用程序文件,包括可执行文件。根据代码生成的配置,信号的调试符号是作为可执行文件的一部分或在单独的文件中创建的。要了解有关代码生成的不同配置的更多信息,请参阅编译从 Simulink 模型生成的代码的方法。

    2. 将目标应用程序作为单独的进程部署在开发计算机上。

    3. 将 Simulink 连接到目标应用程序。

    4. 启动生成的模型代码。

    要分别执行这些步骤,请按顺序点击监控并调节 small arrow pointing down > 分步命令下的以下按钮:

    1. 编译以监控

    2. 部署

    3. 连接

    4. 启动

监控信号和调节参数

您可以通过以下方式监控 Test Signal:

  • Scope 模块 - 双击该模块。

  • 仿真数据检查器 - 点击“仿真数据检查器”按钮。当仿真数据检查器打开时,选中测试信号复选框,这将显示流式数据。

  • Half-Gauge 模块。

要更改正弦波的振幅,请将 Knob 模块上的指针旋转至所需值。

下表描述在仿真期间调节可调模块参数的更多方法。

方法详细信息

模型数据编辑器

要通过模型数据编辑器调整参数,请执行以下操作:

  1. 在 Simulink 编辑器的硬件选项卡上,在准备部分中,点击调整参数,这将打开模型数据编辑器。

  2. 如果您要同时更新多个可调参数,请在准备部分中,通过切换操作打开保持更新。

  3. 在模型数据编辑器的参数选项卡上,在值列中,为可调参数指定新值。

  4. 通过切换操作关闭保持更新或点击更新所有参数 (Ctrl+D)。Simulink 同时将新值下载到目标应用程序。

    如果保持更新关闭,则在您指定新值后,Simulink 会立即将新值下载到目标应用程序。

有关详细信息,请参阅模型数据编辑器。

“模块参数”对话框

要通过“模块参数”对话框调整参数,请执行下列步骤:

  1. 对于要更新的每个模块,请执行以下操作:

    1. 双击该模块,打开“模块参数”对话框。

    2. 在参数字段中,指定新参数值。

    3. 点击应用或确定。

  2. 如果保持更新打开,请通过切换操作关闭保持更新或点击更新所有参数 (Ctrl+D)。Simulink 同时将新值下载到目标应用程序。

    如果保持更新关闭,则在您点击应用或确定后,Simulink 会立即将新模块值下载到目标应用程序。

MATLAB® 工作区

如果模块参数是 MATLAB 工作区变量,请执行以下操作:

  1. 在命令行窗口中,为变量赋予新值。

  2. 在 Simulink 编辑器的硬件选项卡上,在准备部分中,点击更新所有参数 (Ctrl+D)。Simulink 将新值下载到目标应用程序。

有关详细信息,请参阅创建和编辑变量。

有关使用生成的代码进行参数调节的详细信息,请参阅使用 TCP/IP 或串行通信的外部模式仿真和在生成的代码中创建可调标定参数 (Embedded Coder)。

如果您的模型包含 Stateflow® 图,您可以查看状态活动。有关详细信息,请参阅Animate Stateflow Charts (Stateflow)。

停止目标应用程序

要在停止时间到达之前停止执行并断开与目标应用程序的连接,请在硬件选项卡的在硬件上运行部分中,点击停止 button in the shape of a small black square inside a larger gray square。

如果您要在不停止代码执行的情况下断开目标应用程序与 Simulink 的连接,请点击停止 small arrow pointing down > 分步命令 > 断开连接。

XCP 外部模式仿真的触发信号监控

对于 XCP 外部模式仿真,您可以配置触发器,用它启动目标应用程序数据的上传以在 Simulink 中进行信号监控。

  1. 在命令行窗口中,输入以下命令:

    % Create work folder
    if mkdir('workFolder')
        rmdir 'workFolder' s
        mkdir('workFolder')
    end
    cd workFolder
    open_system(new_system('myModel'));
    
    % Add, configure, and connect blocks
    add_block('simulink/Sources/Sine Wave','myModel/Signal',...
                                           'Bias','5',...
                                           'Amplitude','2',...
                                           'SampleTime','0.01');
    set_param('myModel/Signal','position',[140,80,180,120]);
    
    add_block('simulink/Math Operations/Gain','myModel/Signal Gain',...
                                           'Gain','2');
    set_param('myModel/Signal Gain','position',[340,80,380,120]);
    add_line('myModel','Signal/1','Signal Gain/1');
    
    % Label signal
    signal=get_param('myModel/Signal','PortHandles');
    set_param(signal.Outport(1),'Name','test_signal');
    
    % And so on
    add_block('simulink/Math Operations/Product','myModel/Product');
    set_param('myModel/Product','position',[540,160,580,200]);
    add_line('myModel','Signal Gain/1','Product/1');
    
    add_block('simulink/Sources/Sine Wave','myModel/Carrier',...
                                           'Bias','5',...
                                           'Amplitude','10',...
                                           'Frequency','3',...
                                           'SampleTime','0.02');
    
    set_param('myModel/Carrier','position',[140,240,180,280]);
    
    add_block('simulink/Math Operations/Gain','myModel/Carrier Gain');
    set_param('myModel/Carrier Gain','position',[340,240,380,280]);
    add_line('myModel','Carrier/1','Carrier Gain/1');
    
    signal=get_param('myModel/Carrier','PortHandles');
    set_param(signal.Outport(1),'Name','test_carrier');
    
    add_block('simulink/Signal Attributes/Rate Transition',...
              'myModel/Rate Transition');
    set_param('myModel/Rate Transition','position',[440,200,480,240]);
    add_line('myModel','Carrier Gain/1','Rate Transition/1');
    add_line('myModel','Rate Transition/1','Product/2');
    
    add_block('simulink/Sources/Constant','myModel/Constant',...
              'Value','0');
    set_param('myModel/Constant','position',[340,320,380,360]);
    
    add_block('simulink/Logic and Bit Operations/Relational Operator',...
              'myModel/Relational Operator','Operator','>=');
    set_param('myModel/Relational Operator','position',[540,300,580,340]);
    add_line('myModel','Carrier Gain/1','Relational Operator/1');
    add_line('myModel','Constant/1','Relational Operator/2');
    
    signal=get_param('myModel/Carrier Gain','PortHandles');
    set_param(signal.Outport(1),'Name','pos_carrier');
    
    add_block('simulink/Sinks/Scope','myModel/ScopeA');
    set_param('myModel/ScopeA','position',[740,160,780,200]);
    add_line('myModel','Product/1','ScopeA/1');
    
    signal=get_param('myModel/Product','PortHandles');
    set_param(signal.Outport(1),'Name','test_output');
    
    add_block('simulink/Sinks/Scope','myModel/ScopeB');
    set_param('myModel/ScopeB','position',[740,300,780,340]);
    add_line('myModel','Relational Operator/1','ScopeB/1');
    
    signal=get_param('myModel/Relational Operator','PortHandles');
    set_param(signal.Outport(1),'Name','cmp_output');
    
    % Finally, save the model
    save_system('myModel');
  2. 在 Simulink 编辑器中,通过右键点击每个信号,然后点击“记录信号”按钮 ,配置这些信号以进行记录:

    • test_signal

    • test_carrier

    • test_output

    • cmp_output

  3. 在 Simulink 工具条的 App 选项卡上,在为在硬件上运行进行设置部分中,点击在自定义硬件上运行。在“在自定义硬件上运行”弹出对话框中,点击完成。

  4. 在准备库的模型配置下,点击硬件设置。

  5. 在求解器窗格的类型字段中,指定定步长。

  6. 在代码生成 > 接口窗格中,选中外部模式复选框。

  7. 将传输层设置为 XCP on TCP/IP,这将为 MEX 文件名指定 ext_xcp。

  8. 点击确定。然后保存模型。

  9. 要打开“外部信号和触发”对话框,请从准备库中的信号监控和跟踪下,点击控制面板。

  10. 在配置部分中,点击信号和触发,这将打开“外部信号和触发”对话框。

    通过此对话框,您可以选择要监控的信号,并配置用于从目标应用程序上传数据的触发器。对于此示例,请使用默认设置。

    • 全选复选框选中 - 对话框在选定列的每行中显示一个 X。您可以在仿真期间监控所有记录的信号。

    • 信源设置为手动 - 通过外部模式控制面板可手动控制数据上传,例如使用装载触发器按钮。

    • 连接到目标时装载复选框选中 - 当您将 Simulink 连接到目标应用程序时,触发器被装载。

  11. 点击确定以关闭“外部信号和触发”对话框,然后点击确定以关闭外部模式控制面板。

  12. 在 Simulink 编辑器中,转至硬件选项卡。

  13. 在在硬件上运行部分的停止时间字段中,指定值,例如 inf。

  14. 保存模型。

  15. 点击监控并调节 play icon 以启动该过程。软件将执行以下操作:

    1. 编译目标应用程序。

    2. 将目标应用程序作为单独进程部署在开发计算机上。

    3. 将 Simulink 连接到目标应用程序。

    4. 启动生成的模型代码。

要查看示波器显示画面,请双击 ScopeA 和 ScopeB。

要在仿真数据检查器中监控信号,请在查看结果部分中,点击数据检查器。

从外部模式控制面板中,您可以暂停或继续信号记录和监控。在连接和触发部分,分别点击取消触发器或装载触发器。

要停止目标应用程序的执行并断开 Simulink 与目标环境的连接,请点击停止实时代码。

有关信号监控和触发选项的信息,请参阅 XCP External Mode Control Panel和 XCP External Signal & Triggering Dialog Box。

从命令行运行 XCP 外部模式仿真

您可以使用命令来运行 XCP 外部模式仿真。要检索和设置模型参数的值,请使用 get_param 和 set_param 命令。

要运行这些命令,您必须打开 Simulink 模型并运行目标应用程序。

  1. 将模型仿真模式设置为外部模式。

    set_param(gcs,'SimulationMode','external');

  2. 将 Simulink 连接到目标应用程序。

    set_param(gcs,'SimulationCommand','connect')

  3. 运行生成的模型代码。

    set_param(gcs,'SimulationCommand','start');

  4. 要调节参数,请通过一行命令来更改其工作区变量值。例如,如果将模块参数值指定为 Simulink.Parameter 对象,请将新值赋给 Value 属性。

    myParamObj.Value = 5.23;

  5. 要将新值下载到目标应用程序,请更新模型。

    set_param(gcs,'SimulationCommand','update');

  6. 停止目标应用程序,并断开 Simulink 与目标环境的连接。

    set_param(gcs,'SimulationCommand','stop');

    要在不停止执行生成代码的情况下断开 Simulink 与目标应用程序的连接,请使用以下命令:

    set_param(gcs,'SimulationCommand','disconnect');

使用 set_param 参量的 'SimulationCommand' 命令是异步的。如果从脚本连续运行这些命令,每个命令都会启动,而不会等待前一个命令运行完毕才启动下一个命令。要检查每个命令是否完成,请在脚本中使用带 get_param 参量的 'SimulationStatus' 命令。例如,对于步骤 1 至 3,在脚本中指定以下命令:

set_param(gcs,'SimulationMode','external');
set_param(gcs,'SimulationCommand','connect');

isExternalSimulationActive = false;
while ~isExternalSimulationActive
    simStatus = get_param(gcs, 'SimulationStatus');
    isExternalSimulationActive = strcmp(simStatus, 'external');
end
set_param(gcs,'SimulationCommand','start');

有关详细信息,请参阅以编程方式运行仿真。

诊断查看器显示由 get_param 和 set_param 命令产生的错误消息。

下表列出了您可以在 get_param 和 set_param 命令中使用的参数。

XCP 外部模式命令行参数

参数和值对话框等效项描述
ExtModeArmWhenConnect
off, on
外部信号和触发:连接到目标时装载复选框一旦 Simulink Coder™ 软件连接到目标,立即装载触发器。
ExtModeBatchMode
off, on
外部模式控制面板:批量下载复选框在批处理模式下启用或禁用参数下载。
ExtModeConnected
off, on
外部模式控制面板:连接/断开连接按钮指示与目标应用程序的连接状态。
ExtModeEnableFloating
off, on
外部模式控制面板:启用数据上传复选框当与浮动示波器建立连接时,启用或禁用触发器的装载和取消。
ExtModeLogAll
off, on
外部信号和触发:全选复选框将可用信号从目标上传到主机。
ExtModeSendContiguousSamples
off, on
外部信号和触发:在同一个数据包中发送多个连续采样复选框指定用于将信号流式传输到 Simulink 的 XCP DAQ 压缩模式。目标应用程序在一个数据包中发送来自多个时间步的采样。ExtModeTrigDuration 确定数据包中发送的采样数。
ExtModeTrigDelay
integer (0)
外部信号和触发:延迟文本字段指定发生触发事件和开始数据采集之间经过的时间量(以基本速率步数表示)。
ExtModeTrigDirection
character vector - rising, falling, either
外部信号和触发:方向菜单指定当信号穿越阈值时规定的行进方向。
ExtModeTrigDuration
integer (1000)
外部信号和触发:持续时间文本字段

指定触发事件后外部模式记录数据的基本速率步数。

如果 ExtModeSendContiguousSamples 为 on,则从目标应用程序发送到 Simulink 的一个数据包中的采样数等于:

ExtModeTrigDuration/n
其中 n =(基本速率)/(采样率)

如果 n=1,则数据包中发送的采样数恰好是 ExtModeTrigDuration 的值。对于多速率模型中的子速率,数据包中发送的采样数向下舍入到最接近的整数。目标应用程序将丢弃未发送到 Simulink 的缓冲区采样。

ExtModeTrigHoldOff
integer (0)
外部信号和触发:释抑文本字段指定触发事件终止和触发器重新装载之间的基本速率步数。
ExtModeTrigLevel
integer (0)
外部信号和触发:电平文本字段指定触发信号要触发触发器所必须穿越的阈值。
ExtModeTrigMode
character vector - normal, oneshot
外部信号和触发:模式菜单指定触发器是在每次触发事件后自动重新装载,还是每次装载时只采集一个缓冲区的数据。
ExtModeTrigSignalBlockPath
character vector
外部信号和触发:在信号选择视图中,选择信号,然后点击触发信号按钮。指定用来提供触发信号的输出端口所在模块的路径。
ExtModeTrigSignalOutputPortIndex
integer
外部信号和触发:在信号选择视图中,选择信号,然后点击触发信号按钮。为 ExtModeTrigSignalBlockPath 指定的模块指定触发信号输出端口的索引。
ExtModeTrigType
character vector - manual, signal
外部信号和触发:源菜单指定是在触发器装载时还是在指定的触发器信号满足触发器条件时开始记录数据。

XCP 外部模式仿真期间通信缓冲区的内存分配

对于基于 XCP 的外部模式仿真,您不必手动确定模型的内存需求,例如,将大量数据流式传输到 Simulink 或在低内存目标设备上运行的模型。

将传输层设置为 XCP on TCP/IP 或 XCP on Serial 会启用以下配置参数:

  • 自动分配静态内存 (ExtModeAutomaticAllocSize)

  • 最大持续时间 (ExtModeMaxTrigDuration) - 默认为 10 个基本速率步数。

软件使用模型信息(包括最大持续时间值)为以下各项分配内存:

  • XCP 栈使用的内部数据结构体

  • XCP 数据包的存储

如果清除自动分配静态内存复选框,则:

  • 为内部数据结构体分配的内存为默认值。

  • 您可以使用静态内存缓冲区大小 (ExtModeStaticAllocSize) 字段来指定为 XCP 数据包分配的内存。默认值为 1,000,000 字节。

如果分配的内存不足,外部模式仿真在尝试为内部数据结构体或信号流预留内存时会发出内存不足错误。在这种情况下,请重新选中自动分配静态内存复选框以使软件能够计算所需的内存量。

如果您使用 target 命名空间来设置 XCP 外部模式连接,则可以通过指定以下 XCP 参数的值来更精准地控制目标硬件内存的预分配:

  • MaxCTOSize

  • MaxDTOSize

在创建包含 XCP 外部模式连接选项的 target.XCPExternalModeConnectivity 对象后,通过关联的 target.XCPTransport 对象的属性指定 XCP 参数值。例如:

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

extModeConnectivity.XCP.XCPTransport.MaxCTOSize = 16
extModeConnectivity.XCP.XCPTransport.MaxDTOSize = 256
MaxCTOSize 和 MaxDTOSize 值越小,预分配的目标硬件内存就越少。

有关详细信息,请参阅为 XCP 外部模式仿真自定义连接。

目标应用程序参量

您可以使用可选参量运行目标应用程序。您可以通过自定义启动程序实现将可选参量传递给目标应用程序。

参量描述
-w

指定目标应用程序进入等待状态,并保持在该状态,直到收到来自 Simulink 的消息。

如果不指定 -w,目标应用程序会立即执行模型代码。模型代码将使用您在构建模型时所用的参数值直接运行。

-tf time

覆盖模型参数 StopTime。

使用以下单位指定 time:

  • 秒(如果 PurelyIntegerCode 设置为 'off')。

  • 基本速率步(如果 PurelyIntegerCode 设置为 'on')。

-tf inf 指定在执行模型代码时模型无限期运行。

对于在开发计算机上运行的外部模式仿真,您可以指定其他 rtiostream (Embedded Coder) 参量。

参量描述

-verbose level

指定详细级别:

  • 0 - 无信息

  • 1 - 详细信息

-port number

对于 XCP on TCP/IP 传输层,指定 TCP/IP 服务器的端口号。使用 256 和 65535 之间的整数值。默认值为 17725。

对于 XCP on Serial 传输层,指定串行端口 ID。例如:

在 Windows® 上,指定 'COM1' 或 1 表示 COM1,指定 'COM2' 或 2 表示 COM2,依此类推。

在 Linux® 上,指定 '/dev/ttyS0' 等。

-baud value

对于 XCP on Serial 传输层,指定波特值:1200、2400、4800、9600、14400、19200、38400、57600(默认值)或 115200。

XCP 外部模式限制

下表描述了适用于使用 XCP 通信的外部模式仿真的限制。

功能详细信息

更改模型结构的参数更新

您无法更改:

  • 模块的状态、输入或输出的数量

  • 采样时间或采样时间的数量

  • 连续系统的积分算法

  • 模型或模块的名称

如果您进行的参数更新会更改模型结构,则您必须重新编译目标应用程序。

如果状态数不变,您可以更改 Transfer Fcn、Discrete Transfer Fcn 和 Discrete Filter 模块的分子多项式和分母多项式参数。

您无法更改 State-Space、Zero-Pole 和 Discrete Zero-Pole 模块中由用户指定的或计算的参数(即在零极点到状态空间变换过程中得到的 A、B、C 和 D 矩阵)中的零值项。

在 State-Space 模块中,如果在可控标准实现中指定矩阵,则允许在保留此实现和矩阵维度的前提下对 A、B、C 和 D 矩阵进行更改。

如果 Simulink 模块图与目标应用程序不匹配,Simulink 会产生错误,指出校验和不匹配。校验和会考虑顶层模型,但不考虑引用模型。要重新编译目标应用程序,请使用更新后的模块图。

信号值显示

不支持仿真期间信号值的图形显示。例如,您无法使用仿真中的数据显示菜单项悬停时显示值标签、点击时切换值标签和显示所选端口的值标签。有关详细信息,请参阅在模型图中显示信号值。

数据存档

不支持外部模式控制面板上提供的数据存档功能。您可以使用仿真数据检查器来收集和导出数据。

覆盖信号记录设置

如果您使用信号记录选择器来覆盖信号记录设置,则不支持用来覆盖抽取和限制数据点设置的控件。

子系统信号记录

对于外部模式仿真,信号记录是为了响应目标硬件上的事件而发生的。当前,唯一支持的日志事件是新的采样计时单元。一些子系统由控制信号启用或禁用。对于这些子系统,即使子系统的控制信号未启用,软件也会记录信号值。

例如,如果 Enabled Subsystem 模块中的信号配置为记录,则即使子系统的控制信号不大于零,软件也会记录信号值。在这种情况下,记录的值是在控制信号上次大于零时信号的值。

有关适用此限制的子系统的详细信息,请参阅 Simulink 子系统语义。

非周期性任务和导出函数信号记录非周期性任务和导出函数模型不支持信号记录。

编译器调试符号格式

您的工具链必须以下列格式之一生成调试信息:

  • DWARF

  • PDB

全局变量

信号、参数和状态必须指定为全局变量。存储变量的目标内存位置必须在 0 - 4294967295 范围内。

参数结构体

您无法调节作为结构体的参数。

纯整数代码

支持纯整数代码。对于代码生成,如果 PurelyIntegerCode 是 'on',请指定分辨率大于或等于 1 微秒的 FixedStep。例如,指定 1.000001,而不是 1.0000001。

如果您没有在执行命令中指定 -tf finalTime,目标应用程序将无限期运行生成的模型代码,而忽略 StopTime。

如果在执行命令中指定 -tf finalTime:

  • finalTime 值表示基本速率步数,而不是秒数。

  • finalTime 的最大值(以计时单元为单位)是 MAX_int32_T。

可变大小信号

不支持上传可变大小信号。

地址粒度

不支持使用字地址的目标硬件。

可移植字长

当生产目标硬件支持字地址时,不支持使用可移植字长生成基于主机的目标应用程序。生产目标硬件必须支持 8 位、16 位和 32 位原生数据类型。

Display 和模块 Scope 模块(包括 Scope、Floating Scope 和波形查看器)

不支持某些信号数据类型。仿真会产生警告。

要在使用 Floating Scope 或波形查看器的外部模式仿真中监控信号,您必须标记该信号以进行记录。有关详细信息,请参阅标记要记录的信号。

在外部模式仿真期间,您无法使用 Floating Scope 模块、波形查看器或 Display 模块监控引用模型中的信号。要监控引用模型信号,请启用信号记录并使用仿真数据检查器。

在外部模式仿真期间,连接到 Simulink 消息模块的 Scope 和 Display 模块不显示数据。要可视化消息,请使用仿真数据检查器或 Dashboard 模块。

如果您的模型使用 Scope 模块,并且在外部模式仿真期间记录的数据量变得非常大,Simulink 可能会变慢。请考虑使用仿真数据检查器或 Dashboard 库中的模块。有关详细信息,请参阅决定如何可视化仿真数据。

非零仿真开始时间

不支持非零仿真开始时间。使用求解器 > 开始时间默认值 0.0。

中间步长值

一些 Simulink 模块可以在一个仿真时间步内生成多个值。例如:

对于外部模式仿真中的每个时间步,Simulink 从目标应用程序仅上传这些模块的最终值。Simulink 不上传在时间步中生成的中间值。

服务代码接口

对于使用基于 ERT 的系统目标文件和服务代码接口配置的组件模型,在目标环境中执行从这种组件模型生成的代码时,不支持使用 XCP 通信来调整参数和监控信号。

作用域为文件的数据

不支持作用域为文件的数据。例如,应用内置自定义存储类 FileScope 的数据项。仿真会产生警告。

有关 FileScope 存储类的详细信息,请参阅Choose Storage Class for Controlling Data Representation in Generated Code (Embedded Coder)。

行优先代码生成

不支持以行优先格式生成的代码。

并发执行

在 Windows 和 Linux 计算机上,支持并发执行。

在 Mac 计算机上,不支持使用本机线程示例的并发执行。如果外部模式和允许任务在目标上并发执行复选框处于选中状态,则无法构建目标应用程序,除非您使用支持外部模式仿真并发执行的目标硬件支持包。

在 Windows 计算机上,在运行时,目标应用程序中的基础采样时间量化为系统计时器中断间隔(通常为 15.625 ms)的最接近倍数。采样子速率是基本采样率的预期倍数。仿真数据检查器 (SDI) 中记录的时间戳对应于仿真时间,而不是挂钟时间。例如,下表显示 Simulink 模型的步长时间,该模型的基础采样时间为 10 ms,子速率采样时间为 20 ms。

基本速率子速率
步 挂钟时间 (ms) 记录的时间戳 (ms)步挂钟时间 (ms)记录的时间戳 (ms)
000000
1 15.625 10   
2 31.250 20 1 31.250 20
3 46.875 30   
4 62.500 40 2 62.500 40
仿真数据导出

您可以将记录的信号和顶层模型输出数据导出到 MATLAB 工作区:

  • 对于记录的信号数据,选中信号记录复选框。

  • 对于顶层模型输出数据,选中输出复选框,并从格式列表中选择数据集。

如果您要将数据导出到 MAT 文件而不是 MATLAB 工作区,还要选中将数据集数据记录到文件复选框。

不支持导出仿真状态数据。

不支持将仿真输出保存为单个对象。仿真会产生警告。

使用第三方 XCP 客户端软件

Simulink XCP 服务器不支持通过 GET_DAQ_CLOCK 命令在任意时间读取时间戳,这会阻止同步和时间相关性功能的使用。因此,某些 XCP 客户端可能会生成错误并断开与服务器的连接。服务器和目标应用程序不受该错误的影响。

某些支持包提供了解决方法。有关信息,请参考支持包文档。

另请参阅

主题

外部网站