CANoe使用問題匯總。
1.如何將CAPL文件加密
使用CAPL Browser打開需要加密的CAPL文件*.can進行編譯,編譯通過后,點擊菜單欄File -> Save as Encrypted,將*.canencr文件保存到*.can文件相同的路徑中(*.canencr文件就是*.can文件的加密文件),將*.can文件從當前路徑移除,CANoe也可以正常運行。
對*.cin文件進行加密與上述類似,用CAPL Browser打開*.cin文件進行編譯,編譯通過后,在相同路徑下另存為*.cinencr文件,移除*.cin文件即可。
2.CAN報文中未使用位的檢測
若想要檢查某個報文未使用位的值是否滿足要求,可用ChkStart_PayloadGapsObservation函數。若想要檢查某個節點中所有TX報文或者RX報文未使用位的值是否滿足要求,可使用ChkStart_PayloadGapsObservationTx/ChkStart_PayloadGapsObservationRx函數。關于函數的具體介紹請參考CANoe Help文檔。文檔以示例工程Demo_Check_Unused_Bit為例,通過調用函數ChkStart_PayloadGapsObservation來檢測CAN報文未使用位的值是否為0,若為0則測試通過,否則測試失敗。測試代碼(CAPL_Tester節點)示例如圖二所示:
includes { } variables { dword checkId; } void MainTest () { BGCheck_UnusedBits(); } testcase BGCheck_UnusedBits() // 報文的未使用位檢測 { checkId = ChkStart_PayloadGapsObservation(message_1,0); // 檢查報文的未使用位值是否為0,函數的第一個參數為需檢查報文的名稱,第二個參數為未使用位期望的數值 TestAddCondition(checkId); // 添加檢測條件,若報文未使用位的數值不滿足要求,則會在報告中記錄下來 TestWaitForTimeout(10000); // 持續檢測10s TestRemoveCondition(checkId);// 移除檢測條件 }
運行CAPL_Tester測試模塊,在測試時間內通過按鍵‘a’發送一幀名為message_1(ID為0x123)的報文,該報文中未使用位bit15的值為0,未使用位值滿足要求,測試通過(報告如圖二所示)。
3.如何安裝和使用CANoe MATLAB插件
首先需要檢查CANoe、插件MATLAB的版本兼容性,以及MATLAB與編譯器的版本兼容性,檢查方法可在CANoe的User Assistance找到:
搜索打開MATLAB Integration Package,之后點擊MATLAB Integration Package Version History查看。
同樣在MATLAB Integration Package頁面,點擊打開Compiler Configuration查看。
檢查完兼容性后,就是插件安裝了,在CANoe的安裝目錄下,Vector CANoe 17Installer Additional ComponentsMatlab,右擊使用管理員權限安裝。當在Simulink Library Browser看到Vector CANoe分類時,安裝已成功。
插件的使用可以查詢CANoe自帶的使用說明文檔,Using_MATLAB_with_CANoe.pdf。
4.使用CANoe比較兩個記錄文件的信號
關于如何使用Graphics窗口直觀地比較兩個不同的CAN記錄文件中的相同信號。可以按照下面提到的四個步驟進行:
1.打開CANoe:使用兩個CAN通道的模板來創建一個新的CANoe工程(CAN 500 kBaud 2ch)。
2.配置為Offline模式:在Measurement Setup窗口中右鍵單擊離線文件列表,打開Offline Mode Configuration對話框。跳轉到Channel mapping 并添加一個新的設置。配置Bus Type為CAN,Source Channel設置為1(或任何一個有所需信號的通道)以及Destination Channel設置為2(或其他除Source Channel以外的數字),然后點擊OK。
3.添加所需文件:在兩個通道上添加相同的DBC文件。在Measurement Setup窗口的離線文件列表中添加兩個記錄文件。對于其中一個記錄文件,選擇步驟2中創建的通道匹配設置。
3.查看圖形:在Measurement Setup窗口中打開Graphics窗口。添加兩個通道中的同一個信號,添加時請確保分別選擇了對應的通道。運行工程,觀察從兩個記錄文件中得出的兩個信號圖形。
5.如何為DoIP Tester定義特定TCP源端口
要為DoIP Tester發送的數據包定義特定的TCP源端口,請按照以下步驟操作:
進入CANoe Options并打開應用程序數據位置:
然后關閉CANoe。應用程序數據文件夾包含一個名為DoIP.ini的文件。用文本編輯器打開該文件。在文件末尾添加以下部分,以設置特定的TCP端口:[Connection] ForceTesterTCPSendPort=[Port],然后保存。
6.CAN TP 如何接收超過4095字節的數據?
CAN TP中默認的接收緩存是4095字節,可以使用CAPL 函數CanTpSetMaximumReceiveLength 來增加TP層接收緩存區的大小,如下,目前CANoe 支持最大16MB的數據傳輸。
on start { dword maxLength =8000; CanTpSetMaximumReceiveLength(gRxHandle,maxLength); // gRxHandle: 用于建立CAN TP層連接的句柄 }7.如何在CAPL中訪問信號和系統變量的Value Table條目
信號和系統變量可以具有描述特定值的Value Table。這些Value Description也可以在CAPL中訪問,以獲得更好的可讀性/對實際CAPL代碼的解釋。引用Value Description(而不是實際值)和查找特定值的Value Description都是可行的。
在Switch/Case中引用Value Description(而不是實際值)的示例:
Switch(@SystemVariable)
{
case (sysvar:
// do whatever you want to do"
}
8.關于CANoe測試報告問題
1>.如何設置測試報告格式
在CANoe Options | General | Test Feature Set | Reporting File Format處選擇測試報告格式。
2>測試報告格式轉換
Test Report Viewer format轉換為PDF格式使用工具Vector CANoe Test Report Viewer打開*.vtestreport文件,點擊File | Export | Export PDF,可以將測試報告轉為PDF格式
3>Test Report Viewer format轉換為XML格式
使用工具Vector CANoe Test Report Viewer打開*.vtestreport文件,點擊File | Export | Export XML,可以將測試報告轉為XML格式。
9.Ethernet/CAN 網關
CAPL實現ETH轉CAN,網關先收到一幀UDP報文,以表示啟動。這幀報文可以由Ethernet IG 來進行仿真。這幀報文以兩個CAN報文的組成形式,從網關轉發出去。每幀CAN報文至少包含14個字節,內容包括CAN-Id, -dlc, -rtr 以及data bytes。
variables { // // Constants // const WORD kPort = 23; // UDP port number for instance const WORD kRxBufferSize = 1500; const WORD kTxBufferSize = 1500; // // Structure of UDP payload // _align(1) struct CANData { BYTE dlc; BYTE flags; // Bit 7 - Frame type (0 = standard, 1 = extended) // Bit 6 - RTR bit ('1' = RTR bit is set) DWORD canId; BYTE canData[8]; }; // // Global variables // UdpSocket gSocket; CHAR gRxBuffer[kRxBufferSize]; CHAR gTxBuffer[kTxBufferSize]; DWORD gOwnAddress; DWORD gModuleAddress= 0xFFFFFFFF; // default is the broadcast address 255.255.255.255 and the TCP/IP stack will build the Network broadcast address } // // Measurement start handler // on start { DWORD addresses[1]; // get own IP address of the Windows TCP/IP stack IpGetAdapterAddress( 1, addresses, elcount(addresses) ); gOwnAddress = addresses[0]; // open UDP socket gSocket = UdpSocket::Open( 0, kPort ); if (gSocket.GetLastSocketError() != 0) { write( "<%BASE_FILE_NAME%> Open UDP socket failed, result %d. Measurement stopped!", gSocket.GetLastSocketError() ); stop(); return; } if (gSocket.ReceiveFrom( gRxBuffer, elcount(gRxBuffer) ) != 0) { if (gSocket.GetLastSocketError() != 997) // ignore pending IO operation { write( "<%BASE_FILE_NAME%> UDPReceive failed, result %d. Measurement stopped!", gSocket.GetLastSocketError() ); stop(); return; } } } // // On receive UDP data handler using CAPL Callback // void OnUdpReceiveFrom( dword socket, long result, dword address, dword port, char buffer[], dword size) { DWORD dataOffset; struct CANData canData; message * canMsg; if (address == gOwnAddress) return; // ignore own broadcasts // // Store IP address of module to reach // if (gModuleAddress == 0) { gModuleAddress = address; } // // Handle received data // dataOffset = 0; while (dataOffset + __size_of(struct CANData) <= size) { memcpy( canData, buffer, dataOffset ); canMsg.id = (canData.canId & 0x1FFFFFFF) | ((canData.flags & 0x80) ? 0x80000000 : 0); canMsg.dlc = canData.dlc & 0x0f; canMsg.rtr = ((canData.flags & 0x40) ? 1 : 0); canMsg.byte(0) = canData.canData[0]; canMsg.byte(1) = canData.canData[1]; canMsg.byte(2) = canData.canData[2]; canMsg.byte(3) = canData.canData[3]; canMsg.byte(4) = canData.canData[4]; canMsg.byte(5) = canData.canData[5]; canMsg.byte(6) = canData.canData[6]; canMsg.byte(7) = canData.canData[7]; output( canMsg ); dataOffset += __size_of(struct CANData); } // // Receive more data // if (gSocket.ReceiveFrom( gRxBuffer, elcount(gRxBuffer) ) != 0) { if (gSocket.GetLastSocketError() != 997) // ignore pending IO operation { write( "<%BASE_FILE_NAME%> UDPReceive failed, result %d. Measurement stopped!", gSocket.GetLastSocketError() ); stop(); return; } } } // // Handler for CAN messages // on message * { int i; struct CANData canData; if ((this.dir == RX) && (gModuleAddress != 0)) { canData.canId = this.id & 0x1FFFFFFF; canData.flags = ((this.id & 0x80000000) ? 0x80 : 0x00) | ((this.rtr == 1) ? 0x40 : 0x00); canData.dlc = this.dlc; for( i = 0; i < 8; i++ ) { canData.canData[i] = (i < this.dlc) ? this.byte(i) : 0; } memcpy( gTxBuffer, canData ); gSocket.SendTo( gModuleAddress, kPort, gTxBuffer, __size_of(struct CANData) ); } else if (gModuleAddress == 0) { write( "<%BASE_FILE_NAME%> Tx not possible. Module to reach must send packets first." ); //Server simulation } } 審核編輯:黃飛
-
matlab
+關注
關注
185文章
2977瀏覽量
230567 -
編譯器
+關注
關注
1文章
1634瀏覽量
49150 -
CANoe
+關注
關注
4文章
66瀏覽量
8665
原文標題:CANoe使用問題匯總
文章出處:【微信號:eng2mot,微信公眾號:汽車ECU開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論