2017-06-09 101 views
1

我在寫CAPL腳本來Automise診斷服務。我已經閱讀了一些大於8字節的DID。直到8個字節,我可以正確捕獲我的CAPL腳本中的數據,但是當數據大小超過8個字節時,我得到剩餘字節的一些垃圾值00。用於診斷服務的CAPL腳本

我可以在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(); 
     } 

    } 
} 
+0

請將您的腳本代碼添加到問題中。 [問] –

+0

嗨哈米德,你沒有提到你是否有診斷數據庫(ODX,CDD,...)或你使用的診斷協議(KWP,GMLAN,UDS)。我問的原因是診斷協議建立在ISO-TP(用於CAN)上。您可以在CAPL中使用ISO-TP(參見例如[使用CAPL在CANoe中傳輸ISO-TP上的數據](https://stackoverflow.com/questions/35626632/transmitting-data-over-iso-tp-transport -protocol-in-canoe-using-capl)),但是當診斷數據庫可用時會容易得多。 (如果沒有診斷數據庫可用,請查看基本診斷的文檔。) – Sonic78

+0

我使用獨立軟件開發CDD協議。數據庫可用。 –

回答

0

我有類似的問題訪問J1939 PGN與數據長度碼(DLC)> 8字節。這些消息在跟蹤窗口中作爲j1939幀(DLC> 8字節)而不是CAN幀(DLC = 8字節)傳輸。我必須在像這樣的pg事件中使用getThisMessage(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 PGNs的這個解決方案可以幫助你,因爲我不知道你是否有獨木舟安裝中的j1939許可證。