【CP AUTOSAR】ComM(COMManager)分析和使用
本文介绍了AUTOSAR架构中的ComM组件功能及配置经验。ComM位于通信服务层,封装底层通信控制,简化用户操作。文章详细解析了ComM的五大核心功能:总线通信简化、多组件协调、通信禁用API、通道状态机控制及PNC网络集群支持。重点阐述了ComM的三种主要通信模式(NO/SILENT/FULL)及其子状态转换逻辑,以及管理通道与被管理通道的引用关系配置要求。通过状态机图和功能表格直观展示了Co
文章目录
前言
本文介绍CP AUTOSAR 架构下的ComM组件,基于S32K312芯片、Vector提供的CBD包,使用DaVinci Configurator、DaVinci Developer工具进行配置的经验。
ComM组件位于Communication Services层。
ComM封装了对底层通信服务的控制,用户不需要关心底层的通信细节。ComM模块控制与通信相关的基础软件模块即XXNm和XXSM,用户通过调用ComM的接口,ComM会去控制XXNm和XXSM来达到想要的通信模式。

上图为CP AUTOSAR CAN网络架构。
一、ComM功能概述
(一)、功能概述
ComM模块的目的包括:
简化用户对总线通信栈的使用:包括简化网络管理处理;
协调同一ECU上多个独立软件组件的总线通信栈可用性(允许信号的发送和接收)。用户无需了解硬件细节(如在哪个通道通信),只需请求Communication Mode,ComM模块会开启关闭对应通道的通信能力;
提供API禁用信号发送,以防止ECU主动唤醒通信总线;
通过为每个通道实现通道状态机,控制ECU的多个通信总线通道。ComM模块向相应的总线状态管理器模块请求Communication Mode,实际的总线状态由对应总线状态管理器模块控制;
支持强制保持总线唤醒的ECU进入No Communication模式;
PNC功能允许用户请求并保持网络中一组ECU(即部分网络集群)处于唤醒状态。PNC 网关能将这些部分网络集群扩展到不同的分层物理总线和网络。

