TSMaster 应用笔记 | 同星 XCP 模块输出的 mat 文件格式说明

本文介绍如何使用TSMasterXCP模块输出的mat文件进行Simulink信号回放,包括mat变量格式定义、时间序列解析、构建timeseries及Simulink模型中的信号回放步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文目录:

一、mat变量格式定义

1. 固定变量定义

2. 时间解析方法

3. 时间关联的信号解析方法

4. 构建 timeseries

二、Simulink 信号回放

1. 模型中回放工作区变量

mat变量格式定义

TSMaster XCP 模块支持直接输出压缩的 HDF5 格式的 mat 文件(Matlab 7.3 版 本及以上),为基于 Simulink 的模型开发创造了便利。TSMaster  输出的 mat 文件载入 Matlab 后,其工作区变量列表如下:

1、固定变量定义

固定变量列表如下:

 

2、时间解析方法

首先分隔时间序列,获取所有时间轴:

 

>以 AN0001 中记录的信号为例,其时间序列 TIME_LIST 字符串变量如下:

ecu1_TIME_DAQ_Cyclic,ecu1_TIME_DAQ_10_ms,ecu1_TIME_DAQ_100ms,ecu1 _TIME_POLL_noiseSignal,TIME_XCPSimBus__engine_speed

分隔后可根据名称在工作区取得每一根时间轴数组,每根时间轴数组可关联 一个或一组信号,时间轴有三种类型,分别是 DAQ  时间(一根时间轴包含一个 或一组信号);Poll 时间 (一根时间轴对应一个信号) 和系统变量时间 (一根时间轴对应一个信号):

>根据每根时间轴数组名称可以提取时间轴的每个时刻绝对时间, 单位时秒, 以 ecu1_TIME_DAQ_100ms 为例,如下图所示:

 

3、时间关联的信号解析方法 

>获取了时间轴后, 需要获取时间轴所关联的信号列表,并根据列表中信号名 称定位信号。以时间轴 ecu1_TIME_DAQ_100ms 为例,其对应的信号列表存放于 名称 ecu1_TIME_DAQ_100ms_LIST  的字符串变量里(逗号分隔),其变量名称规 则为:

时间轴名称_LIST

>按逗号分隔方式展开字符串变量 ecu1_TIME_DAQ_100ms_LIST 即可得到时间轴 ecu1_TIME_DAQ_100ms 所对应的一个或一组变量名称,在本例中,只有一个名称:

ecu1_triangleSignal

>这个变量名称最终定位到信号值数组“ecu1_triangleSignal”,该信号值数组 的每一个元素与时间信号数组的每一个元素在时间上是一一对应的。

>在这个信号上右击可以绘制信号按点分布的曲线(不带时间信息),如下图所示:

4、构建 timeseries 

>若需要构建带时间信息的信号值序列,需要额外执行一段m脚本来构造timeseris ,以 信 号 ecu1_triangleSignal    为 例 ,  其 对 应 的 时 间 轴 是 ecu1_TIME_DAQ_100ms,则 timeseries 可以通过如下脚本构造:

Triangle_signal = timeseries(ecu1_triangleSignal, ecu1_TIME_DAQ_100ms)

>构造后,在工作区出现一个新的信号“Triangle_signal”:

>右键绘制其变化曲线,可以看出横纵坐标分别是时间和值:

 

二、Simulink 信号回放 

1、模型中回放工作区变量

在模型中回放 XCP 信号有如下几个步骤:

打开 Simulink 模块,在模块空白处双击,选择“FromWorkspace”:

根据 timeseries 的名称,将 Simulink 中的信号名称改为“Triangle_signal”,即 可参与模型相关的算法仿真和测试过程:

 

连接 Scope 后,仿真结果如下:

 

 

### 使用 C 袋面编译器发送事件报文 在嵌入式系统开发过程中,使用特定工具链来发送 CAN 或者其他类型的网络报文是一种常见的需求。针对 C 袋面编译器(假设这是一个类似于 Keil、IAR 等用于嵌入式系统的集成开发环境),要实现在该环境中发送事件报文的操作,通常涉及以下几个方面的配置和编程: #### 配置通信协议栈 为了能够通过 CAN 总线或者其他总线技术发送事件报文,首先需要确保项目中已经集成了相应的通信协议栈支持[^1]。 #### 定义报文结构 当涉及到不定长报文的构建时,可以参照如下结构体定义,这有助于创建标准化的数据包格式以便于解析与处理: ```c #pragma pack(1) // 单字节对齐 typedef struct _Frame { uint8_t head; // 帧头标志位 uint8_t type; // 数据类型标记 uint8_t len; // 下方数据区的实际长度 uint8_t data[]; // 动态数组表示可变长度的有效载荷部分 } Frame; #pragma pack() ``` 需要注意的是,在实际应用中 `data` 字段应当被声明为灵活数组成员而非固定大小的一维数组[^2]。 #### 实现具体功能函数 基于上述准备好的框架基础之上,接下来就是编写具体的逻辑去填充这些字段并调用底层 API 来完成消息的封装以及最终向目标节点发出请求的动作。例如,如果是要执行像 XCP_CMD_USER_CMD (0xF1) 这样的命令,则可以在应用程序层面上构造对应的 PDU 并将其传递给驱动程序接口进行传输操作。 #### 示例代码片段 下面给出一段简单的伪代码示例,展示了如何利用假定存在的库函数来进行一次基本的消息发送过程: ```c void sendEventMessage(uint8_t eventType, const void* eventData, size_t eventSize){ Frame msg = { .head = 0xA5 }; // 初始化帧头部信息 msg.type = eventType; // 设置事件类别 msg.len = eventSize; // 记录有效负载尺寸 memcpy(msg.data, eventData, eventSize); // 复制用户提供的数据到缓冲区内存区域 canape_send(&msg); // 调用 CanApe 库中的发送函数 } ``` 此段代码仅作为概念验证用途,并未考虑错误检测机制和其他必要的优化措施。实际部署前还需要根据具体情况调整参数设置并加入适当的异常处理流程以提高可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TOSUN同星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值