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 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();
}

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博学之~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值