(二)、术语
IRA:
内部请求数组。这是一个位向量,包含了每个通道的汇总内部PNC请求。
EIRA:
外部和内部请求数组。这是一个位向量,包含汇总的外部和内部PNC请求。
ERA:
外部请求数组。这是一个包含汇总外部PNC请求的位向量。每个设置了ComMPncGatewayType的ComM通道都有一个对应的ERA。
ERAn:
在ComM中可用的所有外部请求数组(ERA),即设置了ComMPncGatewayType的n个ComM通道,会在ComM中生成n个外部请求数组。
Passive wake-up:
由总线上其他ECU引起的唤醒。
Active wake-up:
由ECU本身引起的唤醒,比如传感器触发、按键触动等。
PNC:
Partial Network Cluster。部分网络集群,网络上有PNC时,该PNC可以同睡同醒不影响其他节点。
(三)、模块依赖性
Rte:
每个User均可请求一种通信模式。Rte会将用户请求传播至ComM模块,并将 ComM 的通信模式指示反馈给用户。
EcuM:
EcuM负责验证唤醒事件,并在唤醒事件通过验证时向ComM发送指示。ECU的通信允许状态与关机操作由EcuM与BswM共同处理。
BswM:
BswM实现模式仲裁和模式控制两大功能,以支持应用模式管理和车辆模式管理。若在BswM的动作列表中配置了相关操作,BswM会将用户请求传递至ComM模块,从而实现通过BswM请求ComM模式的功能。此外,若动作列表中配置了对Com_IpduGroupControl()的调用,BswM还将控制AUTOSAR通信模块(COM)中的PDU Groups。
Dcm:
Dcm负责诊断PDU的调度。当需要执行诊断时,Dcm通过DCM_ActiveDiagnostic指示请求COMM_FULL_COMMUNICATION通信模式,充当用户角色。Dcm不提供启动/停止收发的API,但确保通信能力符合ComM模块的通信模式要求。
LinSM:
LIN状态管理器控制与ComM模块通信模式对应的LIN总线实际状态。ComM模块向LIN状态管理器请求通信模式,LIN状态管理器将通信模式映射为总线状态。
CanSM:
CAN状态管理器控制与ComM模块通信模式对应的CAN 总线实际状态。ComM模块向CAN状态管理器请求通信模式,CAN状态管理器将通信模式映射为总线状态。
FrSM:
FlexRay状态管理器控制与ComM模块通信模式对应的FlexRay总线实际状态。ComM模块向FlexRay状态管理器请求通信模式,FlexRay状态管理器将通信模式映射为总线状态。
EthSM:
Ethernet状态管理器控制与ComM模块通信模式对应的Ethernet总线实际状态。ComM模块向Ethernet状态管理器请求通信模式,Ethernet状态管理器将通信模式映射为总线状态。
Nm:
ComM模块使用Nm来同步网络中通信能力的控制(同步启动和关闭)。此外,ComM与Nm之间通过专用API交换关于协议非合规性(PNC)的状态信息。
Det:
Det提供有关开发、运行时和瞬态错误的报告。
User:
对ComM的请求这,可以是Rte、BswM、Dcm、Runnable、Swc。
(四)、通信模式
ComM提供如下不同的通信模式请求。最高的通信模式应为COMM_FULL_COMMUNICATION,最低的通信模式应为COMM_NO_COMMUNICATION。
对于User而言,只允许请求通信模式COMM_NO_COMMUNICATION和COMM_FULL_COMMUNICATION。
通信模式COMM_SILENT_COMMUNICATION及其子模式/子状态仅用于与AUTOSAR NM同步。
通信模式COMM_FULL_COMMUNICATION_WITH_WAKEUP_REQUEST仅用于请求下层触发网络唤醒。此模式不能由用户请求。
通信模式COMM_SILENT_COMMUNICATION仅应用于网络同步。
COMM_FULL_COMMUNICATION模式下,对应的通道允许收发。
COMM_NO_COMMUNICATION模式下,对应的通道不允许收发。
如果多个User对同一通道请求了不同的模式,那么以最高优先级的模式请求来执行,COMM_FULL_COMMUNICATION通信模式最高。
二、ComM通道状态机
ECU拥有的每个总线在ComM上对应着通道,每个通道都有独立的状态机进行维护。
如果启用了PNC功能,所有PNC相关动作必须在通道相关动作之前执行。因为网络管理请求的优先级最高。
ComMPncNmRequest为TRUE时,若因PNC状态机切换至COMM_PNC_REQUESTED而请求FULL Communication,即使当前已处于FULL Communication状态,仍需调用Nm_NetworkRequest(),因为可以触发NM消息的n次即时传输(n可配置)来确保PNC收发器的唤醒和同步。
通道的的状态机转换如下:
ComM通道状态机应包含与通信模式对应的有三个主要状态:
COMM_NO_COMMUNICATION
COMM_SILENT_COMMUNICATION
COMM_FULL_COMMUNICATION
COMM_FULL_COMMUNICATION包含子状态:
COMM_FULL_COM_NETWORK_REQUESTED
COMM_FULL_COM_READY_SLEEP
COMM_NO_COMMUNICATION包含子状态:
COMM_NO_COM_REQUEST_PENDING
COMM_NO_COM_NO_PENDING_REQUEST
COMM_FULL_COM_READY_SLEEP和COMM_SILENT_COMMUNICATION对于总线上通信关闭的同步至关重要。若仅单个ECU关闭通信,其他ECU会因该ECU停止发送应用信号而存储该ECU的通信丢失DTC。
主要状态呈现了每个通道通信能力的抽象状态,这些状态是用户关注的核心。子状态代表中间状态,用于执行支持与外部组件和管理协议(如 NM)同步转换的活动。
在COMM_NO_COM_REQUEST_PENDING状态时如果ECU已经初始化完则通过ComM_CommunicationAllowed()将CommunicationAllowed标志置为TRUE进入COMM_FULL_COMMUNICATION状态。
ComM支持四种通信模式的请求,
COMM_FULL_COMMUNICATION、COMM_FULL_COMMUNICATION_WITH_WAKEUP_REQUEST、COMM_SILENT_COMMUNICATION、
COMM_NO_COMMUNICATION。
下图是每个模式下的通信能力:
对通信模式COMM_FULL_COMMUNICATION_WITH_WAKEUP_REQUEST的请求,在ComM通道状态机内应作为COMM_FULL_COMMUNICATION请求处理。
每个ComM通道状态机管理一个与XXSM总线状态管理器的通道。
ComM在通道状态机里主要是调用_RequestComMode()、Nm_PassiveStartUp()、Nm_NetworkRelease()、Nm_NetworkRequest()来请求释放总线和总线模式管理。
(一)、ComM的管理与被管理通道
一个ComM通道可以引用其他ComM通道,通过ComMManageReference配置建立引用关系,ComMManageReference的源ComM通道称为管理通道,目标通道称为被管理通道。一个管理通道可引用0到n个被管理通道,而一个被管理通道仅能被1个管理通道引用。这样就能实现管理通道处理NM模块交互,被管理通道无需直接对接NM。
管理通道的ComMNmVariant必须配置为FULL模式,确保具备完整网络管理能力,需承担所有被引用通道的NM协调职责。
被管理通道的ComMNmVariant强制设为LIGHT模式,依赖管理通道处理NM交互,被管理通道的ComMPncGatewayType不得设置为COMM_GATEWAY_TYPE_ACTIVE或COMM_GATEWAY_TYPE_PASSIVE。
(二)、COMM_NO_COMMUNICATION状态的行为
进入COMM_NO_COMMUNICATION时自动切为子状态COMM_NO_COM_NO_PENDING_REQUEST。
ComM初始化后默认进入COMM_NO_COMMUNICATION,此时不会向BswM或Rte发起模式变更的指示,因为此时Rte尚未初始化。
在COMM_NO_COMMUNICATION状态时ComM通道应关闭收发功能,通过调用对应的SM_RequestComMode()来实现,输入模式为COMM_NO_COMMUNICATION。
当进入COMM_NO_COMMUNICATION状态并且ComMNmVariant为FULL时,如果先前通过Nm_NetworkRequest()或Nm_PassiveStartup()请求过NM则ComM需调用Nm_NetworkRelease()释放NM。
1、COMM_NO_COM_NO_PENDING_REQUEST
在该状态下如果User请求COMM_FULL_COMMUNICATION且通信限制禁用,需要立即切换立即切换至COMM_NO_COM_REQUEST_PENDING子状态。
在该状态下如果ComMNmVariant为FULL|LIGHT|NONE,如果ComM_DCM_ActiveDiagnostic()被调用说明诊断激活了,那么就算有通信限制也要切换至COMM_NO_COM_REQUEST_PENDING子状态。
如果ComM_EcuM_WakeUpIndication()被调用且配置参数ComMSynchronousWakeUp设为FALSE,对应的通道要切换至COMM_NO_COM_REQUEST_PENDING子状态。若通道为管理通道,则引用的被管理通道的状态机也要切换至COMM_NO_COM_REQUEST_PENDING。
如果配置参数ComMSynchronousWakeUp设为TRUE,则所有通道都有切换。
在该状态下如果ComM_Nm_RestartIndication()被调用,需要立即切换立即切换至COMM_NO_COM_REQUEST_PENDING子状态。
在该状态下如果ComM_EcuM_PNCWakeUpIndication()被调用,且配置参数ComMSynchronousWakeUp设为FALSE,ComMPncSupport设为TRUE,则通过ComMChannelPerPnc引用的ComM通道切换至COMM_NO_COM_REQUEST_PENDING子状态,包括管理通道引用的通道。
如果ComMSynchronousWakeUp设置为TRUE,则所有ComM通道状态机都应切换到COMM_NO_COM_REQUEST_PENDING子状态。
2、COMM_NO_COM_REQUEST_PENDING
在COMM_NO_COM_REQUEST_PENDING子状态下,如果CommunicationAllowed被设置为TRUE,ComM通道状态机将立即切换到COMM_FULL_COMMUNICATION状态。
通过ComM_CommunicationAllowed()将CommunicationAllowed设置为TRUE,该函数通常被EcuM或BswM调用。
在COMM_NO_COM_REQUEST_PENDING子状态下,如果没有任何有效的待处理COMM_FULL_COMMUNICATION请求,ComM通道状态机将切换回默认的COMM_NO_COM_NO_PENDING_REQUEST子状态。
这一设计的合理性在于,它允许在某些情况下(例如,由于某种原因通信从未被允许)切换回默认子状态。
例如,如果由于用户请求COMM_FULL_COMMUNICATION或ComM_DCM_ActiveDiagnostic()而触发了向COMM_NO_COM_REQUEST_PENDING的转换,但现在通过请求COMM_NO_COMMUNICATION或DCM调用ComM_DCM_InactiveDiagnostic()取消了请求,则状态机将切换回默认子状态。
(三)、COMM_SILENT_COMMUNICATION状态的行为
进入COMM_SILENT_COMMUNICATION状态时,ComM通道状态机应关闭传输功能(保持接收功能开启)。通过调用SM_RequestComMode(), 入参为COMM_SILENT_COMMUNICATION实现。
NM状态机为PBM时进入。
在COMM_SILENT_COMMUNICATION状态下,若配置参数ComMNmVariant为FULL|LIGHT|NONE且ComM_DCM_ActiveDiagnostic()被调用,通道状态机应切换至COMM_FULL_COMMUNICATION状态。就算有通信限制也应临时失效。
在COMM_SILENT_COMMUNICATION状态下,若ComM_Nm_BusSleepMode()被调用,ComM通道状态机应切换至COMM_NO_COMMUNICATION状态。
在COMM_SILENT_COMMUNICATION状态下,若ComM_Nm_NetworkMode()被调用,ComM通道状态机应切换至COMM_FULL_COMMUNICATION状态及子状态COMM_FULL_COM_READY_SLEEP。
在COMM_SILENT_COMMUNICATION下ECU应该不发报文只能收报文,只收不发操作由SM控制CanIf完成,SM会切换CanIf的PDU模式为CANIF_TX_OFFLINE模式即CanIf模块的数据不会传给CanDrv,然后ComM也会调用BswM_ComM_CurrentMode()通知到BswM,如果BswM有配置Action,那么Action会调用Com的Com_IpduGroupStop()停止所有IPDU组最终实现ECU的只收不发。
(四)、COMM_FULL_COMMUNICATION状态的行为
进入COMM_FULL_COMMUNICATION状态时,ComM通道状态机默认进入COMM_FULL_COM_NETWORK_REQUESTED子状态,当从COMM_SILENT_COMMUNICATION状态切换时,如果转换中指定,ComM通道状态机可以直接切换到COMM_FULL_COM_READY_SLEEP子状态。
进入COMM_FULL_COMMUNICATION状态时,ComM通道状态机将开启传输和接收能力。
如果请求的是COMM_FULL_COMMUNICATION模式,则调用SM_RequestComMode(),入参为COMM_FULL_COMMUNICATION。
如果请求的是COMM_FULL_COMMUNICATION_WITH_WAKEUP_REQUEST模式,ComMWakeupSleepRequestEnabled设置为TRUE,则调用SM_RequestComMode(),入参为COMM_FULL_COMMUNICATION_WITH_WAKEUP_REQUEST。
ComMWakeupSleepRequestEnabled设置为FALSE,则调用SM_RequestComMode(),入参为COMM_FULL_COMMUNICATION。
每次以COMM_FULL_COMMUNICATION_WITH_WAKEUP_REQUEST模式请求ComM通道,并且ComMWakeupSleepRequestEnabled设置为TRUE时,即使ComM通道已经处于COMM_FULL_COMMUNICATION状态,ComM也应通过调用SM_RequestComMode(COMM_FULL_COMMUNICATION_WITH_WAKEUP_REQUEST)来请求对应网络。如果ComMWakeupSleepRequestEnabled设置为FALSE或不可用,则忽略该请求。
在COMM_FULL_COMMUNICATION状态下,如果ComM_Nm_BusSleepMode()被调用,则ComM通道状态机应切换到COMM_NO_COMMUNICATION状态。
在COMM_FULL_COMMUNICATION状态下,如果配置参数ComMNmVariant为SLAVE_ACTIVE|SLAVE_PASSIVE,并且ComM_BusSm_BusSleepMode()被调用,则ComM通道状态机应切换到COMM_NO_COMMUNICATION状态。
在COMM_FULL_COMMUNICATION状态下,如果配置参数ComMNmVariant为FULL|PASSIVE,并且ComM_Nm_PrepareBusSleepMode()被调用,则ComM状态机应切换到COMM_SILENT_COMMUNICATION状态。
1、COMM_FULL_COM_NETWORK_REQUESTED
在进入COMM_FULL_COM_NETWORK_REQUESTED子状态时,如果ComMNmVariant配置为LIGHT|NONE,启动计时器ComMTMinFullComModeDuration防止在COMM_FULL_COMMUNICATION模式下频繁切换状态。
如果是因为ComM_EcuM_WakeUpIndication()或ComM_EcuM_PNCWakeUpIndication()或ComM_Nm_RestartIndication()或ComM_Nm_NetworkStartIndication()被调用进入的COMM_FULL_COM_NETWORK_REQUESTED子状态,那么ComM调用Nm_PassiveStartup()对相应的网络通道进行被动唤醒。
如果被唤醒的是被管理通道,那么Nm_PassiveStartup()入参为管理通道。
如果ComMNmVariant配置为FULL,ComM_RequestComMode(COMM_FULL_COMMUNICATION)或ComM_DCM_ActiveDiagnostic()被调用进入的COMM_FULL_COM_NETWORK_REQUESTED子状态,则ComM调用Nm_NetworkRequest()对相应的网络通道进行主动唤醒。
在COMM_FULL_COM_NETWORK_REQUESTED状态下,ComMNmVariant配置为LIGHT|NONE,且ComMTMinFullComModeDuration计时器到期,ComM_RequestComMode(COMM_FULL_COMMUNICATION)和ComM_DCM_ActiveDiagnostic()没被调用,那么切换到COMM_FULL_COM_READY_SLEEP子状态。
在COMM_FULL_COM_NETWORK_REQUESTED状态下,ComMNmVariant配置为FULL,ComM_RequestComMode(COMM_FULL_COMMUNICATION)和ComM_DCM_ActiveDiagnostic()没被调用,那么切换到COMM_FULL_COM_READY_SLEEP子状态。
在COMM_FULL_COM_NETWORK_REQUESTED状态下,ComMNmVariant配置SLAVE_ACTIVE,而且ComM_RequestComMode(COMM_FULL_COMMUNICATION)没被调用,则直接切换至COMM_FULL_COM_READY_SLEEP子状态。
在COMM_FULL_COM_NETWORK_REQUESTED状态下,ComMNmVariant配置PASSIVE| SLAVE_PASSIVE,则直接切换至COMM_FULL_COM_READY_SLEEP子状态。
在COMM_FULL_COM_NETWORK_REQUESTED状态下,如果ComM_DCM_ActiveDiagnostic()没有被调用而且有通信限制请求,则需要立即切换到COMM_FULL_COM_READY_SLEEP,ComMTMinFullComModeDuration定时器停止。
2、COMM_FULL_COM_READY_SLEEP
进入COMM_FULL_COM_READY_SLEEP子状态时,如果ComMNmVariant配置为FULL,则调用Nm_NetworkRelease()释放对应的网络通道,如果配置为LIGHT,则启动启动ComMNmLightTimeout计时器。
在COMM_FULL_COM_READY_SLEEP状态下,如果ComMNmVariant配置为LIGHT,此ComM通道无PNC 关联(ComMPncSupport设为FALSE或此通道未被PNC引用)且ComMNmLightTimeout定时器超时,应切换至COMM_NO_COMMUNICATION状态。
如果通道被PNC引用,ComMNmLightTimeout定时器超时后,当所有引用的PNC都处于COMM_PNC_NO_COMMUNICATION状态后,立即切换至COMM_NO_COMMUNICATION状态。
在COMM_FULL_COM_READY_SLEEP子状态下,若配置参数ComMNmVariant为LIGHT,此ComM通道是被管理通道且被一个管理通道引用但未被任何PNC引用,且ComMNmLightTimeout定时器超时,ComM通道状态机应在引用的管理通道过渡到COMM_PNC_NO_COMMUNICATION状态后,立即切换至COMM_NO_COMMUNICATION状态。
在COMM_FULL_COM_READY_SLEEP子状态下,若配置参数ComMBusType为COMM_BUS_TYPE_INTERNAL,ComM通道状态机应立即切换至COMM_NO_COMMUNICATION状态。
在COMM_FULL_COM_READY_SLEEP子状态下,若ComM_RequestComMode(COMM_FULL_COMMUNICATION)且通信限制禁用,ComM通道状态机应立即切换至COMM_FULL_COM_NETWORK_REQUESTED子状态。
在COMM_FULL_COM_READY_SLEEP子状态下,若配置参数ComMNmVariant为FULL|LIGHT|NONE且ComM_DCM_ActiveDiagnostic()被调用,应切换至COMM_FULL_COM_NETWORK_REQUESTED子状态。就算有通信限制也应临时失效。
在COMM_FULL_COM_READY_SLEEP子状态下,若配置参数ComMNmVariant为LIGHT,且ComM_RequestComMode(COMM_FULL_COMMUNICATION)或ComM_DCM_ActiveDiagnostic()被调用切换到COMM_FULL_COM_NETWORK_REQUESTED状态,应取消ComMNmLightTimeout定时器。
(五)、传输路径
以CAN通信为例,当USER对ComM发起请求后,ComM需要调用CanSM的接口来控制CAN控制器、CAN收发器的模式和调用Nm的接口激活释放网络管理,网络状态变化后,BswM那里也会调用Com的接口开启停止IPDU组,以ComM面向应用层,ComM就能控制应用报文、NM报文的收发,但是诊断报文不能控制。
(六)、序列图
1、CAN总线激活

该序列图展示了ComM如何激活CAN总线的收发,该行为与其他总线动作类似,如LIN、FlexRay、Ethernet,不同的总线调用不同的API。
当CommunicationAllowed为TRUE后,即进入COMM_FULL_COMMUNICATION状态,调用CanSM_RequestComMode(),让CanSM将对应的CAN网络通道设置通信模式为COMM_FULL_COMMUNICATION模式,即CAN控制器和CAN收发器都设置为正常收发,设置完后,CanSM调用ComM_BusSM_ModeIndication()通知ComM设置完成。
接下来则要开启网络管理,如果是主动唤醒则调用Nm_NetworkRequest(),如果是被动唤醒则调用Nm_PassiveStartUp()。
2、CAN被动唤醒

