4. 诊断通信参数配置

在ETAS AUTOSAR诊断栈中,UDS协议能否稳定工作,很大程度上取决于一组时间参数的配合。这些参数分布在诊断栈的不同层次:P2、P2*、S3属于UDS会话层的时间约束,由诊断应用和Dcm模块共同管理;N_As、N_Ar、N_Bs、N_Br、N_Cs、N_Cr则属于ISO-TP传输层的时间参数,由CanTp模块控制。理解它们的定义、配置位置和相互影响,是诊断集成工程中最容易出错也最值得投入精力的部分。

一、UDS会话层时间参数:P2、P2*与S3

P2(P2Server)定义的是诊断服务器从收到完整请求到发出首个响应字节的最大允许时间。在ETAS诊断栈中,它对应Dcm模块的DcmDspSessionP2ServerMax参数,单位通常为毫秒。如果ECU在该时间内没有开始响应,Tester会认为请求超时。P2*(P2Server*)则用于增强型诊断会话或需要更长处理时间的场景,例如刷写前的擦除操作,它允许服务器先发送一个否定响应0x78(requestCorrectlyReceived-ResponsePending),然后延长等待窗口。Dcm中通过DcmDspSessionP2StarServerMax配置该值。

S3是Tester端参数,表示诊断会话在无请求情况下保持活动状态的最长时间。ECU侧对应的配置是DcmDspSessionTimeout,通常设为5000ms。如果Tester在S3超时前没有发送新的请求,ECU会退出当前非默认会话,回到默认会话。这个参数直接影响诊断仪在长时间操作中的会话保持策略。

这三个参数的关系可以用一个简单的例子说明:假设P2=50ms,P2*=5000ms,S3=5000ms。Tester发送10 03(进入扩展会话),ECU必须在50ms内回复50 03。如果ECU需要更长时间准备,可以先回复7F 10 78,然后Tester将等待窗口切换到P2*,即5000ms。在此期间,Tester必须持续发送3E 80(TesterPresent)来维持会话,否则S3超时后会话自动回退。

二、ISO-TP传输层时间参数:N_As、N_Ar、N_Bs、N_Br、N_Cs、N_Cr

当诊断报文超过单帧容量(经典CAN为8字节,CAN FD为64字节)时,CanTp模块负责分段传输。六个网络层时间参数分别约束发送方和接收方的行为:

  • N_As:发送方从请求发送到实际发出帧的最大时间,约束CanTp向CanIf提交发送请求后的等待。
  • N_Ar:接收方从收到帧到发出流控帧的最大时间,约束接收端CanTp的处理速度。
  • N_Bs:发送方发出首帧后等待流控帧的最大时间,超时则中止传输。
  • N_Br:接收方发出流控帧后等待下一个连续帧的最大时间。
  • N_Cs:发送方发出连续帧后等待下一个流控帧或确认的时间。
  • N_Cr:接收方收到连续帧后等待下一个连续帧的最大时间。

在ETAS诊断栈中,这些参数通过CanTp模块的配置容器CanTpChannel下的CanTpNas、CanTpNar、CanTpNbs、CanTpNbr、CanTpNcs、CanTpNcr进行设置,单位通常为毫秒。典型值参考ISO 15765-2:N_As=1000ms,N_Ar=1000ms,N_Bs=1000ms,N_Br=0ms(接收方立即发送流控帧),N_Cs=0ms,N_Cr=1000ms。实际工程中需要根据总线负载和ECU处理能力调整。

UDS诊断时间参数在ETAS诊断栈中的分布与约束关系 Tester(诊断仪) UDS应用层 P2 / P2* / S3 ISO-TP发送 N_As / N_Bs / N_Cs ISO-TP接收 N_Ar / N_Br / N_Cr CAN驱动 CanIf / Can ECU(诊断栈) Dcm P2 / P2* / S3 CanTp发送 N_As / N_Bs / N_Cs CanTp接收 N_Ar / N_Br / N_Cr CAN驱动 CanIf / Can CAN / CAN FD 总线 P2 / P2* 约束:请求 → 首个响应字节 P2超时 → Tester报错;P2*用于0x78挂起后延长等待 S3:无请求时保持会话的最大空闲时间 N_Bs / N_Br:首帧 ↔ 流控帧 发送方等流控帧(N_Bs);接收方发流控帧后等下一帧(N_Br) N_Cs / N_Cr:连续帧 ↔ 流控帧/下一连续帧 发送方发连续帧后等流控帧(N_Cs);接收方等下一连续帧(N_Cr) N_As / N_Ar:帧提交到总线发送/接收确认的最大时间 Tester侧 ECU侧 总线 UDS会话层约束 ISO-TP流控约束 ISO-TP连续帧约束

