首页 文章

用于诊断服务的CAPL脚本

提问于
浏览
2

我正在编写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中读取CAPL中超过8个字节 .

我的脚本看起来像:

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 回答

  • 1
    on message UPA_to_DTOOL
    

    正在响应CAN消息 UPA_to_DTOOL ,这样您只能访问CAN消息的8个字节 .

    如果您想对应该使用的诊断消息做出反应

    on diagResponse <serviceName>
    

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

  • 0

    我在访问j1939 PGN时遇到了类似的问题,数据长度代码(DLC)> 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的许可证 .

相关问题