Autosar Nm-网管报文PNC停发后无法休眠问题排查

前言

Autosar Nm中针对于支持PN功能的收发器,要求PNC停发后允许进入休眠模式,开发过程中遇到PNC停发后无法休眠,本文对该问题进行排查与处理。

Autosar CanNm标准中的相关参数

此处我们讨论支持PN功能的情况,也就是CanNmPnEnabled为True

CanNmAllNmMessagesKeepAwake

在这里插入图片描述
在这里插入图片描述
当该参数配置为Trrue时,只要收到Nm报文,就会认为是有网络唤醒请求

当该参数配置为false时,需要Nm Pdu中PNI位为1且有对应的PNC请求才会认为是有效的网络唤醒请求

对于不支持PN功能的can收发器,该配置项可以配置为True以防止PNI置位时被频繁唤醒

对于支持PN功能的can收发器,该配置项需要配置为false,保证PNI置位但没有PNC请求时也可以进入休眠模式。

注意:此时can收发器端配置data有效数据时不能包含PNI位,只需关联对应的PNC位为1即可
在这里插入图片描述
在这里插入图片描述

标准解读:

1.对于支持PN功能的ECU,当PNI为0时,CanNmAllNmMessagesKeepAwake为TRUE时,仍需要认为接收到有效的Nm Pdu,也就是能够维持唤醒。

2.对于支持PN功能的ECU,当PNI为0时,CanNmAllNmMessagesKeepAwake为FALSE时,需要忽略接收到的Nm Pdu,也就是会走网络管理下电流程(Ready Sleep-PreBus Sleep-Bus Sleep)

3.对于支持PN功能的ECU,当PNI为1且没有关联的PNC置位时,CanNmAllNmMessagesKeepAwake为FALSE时,需要忽略接收到的Nm,Pdu,也就是会走网络管理下电流程

4.对于支持PN功能的ECU,当PNI为1且没有关联的PNC置位时,CanNmAllNmMessagesKeepAwake为TRUE时,仍需要认为接收到有效的Nm Pdu,也就是能够维持唤醒

PN过滤功能

此处有三个配置参数,CanNmPnInfoOffset,CanNmPnInfoLength,CanNmPnFilterMaskByteValue,Offset表示PNC从Nm Pdu中的第几个字节开始算,Length即为PNC的字节数,MaskByteValue配置有效的PNC位

标准中示例如下:
在这里插入图片描述
例子中两个字节的PNC,第一个字节没有有效的PNC位,第二个字节中有有效的PNC

CanNm_ConfirmPnAvailability

为了通知CanNm能够支持PN过滤,需要CanSm调用CanNm_ConfirmPnAvailability函数在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题描述

Nm PDU中关联的PNC停止发送,ECU报文停发,但未进入休眠模式,导致耗电严重

问题原因排查

停发PNC后,Nm状态仍处于Ready Sleep状态,Nm Pdu仍能正常接收,查看CanNm配置项CanNmAllNmMessagesKeepAwake已经为FALSE。在CanNm_RxIndication中默认PDU是收到的,只有CanNmAllNmMessagesKeepAwake为FALSE且CANNM_GetPnMsgFilteringStatus为TRUE才能允许PDU未接收

而CANNM_GetPnMsgFilteringStatus一直为FALSE,所以Nm PDU一直能收到

排查发现CANNM_SetPnMsgFilteringStatus没有运行,该函数在CanNm_ConfirmPnAvailability中调用,而CanNm_ConfirmPnAvailability在CanSM_ConfirmPnAvailability中调用,实际CanSm_ConfirmPnAvailability函数没有地方调用

所以导致Nm Pdu一直是收到的状态,导致无法进入下电过程

解决方案

本质上就是要调用CANNM_SetPnMsgFilteringStatus,可以在初始化完后通过CanNm_ConfirmPnAvailability函数进行调用

注意:该函数传递的参数为nmChannelHandle,需要确认对应的Nm通道是否正确

另外,如果关联的PNC停发后仍然没有进入休眠状态,那么就需要再排查下 PN过滤的参数了。

扩展

标准文档中的推荐流程为:CanTrvc->CanIf->CanSm->CanNm

