UDS DTC 老化(Ageing)测试 CAPL脚本

UDS DTC 老化测试(Ageing)

  • 什么是老化
    1.1从测试的角度上看,ECU 出现过一次故障,然后故障消失了,存储为历史故障,这个是老化测试的前提条件。比如测试电压偏低这个DTC,
    1.1.1应该先调低电压至最低阈值(一般7.5v左右),通过19 02 01服务读取当前DTC,出现电压过低的当前DTC,
    1.1.2然后恢复电压,通过19 02 01服务读不到电压过低的当前DTC,
    1.1.3然后通过19 02 09读当前DTC和历史DTC,能够读到电压过低的DTC,那么这个故障就是一个历史故障,
    那老化测试的前置条件就满足了。

    条件满足之后,上电下电40(一般定义的Ageing Counter都是40)个周期之后,(这个周期的说法根据车厂的定义可能不一致,博主见过有通过CAN报文接收电源模式的信号,从RUN切换到OFF是一个周期,也有车厂定义是唤醒到休眠就是一个周期)再去读19 02 09,读不到电压过低的历史DTC,说明该DTC的老化功能是有功能实现的,测试PASS.

    1.2老化从数据流上看多读一个历史DTC就是多读DTC掩码位的bit3,也就是对应DTC状态位的bit3 Confirmed DTC的数据从1跳变到0的过程(当然如果调用14服务清除DTC的话这个标志位也会从1跳变到0)。
    bit3置1的时候说明这个故障被存储到eeprom或者flash里了,有个不严谨的说法就是bit3置1就代表它是个历史DTC(之所以说不严谨是我理解还需要加上bit0为0这个条件就是代表不是当前DTC)
    19 02 09

  • 2.老化的CAPL脚本

这个capl脚本适用canalyzer和canoe,博主用的是canalyzer,测试中的40个周期中的周期是指唤醒到休眠40次。
测试思路是
2.1.工程运行后以10ms为周期发送唤醒报文0x555(根据自己的项目修改),等待测试人员按下‘T’后开始测试,触发开始测试的方式很多,可以通过新建环境变量,通过panel里的button关联环境变量后,以按键为触发开始测试的条件,博主这里图简单。
2.2测试人员按下’T’后停止发送唤醒报文,等待ECU进入休眠模式,这里设置的是等12s
2.3等12s之后,ECU已经完全进入休眠了,再次发送唤醒报文,ECU从接收到唤醒报文之后应该在指定时间内被唤醒并发送应用报文,客户一般会对这个唤醒时间有限制的在ms级别以内,但是博主这里是唤醒8s,设置的时间比较长,因为不同DTC完成一轮测试的时间长短不一,但是8s肯定足够了,可以根据自己的项目修改
2.4唤醒8s之后,通过诊断(物理寻址的诊断请求ID是0x14DAF160这个根据自己项目修改)读一下历史DTC,并且通过一条debug(0x7A0,这个ID随便定义,避免与ECU应用报文有冲突就好,仅仅为了log存档)报文记录当前的老化测试次数,其实这个操作做不做都可以,我这里加主要是想保存log,在看log数据的时候能够明确的看到DTC 状态位 bit3是在第几次周期完成从1-0的跳变的。
2.5读完之后再次停发唤醒报文,循环40次。

includes
{
    
    
  
}

variables
{
    
    
  message 0x14DAF160 D_Phy_Req;//phy diagnostic req
  message 0x555 M_Wake_up;//Message 0x555
  msTimer System_Timer_10ms;//system basic timer
  message 0x7A0 Debug_Message;//debug message,when save log,can view current ageing test counter's relationship with history bit
  
  byte g_Ageing_frequency_input;
  byte g_Ageing_Test_Status;
  byte g_Enable_Tx_Wake_Message;
  word Counter_Wait_ECU_Goto_Sleep;
  word Counter_ECU_Keep_Active;
  byte g_Ageing_Test_Counter;

  
  const word ECU_GoTo_Sleep_Time=1200;//12s to sleep
  const word ECU_Keep_Wake_UP=800;//8s Keep active
  const byte Ageing_Total_Times=40;//40
  
  const byte Enable=1;
  const byte Disable=0;
  
  
  enum Ageing_Test_State
  {
    
    
   Sta_Default=0,
   Sta_Wait_ECU_Goto_Sleep,
   Sta_ECU_Keep_Active,
   Sta_Test_End
  };
}