当ComM_EcuM_WakeUpIndication()(如果ECUM中的wakeup source绑定了ComM通道,则在调用EcuM_CheckWakeup()时自动调用)、ComM_EcuM_PNCWakeUpIndication()、ComM_Nm_RestartIndication()、ComM_Nm_NetworkStartIndication()被调用说明有远程唤醒或其他的的被动唤醒,CommunicationAllowed为TRUE后调用CanSM_RequestComMode()入参为COMM_FULL_COMMUNICATION,如果ComMNmVariant为FULL或PASSIVE,则调用Nm_PassiveStartUp()使对应的NM通道被动唤醒,如果是NONE或LIGHT启动ComMTMinFullComModeDuration定时器。
ComM_Nm_NetworkStartIndication()是在NM状态机为BUSSLEEP时被调用,说明在BUSSLEEP下收到了其他NM报文,那这时候Nm会调用这函数,ComM会再调用Nm_PassiveStartUp()让NM状态机进入NOS。
3、CAN网络关闭

当没有USER的通信请求和诊断激活时,即需要释放网络则USER调用ComM_RequestComMode()入参为COMM_NO_COMMUNICATION,或者车辆管理模块需要禁止通信,调用ComM_LimitChannelToNoComMode()。
接着ComM状态机切换到SUBS_COMM_READY_SLEEP,然后调用Nm_NetworkRelease()释放对应的网络。
当网络状态机进入PBM时,Nm调用ComM_Nm_PrepareBusSleepMode()通知ComM,然后ComM切换到COMM_SILENT_COMMUNICATION状态机,调用CanSM_RequestComMode()入参为COMM_SILENT_COMMUNICATION,使对应的CAN通道处于只收不发状态,然后ComM调用Rte_Ports_UserMode_P()[n].Switch_currentMode()、BswM_ComM_CurrentMode()、Dcm_ComM_SilentComModeEntered()通知各个USER已经进入静默模式。
当网络状态机进入BSM时,Nm调用ComM_Nm_BusSleepMode()通知ComM,然后ComM切换到COMM_NO_COMMUNICATION状态机,调用CanSM_RequestComMode()入参为COMM_NO_COMMUNICATION,使对应的CAN通道处于禁止收发状态,然后CanSM调用ComM_BusSM_ModeIndication()入参为COMM_NO_COMMUNICATION通知ComM已经进入COMM_NO_COMMUNICATION状态,然后ComM调用Rte_Ports_UserMode_P()[n].Switch_currentMode()、BswM_ComM_CurrentMode()、Dcm_ComM_NoComModeEntered()通知各个USER已经进入无通信模式。
4、CAN主动唤醒

当有来自USER的主动请求调用ComM_RequestComMode()入参为COMM_FULL_COMMUNICATION或Dcm诊断激活调用ComM_DCM_ActiveDiagnostic(),等CommunicationAllowed为TRUE后调用CanSM_RequestComMode()入参为COMM_FULL_COMMUNICATION。
如果ComMNmVariant为FULL,调用Nm_NetworkRequest()使对应的CAN网络激活。
三、PNC管理
(一)、概述
PNC是可选功能,ComM为User提供了唤醒和保持部分网络集群(PNC)处于唤醒状态的选项。
ComM为每个PNC通道实现一个状态机,用于表示PNC的通信模式。
每个PNC通道拥有独立状态,其状态定义与ComM的状态相关,以实现简单映射。
User可用于请求和释放PNC。
所有通道的PNC的状态信息通过NM消息中的PNC位向量进行交换。
在没有PN功能的网络里,所有ECU同睡同醒,有了PN功能后,只有在同一个PNC内的ECU才同睡同醒,这样就能不必唤醒每个ECU进行工作达到省电的目的。
PN请求信息包含在NM PDU里的USER DATA里,ECU需要判断本ECU属于的PNC bit即请求信息是否为1,如果为1代表要工作便发送应用报文和NM报文。
某些IPDU GROUP也与各个PNC bit关联,那么当对应的PNC bit开启关闭时,对应的IPDU GROUP也开启关闭。

如上图,假设总线上NM PDU里的PNC1、PNC2、PNC3是置位的,那么ECU1的node1和ECU3的node5就需要工作要收发报文,如果只有PN4、PNC5置位,那么ECU2的node4和ECU3的node5要工作。
判断PNC位是否有效是在Nm模块里判断,如果没有有效的PNC位则丢弃收到的NM报文否则通知ComM更新ERA,AUTOSAR4.4则是在CanNm里去作判断。
ERA/EIRA是PN请求的状态集,可以理解为一个数组,每路通道都可以选择该路是ERA还是EIRA,通常ERA是网关节点使用,是ERA的通道收到别的NM PNC请求时要转发给其他相应的通道,本通道和其他通道进行主动唤醒。
不是网关节点如果没有路由PNC请求,使用EIRA。
External便是从外部NM PDU收到的PN请求,Internal便是内部PN请求,如SWC主动对某路PNC请求网络激活或者某个网关有两个CAN节点,CAN1节点收到NM PDU后对应的PNC关联CAN2,那么通过转发唤醒CAN2,也是内部请求。
对于PnResetTimer,每路的EIRA在内部是可以共用的,而对于ERA假如有3路Channel,8路PNC,则需要建立3*8个PnResetTimer。
只有在该PNC对应的User主动调用ComM_RequestComMode()为FullCom或是ComMPNCGatewayEnabled = TRUE时收到NM PDU里对应的PNC bit为1,该PNC对应的Channel发出的NM PDU才把相应的PNC bit置为1,否则就算收到NM PDU里PNC bit有效,本ECU发出的NM PDU也不把对应的PNC bit置为1,就跟Channel状态机的主动唤醒和被动唤醒相对应。
当本节点是网关节点,有多个Channel关联同一个PNC,若其中一个Channel被唤醒,其他Channel也要被唤醒并且是主动唤醒。
ComM在PNC状态机里主要是获取和更新ERA或EIRA里的PNC bit,并根据相应的bit更新后通知BswM,再根据Action去开启关闭相关的PNC对应的IPDU组或执行VFC功能。
(二)、PNC管理功能
当参数ComMPncSupport设置为TRUE 时,才有PNC功能。
参数ComMPncEnabled用来配置PNC功能是否开启。
ComM模块通过调用BswM_ComM_CurrentPncMode(),向BswM通知PNC状态机的每一次状态变更。
为在ComM和Nm之间交换PNC 状态信息,应使用位向量。此类位向量称为PNC位向量,最多包含504位。
PNC位向量以uint8类型数组的引用形式,通过专用API提供给ComM。PNC位向量中的每一位代表特定PNC的状态,该位称为PNC位。
与某个ComMPncId对应的PNC位的字节索引(byteIndex)和位索引(bitIndex)应按以下方式确定:
byteIndex = (ComMPncId除以8) - 。
bitIndex = (ComMPncId对8取模)。
ComM通过回调函数ComM_Nm_UpdateEIRA (<内部和外部PNC请求的PNC位向量>),以PNC位向量形式接收内部和外部PNC请求的汇总状态。
若ComM_Nm_UpdateEIRA()被调用,则ComM应根据NmIf中配置的PNC位向量长度,将给定PNC 位向量的内容传输至ComM的EIRA。
每个PNC的一个EIRA PNC位向量缓冲区,该缓冲区的长度应等于与此PNC关联的通道所配置的PNC位向量的最大长度。
例如,若PNC引用ComMChannel A和ComMChannel B,且为这些通道配置的PNC位向量长度不同(ChannelAPncBitVectorLength = 10字节,ChannelBPncBitVectorLength = 20字节),则该PNC应使用一个长度为20字节的EIRA缓冲区。
ComM通过回调函数ComM_Nm_UpdateERA (<外部 PNC 请求的 PNC 位向量>),按通道以PNC位向量形式接收外部PNC请求的汇总状态。
若配置参数ComMPncGatewayEnabled设置为TRUE,ComM_Nm_UpdateERA (<ERA的 PNC位向量 >)被调用,且为给定通道设置了参数ComMPncGatewayType,则ComM应根据给定通道和NmIf中配置的PNC位向量长度,将给定PNC位向量的内容传输至ComM的ERA。
ComM将Nm提供的EIRA PNC位向量传输至内部EIRA,并将每个ERA PNC位向量按ComMChannel传输至对应的ERA。传输PNC位向量内容时,若PNC位向量中对应PNC位为1,则将ComM内部EIRA/ERA中的PNC位设为1,若为0,则设为0。
ComM模块应能在已分配的ComM通道间分发特定PNC的状态(PNC 状态机的结果)。因此,ComM应通过调用Nm_UpdateIRA ( < 汇总内部PNC请求的PNC位向量 >),按通信通道将内部PNC请求的汇总状态作为PNC位向量转发。IRA PNC位向量用于指示内部PNC请求的状态。
(三)、PNC状态机

