AUTOSAR——MBD应用之NM模块Stateflow实现

目录

一、前言

二、Autosar NM概括

2.1 术语

2.2  PDU

2.3 文件结构

2.4 NM结构体

2.5 状态机

三、Stateflow实现

3.1 NM接口定义

3.2 NM功能实现

3.3 NM模块测试

3.4 NM模块部署


一、前言

        基于MBD的应用开发已经非常常见,在开发过程中以简明,高效的优点被诸多ECU开发人员青睐,有的主机厂可能也会直接要求供应商采用这种方式开发。一个功能或者模块只要设计好外部接口,也可以独立开发然后嵌入工程中。Autosar的nm状态机UML与stateflow画图如出一辙,做起来快速简洁。

二、Autosar NM概括

2.1 术语

AUTOSAR——MBD应用之NM模块Stateflow实现_第1张图片

 NM (NetWork Management) Message:网络激活,发送本节点网络报文及应用报文 一般定义NM ID(0x503)第一个字节05是网段ID,03表示该节点在该网段编号

App Message:客户定义的Rx\Tx报文;收到非网络报文一般ECU需保持一定时间后休眠,在该时间内收到NMM,网络激活正常通信

PN(Partial Network):该功能是必须是该节点 指定的NM报文才能唤醒节点网络。

Passive Mode:唤醒后只收不外发NM PDU(SWS_CanNm_00072),对于一个节点所在的网络只能同时使能或禁用PassiveMode

Active Mode:唤醒后外发NM PDU

Active Wakeup:上层主动调用CanNm_NetworkRequest()接口唤醒网络。常见唤醒源:KL15信号,定时器、传感器等,主动唤醒一般发送立即帧报文5帧,然后进入RMS状态。

Passive Wakeup:收到其他节点的有效网络管理报文被动唤醒,调用CanNm_PassiveStartup()接口唤醒网络

Remote Wakeup:与总线信号相关的唤醒方式,如收到网络报文、指定诊断报文、KL15信号的应用报文

Local Wakeup:与硬线相关的唤醒方式,KL15线,硬件传感器如脚踢门;注意KL30是蓄电池供电

AUTOSAR——MBD应用之NM模块Stateflow实现_第2张图片

2.2  PDU

Byte0 表示源节点地址,一般是 帧ID - 基地址

Byte1表示CBV控制位,具体定义看下图7-2

其余字节一般主机厂自定义,若无特殊说明默认为0

AUTOSAR——MBD应用之NM模块Stateflow实现_第3张图片

Bit0: Repeat报文请求, 0表示为请求,1表示请求;当收到该位置1,应当进入RMS状态

Bit3:NM 控制休眠位,0表示未被NM控制器请求,1表示请求;该功能需要使能CanNmCoordinatorSyncSupport

Bit4: Active Wakeup Bit , 0表示节点没有唤醒网络(属于被动唤醒),1表示节点唤醒网络(属于主动唤醒)

Bit6: partial network information Bit(PNI) 0表示NM PDU包含没有PN请求信息,1表示包含PN请求信息。

为什么需要PN(Partial Network)功能呢?实质还是为了节能。没有PN功能时,一个网段内的所有ECU同醒同睡。有时,在一个网段内,可能只需要某些ECU正常工作即可,不相关的ECU没必要唤醒(费电)。所以,增加PN功能是节能的一个优选项。

Bit 1 , 2 , 5, 7功能扩展的预留位,0不使用/保留

2.3 文件结构

AUTOSAR——MBD应用之NM模块Stateflow实现_第4张图片

 ComStack_Types.h应当包含Std_Types.h(AUTOSAR 标准类型) Platform_Types.h(平台特定类型), Compiler.h编译特定语言的扩展文件;

Nm_Cbk.h一般NM接口的回调函数声明

Det.h默认错误Tracer定义的接口

NmStack_Types.h 公共的网络管理类型

CanIf.h CanIf的接口包括发送、接收函数等

PduR_CanNm.h如果用户数据使能包含改头文件(COM User Data Support)

2.4 NM结构体

