ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

[AUTOSAR][诊断管理][ECU][$28] 通信控制

[AUTOSAR][诊断管理][ECU][$28] 通信控制 文章目录一、简介二、 应用场景三、通信控制基本原理四、服务请求请求格式请求实例服务响应正响应格式负响应NRC支持五、常见Bug大揭秘六、示例代码28_comm_ctl.c一、简介根据ISO14119-1标准中所述诊断服务28服务主要用于网络中的报文发送与接受比如控制应用报文的发送与接收又或是控制网络管理报文的发送与接收以便满足一定场景下的应用需求。下列文中使用到的Client可直接理解为上位机TesterServer可直接理解为接受Tester诊断请求的ECU。二、 应用场景一般而言对于28诊断服务主要应用场景为以下场合存在某些特殊的测试场景比如只希望接收或者发送对应的网络管理与应用报文绝大多数情况下应用在刷写ECU的过程中即在预编程条件下执行28服务功能寻址便可以抑制总线应用报文与网络管理报文的发送与接收以便减少网络总线负载提高ECU下载效率同时刷写结束后也要执行28服务使能对应控制报文的发送与接收在此过程中一般会配合85服务一起使用。三、通信控制基本原理如下图1所示针对28服务的通信控制过程会经过如下几个AUTOSAR BSW模块进行处理然后完成最终的通信控制具体步骤如下Tester发送28通信控制服务请求给到ServerServer会将该诊断报文请求传递至DCM模块DCM模块调用28服务对应的上层应用函数首先进行输入参数的基本校验校验无误之后然后传递相关控制模式请求至BswM模块BswM模块根据静态配置的规则来实现对应请求中的通道通信状态控制(常见的模式控制为3X4 12种)如下表1所示列举出了常见的12种的通信控制模式如下图1所示为28通信控制的原理图可以看到28诊断服务经过DCMBswMComNM完成整个上述12种通信模式的控制。其中蓝色表示的部分为最终完成通信控制的函数体。四、服务请求服务请求是Client发送给到Server的诊断服务指令。请求格式按照ISO14229-1标准所述如下图2所示为28服务诊断请求格式即上述通信控制原理中诊断服务请求格式值得注意的是28服务诊断请求中的nodeIdentificationNumber仅在subFunction等于4或者5才有效否则#4#5参数可以不存在。下图3中各参数解释如下如下图4所示为上述subfunction(control Type)中的各项取值的具体含义如下图5所示为communicationType的各项取值具体含义请求实例以抑制网络管理报文发送为例28服务诊断请求实例如下图6所示以控制远程特定地址节点进入仅诊断模式为例节点地址为0x00 0A, 28服务诊断请求示例如下关于控制控制远程特定地址节点进入正常工作模式这里就不一一列举具体message Flow可参考ISO14229-1规范。服务响应服务响应是针对Client对Server诊断请求的响应。正响应格式如下图8所示为28诊断服务的正响应格式从上图中可以看出28诊断服务的正响应由以下三个部分组成Response ID该参数固定为SID0x40 0x68SubFunction该参数为上述诊断请求格式中controlType;正响应实例抑制网络管理报文发送如下图9所示为上述28 01 02请求示例所对应的正响应其中0x01就是跟诊断请求中的controlType保持一致即可。控制远程特定地址节点进入仅诊断模式如下图10所示则为上述28 04 01 00 0A的所对应的正响应。负响应NRC支持绝大多数情况下Server针对Client的请求都会给到正响应比如发生重启前需确保整车处于安全状态如引擎熄火车速不能超过3km/h等或者为了防止不按照诊断请求格式进行请求那么Server需要通过某种方式来告诉Client执行不成功的原因在哪里以便于调查问题直至得到正响应。因此ISO14229-1针对所有的诊断服务提供了一种统一的诊断负响应的诊断格式7F SID NRC。其中NRC全称为Negetive Responce Code每个NRC具有唯一的含义来代表当前诊断请求错误的原因所在。当然每个诊断服务支持的NRC不尽相同具体支持的NRC需要参考ISO14229-1标准文档对于27服务而言支持的NRC如下表2当诊断请求的subfuntion不在Server支持的范围内时则Server会回复”7F 28 12“当发送报文长度或者格式不对时则Server会回复7F 28 13例如当尝试请求复位时且当前车速条件不满足此时Client发送诊断指请求时Server将会回复“7F 28 22”来告诉请求者当前进入编程会话的条件不满足请再次检查进入编程会话的条件。当communicationType与nodeIdentificationNumber均超出规定的范围时则Server会回复“7F 28 31”五、常见Bug大揭秘对于从事过UDS开发的小伙伴可能会发现其实针对每个服务的Bug都是有迹可循的万变不离其宗绝大多数问题都是由于针对需求理解不清晰或者其他人为因素导致的问题。因此为了方便大家能够在工作过程中能够快速找到问题症结所在特将了解到的常见28服务Bug分享给到大家当然具体问题还是要具体分析这里所列出的只是比较典型且出现错误次数较多的Bug仅供参考。六、示例代码28_comm_ctl.c/******************************************************************************** * file 28_comm_ctl.c * author jianqiang.xue * version V1.0.0 * date 2023-05-30 * brief 通信控制 ********************************************************************************//* Includes ------------------------------------------------------------------*/#includestdint.h#includestdbool.h#includestring.h#includestdlib.h#includemodules.h#includeos_api.h#includeedebug.h#includekv_sys.h#includeecu_ble_uart.h/* Private includes ----------------------------------------------------------*/#includestd_math.h#includeapp_can.h#includecan_nm.h#includeapp_nm.h#includediag_main.h/* Private define ------------------------------------------------------------*/#defineUDS_ID0x28/* Private typedef -----------------------------------------------------------*//* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*//***************软定时器创建***************//* Private func --------------------------------------------------------------*/voiduds28_main(nwl_msg_t*p){uint8_treq_type0;// 0-使能接收和发送 1-使能接收和禁止发送 2-禁止接收和使能发送 3-禁止接收和禁止发送uint8_tdata[10];if(p-len!3){LOGE(len err ! 3);send_nrc_data(UDS_ID,NRC_INCORRECT_MESSAGE_LENTH);gotoend;}req_typep-data[1]0x7F;if(req_type3){LOGE(Unsupported,sub:%02x,p-data[1]);send_nrc_data(UDS_ID,NRC_SUBFUNCTION_NOT_SUPPORTED);gotoend;}if((g_car_ste.IPB.bit.VehicleSpeedVld1)(get_car_speed()3)){send_nrc_data(UDS_ID,NRC_CONDITION_NOT_CORRECT);gotoend;}if(p-data[2]3){LOGE(Unsupported,sub2:%02x,p-data[2]);send_nrc_data(UDS_ID,NRC_REQUEST_OUT_OF_RANGE);gotoend;}LOGI(%x,%x,get_nm_msg_tx_ste(),get_nm_msg_rx_ste());switch(p-data[2]){// 应用报文case0x01:switch(req_type){case0x00:app_can_tx_msg_ctrl(CTL_BY_DIAG_SRV,0);app_can_rx_msg_ctrl(CTL_BY_DIAG_SRV,0);break;case0x01:app_can_tx_msg_ctrl(CTL_BY_DIAG_SRV,1);app_can_rx_msg_ctrl(CTL_BY_DIAG_SRV,0);break;case0x02:app_can_tx_msg_ctrl(CTL_BY_DIAG_SRV,0);app_can_rx_msg_ctrl(CTL_BY_DIAG_SRV,1);break;case0x03:app_can_tx_msg_ctrl(CTL_BY_DIAG_SRV,1);app_can_rx_msg_ctrl(CTL_BY_DIAG_SRV,1);break;}break;// 网管报文case0x02:switch(req_type){case0x00:can_nm_msg_tx_en();can_nm_msg_rx_en();break;case0x01:can_nm_msg_tx_disa();can_nm_msg_rx_en();break;case0x02:can_nm_msg_tx_en();can_nm_msg_rx_disa();break;case0x03:can_nm_msg_tx_disa();can_nm_msg_rx_disa();break;}break;// 网管报文和应用报文case0x03:switch(req_type){case0x00:can_nm_msg_tx_en();can_nm_msg_rx_en();app_can_tx_msg_ctrl(CTL_BY_DIAG_SRV,0);app_can_rx_msg_ctrl(CTL_BY_DIAG_SRV,0);break;case0x01:can_nm_msg_tx_disa();can_nm_msg_rx_en();app_can_tx_msg_ctrl(CTL_BY_DIAG_SRV,1);app_can_rx_msg_ctrl(CTL_BY_DIAG_SRV,0);LOGI(%x,%x,get_nm_msg_tx_ste(),get_nm_msg_rx_ste());break;case0x02:can_nm_msg_tx_en();can_nm_msg_rx_disa();app_can_tx_msg_ctrl(CTL_BY_DIAG_SRV,0);app_can_rx_msg_ctrl(CTL_BY_DIAG_SRV,1);break;case0x03:can_nm_msg_tx_disa();can_nm_msg_rx_disa();app_can_tx_msg_ctrl(CTL_BY_DIAG_SRV,1);app_can_rx_msg_ctrl(CTL_BY_DIAG_SRV,1);break;}break;default:break;}if(p-data[1]0x80){// 子功能bit7为应答位。 1则不允许应答// 应用无需应答}else{// 回复正响应码 单帧格式: len, 服务ID|0x40, 子功能ID,data[0]2;// 数据总长度数据长度服务号data[1]UDS_ID|0x40;// 服务号回复上位机需要 |0x40data[2]p-data[1];memset(data[3],0xAA,5);app_can_enqueue_msg(CAN_MSG_EVENT_SEND,NWL_RES_ADDR,data,8);}g_p2_service_time_remaining0;// 如果发送诊断报文则清除倒计时。P2_SERVER_MAXend:return;}#ifAUTOSAR_DIAG_SWITCHUSE_UDS_28DIAG_SERVICE_REG(UDS_ID,DIAG_NO_SECURITY_LEVEL,(EXTENDED_SESSION),(DIAG_PHYS_REQ|DIAG_FUNC_REQ),NULL,NULL,uds28_main);#endif
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进