PNC状态机有两个主状态:
COMM_PNC_FULL_COMMUNICATION
COMM_PNC_NO_COMMUNICATION
COMM_PNC_FULL_COMMUNICATION下有三个子状态:
COMM_PNC_PREPARE_SLEEP
COMM_PNC_READY_SLEEP
COMM_PNC_REQUESTED
状态变更后通过BswM_ComM_CurrentPncMode()通知BswM模块。
ComM_RequestComMode()调用触发的状态转换仅在ComM_MainFunction()中执行。
在ComM_MainFunction()中,请求按以下顺序处理:
映射到该通道一个或多个PNC的ComM用户请求。
直接映射到该通道的ComM用户请求。
ERA(当ComMPncGatewayEnabled为TRUE时)。
EIRA。
1、COMM_PNC_NO_COMMUNICATION状态机的行为
COMM_PNC_NO_COMMUNICATION状态下是默认状态。当PNC即没有外部请求也没有内部请求时,该状态一直保持。
当PNC通过ComMChannelPerPnc引用至少一个ComMChannel,如果ComMSynchronousWakeUp为TRUE,ComM_EcuM_WakeUpIndication()被调用的话,进入COMM_PNC_PREPARE_SLEEP子状态。
如果ComMSynchronousWakeUp为FALSE,ComM_EcuM_WakeUpIndication()被调用的话,保持COMM_PNC_NO_COMMUNICATION状态,直到收到PNC请求(EIRA中PNC位设置为1)。
当PNC通过ComMChannelPerPnc引用至少一个ComMChannel,ComM_EcuM_PNCWakeUpIndication()被调用的话,进入COMM_PNC_PREPARE_SLEEP子状态。
当分配给该PNC的至少一个ComMUser请求Full Communication时,离开当前状态,进入COMM_PNC_FULL_COMMUNICATION的COMM_PNC_REQUESTED子状态。
当PNC通过ComMChannelPerPnc引用至少一个ComMChannel,若EIRA中表示此PNC的至少一个PNC位变为1,应退出该状态并进入COMM_PNC_READY_SLEEP。
当ComMPncGatewayEnabled设置为TRUE,PNC通过ComMChannelPerPnc引用至少一个通道,所有引用通道都设置了ComMPncGatewayType,若ERAn中表示此PNC的至少一个PNC位变为1,则退出该状态并进入子状态COMM_PNC_REQUESTED。
2、从PowerOff下进入COMM_PNC_NO_COMMUNICATION
当ECU上电时,默认进入COMM_PNC_NO_COMMUNICATION状态。
3、COMM_PNC_FULL_COMMUNICATION状态机的行为
只要某个指定的PNC处于COMM_PNC_FULL_COMMUNICATION状态,该PNC通过ComMChannelPerPnc引用的所有ComMChannel均应处于COMM_FULL_COMMUNICATION状态。
4、COMM_PNC_REQUESTED子状态
当从COMM_PNC_NO_COM或COMM_PNC_PREPARE_SLEEP进入COMM_PNC_REQUESTED时,若此PNC通过ComMChannelPerPnc引用至少一个ComMChannel,且此PNC的ComMPncWakeupSleepRequestEnabled设置为TRUE,则应调用BswM_ComM_CurrentPNCMode()并传入COMM_PNC_REQUESTED_WITH_WAKEUP_REQUEST,而非传入 COMM_PNC_REQUESTED。
当进入PNC子状态COMM_PNC_REQUESTED时,如果ComMPncGatewayEnabled设置为FALSE或此PNC引用的所有ComMChannel均未设置ComMPncGatewayType,ComM模块应在IRA中将表示此PNC的PNC位设置为1,并通过调用Nm_UpdateIRA()将汇总的内部PNC请求转发至该PNC引用的每个通道。
每当从其他状态进入子状态COMM_PNC_REQUESTED时,ComM应诊断通过参数ComMChannelPerPnc引用的所有已配置ComM通道以及其中ComMWakeupSleepRequestEnabled设置为FALSE或不存在的情况(即使该通道已被请求),请求COMM_FULL_COMMUNICATION。
每当从COMM_PNC_NO_COM或COMM_PNC_PREPARE_SLEEP进入子状态COMM_PNC_REQUESTED时,ComM应诊断通过参数ComMChannelPerPnc引用的所有已配置ComM通道以及其中ComMWakeupSleepRequestEnabled设置为TRUE的情况(即使该通道已被请求),请求COMM_FULL_COMMUNICATION_WITH_WAKEUP_REQUEST。
每当从COMM_PNC_READY_SLEEP进入子状态COMM_PNC_REQUESTED时,ComM应诊断通过参数ComMChannelPerPnc引用的所有已配置ComM通道以及其中ComMWakeupSleepRequestEnabled设置为TRUE的情况(即使该通道已被请求),请求COMM_FULL_COMMUNICATION。
当进入PNC子状态COMM_PNC_REQUESTED且ComMPncGatewayEnabled设置为TRUE时,ComM应在所有引用的ComMChannel中(其ComMPncGatewayType设置为COMM_GATEWAY_TYPE_ACTIVE)的IRA中将表示此PNC的PNC位设置为1,并相应的通过调用Nm_UpdateIRA()将汇总的内部PNC请求转发至这些ComMChannel上。
5、COMM_PNC_REQUESTED子状态的行为
当分配给此PNC的所有ComM用户请求No Communication时,若ComMPncGatewayEnabled设置为FALSE或该PNC引用的所有通道均未设置ComMPncGatewayType,则应退出子状态COMM_PNC_REQUESTED并进入子状态COMM_PNC_READY_SLEEP。
当处于子状态COMM_PNC_REQUESTED且ComMPncGatewayEnabled设置为FALSE时,若分配给特定PNC的至少一个ComM用户请求Full Communication时,则ComM应为该PNC通过ComMChannelPerTxOnlyPnc引用的ComM通道请求COMM_FULL_COMMUNICATION。
当处于子状态COMM_PNC_REQUESTED且ComMPncGatewayEnabled设置为FALSE 时,若分配给特定PNC的所有ComM用户请求No Communication时,则ComM应为该PNC通过ComMChannelPerTxOnlyPnc引用的ComM通道请求COMM_NO_COMMUNICATION。
当分配给此PNC的所有ComM用户请求No Communication、参数ComMPncGatewayEnabled设置为TRUE、此PNC通过ComMChannelPerPnc引用至少一个ComMChannel、此PNC引用的所有ComMChannel均已设置ComMPncGatewayType参数、ERAn中表示此PNC的PNC位等于0满足时,应退出子状态COMM_PNC_REQUESTED并进入子状态COMM_PNC_READY_SLEEP。
当分配给此PNC的所有ComM用户请求No Communication、参数ComMPncGatewayEnabled设置为TRUE、此PNC引用的所有ComMChannel均未设置ComMPncGatewayType参数满足时,应退出子状态COMM_PNC_REQUESTED并进入子状态COMM_PNC_READY_SLEEP。
当处于子状态COMM_PNC_REQUESTED且ComMPncGatewayEnabled设置为TRUE时,若分配给特定PNC的至少一个ComM用户请求Full Communication,则ComM应在以下条件的ComMChannel的IRA中将表示该特定PNC的PNC位设置为1:
ComMPncGatewayType参数设置为COMM_GATEWAY_TYPE_PASSIVE;
由该PNC通过ComMChannelPerPnc或ComMChannelPerTxOnlyPnc引用,并通过调用Nm_UpdateIRA()转发更新后的IRA。
当处于子状态COMM_PNC_REQUESTED且ComMPncGatewayEnabled设置为TRUE时,若至少一个ERA中表示特定PNC的PNC位等于1,且其对应的ComMChannel的ComMPncGatewayType参数设置为COMM_GATEWAY_TYPE_ACTIVE,则ComM应在以下条件的ComMChannel的IRA中将表示该特定PNC的PNC位设置为1:
ComMPncGatewayType参数设置为COMM_GATEWAY_TYPE_PASSIVE;
由该PNC通过ComMChannelPerPnc或ComMChannelPerTxOnlyPnc引用,并通过调用Nm_UpdateIRA()转发更新后的IRA。
当处于子状态COMM_PNC_REQUESTED且ComMPncGatewayEnabled设置为TRUE时,若分配给特定PNC的至少一个ComM用户请求Full Communication,则ComM应为该PNC通过ComMChannelPerTxOnlyPnc引用的ComM通道请求COMM_FULL_COMMUNICATION。
当处于子状态COMM_PNC_REQUESTED且ComMPncGatewayEnabled设置为TRUE时,若分配给特定PNC的所有ComM 用户请求No Communication,且ERAn中表示该特定PNC的PNC位等于0(其对应的ComMChannel的ComMPncGatewayType参数设置为COMM_GATEWAY_TYPE_ACTIVE),则ComM应在以下条件的ComMChannel的IRA中将表示该特定PNC的PNC位设置为0:
ComMPncGatewayType参数设置为COMM_GATEWAY_TYPE_PASSIVE;
由该PNC通过ComMChannelPerPnc或ComMChannelPerTxOnlyPnc引用,并通过调用 Nm_UpdateIRA()转发更新后的IRA。
当处于子状态COMM_PNC_REQUESTED且ComMPncGatewayEnabled设置为TRUE时,若分配给特定PNC的所有ComM用户请求No Communication,且该PNC引用的ComMChannel均未设置ComMPncGatewayType参数,则ComM应在该PNC引用的所有ComMChannel的IRA中将表示该特定PNC的PNC位设置为0,并通过调用Nm_UpdateIRA() 转发更新后的IRA。
当处于子状态COMM_PNC_REQUESTED且ComMPncGatewayEnabled设置为TRUE时,若分配给特定PNC的所有ComM用户请求No Communication,则ComM应为该PNC通过ComMChannelPerTxOnlyPnc引用的ComM通道请求COMM_NO_COMMUNICATION。
当在子状态COMM_PNC_REQUESTED中ComM_Nm_ForwardSynchronizedPncShutdown()被调用,且满足以下所有条件时:
分配给此PNC的所有ComM用户请求No Communication;
该PNC通过ComMChannelPerPnc引用的所有通道(其通道属性ComMPncGatewayType设置为COMM_GATEWAY_TYPE_ACTIVE)的ERAn中对应的PNC位均设置为0;
ComM_Nm_ForwardSynchronizedPncShutdown()指示通道分配给此PNC,且该PNC被指示关闭(给定PNC位向量中PNC位设置为1);
指示通道的ComMPncGatewayType设置为COMM_GATEWAY_TYPE_PASSIVE,且通过ComMChannelPerPnc引用;
ComMSynchronizedPncShutdownEnabled设置为TRUE;
则ComM模块应执行以下操作:
在该PNC通过ComMChannelPerPnc引用的所有通道(其通道属性ComMPncGatewayType设置为COMM_GATEWAY_TYPE_PASSIVE)的ERA中,将此PNC的ERA位设置为0。
对当前处理的PNC中每个具有的调用Nm_RequestSynchronizedPncShutdown(),其中ComMPncGatewayType被设置为COMM_GATEWAY_TYPE_ACTIVE,且该通道通过ComMChannelPerPnc进行引用。
退出子状态 COMM_PNC_REQUESTED 并进入子状态 COMM_PNC_READY_SLEEP。
原因为:
每当中间 PNC 协调器(至少有一个ComMChannel的ComMPncGatewayType设置为COMM_GATEWAY_TYPE_PASSIVE)从顶层PNC协调器接收到作为PN关闭消息的Nm帧时,ComM应立即释放该PNC,转发PN关闭消息的PNC位向量,并在分配给受影响PNC且ComMPncGatewayType设置为COMM_GATEWAY_TYPE_ACTIVE的ComMChannel上请求同步PNC关闭(请求传输 PN 关闭消息)。
ComM必须确保接收作为PN关闭消息的Nm帧时的处理流程尽可能快,以最小化同步PNC关闭的延迟。
如果本地用户已指示请求受影响的PNC,或通过ComMPncGatewayType设置为COMM_GATEWAY_TYPE_ACTIVE的ComM通道接收到PNC请求,则不执行同步PNC关闭的转发。本地请求或远程请求的PNC始终优先于同步PNC关闭请求。
仅当指示的PNC(在PNC位向量中给出)处于COMM_PNC_REQUESTED状态时,才执行同步PNC关闭处理。
如果通过调用ComM_Nm_ForwardSynchronizedPncShutdown() 为此PNC指示转发同步PNC关闭请求,且该PNC符合释放条件但转发同步PNC请求的前提条件不满足,则ComM模块应拒绝执行同步PNC关闭的转发;如果ComMPncNmRequest设置为TRUE,即使受影响通道的当前状态已为Full Communication,ComM也应通过调用Nm_NetworkRequest()为分配给此PNC的所有ComMChannel重新请求网络。
如果ComMSynchronizedPncShutdownEnabled设置为TRUE,且分配给此PNC的所有ComM通道的ComMPncGatewayType均设置为COMM_GATEWAY_TYPE_ACTIVE,则在以下条件下应调用Nm_RequestSynchronizedPncShutdown(< 通道 >, ),其中<通道>表示当前处理的ComMChannel,为此PNC的ComMPncId:
ERAn中对应的PNC位等于0;
分配给此PNC的所有ComM用户请求No Communication;
该通道通过ComMChannelPerPnc被此PNC引用。
原因为:
每当释放PNC、配置同步PNC关闭且ECU作为此PNC的顶层PNC协调器时,必须在受影响的ComMChannel上传输PN关闭消息。因此,ComM通过为分配给该PNC的每个ComMChannel调用Nm_RequestSynchronizedPncShutdown(),将检测到的已释放PNC的PNC位向量转发给NmIf。NmIf将调用转发给受影响的Nm,PN关闭消息在Nm_Mainfunction()中传输。
当处于子状态COMM_PNC_REQUESTED时,若ComM0PncVectorAvoidance设置为TRUE,且通过ComMChannelPerPnc引用的ComMChannel的计算IRA中的所有PNC位均设置为0,则ComM模块应释放该ComMChannel。一旦IRA中至少有一位重新变为1,ComM模块应重新请求该ComMChannel。
原因为:
只要远程请求PNC(即分配给此PNC的ERAn中至少一个PNC位等于1)且配置开关ComMPncGatewayEnabled设置为TRUE,COMM_PNC_REQUESTED就会保持为当前PNC状态。
6、COMM_PNC_READY_SLEEP子状态
当从COMM_PNC_REQUESTED进入PNC 子状态COMM_PNC_READY_SLEEP时,应将IRA中表示该PNC的PNC位设置为0,并通过调用Nm_UpdateIRA()将汇总的内部PNC请求转发至该PNC引用的每个通道。
当从COMM_PNC_REQUESTED进入PNC子状态COMM_PNC_READY_SLEEP时,ComM应为该PNC通过ComMChannelPerPnc引用的所有已配置ComM通道释放COMM_FULL_COMMUNICATION请求。
7、COMM_PNC_READY_SLEEP子状态的行为
只要PNC处于被请求状态(即EIRA中表示该PNC的PNC位等于1)且没有分配给此PNC的ComM用户请求Full Communication,当前状态应为COMM_PNC_READY_SLEEP。
若PNC被释放(即EIRA中表示该PNC的PNC位等于0),应退出子状态COMM_PNC_READY_SLEEP并进入子状态COMM_PNC_PREPARE_SLEEP。
若分配给此PNC的至少一个ComM用户请求Full Communication,应退出子状态COMM_PNC_READY_SLEEP并进入子状态COMM_PNC_REQUESTED。
当处于子状态COMM_PNC_READY_SLEEP时,若ERAn中表示该PNC的至少一个PNC位变为1,则在以下条件下应退出子状态COMM_PNC_READY_SLEEP并进入子状态 COMM_PNC_REQUESTED:
参数ComMPncGatewayEnabled设置为TRUE;
此PNC通过ComMChannelPerPnc引用至少一个通道,且被引用的通道已设置ComMPncGatewayType。
8、COMM_PNC_PREPARE_SLEEP子状态
若进入子状态COMM_PNC_PREPARE_SLEEP,应使用配置的初始值启动定时器ComMPncPrepareSleepTimer。
9、COMM_PNC_PREPARE_SLEEP子状态的行为
只要定时器ComMPncPrepareSleepTimer正在运行且未发生ComM User、EIRA或ERAn变化,当前状态应为COMM_PNC_PREPARE_SLEEP。
当定时器ComMPncPrepareSleepTimer超时时,应退出PNC子状态COMM_PNC_PREPARE_SLEEP并进入PNC主状态COMM_PNC_NO_COMMUNICATION。
当处于COMM_PNC_PREPARE_SLEEP时,若分配给此PNC的至少一个ComM用户请求Full Communication,应退出COMM_PNC_PREPARE_SLEEP状态,停止定时器ComMPncPrepareSleepTimer,并进入子状态COMM_PNC_REQUESTED。
当处于COMM_PNC_PREPARE_SLEEP时,若EIRA中表示此PNC的PNC位变为1且此PNC通过ComMChannelPerPnc引用至少一个通道,应退出子状态COMM_PNC_PREPARE_SLEEP,停止定时器ComMPncPrepareSleepTimer,并进入子状态COMM_PNC_READY_SLEEP。
(四)、PNC网关
PNC网关功能用于将(逻辑上的)部分网络集群(Partial Network Cluster)扩展到总线/通信通道的边界之外,实现PNC请求在不同总线/网络间的网关传递。(因此,PNC网关必须连接多个物理通道才能存在。)
PNC网关配置中定义了每个PNC所需的物理通道信息,确保覆盖该PNC所有成员。
从所有主动通道(主动通道需维持唤醒状态)收集PNC请求并进行汇总。
网关将汇总后的PNC状态发送至所有主动通道,使网络中所有节点对PNC请求状态与网关一致,确保跨通道的同步性。
若PNC网关非网络层级中的顶层节点,它会通过被动通道(因其无需主动维持唤醒)将下级节点的PNC请求状态与自身内部请求状态汇总,发送给上级PNC协调器。
PNC协调器禁止汇总并回传被动通道收到的信息,以避免产生无限循环的虚假PNC请求。
PNC通道映射关系由静态配置提供。此外,可通过可选特性动态PNC通道映射在运行时扩展该映射关系。
当PNC网关激活时,即使某PNC仅被分配到单个通道,若请求来自其他未分配该PNC的通道,网关仍会执行协调逻辑。此设计意图在于:另一通道上可能存在仅需发起PNC请求但不希望被该PNC唤醒的节点。

