从代码角度看CAN网络层协议 ISO 15765-2 (二)

ont color=orange>📙 相关文章
在这里插入图片描述


📘前言

  • 测试软硬件环境:
    CANoe 11 SP2
    Win10 X64
    ISO 15765-2 -2016

  • ISO 15765-2 是TP层的规范,在上一节博客内容中,我们了解了标准的重要文档内容,下面我们通过代码的方式进一步了解下多帧传输的参数


请添加图片描述

请添加图片描述


固定配置N_PCI参数


下图是一个CANoe工程中加载了CDD文件的 TP层配置参数和一段对应的真实Trace,

在这里插入图片描述


动态配置N_PCI参数


在做工程中正常我们加载cdd,可以正常做诊断,但是我们在做TP测试的时候,就需要我们拿掉cdd文件,使用底层函数测试了。
下面我们就按照TP测试,来熟悉下TP层的底层函数。

本次测试根据真实ECU,我们新建个CAN工程,并配置好通信波特率(CAN-FD),下图所示连接号通道和配置好波特率,就能正常收到ECU发送的报文了,
NOTE:测试所用ECU,无需网络唤醒,上电即通信。
在这里插入图片描述


①, 新建一个Network Node

新建一个TP_Test.can 文件,并在Components里面导入OSEK_TP.dll
在这里插入图片描述


② ,先定义以下代码 将Tester和 ECU 建立连接

variables
{
  const long sysTxIdentifier = 0x72E; //Tester的物理地址ID
  const long sysRxIdentifier = 0x73E; //真实ECU的物理地址ID
  long gHandleConn1;
  long dbHandle;
}

on start
{
  InitConn();
}
InitConn()
{  
  //连个ID 建立连接
  dbHandle = CanTpGetDBConnection();
  write("**************dbHandle:%d**************",dbHandle);  
  if (dbHandle > 0) 
  {
    CanTpCloseConnection(dbHandle);
  }
  gHandleConn1 = CanTpCreateConnection(0); // Normal mode
  write("**************gHandleConn1:%d**************",gHandleConn1);
  
  CanTpSetTxIdentifier(gHandleConn1, sysTxIdentifier);
  CanTpSetRxIdentifier(gHandleConn1, sysRxIdentifier);
  CanTpSetMaxCANFDFrameLength( gHandleConn1,8); // 因为测试使用的ECU 是基于CAN-FD ,并且DL =8 ,所以需要设置
  //CanTpSetBitRateSwitch( gHandleConn1,0);

}

on key 'a' 
{
  byte txDataBuffer[2]={0x19,0x0A};
  write("**************press key a**************");
  CanTpSendData(gHandleConn1, txDataBuffer, 2); 
}

按键‘a’ 里面的代码发送 0x19 0x0A读取ECU支持的DTC.
按键‘a’ ,可以看出响应的Trace,这说明以上代码Tester 和 ECU建立连接是成功的。
流控的参数和填充 都是默认的,后面我们再看具体的设置函数
上面的代码用到的函数在help文档中都有,这里就不一一展开细讲了。

在这里插入图片描述


③ ,添加回调函数

如下,我们在上面的代码基础上,添加4个回调函数,可以监控到传输的细节

//以下4个都是回调函数
void CanTp_SendCon( long connHandle, dword count) //发送成功后会调起此函数
{
  write( "Transmission of %d byte on connection %d successful"
  , count, connHandle);
}
void CanTp_FirstFrameInd( long connHandle, dword length)//发送成功后会调起此函数
{
  write("Peer has started transfer of %d byte on connection %d"
  , length, connHandle);
} 
void CanTp_ReceptionInd( long connHandle, byte data[])//接收到报文会调起此函数
{
  write( "Received %d byte on connection %d: [%02x] ..." 
  , elcount( data), connHandle, data[0]);
}

void CanTp_ErrorInd( long connHandle, long error) //连接过程中报错会调起此函数
{
  write( "Error %d for connection %d", error, connHandle);
}


再次按键‘a’ ,根据write 窗口的打印信息,理解下回调函数的执行过程

