目录
一、前言
二、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画图如出一辙,做起来快速简洁。
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是蓄电池供电
Byte0 表示源节点地址,一般是 帧ID - 基地址
Byte1表示CBV控制位,具体定义看下图7-2
其余字节一般主机厂自定义,若无特殊说明默认为0
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不使用/保留
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)
NM结构体也叫做配置结构体CanNmGlobalConfig,这种配置类型可以使工程实现根据不同的客户可配置化,使用UML一目了然。
具体的结构体成员含义需参考标准。
在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
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状态;
根据NM模块功能设计输入、输出、API函数
输入:NM PDU信息, 诊断28是否使能发送或接收NM PDU,电源信号
输出:NM PDU,使能DTC,使能APP,NM状态
API:CAN发送接收,发送接收确认,CAN初始化;定时器函数;NetworkRequest,NetworkRelease函数
定义好接口后,根据2.5小节状态间转换的条件就可以在State flow中实现该功能。
被动模式
主动模式
首先了解一下在环测试的概念。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 进行编程
在模型设置中使能模型覆盖度:
建立testManager 管理test file,对每一个 状态建立一个test suit, 进行设置覆盖度,点击运行即可
test case 测试结果:
3.4.1 生成C/C++代码
在配置文件中设置外部文件头文件和源文件位置
设置生成C或者C++语言的程序
点击Build即可生成代码,存于 ert_rtw中
3.4.2 嵌入APP工程
剪出主要源文件及其对应的各种头文件,查看mk文件进行路径修改等设置成单独可编译mk文件
将剪切的代码文件嵌入工程中,并将mk文件链起来,或者在工程mk文件中直接INC_DIR,CSRC_DIR加入相关文件路径即可完成部署
参考:
Autosar网络管理:Partial Network基础 - 知乎 (zhihu.com)
为什么需要PN(Partial Network)功能呢?-电子发烧友网 (elecfans.com)