CAPL完成诊断服务0x10测试的两种方式

一、测试内容

0x10诊断会话控制服务所要求的测试内容可以参见以下博客:

https://mp.csdn.net/mp_blog/creation/editor/130293858

考虑到测试工具问题,由于有些开发者有相对齐全的vector公司配套工具,而有些么得。其实这里最主要的就是有没有candelastudio的问题,那么的话本文将采用两种方式进行测试:第一种是基于dela制作好的CDD文件、第二种是无需CDD文件的

二、基于CDD文件完成诊断0x10服务测试

   使用CDD文件的好处是CDD文件已经定义好各个服务,只需在capl当中引用相应名称,定义相应的测试case就可以轻松利用canoe中已经封装好的合适的capl函数完成测试任务。

1、需要用到的一些封装好的函数介绍,也是完成测试的核心

        - diagSendRequest 用于发送诊断物理寻址请求给目标ECU

        - diagSendFunctional 用于发送诊断功能寻址请求给目标ECU

        - testReportWriteDiagObject 将发送的诊断请求写入测试报告

        - testReportWriteDiagResponse 将得到的诊断响应写入测试报告

        - testWaitForDiagResponse 等待诊断响应

        - diagGetLastResponseCode 得到上一次诊断请求响应返回码

                  -1为肯定响应,0为否定响应,> 1为否定(NRC)

        - diagResize 设置诊断请求的长度

        - diagSetSuppressResp 设置禁止肯定响应位

        - DiagSetPrimitiveByte 设置诊断请求中某个byte的值

2、下面是代码部分

     i 变量定义部分      

includes
{}variables
{//根据CDD定义请求格式diagRequest XXX.DefaultSession_Start Default_Session; //XXX代表CDD的名字diagRequest XXX.ProgrammingSession_Start Pragramming_Session;diagRequest XXX.ExtendedDiagnosticSession_Start Extend_Session;//定义响应码enum NRCType{Positive = 0x00, NoRes = 0x01, NRC11 = 0x11,NRC12 = 0x12,NRC13 = 0x13, NRC21 = 0x21, NRC22 = 0x22, NRC24 = 0x24, NRC31 = 0x31, NRC33 = 0x33, NRC35 = 0x35, NRC36 = 0x36,NRC37 = 0x37, NRC70 = 0x70, NRC71 = 0x71, NRC72 = 0x72,NRC73 = 0x73, NRC78 = 0x78, NRC7E = 0x7E , NRC7F = 0x7F };
}

    ii 物理寻址诊断请求响应处理:

