使用 XCP 通信进行外部模式仿真
在外部模式仿真中,您可以实时调节参数并监控目标应用程序信号。使用“在自定义硬件上运行”App,您可以在开发计算机或自定义硬件上设置和运行使用 XCP 通信信道的外部模式仿真。
对于外部模式仿真,您可以:
在您的开发计算机上编译目标应用程序。
将目标应用程序部署到目标硬件。
将 Simulink® 连接到在目标硬件上运行的目标应用程序。
开始在目标硬件上执行生成的代码。
在开发计算机上运行 XCP 外部模式仿真
配置并运行使用 XCP 通信协议的外部模式仿真。在仿真期间:
使用 Scope 模块、Dashboard 模块和仿真数据检查器监控信号。
使用 Dashboard 模块调节参数。
为 XCP 配置信号监控和参数调节
为此示例创建一个文件夹。
mkdir ext_mode_xcp_example cd ext_mode_xcp_example
打开 Simulink 并创建一个简单模型
xcpExample
,其中包含以下模块:Sine Wave
Gain
Scope
Half Gauge
Knob
双击 Sine Wave 模块。将采样时间设置为 0.1,然后点击确定。
双击 Gain 模块。将增益设置为 2,然后点击确定。
将 Sine Wave 模块连接到 Gain 模块,并命名该连接(例如,命名为
Test Signal
)。将 Gain 模块连接到 Scope 模块,并命名该连接(例如,命名为
Output Signal
)。配置
Test Signal
以进行记录:选择
Test Signal
。在信号选项卡的监控部分中,选择记录信号。
如果不启用信号记录,则无法将
Test Signal
流式传输到仿真数据检查器。配置 Half Gauge 模块以监视
Test Signal
的值:双击 Half Gauge 模块。
在 Simulink 编辑器中,选择
Test Signal
。在“模块参数”对话框中:
将模块连接到
Test Signal
。在最大值字段中,输入一个值,例如
1
。
点击确定。
配置 Knob 模块以调节 Sine Wave 模块的振幅参数:
双击 Knob 模块。
在 Simulink 编辑器中,选择 Sine Wave 模块。
在“模块参数”对话框中:
将模块连接到 Sine Wave 模块的振幅参数。
在最小值和最大值字段中,分别输入值,例如 0.1 和 1。
点击确定。
将模型另存为
xcpExample
。
指定硬件并准备模型
在 Simulink 工具条的 App 选项卡上,在为在硬件上运行进行设置部分中,点击在自定义硬件上运行。在“在自定义硬件上运行”弹出对话框中,点击完成。
在硬件部分的硬件板字段中,使用默认值无硬件板。
在准备库的模型配置下,点击硬件设置。这将打开“配置参数”对话框,显示由系统目标文件确定的硬件实现设置。
在求解器窗格的类型字段中,指定定步长。然后,在求解器详细信息下的定步长(基础采样时间) 字段中,指定 0.1。
在代码生成 > 优化窗格中,将默认参数行为设置为可调。
在代码生成 > 接口窗格中,选中外部模式复选框。然后将传输层设置为 XCP on TCP/IP。选择 XCP on TCP/IP 会自动为 MEX 文件名指定
ext_xcp
、选中自动分配静态内存复选框并启用最大持续时间。在此示例中,使用默认值最大持续时间。如果系统目标文件为 ert.tlc,请在代码生成 > 模板窗格中,选中生成示例主程序复选框,并将目标操作系统设置为 BareBoardExample。代码生成器使用
中提供的外部模式抽象层的公开 API 创建一个示例,说明如何为不运行操作系统的裸板卡提供 XCP 外部模式目标连接。matlabroot
\toolbox\coder\xcp\src\target\ext_mode\include\ext_mode.h点击确定以应用更改并关闭对话框。
在硬件选项卡上,连接字段显示 IP: "localhost" – Port:17725。当您将传输层设置为 XCP on TCP/IP 时,在步骤 c 中指定 Simulink 与您的开发计算机之间的连接。
保存模型。
编译并运行目标应用程序
在在硬件上运行部分中,执行以下操作:
要为仿真停止时间指定非默认值,请在停止时间字段中指定您的值,例如
inf
。点击监控并调节 以启动该过程。软件将执行以下操作:
编译目标应用程序文件,包括可执行文件。根据代码生成的配置,信号的调试符号是作为可执行文件的一部分或在单独的文件中创建的。要了解有关代码生成的不同配置的更多信息,请参阅编译从 Simulink 模型生成的代码的方法。
将目标应用程序作为单独的进程部署在开发计算机上。
将 Simulink 连接到目标应用程序。
启动生成的模型代码。
要分别执行这些步骤,请按顺序点击监控并调节 > 分步命令下的以下按钮:
编译以监控
部署
连接
启动
监控信号和调节参数
您可以通过以下方式监控 Test Signal
:
Scope 模块 - 双击该模块。
仿真数据检查器 - 点击“仿真数据检查器”按钮。当仿真数据检查器打开时,选中测试信号复选框,这将显示流式数据。
Half-Gauge 模块。
要更改正弦波的振幅,请将 Knob 模块上的指针旋转至所需值。
下表描述在仿真期间调节可调模块参数的更多方法。
方法 | 详细信息 |
---|---|
模型数据编辑器 | 要通过模型数据编辑器调整参数,请执行以下操作:
有关详细信息,请参阅模型数据编辑器。 |
“模块参数”对话框 | 要通过“模块参数”对话框调整参数,请执行下列步骤:
|
MATLAB® 工作区 | 如果模块参数是 MATLAB 工作区变量,请执行以下操作:
有关详细信息,请参阅创建和编辑变量。 |
有关使用生成的代码进行参数调节的详细信息,请参阅使用 TCP/IP 或串行通信的外部模式仿真和在生成的代码中创建可调标定参数。
如果您的模型包含 Stateflow® 图,您可以查看状态活动。有关详细信息,请参阅Animate Stateflow Charts (Stateflow)。
停止目标应用程序
要在停止时间到达之前停止执行并断开与目标应用程序的连接,请在硬件选项卡的在硬件上运行部分中,点击停止 。
如果您要在不停止代码执行的情况下断开目标应用程序与 Simulink 的连接,请点击停止 > 分步命令 > 断开连接。
XCP 外部模式仿真的触发信号监控
对于 XCP 外部模式仿真,您可以配置触发器,用它启动目标应用程序数据的上传以在 Simulink 中进行信号监控。
在 Simulink 编辑器中,通过右键点击每个信号然后选择记录所选信号,配置这些信号以进行记录:
test_signal
test_carrier
test_output
cmp_output
在 Simulink 工具条的 App 选项卡上,在为在硬件上运行进行设置部分中,点击在自定义硬件上运行。在“在自定义硬件上运行”弹出对话框中,点击完成。
在准备库的模型配置下,点击硬件设置。
在求解器窗格的类型字段中,指定定步长。
在代码生成 > 接口窗格中,选中外部模式复选框。
将传输层设置为 XCP on TCP/IP,这将为 MEX 文件名指定
ext_xcp
。点击确定。然后保存模型。
要打开“外部信号和触发”对话框,请从准备库中的信号监控和跟踪下,点击控制面板。
在配置部分中,点击信号和触发,这将打开“外部信号和触发”对话框。
通过此对话框,您可以选择要监控的信号,并配置用于从目标应用程序上传数据的触发器。对于此示例,请使用默认设置。
全选复选框选中 - 对话框在选定列的每行中显示一个
X
。您可以在仿真期间监控所有记录的信号。信源设置为手动 - 通过外部模式控制面板可手动控制数据上传,例如使用装载触发器按钮。
连接到目标时装载复选框选中 - 当您将 Simulink 连接到目标应用程序时,触发器被装载。
点击确定以关闭“外部信号和触发”对话框,然后点击确定以关闭外部模式控制面板。
在 Simulink 编辑器中,转至硬件选项卡。
在在硬件上运行部分的停止时间字段中,指定值,例如
inf
。保存模型。
点击监控并调节 以启动该过程。软件将执行以下操作:
编译目标应用程序。
将目标应用程序作为单独进程部署在开发计算机上。
将 Simulink 连接到目标应用程序。
启动生成的模型代码。
要查看示波器显示画面,请双击 ScopeA
和 ScopeB
。
要在仿真数据检查器中监控信号,请在查看结果部分中,点击数据检查器。
从外部模式控制面板中,您可以暂停或继续信号记录和监控。在连接和触发部分,分别点击取消触发器或装载触发器。
要停止目标应用程序的执行并断开 Simulink 与目标环境的连接,请点击停止实时代码。
有关信号监控和触发选项的信息,请参阅 XCP External Mode Control Panel和 XCP External Signal & Triggering Dialog Box。
从命令行运行 XCP 外部模式仿真
您可以使用命令来运行 XCP 外部模式仿真。要检索和设置模型参数的值,请使用 get_param
和 set_param
命令。
要运行这些命令,您必须打开 Simulink 模型并运行目标应用程序。
将模型仿真模式设置为外部模式。
set_param(gcs,'SimulationMode','external');
将 Simulink 连接到目标应用程序。
set_param(gcs,'SimulationCommand','connect')
运行生成的模型代码。
set_param(gcs,'SimulationCommand','start');
要调节参数,请通过一行命令来更改其工作区变量值。例如,如果将模块参数值指定为
Simulink.Parameter
对象,请将新值赋给Value
属性。myParamObj.Value = 5.23;
要将新值下载到目标应用程序,请更新模型。
set_param(gcs,'SimulationCommand','update');
停止目标应用程序,并断开 Simulink 与目标环境的连接。
set_param(gcs,'SimulationCommand','stop');
要在不停止执行生成代码的情况下断开 Simulink 与目标应用程序的连接,请使用以下命令:
set_param(gcs,'SimulationCommand','disconnect');
使用 'SimulationCommand'
参量的 set_param
命令是异步的。如果从脚本连续运行这些命令,每个命令都会启动,而不会等待前一个命令运行完毕才启动下一个命令。要检查每个命令是否完成,请在脚本中使用带 'SimulationStatus'
参量的 get_param
命令。例如,对于步骤 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 ) | 外部信号和触发:持续时间文本字段 | 指定触发事件后外部模式记录数据的基本速率步数。 如果
n =(基本速率)/(采样率)如果 |
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
值越小,预分配的目标硬件内存就越少。有关详细信息,请参阅Customise Connectivity for XCP External Mode Simulations。
目标应用程序参量
您可以使用可选参量运行目标应用程序。您可以通过自定义启动程序实现将可选参量传递给目标应用程序。
参量 | 描述 |
---|---|
-w | 指定目标应用程序进入等待状态,并保持在该状态,直到收到来自 Simulink 的消息。 如果不指定 |
-tf | 覆盖模型参数 使用以下单位指定
|
对于基于主机的外部模式仿真,您可以指定其他 rtiostream
参量。
参量 | 描述 |
---|---|
| 指定详细级别:
|
| 对于 XCP on TCP/IP 传输层,指定 TCP/IP 服务器的端口号。使用 256 和 65535 之间的整数值。默认值为 17725。 对于 XCP on Serial 传输层,指定串行端口 ID。例如: 在 Windows® 上,指定 在 Linux® 上,指定 |
| 对于 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 子系统语义。 | ||||||||||||||||||||||||||||||||||||||||||
编译器调试符号格式 | 您的工具链必须以下列格式之一生成调试信息:
| ||||||||||||||||||||||||||||||||||||||||||
全局变量 | 信号、参数和状态必须指定为全局变量。存储变量的目标内存位置必须在 0 - 4294967295 范围内。 | ||||||||||||||||||||||||||||||||||||||||||
参数结构体 | 您无法调节作为结构体的参数。 | ||||||||||||||||||||||||||||||||||||||||||
纯整数代码 | 支持纯整数代码。对于代码生成,如果 如果您没有在执行命令中指定 如果在执行命令中指定
| ||||||||||||||||||||||||||||||||||||||||||
可变大小信号 | 不支持上传可变大小信号。 | ||||||||||||||||||||||||||||||||||||||||||
地址粒度 | 不支持使用字地址的目标硬件。 | ||||||||||||||||||||||||||||||||||||||||||
可移植字长 | 当生产目标硬件支持字地址时,不支持使用可移植字长生成基于主机的目标应用程序。生产目标硬件必须支持 8 位、16 位和 32 位本机数据类型。 | ||||||||||||||||||||||||||||||||||||||||||
Scope 模块 | 如果您的模型使用 Scope 模块,并且在外部模式仿真期间记录的数据量变得非常大,Simulink 可能会变慢。您可改用仿真数据检查器或 Dashboard 库中的等效模块,而不是使用 Scope 模块。有关详细信息,请参阅决定如何可视化仿真数据。 | ||||||||||||||||||||||||||||||||||||||||||
Scope 和 Floating Scope 模块,以及波形查看器 | 不支持某些信号数据类型。仿真会产生警告。 | ||||||||||||||||||||||||||||||||||||||||||
Floating Scope 模块和波形查看器 | 在外部模式仿真期间,您无法使用 Floating Scope 模块和波形查看器来监控引用模型中的信号。要监控引用模型信号,请启用信号记录并使用仿真数据检查器。 | ||||||||||||||||||||||||||||||||||||||||||
引用模型中的 Scope 和 Display 模块 | 在模型层次结构中,如果顶层模型在外部模式下运行,则用于查看信号的模块不会在引用模型中提供显示画面。要监视引用模型中的信号,请启用信号记录并使用仿真数据检查器。 | ||||||||||||||||||||||||||||||||||||||||||
Scope 和 Display 模块连接到 Simulink 消息模块 | 在外部模式仿真期间,连接到 Simulink 消息模块的 Scope 和 Display 模块不提供显示画面。 要可视化消息,请使用仿真数据检查器或 Dashboard 模块。 | ||||||||||||||||||||||||||||||||||||||||||
非零仿真开始时间 | 不支持非零仿真开始时间。使用求解器 > 开始时间默认值 | ||||||||||||||||||||||||||||||||||||||||||
中间步长值 | 一些 Simulink 模块可以在一个仿真时间步内生成多个值。例如:
对于外部模式仿真中的每个时间步,Simulink 从目标应用程序仅上传这些模块的最终值。Simulink 不上传在时间步中生成的中间值。 | ||||||||||||||||||||||||||||||||||||||||||
服务代码接口 | 对于使用基于 ERT 的系统目标文件和服务代码接口配置的组件模型,在目标环境中执行从这种组件模型生成的代码时,不支持使用 XCP 通信来调整参数和监控信号。 | ||||||||||||||||||||||||||||||||||||||||||
作用域为文件的数据 | 不支持作用域为文件的数据。例如,应用内置自定义存储类 有关 | ||||||||||||||||||||||||||||||||||||||||||
行优先代码生成 | 不支持以行优先格式生成的代码。 | ||||||||||||||||||||||||||||||||||||||||||
并发执行 | 在 Windows 和 Linux 计算机上,支持并发执行。 在 Mac 计算机上,不支持使用本机线程示例的并发执行。如果外部模式和允许任务在目标上并发执行复选框处于选中状态,则无法构建目标应用程序,除非您使用支持外部模式仿真并发执行的目标硬件支持包。 在 Windows 计算机上,在运行时,目标应用程序中的基础采样时间量化为系统计时器中断间隔(通常为 15.625 ms)的最接近倍数。采样子速率是基本采样率的预期倍数。仿真数据检查器 (SDI) 中记录的时间戳对应于仿真时间,而不是挂钟时间。例如,下表显示 Simulink 模型的步长时间,该模型的基础采样时间为 10 ms,子速率采样时间为 20 ms。
| ||||||||||||||||||||||||||||||||||||||||||
仿真数据导出 | 您可以将记录的信号和顶层模型输出数据导出到 MATLAB 工作区:
如果您要将数据导出到 MAT 文件而不是 MATLAB 工作区,还要选中将数据集数据记录到文件复选框。 不支持导出仿真状态数据。 不支持将仿真输出保存为单个对象。仿真会产生警告。 |
另请参阅
相关主题
- 用于参数调节、信号监控和代码执行探查的外部模式仿真
- 标记要记录的信号
- Set Up External Mode Connectivity Between Simulink and Target Hardware
- Customize XCP Server Software
- 仿真数据检查器