1、对分配到多个通道的不PNC协调动作的支持
当一个PNC被分配至多个ComMChannel时,该PNC必须在所有受影响的ComMChannel上均启用协调动作,或在所有此类通道上均不启用协调动作。
如果PNC被分配至不同的ComMChannel,且这些通道未通过PNC网关进行协调,则网络拓扑和通信设计必须确保受影响的ComMChannel在同一时刻被请求和释放。在使用PNC的情况下,应用程序不应关注ComMChannel的状态,此外,ComM也不会处理该用例中的ComMChannel状态,因为未对这些通道执行PNC协调动作。换句话说,如果被动请求一个PNC,则所有引用的ComMChannel也应被被动请求,因为应用程序期望分配给该PNC的所有ComMChannel均处于COMM_FULL_COMMUNICATION状态。
下图展示了一个PNC网关具有未协调的ComMChannel示例:
2、主动PNC网关
即使配置参数ComMPncGatewayEnabled为TRUE,且某ComMChannel的ComMPncGatewayType参数设置为COMM_GATEWAY_TYPE_ACTIVE,主动PNC网关的行为按PNC状态机流程那样执行。
系统通道上的主动PNC网关应作为该通道上释放PNC的最后一个节点。
(即主动网关需确保所有下属节点先释放PNC请求,自身最后退出,避免网络状态不一致)
若某个PNC在所有ERAn中的对应位均为0,则除PNC网关外,没有其他节点在请求该PNC。
(此时网关作为唯一请求者,需负责协调PNC的休眠流程,避免无效唤醒)
3、被动PNC网关
仅当被动协调通道连接到多个PNC网关时,其才会存在。如果ComM的PNC网关功能已启用(ComMPncGatewayEnabled设置为TRUE),则映射到该PNC网关的ComM通道可设置为主动或被动类型(COMM_GATEWAY_TYPE_ACTIVE或COMM_GATEWAY_TYPE_PASSIVE)。如果某个ComM通道映射到两个不同的PNC网关,则仅一个网关对该通道进行主动协调,另一个则为被动协调。这意味着:一个PNC网关必须至少映射一个主动类型的ComM通道,且可映射一个或多个被动类型的ComM通道。
当本地ComM用户请求PNC,或被动PNC网关的主动协调系统通道中,至少有一个ERA内的PNC位不为0时,PNC网关将请求PNC。
PNC网关计算ERA发送PNC位向量中被动协调通道的PNC位值时,计算方式与主动协调通道在ERA中的PNC位值一致。
4、同步PNC关闭
PN拓扑始终呈现分层架构,其中顶级PNC协调器(top-level PNC coordinator)位于最高层级。在次级层级中,可能存在多个中间PNC协调器(intermediate PNC coordinator)和PNC叶子节点(PNC leaf node)。
PNC-Coor1为顶级PNC协调器,PNC-Coor2为中间PNC协调器,Node1和Node2为位于PN拓扑最低层级的PNC叶子节点。例如,当Node1请求PNC1时,该PNC请求会通过PN拓扑传播至顶级PNC协调器。顶级PNC协调器接管该PNC请求,并确保其在PN网络中分发:通过通道1(PNC-Coor1.Ch1)回传该请求,并将其转发至通道2(PNC-Coor2.Ch2)。
若Node1释放PNC1且网络中无其他ECU请求PNC1,Node1仍会收到顶级PNC协调器发送的包含PNC1请求的Nm帧。PNC叶子节点的释放不会立即从叶子节点向顶级PNC协调器传播,而是在PN拓扑的每个层级上受PN reset time延迟。
当顶级PNC协调器检测到某个PNC的PN reset time到期,且PN网络中无其他ECU请求该PNC时,会重新重置该PNC的PN reset time,并发送PN shutdown message,以确保从顶级PNC协调器到PNC叶子节点的所有PN层级实现PNC的类似同步关闭。
中间PNC协调器在接收PN关闭消息后立即响应:释放指定PNC,重新重置 PN reset time,并将PN关闭消息转发至所有主动协调且分配给该PNC的ComM通道。由此,从顶级PNC协调器到PNC叶子节点的所有层级中,被释放PNC的状态机均进入COMM_PNC_READY_SLEEP状态,并几乎同时重置对应的PN reset time,最终实现PNC的同步关闭,避免应用层超时。
5、多个顶层PNC协调器的支持
PN拓扑结构必须至少有一个顶级PNC协调器。若某个特定PNC所分配到的所有ComMChannels的ComMPncGatewayType均设置为COMM_GATEWAY_TYPE_ACTIVE,则该PNC的顶级PNC协调器即被指定。不同PNC可能拥有不同的顶级PNC协调器。对于同一PNC,通常使用一个顶级PNC协调器。但若PN拓扑满足AUTOSAR SystemTemplate文档中的约束条件constr_pnc90的设计要求,同一PNC也可配置多个顶级PNC协调器。下图展示了具有多个同一PNC顶级PNC协调器的有效PN拓扑示例。
上图中PNC-Coor1作为PNC1和PNC2的顶级PNC协调器。PNC-Coor3作为PNC3的顶级PNC协调器。因此,如果启用同步PNC关闭,则PNC-Coor1负责为PNC1和PNC2启动同步PNC关闭。PNC-Coor3负责为PNC3启动同步PNC关闭。

上图中,PNC-Coor2和PNC-Coor3作为PNC3的顶级PNC协调器。为确保正常运行,需将PNC-Coor3.Ch1的NM过滤掩码进行配置以使PNC3位能通过过滤。若启用同步PNC关闭功能,则预期行为应符合以下描述:
若PNC-Coor2请求PNC3,则该PNC请求将由PNC-Coor3转发至Node3。
若仅PNC-Coor2请求了PNC3,且PNC-Coor2释放PNC3,则PNC-Coor2会发送一条PN关闭消息。PNC-Coor3将同步PNC关闭请求转发至 PNC-Coor3.Ch3。因此,PNC3将在所有受影响节点上进行同步关闭,从PNC-Coor2经PNC-Coor3至Node3。在此场景中,PNC-Coor2作为PNC3的顶级协调器。
若仅Node3请求PNC3,则PNC-Coor3仅通过PNC-Coor3.Ch3回传PNC请求。该PNC请求不会转发至其他通道,因PNC3仅引用PNC-Coor3.Ch3。
若仅Node3请求了PNC3,且Node3释放该PNC,则PNC-Coor3会在PNC-Coor3.Ch3上发送一条PN关闭消息。在此场景中,PNC-Coor3作为PNC3 的顶级协调器。
若Node3和PNC-Coor2均请求了PNC3,且Node3释放PNC3,则PNC-Coor2对PNC3的请求将维持PNC3的请求状态。
若Node3和PNC-Coor2均请求了PNC3,且PNC-Coor2释放PNC3,则PNC-Coor2会在PNC-Coor2.Ch3上发送一条PN关闭消息。PNC-Coor3不会在PNC-Coor3.Ch3上转发该PN关闭请求,因为PNC-Coor3.Ch3的ERA仍包含来自Node3的PNC3请求。因此,PNC-Coor2将异步关闭PNC3,因为只要Node3请求PNC3,PNC-Coor3就会继续处理来自Node3的PNC请求。Node3释放PNC3后,PNC-Coor3和Node3将同步关闭PNC3,因为PNC-Coor3起到了顶级PNC协调器的作用。
6、总结
PNC请求在Passive通道:
如果在网关类型为PASSIVE的通道上接收到ERA=1的请求,则该请求不会镜像回该通道,即该请求不会在EIRA Tx 信号中设置,并且不会路由到网关类型为PASSIVE的通道。请求仅路由到网关类型为ACTIVE的通道。
PNC请求在Active通道:
如果在网关类型为ACTIVE的通道上通过ERA=1接收到PN请求,则该请求会镜像回此通道,且路由到所有其他协调通道。
PNC请求在网关类型为NONE的通道:
如果在网关类型为NONE的通道上通过ERA=1接收到请求,则该请求不会存储在内部ComM ERA信号中,即该PNC请求被忽略。因此,请求不会镜像回此通道,也不会路由到任何其他通道,即请求不会设置在EIRA发射信号中。网关类型为NONE的通道忽略通过ERA信号接收的PNC请求,但它们处理通过 EIRA Rx信号接收的PNC请求。在这种情况下,目标PNC状态不受通过ERA接收的PNC请求影响,但通过EIRA=1接收的PNC请求而进行状态改变。