查看Autosar CanSm文档,CanSm_ConfirmPnAvailability函数由CanIf模块调用
在这里插入图片描述
CanIf有对应配置CanIfDispatchUserConfirmPnAvailabilityUL及CanIfDispatchUserConfirmPnAvailabilityName,需要在CanIf中配置为CanSm盒CanSm_ConfirmPnAvailability,且配置CANIF_PUBLIC_PN_SUPPORT为TRUE
在这里插入图片描述
在这里插入图片描述
这样配置之后,CanIf中的CanIf_ConfirmPnAvailability函数就会调用CanSm_ConfirmPnAvailability了
在这里插入图片描述
而CanIf_ConfirmPnAvailability需要由CanTrcv调用,标准中描述如下:
在这里插入图片描述

总结

由于我们没有使用CanTrcv模块,所以用标准流程会导致很多check不过,但是知道原理之后,怎么解决问题就很简单了~

<think>我们正在处理一个关于AUTOSAR(汽车开放系统架构)中的网络管理(Nm)和部分网络通信(PNC)实现与配置问题。用户希望了解如何实现和配置这些功能。首先,我们需要明确几个关键概念:1.**AUTOSAR网络管理(Nm)**:负责协调ECU(电子控制单元)的通信状态,以实现节能和网络协同。它通过协调总线通信的唤醒和睡眠来实现。2.**部分网络通信(PNC)**:允许ECU仅激活网络中必要的部分(即部分网络),而不是整个网络,从而进一步节省能源。在AUTOSAR中,NmPNC通常一起使用,以实现更精细的电源管理。###实现与配置步骤####1.**配置Nm模块**-**NmGlobalConfig**:配置全局参数,例如主函数周期、节点检测超时等。-**NmChannelConfig**:为每个通信通道(如CAN、FlexRay)配置通道特定参数,例如消息ID、周期时间等。-**NmPnConfig**:配置与部分网络相关的参数,例如PNC位的位置(在Nm消息中用于表示部分网络状态)。示例配置(部分):```c//NmGlobalConfigconstNm_GlobalConfigTypeNmGlobalConfig={.NmMainFunctionPeriod=10,//10ms.NodeDetectionTimeout=2000//2s};//NmChannelConfigforCANconstNm_ChannelConfigTypeNmChannelConfig_CAN={.NmMsgCycleTime=100,//100ms.NmMsgReducedTime=20,//20ms.NmPnHandle=0,//PNCindexforthischannel.NmPduId=0x100//CANmessageID};```####2.**配置PNC**-配置工具(如VectorDaVinciConfigurator)中,需要定义部分网络(PN),每个部分网络包含一组ECU。-为每个ECU配置其所属的部分网络,并设置唤醒条件(即哪些PNC的激活会唤醒该ECU)。例如,在DaVinciConfigurator中:-创建PNC,如PNC1(用于动力总成)、PNC2(用于车身)。-为每个ECU分配PNC,例如:-ECU_A:属于PNC1和PNC2(即当PNC1或PNC2激活时,ECU_A需要唤醒)-ECU_B:仅属于PNC1####3.**实现状态管理**-Nm状态机包括:BUS-SLEEP、PREPARE-BUS-SLEEP、READY-SLEEP、NORMAL_OPERATION等状态。-PNC的激活/去激活通过Nm消息中的PNC位来传递。例如,当某个PNC需要激活时,ECU会设置相应的PNC位为1,并发送Nm消息。状态转换示例:-当ECU需要激活PNC1时,它会设置Nm消息中的PNC1位为1,并进入NORMAL_OPERATION状态(如果之前处于睡眠状态,则先唤醒)。-当所有相关的PNC都去激活后,ECU会进入准备睡眠状态,然后进入睡眠。####4.**代码实现**-在代码中,需要调用Nm接口来请求PNC的激活和去激活。例如:```c//请求激活PNC1Nm_RequestPn(0);//假设0对应PNC1//请求去激活PNC1Nm_ReleasePn(0);```-同时,需要处理Nm状态变化回调,例如:```cvoidNm_StateChangeNotification(NetworkHandleTypenmChannelHandle,Nm_StateTypenmState){if(nmState==NM_STATE_BUS_SLEEP){//进入睡眠状态,可以关闭外设等}}```####5.**验证与测试**-使用总线分析工具(如CANoe)监控Nm消息,确保PNC位正确设置。-测试ECU的唤醒和睡眠行为是否符合预期。###注意事项-**协同性**:多个ECU之间需要协调PNC的激活,避免冲突。-**超时处理**:配置合理的超时参数,防止网络无法进入睡眠。-**错误处理**:处理Nm通信错误,例如消息丢失。[^1]:AUTOSAR_SWS_NetworkManagement.pdf,Version4.4.0[^2]:AUTOSAR_SWS_PowerManagement.pdf,Version4.4.0§§相关问题§§1.AUTOSAR网络管理中,如何配置多个通道(如CAN和FlexRay)?2.部分网络通信(PNC)中,如何处理多个PNC同时请求的情况?3.如何诊断AUTOSAR网络管理中的常见问题(如无法进入睡眠)?4.AUTOSARNm和ComM模块之间是如何交互的?</think>### AUTOSAR NMPNC实现及配置指南 AUTOSAR网络管理(NM)和部分网络通信(PNC)是实现车载ECU高效电源控制的核心机制。以下是关键实现步骤和配置要点: --- #### **一、网络管理(NM)实现** 1. **状态机配置** - 配置NM状态机(Bus-Sleep/Prepare-Bus-Sleep/Ready-Sleep/Normal-Operation) - 示例代码(状态转换逻辑): ```c void Nm_StateChange(NetworkHandleType channel, Nm_StateType newState) { if (newState == NM_STATE_BUS_SLEEP) { EcuM_SetSleepMode(ECUM_SLEEP_MODE_DEEP); // 触发ECU睡眠 } } ``` 2. **消息调度配置** - 定义NM消息周期(`NmMsgCycleTime`)和超时参数(`NmTimeoutTime`) - 配置NM PDU的ID和格式(如CAN ID 0x4xx)[^1] 3. **唤醒源集成** - 配置硬件抽象层(HAL)的唤醒事件: ```c Nm_EnableWakeupSource(NM_CHANNEL_CAN, WAKEUP_SOURCE_CAN_BUS); ``` --- #### **二、部分网络通信(PNC)实现** 1. **PNC网关配置** - 在系统描述文件(`ARXML`)中定义部分网络: ```xml <PARTIAL-NETWORK> <SHORT-NAME>PNC_DriveTrain</SHORT-NAME> <PNC-ID>0x01</PNC-ID> <!-- 分配唯一ID --> <CONTROLLED-ECUS> ECU_Engine, ECU_Transmission </CONTROLLED-ECUS> </PARTIAL-NETWORK> ``` 2. **PNC状态控制** - 通过`ComM_PncRequest()`和`ComM_PncRelease()`API控制网络启停: ```c // 激活动力总成网络 ComM_PncRequest(COMM_CHANNEL_CAN, PNC_DRIVETRAIN); ``` 3. **信号路由配置** - 在通信栈(ComStack)中绑定PDU到PNC: ```c PduR_SetPncRouting(PduIdType TxPduId, PncIdType PncId); ``` --- #### **三、协同工作流程** 1. **睡眠/唤醒序列** ```mermaid graph LR A[所有PNC释放] --> B[NM发起Prepare-Bus-Sleep] B --> C{所有ECU确认} C -->|是| D[NM进入Bus-Sleep] ``` 2. **PNC激活规则** - 当至少一个PNC请求激活时,NM维持`Normal-Operation`状态 - NM消息携带PNC位图(如`NM_PDU_BYTE_1 = 0b00000011`表示PNC1/2激活) --- #### **四、配置工具实践** 1. **Vector Davinci配置步骤** - 在`CanNm`模块设置`NmBasePeriod`(默认50ms) - 在`ComM`模块映射PNC ID到ECU - 在`PduR`模块配置PNC路由路径[^2] 2. **关键参数验证** | 参数 | 典型值 | 作用 | |-----------------------|-------------|--------------------------| | `NmWaitBusSleepTime` | 1000ms | 等待总线睡眠超时 | | `NmPnEraTimeout` | 300ms | PNC状态同步超时 | | `NmRepeatMsgTime` | 2 | 重复发送NM消息次数 | --- #### **五、调试与验证** 1. **常见问题排查** - **无法睡眠**:检查未释放的PNC或`ComM_User`阻塞 - **唤醒失败**:验证`EcuM_WakeupSource`配置 - **PNC超时**:调整`NmPnHandleTimeout`参数 2. **工具链支持** - CANoe/CANalyzer:监控NM消息和PNC位图 - Trace32:分析ECU状态转换时序 > 实现提示:PNC需与**EcuM(ECU状态管理)** 深度集成,确保电源模式与网络状态同步[^2]。 [^1]: AUTOSAR_SWS_NetworkManagement.pdf, Version 4.4.0 [^2]: AUTOSAR_EXP_PowerManagement.pdf, Chapter 6.3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赞哥哥s

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

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

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

打赏作者

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

抵扣说明:

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

余额充值