0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CANoe使用常见问题汇总

汽车ECU开发 来源:汽车ECU开发 2024-04-22 12:28 次阅读

CANoe使用问题汇总。

1.如何将CAPL文件加密

使用CAPL Browser打开需要加密的CAPL文件*.can进行编译,编译通过后,点击菜单栏File -> Save as Encrypted,将*.canencr文件保存到*.can文件相同的路径中(*.canencr文件就是*.can文件的加密文件),将*.can文件从当前路径移除,CANoe也可以正常运行。

d7cba8fa-004f-11ef-a297-92fbcf53809c.png

对*.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,未使用位值满足要求,测试通过(报告如图二所示)。

d7e4af6c-004f-11ef-a297-92fbcf53809c.png

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分类时,安装已成功。

d7febcf4-004f-11ef-a297-92fbcf53809c.png

d81ced8c-004f-11ef-a297-92fbcf53809c.png

插件的使用可以查询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窗口。添加两个通道中的同一个信号,添加时请确保分别选择了对应的通道。运行工程,观察从两个记录文件中得出的两个信号图形。

d834e856-004f-11ef-a297-92fbcf53809c.png

5.如何为DoIP Tester定义特定TCP源端口

要为DoIP Tester发送的数据包定义特定的TCP源端口,请按照以下步骤操作:

进入CANoe Options并打开应用程序数据位置:

d846dd40-004f-11ef-a297-92fbcf53809c.png

然后关闭CANoe。应用程序数据文件夹包含一个名为DoIP.ini的文件。用文本编辑器打开该文件。在文件末尾添加以下部分,以设置特定的TCP端口:[Connection] ForceTesterTCPSendPort=[Port],然后保存。

d85f0ea6-004f-11ef-a297-92fbcf53809c.png

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
    +关注

    关注

    178

    文章

    2929

    浏览量

    228953
  • 编译器
    +关注

    关注

    1

    文章

    1587

    浏览量

    48796
  • CANoe
    +关注

    关注

    3

    文章

    60

    浏览量

    8492

原文标题:CANoe使用问题汇总

文章出处:【微信号:eng2mot,微信公众号:汽车ECU开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PC电源常见问题汇总

    PC电源常见问题汇总,分享!
    发表于 04-29 16:03

    飞思卡尔 KL 系列常见问题和解答汇总

    KL 系列常见问题和解答汇总篇KL 系列 FAQ (十)KL 系列 FAQ (九)KL 系列 FAQ (八)KL 系列 FAQ (七)KL 系列 FAQ (六)KL 系列 FAQ (五)KL 系列 FAQ (四)KL 系列 FAQ (三)KL 系列 FAQ (二)KL 系
    发表于 01-22 15:42

    C语言常见问题

    C语言常见问题汇总大集合
    发表于 05-10 21:37

    Window7远程桌面连接Ubuntu14.04常见问题

    Window7远程桌面连接Ubuntu14.04常见问题汇总
    发表于 11-09 08:01

    STM32常见问题有哪些?怎么解决这些问题?

    STM32常见问题有哪些?如何解决STM32单片机常见问题
    发表于 04-19 06:39

    三菱PLC之间的N:N无线通讯的常见问题汇总

    三菱PLC之间的N:N无线通讯的常见问题汇总如下:【需求描述①:佛山陈工】 我有三个FX3U,一个主站,两个从站。要实现无线N:N通讯,应该怎么下单,也就是说要买几个发射器,几个接受器,可以告诉我型号吗? 【达泰技术:无线PLC】 选择三菱PLC专用无线数据终端DTD43
    发表于 07-02 07:08

    C语言常见问题合集汇总

    C语言常见问题集,学习C语言的同学可以下载。
    发表于 03-29 10:07

    电镀铜的常见问题

    电镀铜的常见问题集 PCB电镀中的酸铜电镀常见问题,主要有以下几个:电镀粗糙;电镀(板面)铜
    发表于 04-07 22:29 3280次阅读

    Keil编译常见问题

    吴鉴鹰总结的Keil 编译常见问题,吴鉴鹰总结的Keil 编译常见问题
    发表于 07-22 15:31 10次下载

    SIM900A常见问题汇总,奉上解决方案

    SIM900A常见问题汇总,奉上SIM900A问题的解决办法。
    发表于 11-06 10:46 1w次阅读

    固德威逆变器wifi设置_方法步骤教程_常见问题汇总

    本文主要介绍的是固德威逆变器wifi设置的步骤教程以及常见问题问题汇总,具体的跟随小编一起来了解下。
    的头像 发表于 05-15 16:03 5.3w次阅读
    固德威逆变器wifi设置_方法步骤教程_<b class='flag-5'>常见问题</b><b class='flag-5'>汇总</b>

    MES软件的作用及常见问题汇总

    本文主要介绍了MES软件的作用及常见问题汇总
    发表于 06-04 08:00 4次下载

    网优工程师面试常见问题汇总资料下载

    电子发烧友网为你提供网优工程师面试常见问题汇总资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 03-29 16:50 106次下载
    网优工程师面试<b class='flag-5'>常见问题</b><b class='flag-5'>汇总</b>资料下载

    2.4G频段的SI24R2E无线单发芯片技术问答,常见问题进行汇总解答

    针对2.4G频段的无线单发芯片——SI24R2E,在开发过程中会遇到的常见问题进行汇总解答。
    的头像 发表于 10-27 14:06 695次阅读

    TSMaster诊断功能之常见问题汇总

    常见问题汇总以上几个章节给小伙伴们介绍了TSMaster诊断功能的一些基础配置问题以及操作步骤详解,那我相信大家在使用TSMaster软件的过程中还会遇到许许多多的问题,下面我就挑几个热度比较
    的头像 发表于 07-22 14:48 1401次阅读
    TSMaster诊断功能之<b class='flag-5'>常见问题</b><b class='flag-5'>汇总</b>