用于诊断服务的CAPL脚本

时间:2017-06-09 12:24:53

标签: can-bus capl canoe

我正在编写CAPL脚本以自动化诊断服务。我已经阅读了一些大于8字节的DID。直到8个字节,我可以正确捕获我的CAPL脚本中的数据,但是当数据大小超过8个字节时,我得到剩余字节的一些垃圾值00。

我可以在CANoe Trace中看到完整的读取数据,但我无法在CAPL脚本中捕获它。如果有人有任何想法或解决方案,请与我分享。

在Belo脚本中,问题是我可以正确地捕获值直到this.byte(7)。但是对于this.byte(8)和this.byte(9)我读了00,尽管CANoe Trace中的实际值是0x54和0x66。所以这意味着我无法从CAN中读取超过8个字节的CAPL。

我的脚本看起来像:

    variables
    {
      //Please insert your code below this comment
      byte test_num;

      message DTOOL_to_UPA msg_tester;

     mstimer readTimerDID_2001;
     mstimer defaultSession;

     byte readBuf2001[8];
    }

    // read request
    on key 'd'
    {  
        test_num = 0; 
        msg_tester.dlc = 8;
        msg_tester.dir = tx;
        msg_tester.can = 1; 
        settimer(defaultSession, 2000);  
    }

    on timer defaultSession         // Request DID: 10 01
    {
      msg_tester.byte(0) = 0x02;
      msg_tester.byte(1) = 0x10;
      msg_tester.byte(2) = 0x01;



       output(msg_tester);
          settimer(readTimerDID_2001, 100);
          canceltimer(defaultSession);
        }

    on timer readTimerDID_2001    // Read Request DID: 22 20 01
    {  
      msg_tester.byte(0) = 0x03;
      msg_tester.byte(1) = 0x22;
      msg_tester.byte(2) = 0x20;
      msg_tester.byte(3) = 0x01;

      output(msg_tester);
      canceltimer(readTimerDID_2001);
    }

    on message UPA_to_DTOOL 
    {

      if (this.DIR == RX)
      { 


// Response Data for DID 2001 
    if ((this.byte(0)== 0x04)&&(this.byte(1)== 0x62)&&(this.byte(2)==0x20)&&
       (this.byte(3)== 0x01)&&(this.byte(4)== 0x23) &&(this.byte(5)== 0x00) 
       &&(this.byte(6)== 0x44)&&(this.byte(7)== 0x22) &&(this.byte(8)==0x54)&&
         (this.byte(9)== 0x66)) 
       {   

        readDID2001();
        }

   }
}

2 个答案:

答案 0 :(得分:1)

    For Each File In Directory.GetFiles("C:\Windows\Temp")
        MsgBox(File)
    Next

对CAN消息on message UPA_to_DTOOL 作出反应,这只能访问CAN消息的8个字节。

如果您要对诊断消息做出反应,则应使用

UPA_to_DTOOL

您可以在此处理程序内访问诊断消息的完整数据

答案 1 :(得分:0)

我在访问具有数据长度代码(DLC)的j1939 PGN时遇到了类似的问题。 8字节。这些消息在跟踪窗口中作为j1939帧(DLC> 8字节)而不是CAN帧(DLC = 8字节)发送。我必须在像这样的on pg事件中使用getThisMessage(pg pg_variable,int length)函数。

on pg UPA_to_DTOOL {
  pg UPA_to_DTOOL UPA_to_DTOOL_pg;
  getThisMessage(UPA_to_DTOOL, UPA_to_DTOOL.dlc);
  write("byte 9 = %X", UPA_to_DTOOL.byte(9));
}

因为带有DLC的消息> 8是以特殊方式传输的,getThisMessage必须在我的情况下使用,这让我可以访问所有的消息字节。我不确定这个j1939 PGN的解决方案对你有帮助,因为我不知道你的独木舟安装中是否有j1939的许可证。