三、参数之间的耦合关系与配置影响

这些参数并非孤立存在。一个常见的集成问题是:P2设置过短而N_Bs设置过长,导致Tester在等待流控帧时已经触发P2超时。例如,若P2=50ms,而N_Bs=1000ms,当ECU需要发送多帧响应时,Tester发出请求后50ms内没有收到任何响应字节,就会报P2超时,尽管ECU的CanTp仍在等待流控帧。正确的做法是确保P2 ≥ N_Bs + N_Ar + 处理时间,或者让ECU在P2内先回复0x78,将等待窗口切换到P2*。

另一个典型问题是S3与TesterPresent的配合。如果S3=5000ms,而Tester的3E 80发送周期为2000ms,则会话可以稳定保持。但如果总线负载导致3E 80的发送被延迟超过5000ms,ECU会退出扩展会话,后续的诊断请求将收到7F 10 7E(服务不支持于当前会话)。在ETAS诊断栈中,可以通过Dcm的DcmDspSessionTimeout和CanTp的CanTpNcr联合调整来缓解这类问题。

四、ETAS诊断栈中的配置示例

以下是一个典型的CanTp通道配置片段,用于经典CAN上的诊断传输:

CanTpChannel:
  CanTpNas = 1000   // ms, 发送方帧提交超时
  CanTpNar = 1000   // ms, 接收方流控帧发出超时
  CanTpNbs = 1000   // ms, 等待流控帧超时
  CanTpNbr = 0      // ms, 流控帧后立即等待
  CanTpNcs = 0      // ms, 连续帧后立即等待
  CanTpNcr = 1000   // ms, 等待下一连续帧超时
  CanTpMaxFrameLength = 8
  CanTpAddressingMode = NORMAL

对应的Dcm会话配置:

DcmDspSessionP2ServerMax = 50      // ms
DcmDspSessionP2StarServerMax = 5000 // ms
DcmDspSessionTimeout = 5000         // ms, S3

在实际项目中,建议先用CANoe或ETAS INCA记录一次完整的诊断交互,观察每个时间参数的实际余量。如果发现N_Cr频繁超时,说明接收方处理连续帧的速度不足,可以适当增大N_Cr或降低连续帧的发送速率(通过流控帧的STmin字段控制)。如果P2*经常被触发,则需要检查ECU的诊断处理任务周期是否过长,或者Dcm的响应优先级是否被其他任务阻塞。

在ETAS ISOLAR-AB中配置这些参数时,CanTp和Dcm的参数分别位于不同的配置容器中。修改后需要重新生成代码并刷新ECU,建议在台架上先用诊断仪验证单帧和多帧场景下的超时行为,再接入整车网络。

五、参数配置检查要点

参数所属模块典型值超时后果
P2Dcm50msTester报P2超时,请求失败
P2*Dcm5000ms0x78挂起后仍超时,传输中止
S3Dcm5000ms会话回退到默认会话
N_AsCanTp1000ms发送方帧提交失败
N_ArCanTp1000ms接收方流控帧发出失败
N_BsCanTp1000ms首帧后未收到流控帧,传输中止
N_BrCanTp0ms流控帧后未及时等待,通常不超时
N_CsCanTp0ms连续帧后未及时等待,通常不超时
N_CrCanTp1000ms连续帧接收超时,传输中止

最后需要强调的是,这些时间参数的最优值取决于具体的总线速率、ECU处理能力和诊断数据长度。在CAN FD场景下,由于单帧可承载64字节,多帧传输的概率降低,N_Bs、N_Cr等参数的触发频率会明显下降,但P2和S3仍然需要根据诊断服务的实际处理时间来设定。建议在项目早期就建立一份时间参数基线表,并在每次诊断栈升级或总线负载变化后重新验证。