如上图所示,Gateway有两路CAN而且都是Active通道和PNC19,当CAN1收到NM PDU包含的PNC19为1时,即ERA更新,BswM根据PNC状态可开启PNC19相关的IPDU组,因为是Active通道并且ComMPNCGatewayEnabled = TRUE,PNC19的状态机从PNC_NO_COMMUNICATION切换到PNC_REQUESTED,同时也调用Nm_UpdateIRA()将发送的NM PDU的PNC19位置1,因为CAN1和CAN2同属PNC19,所以也调用Nm_NetworkRequest()将CAN2通道主动唤醒,开始向总线上发送PNC19为1的NM PDU。
当没收到外部请求PNC19时,PNC19状态机进入COMM_PNC_READY_SLEEP同时调用Nm_UpdateIRA()将发送的NM PDU的PNC19位置0,PNRESETTIMER超时后,PNC19状态机进入COMM_PNC_PREPARE_SLEEP,BswM根据PNC状态可停发PNC19相关的IPDU组,ComMPncPrepareSleepTimer超时后,PNC19状态机进入了COMM_PNC_NO_COMMUNICATION。

当进入PNC_REQUESTED子状态时,要发送的PNC bit置位,离开时不发送,只有主动唤醒请求才进入PNC_REQUESTED,从图上看,User主动调用ComM_RequestComMode()为FullCom或当前是网关节点配置成ERA并且是Active然后收到外部NM的PNC请求或配成ERA的通道收到请求后转发给其他是Active的通道,这些都是主动唤醒,这些都要将PNC bit置位。
如果只配成EIRA,收到外部PNC请求后,只进入COMM_PNC_READY_SLEEP并且不会转发给其他通道,要发送的PNC bit不会置位并且是被动唤醒。

如果是Active的节点配置为ERA收到外部PNC请求,则发送的PNC bit需要置1并且路由的通道是Passive时,该通道需要将PNC bit置为1.
(五)、动态PNC到通道的映射(可选)
该功能支持在运行时更新PNC网关的PNC到通道的映射关系。此更新通过所有参与节点基于请求 - 响应的学习过程实现:当在NM PDU中请求Partial Network learning时,所有参与节点会在对应通道上响应其当前的PNC成员身份,随后PNC网关据此更新当前的PNC到通道映射。
若某个PNC通过ComMChannelPerTxOnlyPnc引用至少一个通道,则ComMDynamicPncToChannelMappingSupport必须设置为FALSE,否则配置无效。配置工具应将此类配置判定为无效(错误)并拒绝。
若在ComMDynamicPncToChannelMappingEnabled设置为TRUE的通道上调用ComM_Nm_PncLearningBitIndication()函数,或当ComM在某通道上调用Nm_PnLearningRequest()时,ComM应将该通道的PNC学习阶段设置为激活状态。
若ComMDynamicPncToChannelMappingSupport设置为TRUE且调用了ComM_Nm_RepeatMessageLeftIndication()函数,ComM应将对应通道的PNC学习阶段设置为非激活状态。
若ComMPncGatewayEnabled设置为TRUE且针对某通道调用了ComM_Nm_PncLearningBitIndication()函数,则应执行以下任一操作:
当对ComMPncGatewayType设置为COMM_GATEWAY_TYPE_ACTIVE的通道调用ComM_Nm_PncLearningBitIndication()时,ComM应通过对所有已启用ComMDynamicPncToChannelMappingSupport且处于协调状态的ComM通道(主动或被动)调用Nm_PnLearningRequest()来转发学习请求。
当对ComMPncGatewayType设置为COMM_GATEWAY_TYPE_PASSIVE的通道调用ComM_Nm_PncLearningBitIndication()时,ComM应仅对ComMPncGatewayType设置为COMM_GATEWAY_TYPE_ACTIVE且启用ComMDynamicPncToChannelMappingSupport的ComM通道调用Nm_PnLearningRequest()来转发学习请求。
Partial network learning bit需转发至网络中所有节点,但即使网络拓扑存在环路,也无需反向镜像该请求(避免形成无限循环)。
若ComMPncGatewayEnabled和ComMPncDynamicMappingSupport均设置为TRUE,且PNC学习阶段处于激活状态,则ComM模块应在ComMDynamicPncToChannelMappingEnabled设置为TRUE的通道上转发接收到的ERA Rx信息。同时,ComM应根据以下规则,在所有其他ComMDynamicPncToChannelMappingEnabled设置为TRUE的通道的ERAn中设置受影响的PNC位:
当在ComMPncGatewayType设置为COMM_GATEWAY_TYPE_ACTIVE的通道上接收到Rx ERA时,应在所有其他协调通道(主动或被动)上转发。
当在ComMPncGatewayType设置为COMM_GATEWAY_TYPE_PASSIVE的通道上接收到Rx ERA时,应在所有其他ComMPncGatewayType设置为COMM_GATEWAY_TYPE_ACTIVE的通道上转发。
1、更新PNC到通道的映射
PNC网关需要能够在运行时更新其PNC到通道的映射。
若ComMPncGatewayEnabled设置为TRUE,且当PNC学习阶段处于激活状态时,在ComMDynamicPncToChannelMappingEnabled设置为TRUE的通道上,ERA中的某个PNC位被置为1,则ComM应将该通道上每个ComMPnc的PNC到通道映射置为1(其中ERA中该PNC位对应此ComMPnc被置为1)。
2、PNC成员信息转发
在PNC学习阶段,每个参与节点必须传输其当前的PNC成员身份信息。此外,PNC网关还需要转发从其他通道接收到的PNC成员身份信息。
若ComMPncGatewayEnabled设置为FALSE且PNC学习阶段处于激活状态,ComM应将当前PNC成员身份的值设置到IRA中对应的PNC位,并对所有启用ComMDynamicPncToChannelMappingSupport的ComM通道调用Nm_UpdateIRA (<通道>, )。
若ComMPncGatewayEnabled设置为TRUE且PNC学习阶段处于激活状态,ComM应针对所有启用ComMDynamicPncToChannelMappingSupport的ComM通道,调用Nm_UpdateIRA (<通道>, ),其中IRA需合并当前PNC成员身份值与需要转发的PNC相关信息。
(六)、PNC配置提示
部分网络配置必须考虑相应NM通道中NM的对应PN过滤器掩码的配置。如果使用SystemDescriptionExtract来配置BSW协议栈,并且SystemDescriptionExtract中提供了建模的部分网络,则每个NM通道的PN过滤器掩码会自动派生。派生后是否手动更改PN过滤器掩码取决于集成过程和集成限制。为支持灵活性,AUTOSAR未定义集成过程和具体限制。
1、双向PNC处理
这意味着PNC请求始终在两个方向上传输。PNC请求的处理在发送和接收时是对称的:
PNC网关行为:转发传入的(外部)PNC请求,并将其镜像回传至原通道。
非PNC网关行为:对传入的PNC请求做出响应,并根据PNC分配关系传输PNC请求。
因此,ComM会在特定PNC通过参数ComMChannelPerPnc引用的ComMChannel上,发送和处理该PNC的请求。NmIf中每个NM通道的PN过滤器掩码需通过合理配置,确保PNC位向量中接收的PNC与ComMChannel 分配的正确性。
ComM不检查接收的PNC是否与ComMChannel分配一致,原因如下:
对于EIRA更新,由于NmIf不转发ComMChannel信息,ComM无法校验PNC请求的接收通道。
对于ERA更新,虽可进行校验,但AUTOSAR规定ComM无需承担该职责。
在PNC网关和非PNC网关场景中,NM通道的PN过滤器掩码必须允许所有通过ComMChannelPerPnc引用对应ComMChannel的PNC 通过。
2、单向PNC处理
这意味着PNC请求仅在单方向上传输,其发送和接收的处理逻辑是不对称的:
PNC网关转发传入的(外部)PNC请求,但不会将其镜像回接收到PNC请求的ComMChannel。
非PNC网关在未分配给PNC的ComMChannel上传输该PNC的请求。
对于PNC网关,NM通道的PN过滤器掩码必须允许所有可在ComMChannel上接收的PNC通过,且这些PNC不通过ComMChannelPerPnc引用该ComMChannel(即不存在PNC - 通道关联)。此外,需为相应NM通道启用PNC ERA处理。对于在无PNC - 通道关联的ComMChannel上接收到的PNC请求,仅执行PNC请求的转发,不向接收该请求的ComMChannel回镜。若在存在PNC - 通道关联的ComMChannel上接收到PNC请求,则执行双向PNC处理。
PNC网关的单向PNC处理可用于以下场景:例如,当网络需要从某个PNC获取信息,但无需回传任何信息时。
对于非PNC网关,NM通道的PN过滤器掩码必须拒绝所有仅在某ComMChannel上传输的PNC。这些ComMChannel上接收到的PNC请求不应被处理,因此不应到达ComM。
非PNC网关的单向PNC处理可用于以下场景:例如,当ECU需要唤醒或保持某些功能激活而不加入该PNC时。
3、传输型PNC处理
这意味着,由于PNC协调而产生的内部PNC请求(即由接收到的PNC请求从外部触发,ERA中的PNC位被置1)将被传输。此时仅更新内部请求数组(IRA),而不请求相应的ComMChannel。引用该PNC的本地ComMUser请求将导致ComMChannel请求。这可通过适当配置实现,例如使PNC通过ComMChannelPerTxOnlyPnc引用ComMChannel。
运行时预期行为:
(1)若PNC通过ComMChannelPerTxOnlyPnc引用某ComMChannel(如 ComMChannel_A),同时通过ComMChannelPerPnc引用至少一个其他ComMChannel(如ComMChannel_B),且该PNC通过接收到的PNC请求从外部被请求(ERA 中的PNC位被置1),则相应的PNC状态机将转换为COMM_PNC_REQUESTED,所有引用的ComMChannel的IRA将被更新,ComMChannel_B的通道状态机将被请求,而ComMChannel_A的通道状态机不会被请求。
(2)若PNC仅通过引用ComMChannelPerTxOnlyPnc引用ComMChannel,且通过接收的PNC请求从外部请求该PNC(ERA中PNC位被置1),但无本地用户请求该PNC,则相应的PNC状态机和关联的ComMChannel不受影响:
PNC状态机保持在COMM_PNC_NO_COMMUNICATION,因此这些ComMChannel的IRA不更新。
引用的ComMChannel状态机不被请求。
(3)若PNC通过引用ComMChannelPerTxOnlyPnc引用某ComMChannel,且被ComMUser本地请求,则相应的PNC状态机转换为COMM_PNC_REQUESTED,该ComMChannel的IRA更新,且引用的ComMChannel状态机被请求为COMM_FULL_COMMUNICATION。
(4)若PNC通过引用ComMChannelPerTxOnlyPnc引用某ComMChannel,被ComMUser本地请求且通过接收的PNC请求从外部请求(ERA中PNC位被置1),则相应的PNC状态机转换为COMM_PNC_REQUESTED,该ComMChannel的IRA更新,且引用的ComMChannel状态机被请求为COMM_FULL_COMMUNICATION。若本地ComMUser释放该PNC请求,则ComMChannel将被释放,但只要PNC仍被外部请求,该ComMChannel的IRA中对应PNC位仍将保持为1。
(5)若PNC通过引用ComMChannelPerTxOnlyPnc引用某ComMChannel,且该ComMChannel未被其他PNC通过ComMChannelPerPnc引用,当检测到唤醒时,PNC状态机将保持在COMM_PNC_NO_COMMUNICATION。
仅传输PNC处理可用于(例如)非PNC网关,以仅请求PNC而不额外请求 NM。
仅传输PNC处理还可用于(例如)PNC网关,以在一个通道(通道 A)上接收单向PNC请求(PNC1),并在另一个通道(通道 B)上转发该PNC请求而不请求NM。在通道B上,PNC1配置为双向PNC处理,因此针对PNC1的接收PNC请求会被转发至通道A,同时考虑请求受影响的ComMChannel及相应的NM。
ComMChannelPerTxOnlyPnc引用无法从SystemDescriptionExtract中派生。PNC通过ComMChannelPerTxOnlyPnc对ComM通道的引用只能在集成阶段手动添加。
(七)、传输路径
NM协议栈对ERA和EIRA的更新机制在AUTOSAR R23-11版本后开始变的不一样,在之前的版本数据流程如下:


