ECU 应用层软件模型之CAN接收11

文摘   2024-12-19 07:25   上海  

ECU 应用层软件模型系列文章不断更新中,从零开始教你做应用层开发:


从本文开始正式进入Simulink建模环节,计划从接口入手,以最通用的CAN通讯来入手:

1 CAN通讯

对于典型控制器的应用层软件开发,都会涉及到CAN通讯,先来了解下CAN报文的接收。基于AUTOSAR的CAN报文接收过程会涉及到多个模块的合作,具体过程是:

  • 首先,BSW调度器周期性地调用CAN Driver模块的Can_MainFunction_Read()函数。

  • 然后,Can_MainFunction_Read() 函数访问CAN Controller(硬件)的相关寄存器,例如仲裁寄存器、数据寄存器和数据长度寄存器等,提取这些寄存器中的数据,调用类似于Can_17_McmCan_lRxExtractData() 的函数从缓冲区中提取数据。接着,它会将消息对象的信息分配给 RxMailBoxInfo 结构体(其中包括 CAN Id、对应的 Hoh 和 ControllerId),并将 PDU 相关信息分配给 RxPduInfo 结构体(包括指向 Ddu 数据的指针 *SduDataPtr 和 Sdu 长度)。

  • 再向上层传递数据,调用 CAN Interface 模块的 CanIf_RxIndication() 函数,从而将数据从 CAN Driver 层传递至上一层的 CAN Interface 模块; CAN Interface 再次调用 PduR 模块的 PduR_RxIndication() 函数,将数据传送到 PduR 模块;PduR 将数据路由至 Com 模块,并调用 Com_RxIndication() 函数将其传送至 Com 模块,Com 模块会将接收到的数据存储在其内部缓存区域。

  • 最后,由应用层软件来获取所需的数据,进行逻辑判断和运算等操作。

CAN报文发送过程也是类似的链路,但所调用的函数不一样,本文不展开,如下所示:

对于应用层软件来说,如果是针对Classical CAN,需要接收CAN报文的8个字节数据,如果是针对CAN FD,需要接收CAN报文的数据可能不止8个字节,不管是Classical CAN还是CAN FD,从底层软件传输上来CAN报文数据有两种形式:
一种是报文数据未被解析的形式,即直接从底层软件传输字节数据给应用层软件,这时应用层软件需要按照DBC进行数据转换,将原始值转换为物理值;
另一种是信号已经被解析的形式,即在COM层已经将原始值转换为物理值,底层软件传给应用层软件是一个一个具有物理意义的CAN信号。
下面就来分享针对这两种信号形式,在ECU应用层软件模型层面如何进行处理。

2 模型开发

1)针对报文数据未被解析的形式
可以使用CAN UNPACK模块,该模块的输出即可以手动添加,也可以利用DBC文件来导入,如下所示操作
实际ECU软件开发中,多采用DBC方式。通过加载已有的DBC文件,字节数据就会将CAN报文的原始信号转换为物理信号,如下所示:
2)针对报文数据已解析的形式

报文数据已解析,底层软件已经将字节数据转换成了物理信号,此时底层软件将物理信号传给应用层软件通常有两种接口形式:一种是总线形式,即将这些物理信号捆绑在一起。那么在应用层软件的模型层面,就是用Bus selector将总线解绑成一个个独立的物理信号,如下所示:

另一种形式就是底层软件直接传递一个一个物理信号,此时就以输入信号形式接收就行。

以上就是在模型中如何接收CAN报文信号,除此之外,在模型中还可以进行ID检验、Timeout,Checksum校验和Counter检验等运算。当然这些都属于高级操作了,我们这里还是关于基础操作,常见原始值转换为物理值。

3)报文转换计算的注意点

对于原始值转换为物理值的计算,首先要注意的是数据转换精度,就如下图需要进行转换的例子:

前面文章提到过定点化,那么需要进行数据类型配置。这里针对输入的物理值,示意两种不同的数据类型配置,可以看到相同的输入,但因为最后输出端配置的数据类型不一定,最终两者存在明显的数值不同,明显配置成uint16存在0.5的精度损失。
然后要注意数据类型,有符号整型和无符号整型的计算,常见有几个方面,一个是在模型层面,需要做一些配置,才能建模成功。比如有符合整型数据与无符号整型数据相加,需要在Add模块取消勾选 要求所有输入具有相同的数据类型才行,如下所示:
其次是考虑两者的运算,也需要对相关模块进行准确的数据类型配置,如下未准确配置数据类型,那么不同数据类型进行相加时,计算结果不是预期的。

只有正确地设置了数据类型,才能获取准确的计算结果,如下所示:


3 小结

以上就简单介绍了CAN报文接收常见的两种形式,不管是哪种形式,在应用层软件都需要对CAN信号进一步处理,最常见的就是原始值转换为物理值,并结合实际开发工作分享了数据转换过程最需要注意的点,最容易产生bug的地方。

对于CAN信号的接收,通常还需要进行信号的有效性验证,比如无效时信号的处理,比如收到的油门深度信号无效,该如何处理?是给无效值,还是寻址可替代的值。更多内容下篇文章继续~


创作不易,欢迎点赞再看收藏关注



汽车研发交流群,有兴趣的朋友请添加群主:prOmiseyes,备注:公司+职务入群。仅限汽车从业人员。

谦益行
分享汽车研发日常,助力你我共同成长。
 最新文章