
CANoe使用問題匯總。
1.如何將CAPL文件加密
使用CAPL Browser打開需要加密的CAPL文件*.can進(jìn)行編譯,編譯通過后,點(diǎn)擊菜單欄?File -> Save as Encrypted,將*.canencr文件保存到*.can文件相同的路徑中(*.canencr文件就是*.can文件的加密文件),將*.can文件從當(dāng)前路徑移除,CANoe也可以正常運(yùn)行。

對*.cin文件進(jìn)行加密與上述類似,用CAPL Browser打開*.cin文件進(jìn)行編譯,編譯通過后,在相同路徑下另存為*.cinencr文件,移除*.cin文件即可。
2.CAN報(bào)文中未使用位的檢測
若想要檢查某個(gè)報(bào)文未使用位的值是否滿足要求,可用ChkStart_PayloadGapsObservation函數(shù)。若想要檢查某個(gè)節(jié)點(diǎn)中所有TX報(bào)文或者RX報(bào)文未使用位的值是否滿足要求,可使用ChkStart_PayloadGapsObservationTx/ChkStart_PayloadGapsObservationRx函數(shù)。關(guān)于函數(shù)的具體介紹請參考CANoe Help文檔。文檔以示例工程Demo_Check_Unused_Bit為例,通過調(diào)用函數(shù)ChkStart_PayloadGapsObservation來檢測CAN報(bào)文未使用位的值是否為0,若為0則測試通過,否則測試失敗。測試代碼(CAPL_Tester節(jié)點(diǎn))示例如圖二所示:
includes{}variables{dword checkId;}void MainTest (){BGCheck_UnusedBits();}testcase BGCheck_UnusedBits() // 報(bào)文的未使用位檢測{checkId = ChkStart_PayloadGapsObservation(message_1,0); // 檢查報(bào)文的未使用位值是否為0,函數(shù)的第一個(gè)參數(shù)為需檢查報(bào)文的名稱,第二個(gè)參數(shù)為未使用位期望的數(shù)值TestAddCondition(checkId); // 添加檢測條件,若報(bào)文未使用位的數(shù)值不滿足要求,則會(huì)在報(bào)告中記錄下來TestWaitForTimeout(10000); // 持續(xù)檢測10sTestRemoveCondition(checkId);// 移除檢測條件}
運(yùn)行CAPL_Tester測試模塊,在測試時(shí)間內(nèi)通過按鍵‘a(chǎn)’發(fā)送一幀名為message_1(ID為0x123)的報(bào)文,該報(bào)文中未使用位bit15的值為0,未使用位值滿足要求,測試通過(報(bào)告如圖二所示)。

3.如何安裝和使用CANoe MATLAB插件
首先需要檢查CANoe、插件MATLAB的版本兼容性,以及MATLAB與編譯器的版本兼容性,檢查方法可在CANoe的User Assistance找到:
搜索打開MATLAB Integration Package,之后點(diǎn)擊MATLAB Integration Package Version History查看。
同樣在MATLAB Integration Package頁面,點(diǎn)擊打開Compiler Configuration查看。
檢查完兼容性后,就是插件安裝了,在CANoe的安裝目錄下,Vector CANoe 17\Installer Additional Components\Matlab,右擊使用管理員權(quán)限安裝。當(dāng)在Simulink Library Browser看到Vector CANoe分類時(shí),安裝已成功。