On start
{
    
    
  setTimer(System_Timer_10ms,1);
  g_Enable_Tx_Wake_Message=Enable;
  g_Ageing_Test_Status=Sta_Default;
  Counter_Wait_ECU_Goto_Sleep=0;
  Counter_ECU_Keep_Active=0;
}

On key 'T'
{
    
    
  /*
  ageing test
  1.power on
  2.make a DTC
  3.recover normal
  4.Press 'T',start test test
  */
  
  /*
  test step
  1,when canalyzer project start run, CAPL Tx 0x555 to wake up ECU
  2.When tester press T,
  3.Stop Tx message 0x555
  4.wait for 12s to let ECU go to sleep
  5.CAPL Tx 0x512 to wake up ECU again
  6.wait for 8s to let ECU keep active(wake up),then read History DTC to confirm history bit
  7.repeat step3-step6 for 40 times
  */
  write("Start DTC Ageing Test");
  g_Enable_Tx_Wake_Message=Disable;
  g_Ageing_Test_Status=Sta_Wait_ECU_Goto_Sleep;
  g_Ageing_Test_Counter=0;
  
}

on timer System_Timer_10ms
{
    
    

  setTimer(System_Timer_10ms,10);
  
  switch(g_Ageing_Test_Status)
  {
    
    
    case Sta_Wait_ECU_Goto_Sleep:
      Counter_Wait_ECU_Goto_Sleep++;//10ms++
      if(Counter_Wait_ECU_Goto_Sleep>ECU_GoTo_Sleep_Time)//12s
      {
    
    
        write("12s completed ,ECU has Sleeped complete then wake up it!");
        Counter_Wait_ECU_Goto_Sleep=0;
        g_Ageing_Test_Status=Sta_ECU_Keep_Active;//status change
        g_Enable_Tx_Wake_Message=Enable;//Tx 0x555 to Wake up ECU Again
      }
    break;
    
    case Sta_ECU_Keep_Active:
      Counter_ECU_Keep_Active++;//10ms++
      if(Counter_ECU_Keep_Active>ECU_Keep_Wake_UP)//8s
      {
    
    
        write("8s Active time completed ,ECU has Keeped active then let it go to sleep!");
        Counter_ECU_Keep_Active=0;
        g_Enable_Tx_Wake_Message=Disable;//Stop Tx Wake up message
        g_Ageing_Test_Status=Sta_Wait_ECU_Goto_Sleep;//status change
        g_Ageing_Test_Counter++;//one time ageing test completed
        
        Tx_Debug_Message();//debug message,when save log,can view current ageing test counter's relationship with history bit
                           
        D_Phy_Req.dlc=8;
        D_Phy_Req.byte(0)=0x03;
        D_Phy_Req.byte(1)=0x19;
        D_Phy_Req.byte(2)=0x02;
        D_Phy_Req.byte(3)=0x09;
        output(D_Phy_Req);//read history bit,means that when history bit cleared,you can see current ageing test counters
        write("Read History DTC");
        
        if(g_Ageing_Test_Counter<Ageing_Total_Times)
        {
    
    
        write("Ageing Counter is: %d",g_Ageing_Test_Counter);
        }
        else
        {
    
    
          g_Ageing_Test_Counter=0;
          g_Enable_Tx_Wake_Message=Enable;
          g_Ageing_Test_Status=Sta_Test_End;//status change
        }
      }
    break;
      
    case Sta_Test_End:
      write("DTC Ageing Test End");
      g_Ageing_Test_Status=Sta_Default;
    break;
      
    case Sta_Default:
    break;
      
    default:
    break;
    
  }
  
  //Tx 0x555 message
  if(g_Enable_Tx_Wake_Message==Enable)
  {
    
    
   M_Wake_up.dlc=8;
   output(M_Wake_up);
  }
}

void Tx_Debug_Message()
{
    
    
  
  Debug_Message.FDF=1;//can fd
  Debug_Message.DLC=8;
  Debug_Message.byte(0)=g_Ageing_Test_Counter;//for log trace view
  output(Debug_Message);
}

猜你喜欢

转载自blog.csdn.net/glenwan/article/details/123363498