一、测试内容
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 received
if(eNRCType ==NoRes)
{
retval = -1;
testStepFail("TestFail","Except No response but Positive received");
}
else
{
if(diagGetLastResponseCode(req)==-1)
{
// A negative response was received
if(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 received
if(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 error
TestStepFail("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]);
else
testStepFail("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();
}