NM PDU里的PNC数据通过Com来进行更新,每次发送接收CanNm都会从Com里获取或保存PNC数据,ComM也是从Com将PNC数据更新或获取。
当有PNC请求时,ComM会调用Com_SendSignal()更新EIRA信号,CanNm在发送时会执行触发发送,通过PduR获取Com里的EIRA信号更新到NM PDU里再发送出去。
如果ECU属于网关节点,需要配置ERA_Rx_PDU、EIRA_Rx_PDU、EIRA_Tx_PDU,如果开发的ECU不是网关节点,只是一个终端节点,则无需配置ERA_Rx_PDU,仅配置EIRA_Rx_PDU、EIRA_Tx_PDU即可。
AUTOSAR版本更新到R23-11后,PNC数据则不需要通过Com进行传递了,CanNm先从NM PDU获取PNC数据段传给Nm,Nm则进行滤波如果有有效的PNC位则传递给ComM:
(八)、序列图
1、PNC同步关闭
(1)、顶层PNC协调器检测到需要释放PNC
当顶层协调器识别到需要释放某路PNC请求时,调用Nm_RequestSynchronizedPncShutdown()通知Nm,Nm在下个Nm_Mainfunction()里检测到有同步关闭请求则调用< Bus >Nm_ActivateTxPnShutdownMsg()激活PN关闭消息。
在< Bus >Nm里的< Bus >Nm_Mainfuntion()如果检测到PN关闭消息已激活,则调用Nm_PncBitVectorTxIndication()获取存储的PNC bit并根据NmPncBitVectorOffset和NmPncBitVectorLength在NM PDU里设置对应的PNC bit,然后将PNSR和PNI bit设置为1.如果检测到PN关闭消息已撤销,除了不将PNSR设置为1其他都和激活动作一样。
之后< Bus >Nm调用< Bus >If_Transmit()将NM PDU传出去。
发送成功后< Bus >_TxConfirmation()被调用,然后Nm_PncBitVectorTxConfirmation()也被调用通知到Nm,让Nm继续做后续操作比如撤销未完成的PNC关闭请求。
(2)、顶层PNC协调器接收到PN关闭消息

