使用Simulink开发Autosar DEM诊断逻辑

前言

Autosar Dem中一般使用两个函数来实现DTC的逻辑,一个是Dem_SetEventStatus,用来设置DTC故障状态,一个是Dem_GetEventFailed,用来获取当前的故障状态。Simulink中也提供了对应的模块,用来实现应用层中的故障DTC状态设置与获取,本文介绍其实现过程

Autosar Dem接口

Autosar Dem标准接口为DiagnosticMonitor和DiagnosticInfo,使用Simulink中自带的demo-autosar_bsw_monitor中的定义,如下所示:
在这里插入图片描述
DiagnosticMonitor中包含了SetEventStatus函数,DiagnosticInfo包含了GetEventFailed函数。

需要注意的是:生成的package位置为/AUTOSAR/Services/Dem(暂时没找到怎么修改),而在使用时,导入对应Autosar工具(例如Etas)时可能会找不到对应的定义。此处我们后面是手动更改arxml中的package路径,理论上来说应该有更好的方案

设计模型及接口

设置三个Client port,两个为DiagnosticInfo接口,一个为DiagnosticMonitor接口,名称参考ETAS Dem中生成的PPort名,DiagnosticInfo接口对应的名称为Event_DTC_0xXXXXXX_Event,DiagnosticInfo接口对应的名称为EvtInfo_DTC_0xXXXXXX_Event
在这里插入图片描述
也可以在Simulink模型中添加对应的Autosar模块,并配置其参数,然后点击刷新,可以自动生成对应的Client Port

添加对应模块,DiagnosticInfoCaller用来调用GetEventFailed,DiagnosticMonitorCaller用来调用SetEventStatus
在这里插入图片描述
配置对应的Client port名,及对应的使用的函数
在这里插入图片描述
点击刷新,可以自动创建对应的port
在这里插入图片描述
在这里插入图片描述
此处示例模型很简单,通过获取三个dtc状态,来触发另一个dtc,并没有什么实际意义

生成代码及arxml

生成的代码中调用了RTE函数Rte_Call_EvtInfo_DTC_0xXXXXX_Event_GetEventFailed用来获取故障状态,调用RTE函数Rte_Call_Event_DTC_0xXXXXXX_Event_SetEventStatus用来设置故障状态,示例如下:


/* Model step function */
void Runnable_Step(void)
{
  float32 rtb_Switch1;
  Dem_EventStatusType tmp;
  boolean rtb_EvtInfo_DTC_0xffff11_Even_i;
  boolean rtb_EvtInfo_DTC_0xffff12_Even_l;
  boolean rtb_EvtInfo_DTC_0xffff15_Even_f;

  /* FunctionCaller: '<Root>/EvtInfo_DTC_0xffff11_Event' */
  Rte_Call_EvtInfo_DTC_0xffff11_Event_GetEventFailed
    (&rtb_EvtInfo_DTC_0xffff11_Even_i);

  /* FunctionCaller: '<Root>/EvtInfo_DTC_0xffff12_Event' */
  Rte_Call_EvtInfo_DTC_0xffff12_Event_GetEventFailed
    (&rtb_EvtInfo_DTC_0xffff12_Even_l);

  /* FunctionCaller: '<Root>/EvtInfo_DTC_0xffff15_Event' */
  Rte_Call_EvtInfo_DTC_0xffff15_Event_GetEventFailed
    (&rtb_EvtInfo_DTC_0xffff15_Even_f);

  /* Logic: '<Root>/Logical Operator' */
  rtb_EvtInfo_DTC_0xffff11_Even_i = (rtb_EvtInfo_DTC_0xffff11_Even_i ||
    rtb_EvtInfo_DTC_0xffff12_Even_l || rtb_EvtInfo_DTC_0xffff15_Even_f);

  /* Switch: '<Root>/Switch1' */
  if (rtb_EvtInfo_DTC_0xffff11_Even_i) {
    /* Switch: '<Root>/Switch1' incorporates:
     *  Constant: '<Root>/Constant'
     */
    rtb_Switch1 = 0.0F;
  } else {
    /* Switch: '<Root>/Switch1' incorporates:
     *  Inport: '<Root>/Sensor1_Percent'
     *  Switch: '<Root>/Switch'
     */
    rtb_Switch1 = Rte_IRead_Runnable_Step_Sensor1_Percent_Percent();
  }

  /* End of Switch: '<Root>/Switch1' */

  /* Outport: '<Root>/Percent' */
  Rte_IWrite_Runnable_Step_Percent_Percent(rtb_Switch1);

  /* Switch: '<S1>/Switch' incorporates:
   *  Constant: '<S1>/Constant'
   *  Constant: '<S1>/Constant1'
   */
  if (rtb_EvtInfo_DTC_0xffff11_Even_i) {
    tmp = DEM_EVENT_STATUS_FAILED;
  } else {
    tmp = DEM_EVENT_STATUS_PASSED;
  }

  /* End of Switch: '<S1>/Switch' */

  /* FunctionCaller: '<Root>/Event_DTC_0xffff13_Event' */
  Rte_Call_Event_DTC_0xffff13_Event_SetEventStatus(tmp);
}