NM结构体也叫做配置结构体CanNmGlobalConfig,这种配置类型可以使工程实现根据不同的客户可配置化,使用UML一目了然。

具体的结构体成员含义需参考标准。

AUTOSAR——MBD应用之NM模块Stateflow实现_第5张图片

AUTOSAR——MBD应用之NM模块Stateflow实现_第6张图片

 在state flow中需要引入改配置头文件 CanNm_Cfg.h:

#ifndef CANNM_CFG_H
#define CANNM_CFG_H 1
#include "StdTypes.h"
/*chapter 10.3.4*/
typedef struct 
{
    /**********10.3.3  CanNmGlobalConfig *************/
    u8_t CanNmBusLoadReductionEnabled;
    u8_t CanNmBusSynchronizationEnabled;
    u8_t CanNmComControlEnabled;
    u8_t CanNmComUserDataSupport;
    u8_t CanNmCoordinatorSyncSupport;
    u8_t CanNmDevErrorDetect;
    u8_t CanNmGlobalPnSupport;
    u8_t CanNmImmediateRestartEnabled;
    u8_t CanNmImmediateTxconfEnabled;
    u8_t CanNmMainFunctionPeriod;
    u8_t CanNmNodeDetectionEnabled;
    u8_t CanNmNodeIdEnabled;
    u8_t CanNmPassiveModeEnabled;
    u8_t CanNmPduRxIndicationEnabled;
    u8_t CanNmPnEiraCalcEnabled;
    u8_t CanNmPnResetTime;
    u8_t CanNmRemoteSleepIndEnabled;
    u8_t CanNmRepeatMsgIndEnabled;
    u8_t CanNmStateChangeIndEnabled;
    u8_t CanNmUserDataEnabled;
    u8_t CanNmVersionInfoApi;
    u8_t CanNmPnEiraRxNSduRef;
    /**********10.3.4  CanNm Channel Configuration Overview********/
    //CanNmTxPdu
    u16_t CanNmTxConfirmationPduId;
    //CanNmRxPdu
    u16_t CanNmRxPduBeginId;
    u16_t CanNmRxPduEndId;
    //CanNmUserDataTxPdu
    u16_t CanNmTxUserDataPduId;
    u8_t ComMChannel;
    /**********10.3.5  CanNmChannelConfig *************/
    u8_t CanNmActiveWakeupBitEnabled;
    u8_t CanNmAllNmMessagesKeepAwake;
    u8_t CanNmBusLoadReductionActive;
    u8_t CanNmCarWakeUpBitPosition;
    u8_t CanNmCarWakeUpBytePosition;
    u8_t CanNmCarWakeUpFilterEnabled;
    u8_t CanNmCarWakeUpFilterNodeId;
    u8_t CanNmCarWakeUpRxEnabled;
    u16_t CanNmImmediateNmCycleTime;
    u8_t CanNmImmediateNmTransmissions;
    u8_t CanNmMsgCycleOffset;
    u16_t CanNmMsgCycleTime;
    u8_t CanNmMsgReducedTime;
    u8_t CanNmMsgTimeoutTime;
    u8_t CanNmNodeId;
    u8_t CanNmPduCbvPosition;
    u8_t CanNmPduNidPosition;
    u8_t CanNmPnEnabled;
    u8_t CanNmPnEraCalcEnabled;
    u8_t CanNmPnHandleMultipleNetworkRequests;
    u32_t CanNmRemoteSleepIndTime;
    u16_t CanNmRepeatMessageTime;
    u16_t CanNmTimeoutTime;
    u16_t CanNmWaitBusSleepTime;

}CanNm_ConfigType;

#endif

AUTOSAR——MBD应用之NM模块Stateflow实现_第7张图片

2.5 状态机

AUTOSAR——MBD应用之NM模块Stateflow实现_第8张图片

NetWorkMode

包含3个子状态Repeat Message State(重复报文状态,RMS),Normal Operation State(NOS,正常模式状态),Ready Sleep State(准备睡眠状态,RSS)。

1.网络模式从BusSleep进入NetWorkMode首先进入RMS,条件为主动或被动唤醒