当< Bus >Nm从< Bus >If接收到PN关闭消息时,将ERA PDU中的PNC bit清零,然后调用Nm_ForwardSynchronizedPncShutdown()通知Nm,然后Nm调用ComM_Nm_ForwardSynchronizedPncShutdown()通知ComM。
ComM在ComM_Mainfunction()里识别到有PN同步关闭请求后并且没其他PNC请求后,将所有与本PNC通道相关的Active通道的请求通信模式设为No Com并且相关的ERA信号设为0,然后调用Nm_RequestSynchronizedPncShutdown()通知与本PNC关联的通道,执行完后PNC状态机从COMM_PNC_REQUESTED切换为COMM_PNC_READY_SLEEP。
Nm里则将PNSR和PNI bit置为1将消息发出去。
(九)、VFC
VFC:Virtual Function Cluster ,虚拟功能簇。SWC之间通过Port交互信息,实现一个或者多个车辆功能。需要使能某个功能时,通过特定的SWC(VFC-Controller)置位VFC #n( = 1)请求对应的通信功能,使得不同SWC之间可以交互信息,对应功能开启;如果不需要某个功能时,复位对应的VFC #n( = 0 )请求关闭通信,功能禁止。
VFC也可以关联多个PNC,VFC置位( = 1)时,对应的PNC置位( = 1),主动请求激活/保持该PNC的网络状态。
一个VFC可以映射一个PNC;
多个VFC可以映射一个PNC;
一个VFC可以映射多个PNC;
一个VFC也可以不映射PNC。
四、Channel、User、PNC映射关系
一个Channel绑定一路物理通道,即ECU上第几路网络通道,对应的下层Nm、SM第几路通道,一个PNC通道和NM PDU上的User Data的一个bit绑定,比如PNC14、PNC15,User则是ComM里的软件抽象概念,来自Swc、Rte、BswM的请求。
ComMUserPerChannel:配置ComM用户到通道的映射关系,支持多对多映射。
ComMUserPerPnc:配置ComM用户到PNC的映射关系。
ComMChannelPerPnc:配置PNC到通道的映射关系(普通PNC)。
ComMChannelPerTxOnlyPnc:配置PNC到通道的映射关系(仅发送 PNC)。
用户到通道映射:通过ComMUserPerChannel参数,可将多个ComM用户映射到一个或多个通道。
用户到PNC映射:通过ComMUserPerPnc参数,可将多个ComM用户映射到一个或多个PNC。
PNC到通道映射:通过ComMChannelPerPnc或ComMChannelPerTxOnlyPnc参数,可将PNC映射到多个通道。
每个PNC至少会和一个User一个Channel绑定,而ComM_RequestComMode()函数的第一个参数就是User,也就是某一个User请求FULL_COMM后,ComM通道状态机发生改变,绑定的PNC状态机也会跟着改变。
为什么设计多个User可以请求同一个Channel,因为考虑到一些安全机制,可以设计安全机制来限制某些User访问网络。
五、扩展功能
(一)、通信抑制
ComM支持运行时配置是否启用唤醒抑制或通信限制功能。
可通过ComM_SetECUGroupClassification()设置ComMEcuGroupClassification变量是否开启对应的功能,该变量应存在NVM里。
若ComM_DCM_ActiveDiagnostic()被即诊断激活,则通信抑制临时失效,ComM_DCM_InactiveDiagnostic()被调用则恢复抑制。
1、唤醒抑制
防止因通信唤醒其他 ECU,避免错误唤醒(如传感器故障导致误唤醒)。这时可以通过调用ComM_PreventWakeUp()阻止网络主动唤醒,忽略用户请求,从而避免系统错误。该功能只在COMM_NO_COMMUNICATION或COMM_SILENT_COMMUNICATION下有效。
被动唤醒功能始终不被抑制。
调用ComM_PreventWakeUp()后会改变ComMNoWakeup值,记录是否要唤醒,该参数应保存在NVM中。
2、通信限制
当通道状态为COMM_FULL_COM_NETWORK_REQUESTED时,可以调用ComM_LimitChannelToNoComMode()或ComM_LimitECUToNoComMode()来强制使某个通道或整个ECU所有通道切换至COMM_FULL_COM_READY_SLEEP以启动关闭流程。
若ComMResetAfterForcingNoComm为TRUE,进入COMM_NO_COMMUNICATION后调用BswM_ComM_InitiateReset()触发ECU的重启。
六、主要代码和参数描述
(一)、主要函数
1、void ComM_Init (const ComM_ConfigType* ConfigPtr)、
void ComM_DeInit (void)
对ComM的初始化和反初始化。
2、Std_ReturnType ComM_GetStatus (ComM_InitStatusType* Status)
返回ComM初始化状态。
3、Std_ReturnType ComM_GetInhibitionStatus (NetworkHandleType Channel,ComM_InhibitionStatusType* Status)
获取指定ComM通道的当前通信抑制状态。
4、Std_ReturnType ComM_RequestComMode (ComM_UserHandleType User,ComM_ModeType ComMode)
USER进行请求通信模式,只能是COMM_FULL_COMMUNICATION 或 COMM_NO_COMMUNICATION,其他的为无效请求,是内部状态机使用的模式。
5、Std_ReturnType ComM_GetMaxComMode (ComM_UserHandleType User,ComM_ModeType* ComMode)
查询指定用户当前允许达到的最高通信模式。受通信抑制功能影响。
6、Std_ReturnType ComM_GetRequestedComMode (ComM_UserHandleType User,ComM_ModeType* ComMode)
查询用户上一次调用ComM_RequestComMode()时请求的通信模式。
7、Std_ReturnType ComM_GetCurrentComMode (ComM_UserHandleType User,ComM_ModeType* ComMode)
获取当前的通信请求模式。
8、Std_ReturnType ComM_GetCurrentPNCComMode (ComM_UserHandleType User,ComM_ModeType* ComMode)
返回与指定用户相关联的PNC的当前通信模式。
9、Std_ReturnType ComM_GetPncToChannelMapping (uint8* MappingTable,uint8* ChannelCnt,uint8* PNCBitVectorLength)
用于获取PNC到通信通道的映射关系。
MappingTable:通过指针传递的数组,用于存储查询到的PNC到通道的映射关系。
ChannelCnt:通过指针传递的变量,用于存储通道的数量。
PNCBitVectorLength:通过指针传递的变量,用于存储PNC位向量的长度。
10、Std_ReturnType ComM_UpdatePncToChannelMapping (const uint8* MappingTable,uint8 channelCnt,uint8 PNCBitVectorLength)
用于动态更新PNC与通信通道之间的映射关系。
11、Std_ReturnType ComM_ResetPncToChannelMapping (void)
用于将PNC与通信通道的映射关系重置为初始配置状态。
12、Std_ReturnType ComM_PnLearningRequest (void)
用于触发PNC的学习过程。
调用后触发NM进入重复消息状态并发送部分网络学习位(Partial Network Learning Bit)和重复消息请求位(Repeat Message Request Bit)。
13、Std_ReturnType ComM_UpdatePncMembership (boolean Control,
const uint8* PncMembership)
在PNC学习阶段更新节点的PNC成员资格信息。
允许SW-C通过参数控制对当前PNC成员资格的修改,当Control参数为0时,使用逻辑与操作清除当前成员资格中除参数提供的PNC位之外的其他位;当Control参数为1时,使用逻辑或操作将参数提供的PNC位添加到当前成员资格中。
14、Std_ReturnType ComM_PreventWakeUp (NetworkHandleType Channel,boolean Status)
用于更改对应通道的唤醒抑制状态。
唤醒抑制的作用是忽略用户的COMM_FULL_COMMUNICATION,但仅在通道当前处于COMM_NO_COMMUNICATION或COMM_SILENT_COMMUNICATION状态时生效,若通道已处于COMM_FULL_COMMUNICATION状态,抑制不会激活。
受ComMEcuGroupClassification参数决定是否开启该功能。
15、Std_ReturnType ComM_LimitChannelToNoComMode (NetworkHandleType Channel,boolean Status)、
Std_ReturnType ComM_LimitECUToNoComMode (boolean Status)
用于更改特定通道的抑制状态和所有通道的抑制状态。
当该限制启用时,ComM模块会忽略该通道上所有用户对COMM_FULL_COMMUNICATION的请求,并在通道处于COMM_FULL_COM_NETWORK_REQUESTED状态时,强制其切换到COMM_FULL_COM_READY_SLEEP状态以启动关闭流程。
受ComMEcuGroupClassification参数决定是否开启该功能。
16、Std_ReturnType ComM_ReadInhibitCounter (uint16* CounterValue)
用于读取被拒绝的COMM_FULL_COMMUNICATION模式请求的数量,即获取因系统抑制通信模式而无法满足的用户请求计数。
该计数器存储在非易失性内存中,可用于检测与非必要通信总线唤醒相关的潜在软件问题。
17、Std_ReturnType ComM_ResetInhibitCounter (void)
用于重置被抑制的COMM_FULL_COMMUNICATION模式请求计数器。
18、Std_ReturnType ComM_SetECUGroupClassification (ComM_InhibitionStatusType Status)
设置ComMEcuGroupClassification参数,决定是否开启唤醒抑制和限制通信功能。
19、void ComM_Nm_NetworkStartIndication (NetworkHandleType Channel)
被Nm调用告知在总线休眠模式下收到了NM消息,这意味着网络中一些节点已进入网络模式。
20、void ComM_Nm_NetworkMode (NetworkHandleType Channel)、
void ComM_Nm_PrepareBusSleepMode (NetworkHandleType Channel)、
void ComM_Nm_BusSleepMode (NetworkHandleType Channel)
被Nm调用,告知对应的网络已进入网络模式、预睡眠模式、睡眠模式。
21、void ComM_Nm_RestartIndication (NetworkHandleType Channel)
被Nm调用告知在协调总线的关闭过程中,至少有一个协调总线上的NM已重启。
当Nm已开始关闭协调总线,但并非所有协调总线都已指示总线休眠状态,且至少有一个协调总线上的NM重启时,Nm会调用该函数。
22、void ComM_Nm_RepeatMessageLeftIndication (NetworkHandleType Channel)
被Nm调用告知所有 Nm 已退出重复消息状态。
该接口用于可选的动态PNC-to-channel-mapping功能,以指示学习阶段结束。
23、void ComM_Nm_PncLearningBitIndication (NetworkHandleType Channel)
被Nm调用告知已收到带有设置的PNC学习位(PNC Learning Bit)的NM消息。
当ComMPncGatewayEnabled为TRUE且该函数被调用时,ComM会根据通道的ComMPncGatewayType,将学习请求转发到相应的协调通道,以支持PNC学习阶段的信息交互。
24、void ComM_Nm_ForwardSynchronizedPncShutdown (NetworkHandleType Channel,const uint8* PncBitVectorPtr)
当作为中间PNC协调器的ECU收到Nm模块的PNC关闭消息时,调用该函数转发同步关闭请求,确保相关PNC节点协调关闭。
促使处于COMM_PNC_REQUESTED状态的PNC状态机释放,并将关闭请求转发至相关通道,实现PNC拓扑中从顶层协调器到下属节点的近似同步关闭,避免应用层超时。
25、void ComM_Nm_UpdateEIRA (const uint8* PncBitVectorPtr)
用于接收Nm模块传递的内部和外部PNC请求汇总状态的PNC位向量,以更新ComM模块的EIRA信息。
26、void ComM_Nm_UpdateERA (NetworkHandleType Channel,const uint8* PncBitVectorPtr)
用于接收Nm模块传递的特定通道的外部PNC请求信息,以更新ComM模块的ERA信息。
27、void ComM_DCM_ActiveDiagnostic (NetworkHandleType Channel)、
void ComM_DCM_InactiveDiagnostic (NetworkHandleType Channel)
当DCM启动诊断会话时调用该函数,向ComM模块指示当前有活跃的诊断需求。或者诊断会话不激活。
28、void ComM_EcuM_WakeUpIndication (NetworkHandleType Channel)
用于通知ComM模块,EcuM检测到对应通道的唤醒事件已通过验证。
若配置参数ComMSynchronousWakeUp设为TRUE,且相关PNC引用了至少一个ComMChannel,调用该函数会使PNC从COMM_PNC_NO_COMMUNICATION状态切换到COMM_PNC_PREPARE_SLEEP子状态;若ComMSynchronousWakeUp设为FALSE,则PNC状态保持不变,直到收到PNC请求。
29、void ComM_EcuM_PNCWakeUpIndication (PNCHandleType PNCid)
用于ComM模块,EcuM检测到特定PNC的唤醒事件已通过验证.
若相关PNC引用了至少一个ComMChannel,调用该函数会使对应PNC从COMM_PNC_NO_COMMUNICATION状态切换到COMM_PNC_PREPARE_SLEEP子状态,并启动ComMPncPrepareSleepTimer。
30、void ComM_CommunicationAllowed (NetworkHandleType Channel,boolean Allowed)
是由EcuM或BswM调用的回调函数,用于向ComM模块指示通信是否被允许。
31、void ComM_BusSM_ModeIndication (NetworkHandleType Channel,ComM_ModeType ComMode)
总线状态管理器模块向ComM指示实际总线模式的回调函数。
32、void ComM_BusSM_BusSleepMode (NetworkHandleType Channel)
总线状态管理器模块向ComM指示总线已进入休眠模式的回调函数。
33、void ComM_MainFunction (void)
周期任务。
(二)、主要配置
1、ComMNmVariant
FULL:该通道具备网络管理模块的所有功能。
LIGHT:该通道不具有网络管理模块,因此不会接收或发送网络管理报文。但可以通过配置定时器,在没有通信需求的一段时间以后自动进入休眠状态。
NONE:该通道不具有网络管理模块,因此不会接收或发送网络管理报文。一旦进入FULL_COM模式就不会退出,也不会自动进入休眠状态,只有通过 ECU 电源才能控制网络关闭。
PASSIVE:该通道的网络管理模块处于 PASSIVE 模式,即本身只接收网络管理报文,但不向外发送网络管理报文。本 ECU 不具备保持总线唤醒的能力,但可以根据其他 ECU的网络管理报文,向 ComM 模块指示进入网络同步休眠状态。
2、ComMTMinFullComModeDuration
用于设置COMM_FULL_COMMUNICATION状态下COMM_FULL_COM_NETWORK_REQUESTED子状态的最小持续时间,单位为秒。
在系统初始化完成进入ComM后,总线默认处于不能进行任何通信活动的状态,需请求进入Full Communication模式才能通信 。在该过程中,ComMTMinFullComModeDuration的ComM模块定时器可防止在COMM_NO_COMMUNICATION和COMM_FULL_COMMUNICATION之间频繁切换.
2、ComMPncPrepareSleepTimer
PNC状态机进入COMM_PNC_PREPARE_SLEEP的时间。
(三)、NVM存储
ComMNoWakeup、ComMEcuGroupClassification、inhibition status、Inhibit counter、PNC-to-channel Mapping、PNC membership可以保存到非易失存储器中,在下次上电后恢复。需要在NvM模块配置这几个 Block。
七、DaVinci Configurator主要配置
(一)、ComMGeneral

Pnc Prepare Sleep Timer[s]:
PNC状态机应在COMM_PNC_PREPARE_SLEEP中等待的时间。
Pnc Support:
启用或禁用PNC功能。
Reset After Forcing No Comm:
使能后,如果因为触发通信限制功能后进入No Communication,则ComM会调用BswM_ComM_InitiateReset()进行复位。
Synchronized Pnc Shutdown Enabled:
是否启用PNC同步关闭功能,此功能仅能为处于Top-Level-PNC-Coordinator或intermediate PNC coordinator角色的ECU启用,不能为subordinated (or leaf) 节点启用。只有当PNC网关使能时才能启用此功能。
Synchronous Wake Up:
如果使能,一个通道的唤醒将导致所有通道的唤醒。
Wakeup Inhibition Enabled:
是否使能唤醒抑制功能。
(二)、ComMConfigSet
1、ComMChannel



Bus Type:
ComM通道的类型。
Manage Reference:
此参数可以选择管理通道。
No Com:
通信限制功能是否启用。
No Wakeup:
唤醒抑制功能是否启用。
Pnc Gateway Type:
定义pnc网关类型。
User Channel:
对与此通道用户对应的ComMUser的引用。
Nm Light Timeout[s]:
仅在将ComMNmVariant配置为ComMLight时使用,定义离开COMM_FULL_COMMUN ICATION子状态COMM_FUL L_COM_READY_SLEEP的超时时间。
Nm Variant:
定义网络管理的功能。
Pnc Nm Request:
如果为TRUE,则每次由于PNC状态机更改为COMM_PNC_REQUESTED而请求Full Communication时,都会调用Nm_NetworkRequest()。仅PNC功能开启时使用。
ComM里的通道对应Nm里的通道则需要在Nm里进行引用:
2、ComMUsers:
此处定义ComM里的User。
3、ComMPncs:
Pnc Id:
PNC标识号。
Channel Per Pnc:
对这个PNC所需的ComMChannel的引用。
User Per Pnc:
这个PNC对应的ComMUsers的引用。
八、使用范例
无。
九、参考资料
AUTOSAR_CP_SWS_CANInterface
AUTOSAR_CP_SWS_CANStateManager
AUTOSAR_EXP_LayeredSoftwareArchitecture
AUTOSAR_FO_PRS_NetworkManagementProtocol
AUTOSAR_FO_TR_Glossary
AUTOSAR_FO_RS_NetworkManagement
AUTOSAR_CP_SWS_COMManager
AUTOSAR_CP_EXP_ModeManagementGuide
AUTOSAR_CP_SWS_NetworkManagementInterface
AUTOSAR_CP_SWS_CANNetworkManagement
AUTOSAR_CP_SWS_CANTransceiverDriver
AUTOSAR_CP_EXP_VFB
AUTOSAR_CP_SWS_RTE
AUTOSAR_CP_SRS_ModeManagement
AUTOSAR_CP_EXP_ModeManagementGuide
AUTOSAR_CP_SWS_BSWModeManager
TechnicalReference_ComM
ISO17356
can2.0
can_fd_spec
总结
本文文字描述多点,更像是本人的使用笔记,仅供参考,如有不对地方欢迎指教。
更多推荐



所有评论(0)