//Diagnostic response Check
long Diag_response_check(diagRequest * req, enum NRCType eNRCType)
{long retval ;diagSendRequest(req);testWaitForTimeout(1);testReportWriteDiagObject(req);retval = testWaitForDiagResponse(req,5000);  testReportWriteDiagResponse(req);switch(retval){case 0:if(eNRCType == NoRes){testStepPass("TestPass"," No Response received");}else{retval = -1;testStepFail("TestFail","No answer from ecu");}break;case 1:  // response receivedif(eNRCType ==NoRes){retval = -1;testStepFail("TestFail","Except No response but Positive received");}else{if(diagGetLastResponseCode(req)==-1){// A negative response was receivedif(eNRCType == Positive){testStepPass("TestPass","Excepted positive received");}else{retval = -1;testStepFail("TestFail","Positive was received when except response was negtive code NRC == 0x%.2x",eNRCType);}}else{// A negative response was receivedif(eNRCType == Positive){retval = -1;testStepFail("TestFail","Negative response received with NRC == 0x%.2x but except was Positive response",(byte)diagGetLastResponseCode(req));}else if(eNRCType == (byte)diagGetLastResponseCode(req)){testStepPass("TestPass","Excepted NRC == 0x%.2x received", eNRCType);}else{retval = -1;testStepFail("TestFail","Wrong NRC == 0x%.2x received but excepted NRC == 0x%.2x",(byte)diagGetLastResponseCode(req),eNRCType);}}} break;case -92:testStepFail("TestFail","There was an error on TP level! Error code received = %i.",retval);break;case -94:testStepFail("TestFail","Diagnostics was not initialized for the node! Error code received = %i.",retval);break;case -96:testStepFail("TestFail","Function not implemented yet! Error code received = %i.",retval);break;default: // internal or setup errorTestStepFail("TestFail","An internal error occurred! Error code received = %i.", retval);}return retval;}

iii 功能函数

void Diag_Session_Switch(diagRequest * req, enum NRCType eNRC)
{if(eNRC == Positive){//session switch testCaseComment("Diagnostic Session Switch to Default session");Diag_response_check(req,eNRC); }else if(eNRC == NRC13){diagResize(req,3);Diag_response_check(req,NRC13);diagResize(req,1);Diag_response_check(req,NRC13);diagResize(req,2);}else if(eNRC == NRC12){DiagSetPrimitiveByte(req, 1, 0x00);}else(eNRC == ...){//看需求做需要测的NRC的发送条件}}

  iV 一个简单case

testcase service_0x10_Phy()
{Diag_Session_Switch(Default_Session,Positive); Diag_Session_Switch(Pragraming_Session,Positive);}
void MainTest()
{service_0x10_Phy();
}

V 要完成功能寻址,只需将ii中diagSendRequest(req) 替换成 diagSendFunctional(req)即可;

   想要设置禁止肯定响应位只需在iii 中加一行diagSetSuppressResp(req, 1)即可,是不是贼简单。

   三、 要不用CDD完成测试,该怎么做呢,当然是用 on message了

          懒得分段写了,一段写完算了,哈哈哈

         

includes
{}
variables
{message 0x770 Diag_Request_phy;message 0x7DF Diag_Request_Fun;message 0x780 Diag_Response;enum NRCType{Positive = 0x00, NoRes = 0x01, NRC11 = 0x11,NRC12 = 0x12,NRC13 = 0x13, NRC21 = 0x21, NRC22 = 0x22, NRC24 = 0x24, NRC31 = 0x31, NRC33 = 0x33, NRC35 = 0x35, NRC36 = 0x36,NRC37 = 0x37, NRC70 = 0x70, NRC71 = 0x71, NRC72 = 0x72,NRC73 = 0x73, NRC78 = 0x78, NRC7E = 0x7E , NRC7F = 0x7F };int Session_Flag;int Response_Data[4];
}void Initial_response_Data()
{int i;for(i=0; i<4; i++)Response_Data[i] = 0; 
}on message 0x6D5
{if(this.byte(1) == 0x50&&Session_Flag = 1){Response_Data[0] = this.byte(3);Response_Data[1] = this.byte(4);Response_Data[2] = this.byte(5);Response_Data[3] = this.byte(6);}
else if(this.byte(1) == 0x7F&&Session_Flag = 2)
{Response_Data[0] = this.byte(3); 
}
else if(this.byte(1) == 0x7F&&Session_Flag = 3)
{Response_Data[0] = this.byte(3); 
}
}void Session_Switch_Phy(int session,enum NRCType eNRC)
{Initial_response_Data();if(eNRC == Positive ){ Session_Flag = 1;Diag_Request_phy.byte(0) = 0x02;Diag_Request_phy.byte(1) = 0x10;Diag_Request_phy.byte(2) = (byte)session;Diag_Request_phy.byte(3) = 0xcc;Diag_Request_phy.byte(4) = 0xcc;Diag_Request_phy.byte(5) = 0xcc;Diag_Request_phy.byte(6) = 0xcc;Diag_Request_phy.byte(7) = 0xcc;output(Diag_Request_phy);testWaitForTimeout(500);if(Response_Data[0] == 0x00 && Response_Data[1] == 0x32 && Response_Data[2] == 0x00 && Response_Data[3] == 0xC8)testStepPass("TestPassed", "Response data is correct. P2 Server == %.2X %.2X, P2* Server == %.2X %.2X", Response_Data[0], Response_Data[1], Response_Data[2], Response_Data[3]);elsetestStepFail("TestFailed", "Response data is wrong. P2 Server == %.2X %.2X, P2* Server == %.2X %.2X", Response_Data[0], Response_Data[1], Response_Data[2], Response_Data[3]);}else if(eNRC == NRC13){Session_Flag = 2;Diag_Request_phy.byte(0) = 0x03;//OR 0x01,只要是满足NRC13条件就行Diag_Request_phy.byte(1) = 0x10;Diag_Request_phy.byte(2) = (byte)session;Diag_Request_phy.byte(3) = 0xcc;Diag_Request_phy.byte(4) = 0xcc;Diag_Request_phy.byte(5) = 0xcc;Diag_Request_phy.byte(6) = 0xcc;Diag_Request_phy.byte(7) = 0xcc;output(Diag_Request_phy);if(Response_Data[0] == 0x13){testStepPass("TestPassed","negative response %.2X received as expected",Response_Data[0]);}else {testStepFail("TestFAILED","negative response %.2X received not as expected",Response_Data[0]);}}else{Session_Flag = 3;Diag_Request_phy.byte(0) = 0x02;Diag_Request_phy.byte(1) = 0x10;Diag_Request_phy.byte(2) = 0x00;Diag_Request_phy.byte(3) = 0xcc;Diag_Request_phy.byte(4) = 0xcc;Diag_Request_phy.byte(5) = 0xcc;Diag_Request_phy.byte(6) = 0xcc;Diag_Request_phy.byte(7) = 0xcc;output(Diag_Request_phy);if(Response_Data[0] == 0x12){testStepPass("TestPassed","negative response %.2X received as expected",Response_Data[0]);}else {testStepFail("TestFAILED","negative response %.2X received not as expected",Response_Data[0]);}}//其他NRC可多加几个else if自行拓展
}//功能寻址只需把所有Diag_Request_phy改成Diag_Request_Fun,自行尝试哈哈//一个简单用例
testcase Session_Switch()
{Session_Switch_Phy(1,Positive);Session_Switch_Phy(3,NRC13);
}Void MainTest()
{Session_Switch();
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部