2.进入Network Mode,成功接收或成功发送NM PDU应当重启NM-Timeout计时器,应当开启APP报文、使能DTC

3.进入RMS,应当重发NM PDU; 在RMS中如果NM计时器超时,重启该计时器;如果收到PDU的CBV中RMS位置为1,应当进入RMS状态

4.进入NOS状态,应当启动PDU周期发送;当网络释放(一般指电源信号OFF)应当进入RSS状态;RSS状态中如果网络请求(电源信号ON),应当进入NOS状态;NOS状态如果收到诊断28服务使能或禁止发送NM,应当打开或者关闭NM PDU

5.在RSS状态中禁止发送NM PDU,发送APP报文;如果NM-timeOut, 则离开RSS,进入PBS状态;

6.在RBS中开启CanNmWaitBusSleepTime定时器,如果超时进入BSS中休眠;如果主动或被动唤醒则重新进入网络模式RMS状态;

AUTOSAR——MBD应用之NM模块Stateflow实现_第9张图片

三、Stateflow实现

3.1 NM接口定义

根据NM模块功能设计输入、输出、API函数

输入:NM PDU信息, 诊断28是否使能发送或接收NM PDU,电源信号

输出:NM PDU,使能DTC,使能APP,NM状态

API:CAN发送接收,发送接收确认,CAN初始化;定时器函数;NetworkRequest,NetworkRelease函数

AUTOSAR——MBD应用之NM模块Stateflow实现_第10张图片

3.2 NM功能实现

定义好接口后,根据2.5小节状态间转换的条件就可以在State flow中实现该功能。

被动模式

AUTOSAR——MBD应用之NM模块Stateflow实现_第11张图片

 主动模式

AUTOSAR——MBD应用之NM模块Stateflow实现_第12张图片

3.3 NM模块测试

首先了解一下在环测试的概念。MIL(model in the loop)模型在环是在matlab中纯软件仿真。  SIL(software in the loop)软件在环 将模型转换为以C/C++嵌入式软件形式的软件,也可以封装成库的形式进行仿真验证。 PIL(processer in the loop)处理器在环 在真实的控制器ECU中进行仿真验证。 HIL(Hardware in the loop)硬件在环 使用真实被控对象,比如电机进行测试验证。

3.3.1 测试用例

对模型建立testHarness,输入时序列test sequence

 对test sequence 进行编程

AUTOSAR——MBD应用之NM模块Stateflow实现_第13张图片

 在模型设置中使能模型覆盖度:

AUTOSAR——MBD应用之NM模块Stateflow实现_第14张图片

 建立testManager 管理test file,对每一个 状态建立一个test suit, 进行设置覆盖度,点击运行即可

AUTOSAR——MBD应用之NM模块Stateflow实现_第15张图片

test case 测试结果:

AUTOSAR——MBD应用之NM模块Stateflow实现_第16张图片

3.4 NM模块部署

3.4.1 生成C/C++代码

在配置文件中设置外部文件头文件和源文件位置

 AUTOSAR——MBD应用之NM模块Stateflow实现_第17张图片AUTOSAR——MBD应用之NM模块Stateflow实现_第18张图片

设置生成C或者C++语言的程序

AUTOSAR——MBD应用之NM模块Stateflow实现_第19张图片

点击Build即可生成代码,存于 ert_rtw中

AUTOSAR——MBD应用之NM模块Stateflow实现_第20张图片

 3.4.2 嵌入APP工程

剪出主要源文件及其对应的各种头文件,查看mk文件进行路径修改等设置成单独可编译mk文件

AUTOSAR——MBD应用之NM模块Stateflow实现_第21张图片

 将剪切的代码文件嵌入工程中,并将mk文件链起来,或者在工程mk文件中直接INC_DIR,CSRC_DIR加入相关文件路径即可完成部署 

参考:

Autosar网络管理:Partial Network基础 - 知乎 (zhihu.com)

为什么需要PN(Partial Network)功能呢?-电子发烧友网 (elecfans.com)

你可能感兴趣的:(MBD)