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

對*.cin文件進行加密與上述類似,用CAPL Browser打開*.cin文件進行編譯,編譯通過后,在相同路徑下另存為*.cinencr文件,移除*.cin文件即可。
2.CAN報文中未使用位的檢測
若想要檢查某個報文未使用位的值是否滿足要求,可用ChkStart_PayloadGapsObservation函數(shù)。若想要檢查某個節(jié)點中所有TX報文或者RX報文未使用位的值是否滿足要求,可使用ChkStart_PayloadGapsObservationTx/ChkStart_PayloadGapsObservationRx函數(shù)。關(guān)于函數(shù)的具體介紹請參考CANoe Help文檔。文檔以示例工程Demo_Check_Unused_Bit為例,通過調(diào)用函數(shù)ChkStart_PayloadGapsObservation來檢測CAN報文未使用位的值是否為0,若為0則測試通過,否則測試失敗。測試代碼(CAPL_Tester節(jié)點)示例如圖二所示:
includes
{
}
variables
{
dword checkId;
}
void MainTest ()
{
BGCheck_UnusedBits();
}
testcase BGCheck_UnusedBits() // 報文的未使用位檢測
{
checkId = ChkStart_PayloadGapsObservation(message_1,0); // 檢查報文的未使用位值是否為0,函數(shù)的第一個參數(shù)為需檢查報文的名稱,第二個參數(shù)為未使用位期望的數(shù)值
TestAddCondition(checkId); // 添加檢測條件,若報文未使用位的數(shù)值不滿足要求,則會在報告中記錄下來
TestWaitForTimeout(10000); // 持續(xù)檢測10s
TestRemoveCondition(checkId);// 移除檢測條件
}
運行CAPL_Tester測試模塊,在測試時間內(nèi)通過按鍵‘a(chǎn)’發(fā)送一幀名為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,右擊使用管理員權(quán)限安裝。當(dāng)在Simulink Library Browser看到Vector CANoe分類時,安裝已成功。


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

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

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

6.CAN TP 如何接收超過4095字節(jié)的數(shù)據(jù)?
CAN TP中默認的接收緩存是4095字節(jié),可以使用CAPL 函數(shù)CanTpSetMaximumReceiveLength 來增加TP層接收緩存區(qū)的大小,如下,目前CANoe 支持最大16MB的數(shù)據(jù)傳輸。
on start
{
dword maxLength =8000;
CanTpSetMaximumReceiveLength(gRxHandle,maxLength); // gRxHandle: 用于建立CAN TP層連接的句柄
}
7.如何在CAPL中訪問信號和系統(tǒng)變量的Value Table條目
信號和系統(tǒng)變量可以具有描述特定值的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.關(guān)于CANoe測試報告問題
1>.如何設(shè)置測試報告格式
在CANoe Options | General | Test Feature Set | Reporting File Format處選擇測試報告格式。
2>測試報告格式轉(zhuǎn)換
Test Report Viewer format轉(zhuǎn)換為PDF格式使用工具Vector CANoe Test Report Viewer打開*.vtestreport文件,點擊File | Export | Export PDF,可以將測試報告轉(zhuǎn)為PDF格式
3>Test Report Viewer format轉(zhuǎn)換為XML格式
使用工具Vector CANoe Test Report Viewer打開*.vtestreport文件,點擊File | Export | Export XML,可以將測試報告轉(zhuǎn)為XML格式。
9.Ethernet/CAN 網(wǎng)關(guān)
CAPL實現(xiàn)ETH轉(zhuǎn)CAN,網(wǎng)關(guān)先收到一幀UDP報文,以表示啟動。這幀報文可以由Ethernet IG 來進行仿真。這幀報文以兩個CAN報文的組成形式,從網(wǎng)關(guān)轉(zhuǎn)發(fā)出去。每幀CAN報文至少包含14個字節(jié),內(nèi)容包括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
+關(guān)注
關(guān)注
189文章
3016瀏覽量
237503 -
編譯器
+關(guān)注
關(guān)注
1文章
1669瀏覽量
51057 -
CANoe
+關(guān)注
關(guān)注
4文章
80瀏覽量
9525
原文標(biāo)題:CANoe使用問題匯總
文章出處:【微信號:eng2mot,微信公眾號:汽車ECU開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
飛思卡爾 KL 系列常見問題和解答匯總篇
三菱PLC之間的N:N無線通訊的常見問題匯總
智慧視頻監(jiān)控常見問題及解決方法匯總
2.4G頻段的SI24R2E無線單發(fā)芯片技術(shù)問答,常見問題進行匯總解答
TSMaster診斷功能之常見問題匯總

CANoe使用常見問題匯總
評論