添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

利用CANoe中的Callback机制实现诊断通信

除了报文记录、仿真、测试等功能外,CANoe本身也是一款功能非常强大的诊断仪。它为用户提供了两种实现诊断的方式,一种是图形化的界面,另一种是使用CAPL语言编写代码。对于后者,CAPL提供了一些应用层的函数,比如DiagSendRequest(),DiagSendResponse(),用它们将diagRequest和diagResponse对象发送出去,然后用on diagRequest或on diagResponse这种由CAPL提供的事件处理机制对收到的请求或响应(取决于仿真的是tester还是ECU)进行接收。利用这种方法我们不需要接触应用层正面的tp层,它可以用于验证应用层的一些功能,比如诊断命令和响应的格式等。但是有些情况下我们的测试或仿真工作是需要控制tp层的,这个时候就需要用到CANoe提供的Callback机制,全称CAPL Callback Interface,简称CCI。

CCI是一种连接CAPL程序应用层和传输层的手段,它由一系列事件触发的函数组成(比如其他的函数被调用,或者有数据到达传输层),如果想要使用CCI,则需要我们自己去将这些函数的内容实现,CCI的格式已经由CAPL规定好,它的函数名称、参数、返回值等都是定好的,而函数内容则是由用户完成的。

利用CCI可以实现的某些目的举例:

  • 改变CAN ID,测试ECU是否只对自己的CAN ID进行响应。
  • 故意将发送的消息延时一段时间,测试对方的timeout值是否准确。
  • 改变传输层中的消息内容,比如填充位,验证通信行为。


由CAPL提供的CCI函数包括

void _Diag_SetChannelParameters()

void _Diag_DataRequest (BYTE data[], DWORD count, long furtherSegments)

void _Diag_SetupChannelReq()

void _Diag_SendFunctional()

由具体的传输层动态库提供的CCI函数(以osek_tp.dll举例),比如

CanTp_SendCon() 用于指示消息发送状态

CanTp_ReceptionInd() 用于指示有消息到达传输层


传输层动态库提供的CCI函数在因为某些事件发生而被自动调用的时候,需要在里面调用CAPL提供的函数,用于向应用层传递信息,对于上面这两个CCI函数来说,分别应该在里面调用void Diag_DataCon (long count)和void Diag_DataInd (byte rxBuffer[], long count, long sender)。

CCI的位置

这张图展示了CCI的位置,它相当于应用层和传输层的粘合剂。下面举几个例子来说一下如何使用CCI。下面的几个例子展示了callback函数如何被调用以及如何调用别的函数。callback函数有两种情况下被调用,一种是某些特殊的CAPL函数被调用,另一种是发生了消息事件(比如发送或接收到消息)。

CALLBACK函数的调用关系

在我们自己定义callback函数时,无论是CAPL还是其他tp动态库定义的callback函数,都需要遵循一定的规则,调用一些必需的函数。比如下面这个osek_tp.dll提供的CanTP_DataCon函数,就必须调用CAPL提供的Diag_DataCon函数。

CanTP_DataCon( long count)

{

/* This function gets the number of bytes succsessfully sent */

Diag_DataCon( count);

}

发布于 2018-11-17 10:56

文章被以下专栏收录