插件的使用可以查詢CANoe自帶的使用說明文檔,Using_MATLAB_with_CANoe.pdf。
關(guān)于如何使用Graphics窗口直觀地比較兩個(gè)不同的CAN記錄文件中的相同信號。可以按照下面提到的四個(gè)步驟進(jìn)行:
1.打開CANoe:使用兩個(gè)CAN通道的模板來創(chuàng)建一個(gè)新的CANoe工程(CAN 500 kBaud 2ch)。
2.配置為Offline模式:在Measurement Setup窗口中右鍵單擊離線文件列表,打開Offline Mode Configuration對話框。跳轉(zhuǎn)到Channel mapping 并添加一個(gè)新的設(shè)置。配置Bus Type為CAN,Source Channel設(shè)置為1(或任何一個(gè)有所需信號的通道)以及Destination Channel設(shè)置為2(或其他除Source Channel以外的數(shù)字),然后點(diǎn)擊OK。
3.添加所需文件:在兩個(gè)通道上添加相同的DBC文件。在Measurement Setup窗口的離線文件列表中添加兩個(gè)記錄文件。對于其中一個(gè)記錄文件,選擇步驟2中創(chuàng)建的通道匹配設(shè)置。
3.查看圖形:在Measurement Setup窗口中打開Graphics窗口。添加兩個(gè)通道中的同一個(gè)信號,添加時(shí)請確保分別選擇了對應(yīng)的通道。運(yùn)行工程,觀察從兩個(gè)記錄文件中得出的兩個(gè)信號圖形。

5.如何為DoIP Tester定義特定TCP源端口
要為DoIP Tester發(fā)送的數(shù)據(jù)包定義特定的TCP源端口,請按照以下步驟操作:
進(jìn)入CANoe Options并打開應(yīng)用程序數(shù)據(jù)位置:?

然后關(guān)閉CANoe。應(yīng)用程序數(shù)據(jù)文件夾包含一個(gè)名為DoIP.ini的文件。用文本編輯器打開該文件。在文件末尾添加以下部分,以設(shè)置特定的TCP端口:[Connection] ForceTesterTCPSendPort=[Port],然后保存。

CAN TP中默認(rèn)的接收緩存是4095字節(jié),可以使用CAPL 函數(shù)CanTpSetMaximumReceiveLength 來增加TP層接收緩存區(qū)的大小,如下,目前CANoe 支持最大16MB的數(shù)據(jù)傳輸。
on start{dword maxLength =8000;CanTpSetMaximumReceiveLength(gRxHandle,maxLength); // gRxHandle: 用于建立CAN TP層連接的句柄}
信號和系統(tǒng)變量可以具有描述特定值的Value Table。這些Value Description也可以在CAPL中訪問,以獲得更好的可讀性/對實(shí)際CAPL代碼的解釋。引用Value Description(而不是實(shí)際值)和查找特定值的Value Description都是可行的。
在Switch/Case中引用Value Description(而不是實(shí)際值)的示例:
Switch(@SystemVariable)
{
? ?case (sysvar::myNamespace::myVariableName::myValueDescription):
? ?// do whatever you want to do"
}
8.關(guān)于CANoe測試報(bào)告問題
1>.如何設(shè)置測試報(bào)告格式
在CANoe Options | General | Test Feature Set | Reporting File Format處選擇測試報(bào)告格式。
2>測試報(bào)告格式轉(zhuǎn)換
Test Report Viewer format轉(zhuǎn)換為PDF格式使用工具Vector CANoe Test Report Viewer打開*.vtestreport文件,點(diǎn)擊File | Export | Export PDF,可以將測試報(bào)告轉(zhuǎn)為PDF格式
3>Test Report Viewer format轉(zhuǎn)換為XML格式
CAPL實(shí)現(xiàn)ETH轉(zhuǎn)CAN,網(wǎng)關(guān)先收到一幀UDP報(bào)文,以表示啟動(dòng)。這幀報(bào)文可以由Ethernet IG 來進(jìn)行仿真。這幀報(bào)文以兩個(gè)CAN報(bào)文的組成形式,從網(wǎng)關(guān)轉(zhuǎn)發(fā)出去。每幀CAN報(bào)文至少包含14個(gè)字節(jié),內(nèi)容包括CAN-Id, -dlc, -rtr 以及data bytes。
variables{//// Constants//const WORD kPort = 23; // UDP port number for instanceconst 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 stackIpGetAdapterAddress( 1, addresses, elcount(addresses) );gOwnAddress = addresses[0];// open UDP socketgSocket = 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}}
-end-
分享不易,懇請點(diǎn)個(gè)【??】和【在看】