3

我正在编写 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();
      }
  }
}
4

2 回答 2

1
on message UPA_to_DTOOL 

正在对 CAN 消息做出反应UPA_to_DTOOL,您只能访问 CAN 消息的 8 个字节。

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

on diagResponse <serviceName>

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

于 2018-08-14T11:32:23.993 回答
0

我在访问数据长度代码 (DLC) > 8 字节的 j1939 PGN 时遇到了类似的问题。这些消息在跟踪窗口中作为 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 的许可证。

于 2017-09-29T08:45:41.067 回答