UDS(ISO14229 - 1)-0x10(Session Control,诊断会话控制)
文章目录
DiagnosticSessionControl (0x10) service服务描述
诊断会话控制服务用于在服务器中启用不同的诊断会话。UDS中所有的服务都是基于诊断会话控制执行的,这就意味着你只能在某一种诊断会话下面进行其他的诊断服务。诊断会话在服务器中启用一组特定的诊断服务和/或功能。
服务器中应始终只有一个诊断会话处于活动状态,服务器在通电时应始终启动默认诊断会话(default session-10 01)。如果未启动其他诊断会话,则只要服务器通电,默认诊断会话就会运行。如果客户端请求了一个已经在运行的诊断会话,那么服务器应发送一条肯定的响应消息,其行为如图 1所示,该图描述了在会话之间转换时的服务器内部行为。会话之间的转换应当保持以下几个原则:
- 每当客户端请求新的诊断会话时,服务器应在服务器中激活新会话的计时之前发送 positive response 消息。
- 在某些情况下(暂时还不清楚,了解了再更新),可能需要在发送肯定响应之前进入新会话,同时保持发送响应的旧协议计时。
- 如果服务器无法启动请求的新诊断会话,则它应响发送negative response消息,并且继续当前会话。
- 在切换到任何非默认诊断会话(除了切换到编程会话)时,需保持默认会话的诊断功能也可用。
- 当服务器从默认会话转换到除默认会话以外的任何其他会话时,则服务器应初始化诊断会话并且通过stopResponseOnEvent(0x86) 服务停止在服务器中配置的事件。
表 1定义了在默认会话和非默认会话(定时服务)下所支持的诊断服务。任何非默认会话都会绑定到诊断会话计时器(计时器超过一定的时间便会切回到默认会话),客户端必须保持活动状态。
注意表中的×表示支持,而不是不支持的意思
请求服务格式
在了解了10服务所表述的意思后,下一步就是学会怎样发一条10服务的诊断请求,在这之前我们必须学习一下请求服务的格式:
服务的请求采用的是十六进制的数来表示,首先第一个数字就是SID,即Service ID-10
第二个数字跟着10服务的子服务,这里常用的有0x01(默认会话)、0x02(编程会话)以及0x03(扩展会话)
回复请求格式
Positive Response
这里需要知道的是一般positive response的SID = 请求服务ID + 40,那么在这里请求服务ID为10,那它的positive response的SID就是0x50。第二位仍然是前面讲到的子服务也就是0x01 或者 0x02等等。3到6位实际上是跟的一些服务器与客户端之间的一些传输时间参数,这里先了解就行,后面有时间会针对这个用一篇文章做一个具体的解释。
Negative Response
Negative Response 的SID使用0x7F表示,这是由协议统一规定的,任何服务的负响应的SID都为0x7F。第二位则为请求服务的SID,在这里就是0x10(不同的服务对应不同的SID),第三位则是NRC(negative response codes),NRC会记录具体的出错原因,下表为10服务可能发生错误的原因:
这里用一个在CANoe里面例子来展示以下真实情况下的Negative response,在这里请求消息为10 02 01,实际上10服务的请求长度为2,这里多加了一位01,所以反馈的NRC为13,表示不正确的消息长度。
以上就是10服务的总结了,如果有什么遗漏的地方或者理解错误可以帮博主留下评论,欢迎大家指正!