在这里插入图片描述


④ ,设置 流控帧参数(发送方 是单帧)

如下,我们在上面的代码基础上,列出流控帧控制的参数

on key 'b' 
{
   //设置流控帧参数的函数
    CanTpSetPadding(gHandleConn1, 0xff);
    write( "Padding value = 0x%x", CanTpGetPadding(gHandleConn1));

    CanTpSetBlockSize(gHandleConn1, 0x00);
    write( "Block size = 0x%x", CanTpGetBlockSize(gHandleConn1));

    CanTpSetSTmin(gHandleConn1, 50);
    write( "ST min = %d", CanTpGetSTmin(gHandleConn1));

}

先按按键‘b’, 再次按键‘a’ ,根据write 窗口的打印信息,对比下流控帧参数的变化

注意我们发送0x19 0A 是单帧,ECU响应的是多帧, 流控帧是我们发出的,约束的是ECU的连续帧的行为
ECU是可以根据自身情况,是否根据流控帧的内容进行传输的,比如下面trace就说明了BS参数奏效了,但是STmin 并没有按照我们设置的进行传输


⑤,设置 流控帧参数 (发送方是多帧)

如下,我们在上面的代码基础上,我们再进一步增加测试代码,我们仿真下 发送方为多帧,ECU发送流控帧的情况
on key ‘c’ 里面发送100个字节,内容是乱写的,不影响作为多帧观察

on key 'c' 
{
  byte txDataBuffer[100]={0x2e,0x2};
  write("**************press key a**************");
  CanTpSendData(gHandleConn1, txDataBuffer, elCount(txDataBuffer)); 
}
on key 'd' 
{
    //设置流控帧参数的函数
    CanTpUseFlowControlFrames(gHandleConn1,1);//是否使用流控帧参数进行传输,1是使用
    write("Use flow control = %d",CanTpIsUseFlowControlFrames(gHandleConn1));
   //设置填充
    CanTpSetPadding(gHandleConn1, 0xff);
    write( "Padding value = 0x%x", CanTpGetPadding(gHandleConn1));
}

先按按键‘d’, 再次按键‘c’ ,根据Trace的打印信息,代码中使用流控帧的参数传输,所以我们发送的规则必须按照流控帧的参数来
在这里插入图片描述


如下,我们在上面的代码基础上,我们将 on key 'd' 的内容改成如下代码,不使用 ECU发送的流控帧参数,使用自己设置的参数

Note : 由于 ECU响应的BS=0,所以 BS参数没法去测试,可以测试 STmin 参数

on key 'd' 
{
    //设置流控帧参数的函数
    CanTpUseFlowControlFrames(gHandleConn1,0);//是否使用流控帧参数进行传输,1是使用
    write("Use flow control = %d",CanTpIsUseFlowControlFrames(gHandleConn1));

    CanTpSetSTmin(gHandleConn1, 20);
    write( "ST min = %d", CanTpGetSTmin(gHandleConn1));

    CanTpUseFlowControlSTmin( gHandleConn1, 0);
    write("Use FSTmin = %d", CanTpIsUseFlowControlSTmin(gHandleConn1));

   //设置填充
    CanTpSetPadding(gHandleConn1, 0xff);
    write( "Padding value = 0x%x", CanTpGetPadding(gHandleConn1));
}

在这里插入图片描述


动态配置 网络层时间参数

添加如下代码,可以设置和读取网络层定时参数。

on key 'e' 
{
    //CanTpSetTimeoutAr(gHandleConn1,1000);
    write( "Ar_ms value = %d", CanTpGetTimeoutAr(gHandleConn1));
    write( "As_ms value = %d", CanTpGetTimeoutAs(gHandleConn1));
    write( "Br_ms value = %d", CanTpGetTimeBr(gHandleConn1));
    write( "Bs_ms value = %d", CanTpGetTimeoutBs(gHandleConn1));
    write( "Br_ms value = %d", CanTpGetTimeBr(gHandleConn1));
    write( "Cr_ms value = %d", CanTpGetTimeoutCr(gHandleConn1));
}