对应的arxml中也生成了对应的接口描述
在这里插入图片描述
此处对应的package路径不对,需要替换成ETAS Dem对应路径,替换完后copy到ETAS工具链中

RTE接口mapping

如果是新增的SWC,还需要将SWC映射到对应的EcucPartition上,且对应的runnable也要映射到对应的task上,本文不介绍这部分内容,默认上述工作已经完成

SWC中已经有了对应的诊断接口(Rport,Client接口
在这里插入图片描述
Runnable中也有了对应调用关系
在这里插入图片描述
将SWC接口与DEM接口进行mapping
在这里插入图片描述
mapping好后进行ECU Extract,然后生成RTE代码即可

RTE代码分析

在生成的SWC RTE头文件中,有对应的接口调用宏定义

#if defined(RTE_PRV_ALL_API) || defined(RTE_RUNNABLEAPI_Runnable_Step)
/* Inline function call optimization; Rte_Call_Event_DTC_0xffff13_Event_SetEventStatus to Dem_SetEventStatus */
#define Rte_Call_Event_DTC_0xffff13_Event_SetEventStatus( EventStatus ) Dem_SetEventStatus(((VAR(Dem_EventIdType, AUTOMATIC))60), EventStatus)

#endif
#if defined(RTE_PRV_ALL_API) || defined(RTE_RUNNABLEAPI_Runnable_Step)
/* Inline function call optimization; Rte_Call_EvtInfo_DTC_0xffff11_Event_GetEventFailed to Dem_GetEventFailed */
#define Rte_Call_EvtInfo_DTC_0xffff11_Event_GetEventFailed( EventFailed ) Dem_GetEventFailed(((VAR(Dem_EventIdType, AUTOMATIC))58), EventFailed)

#endif
#if defined(RTE_PRV_ALL_API) || defined(RTE_RUNNABLEAPI_Runnable_Step)
/* Inline function call optimization; Rte_Call_EvtInfo_DTC_0xffff12_Event_GetEventFailed to Dem_GetEventFailed */
#define Rte_Call_EvtInfo_DTC_0xffff12_Event_GetEventFailed( EventFailed ) Dem_GetEventFailed(((VAR(Dem_EventIdType, AUTOMATIC))59), EventFailed)

#endif
#if defined(RTE_PRV_ALL_API) || defined(RTE_RUNNABLEAPI_Runnable_Step)
/* Inline function call optimization; Rte_Call_EvtInfo_DTC_0xffff15_Event_GetEventFailed to Dem_GetEventFailed */
#define Rte_Call_EvtInfo_DTC_0xffff15_Event_GetEventFailed( EventFailed ) Dem_GetEventFailed(((VAR(Dem_EventIdType, AUTOMATIC))61), EventFailed)

自动生成的宏中实际也是调用的对应Dem的函数,只是加上了对应的Event id,这样的话,应用层也不需要关心是具体是哪个Event id了

总结

使用Simulink开发诊断,可以少一步应用层和底层的数据传递,逻辑开发也很简单。Simulink中除了Dem模块,还有Nvm的模块,有空可以再介绍。

### SimulinkAUTOSAR 开发与配置 #### 使用 Simulink 实现 AUTOSAR 软件组件开发Simulink 中实现 AUTOSAR 的主要方是通过创建符合 AUTOSAR 标准的模型并将其转换为可执行代码。这涉及到几个关键方面: - **定义 Autosar 组件结构**:Simulink 支持直接建模 Autosar 应用程序中的各个部分,如软件组件 (SWC),这些可以在图形界面中直观设计[^3]。 - **映射到 Runnables Ports**:每一个 SWC 可以被分解成多个 Runnable 实体,它们对应于 Simulink 模型内的 Function Call Subsystems 或 Stateflow 图表中的状态机行为[^2]。这种关联使得能够精确控制何时触发特定功能计算,并且简化了调度机制的设计。 - **集成 NVM DEM 功能模块**:除了核心算法外,在 Simulink 还能方便地加入其他重要的 Autosar 模块,比如非易失性存储管理(Nvm)诊断事件管理(Dem)[^1]。这样做的好处在于减少了不同层次间数据交换的需求,提高了系统的整体效率。 #### 配置过程概述 为了使上述概念具体化,以下是关于如何设置一个基本的 AUTOSAR 项目的一些指导原则: - 创建一个新的 Simulink 工程文件(.slx), 并启用支持 AUTOSAR 特性的选项。 - 添加必要的库路径以便访问 MathWorks 提供的标准 AUTOSAR 块集其他第三方扩展包。 - 设计所需的 SWCs, 包括输入/输出端口、内部信号流以及任何依赖的服务接口。 - 将各 SWC 下的功能划分为独立的任务单元(Runnable entities),并通过适当的方连接起来形成完整的应用程序逻辑。 - 利用内置工具自动生成 ARXML 文件描述整个架构布局;同时也可以手动编辑以微调细节参数。 - 测试生成的目标代码是否正确实现了预期的行为模,确保其兼容目标硬件平台的要求。 ```matlab % MATLAB命令用于初始化AUTOSAR环境 initAUTOSAREnv('ProjectName'); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赞哥哥s

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

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

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

打赏作者

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

抵扣说明:

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

余额充值