在这里插入图片描述


End

🌎总结

23

请添加图片描述

🍅本章博客进一步理解ISO-15756-2多帧传输的意义,以及 通过OSEK_TP.dll的 简单应用可以动态设置 TP层的各种传输参数

OSEK_TP.dll是一个函数库,函数众多,本博客通过一个简单的实例了解其中重要的几个函数,进一步的学习可以参考官方Help文档


  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩 有手机的小伙伴可以加下交流群,在车载诊断领域的一个小小圈子,群里有网盘资料源码,可能有你需要的呢,平时可以交流技术,聊聊工作机会啥的。

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    18
### 回答1: canoe.diva 是一款用于进行 tp 层测试的工具,下面是它的操作指南: 1. 准备工作:首先,你需要确保你已经安装了 canoe.diva,并且你的操作系统满足最低要求。你可以从官方网站或其他途径获得安装包,并按照提示进行安装。 2. 启动 canoe.diva:安装完成后,你可以通过点击桌面上的图标或从开始菜单中找到 canoe.diva 并启动它。等待片刻,它将加载所需的组件并显示主界面。 3. 配置测试环境:在进行 tp 层测试之前,你需要配置测试环境。可以在主界面的设置中找到相关选项。你可以设置测试用例的输入参数、验证条件和期望结果等。 4. 创建测试用例:在主界面上,你可以选择创建新的测试用例。根据你的测试需求,选择适当的测试用例类型,并填写相关的测试数据。 5. 运行测试用例:创建测试用例后,你可以选择“运行”按钮来执行测试。canoe.diva 将按照你的设定执行测试用例,并显示相应的结果。 6. 检查测试结果:执行测试后,你可以检查测试结果以验证测试的准确性和可靠性。canoe.diva 将会给出详细的测试报告,包括测试用例的执行结果、错误信息和统计数据等。 7. 问题排查:如果在测试中发现问题或错误,你可以使用 canoe.diva 提供的排查工具来定位和解决问题。它可以帮助你从日志、错误信息以及其他相关数据中找出潜在的问题原因。 8. 导出和分享结果:最后,你可以选择将测试结果导出到特定的格式(如 Excel 或 PDF)以备份或与其他人分享。 以上就是 canoe.diva 在 tp 层测试过程中的操作指南。希望以上内容可以帮助你更好地使用 canoe.diva 进行 tp 层测试。如果你有任何疑问或需要进一步的帮助,请随时向我们咨询。 ### 回答2: Canoe.diva 是一种用于测试和仿真的软件工具,可以用于 TP(Top Package)层的测试。下面是canoe.diva 操作指南 - TP层测试的基本步骤: 1. 打开 Canoe.diva 软件:启动 Canoe.diva 软件,并确保正确加载了相应的配置文件和脚本。 2. 配置测试环境:在 Canoe.diva 中配置适当的测试环境,包括选择正确的接口和设置相应的通信参数。 3. 创建测试场景:根据需要创建适当的测试场景,包括发送和接收的消息、消息的顺序和时间间隔等。 4. 编写测试脚本:根据测试需求,编写相应的测试脚本,以便在 Canoe.diva 中自动执行测试。 5. 运行测试:通过点击运行按钮,执行测试脚本,并观察 Canoe.diva 的输出结果。可以查看发送和接收的消息、日志记录和任何错误消息。 6. 分析测试结果:根据 Canoe.diva 提供的测试结果,分析测试是否通过或失败,并确定可能的原因。 7. 修复和重新运行:如果测试失败,根据分析的结果进行修复,并重新运行测试,直到测试通过。 8. 生成测试报告:根据测试结果,生成详细的测试报告,包括测试过程、结果、异常情况和修复措施等。 总结:Canoe.diva 是一种功能强大的测试工具,可用于 TP层测试。通过正确配置测试环境、创建测试场景、编写脚本、运行测试、分析结果和生成报告,可以有效地进行测试,并提供准确的测试结果。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚂蚁小兵

慢慢长夜磨一章好文章,费烟!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值