如何使用 capl 在 FlexRay 中停止发送 PDU

How-to Stop sending out PDU in FlexRay with capl

在我们的案例中,我有一个名为 TEMP 的 FlexRay PDU,它在每个周期都被填充,我想在这个 PDU 上模拟超时,但它没有更新位。

我有一个面板,我在其中检查启用按钮以决定是否应该发送它。

frPdu FR::TEMP_Pdu;

on preStart {
  if (@FR_namespace::TEMP_Enablebutton)
  {
     FRSetSendPDU(TEMP_Pdu); 
  }
}

on frStartCycle * {
   if (@FR_namespace::TEMP_Enablebutton)
      FrUpdatePDU(TEMP_Pdu, 1, 1));
}

无论我将按钮设置为什么,PDU 都会在每个循环中传输。

我自己不使用 Vector CANoe 或 CANalyzer,几乎没有 public 文档,所以我只能提供一些一般的调试提示:

  • 您是否检查过@FR_namespace::TEMP_Enablebutton 是否具有预期值,即当您关闭按钮时它真的是错误的?您可以在 "on frStartCycle" 内的 if() 之前添加一个 write() 来检查这一点。
  • 这个问题看起来很相似:Sending Periodic CAN signals on button press using CAPL and CANalyzer - 他们使用 "on sysvar" 对按钮按下做出反应,也许你必须做类似的事情。即:响应按钮按下,设置环境变量,检查 "on frStartCycle"
  • 中的变量
  • 由于public资料不多,你也可以在公司内部多打听一下,说不定身边会有人可以帮助到你。

FRUpdatePDU() 没有发送另一个 PDU 实例,它只是用来自 frPDU 对象的数据更新下一次迭代,因为我们谈论的是静态帧的 PDU,一旦 VN 开始发送它,你就不能通过 PDU 控制单独停止它。

帧与 PDU 帧是网络上的物理Flexray Frame。 PDU,是帧有效载荷的一部分(或全部)的虚拟化。 打个比方:邮车就是FlexRay Frame,里面的箱子就是PDU。对于邮政服务(Flexray 协议 - OSI 第 1 层)而言,重要的单元是卡车本身,而对于您(客户)而言,则是其中的箱子。您永远不会对什么样的卡车用箱子运送您的好东西感兴趣,您只对内容本身感兴趣。

当您调用 FrUpdatePDU() 时,您不仅开始发送 PDU,而且还激活(发送非空帧)它的插槽。 通过将下面的帧设置为非空帧,您可以确保(在静态帧的情况下)它将从该点自动循环发送,无论您要对 PDU 做什么(卡车无论如何都会行驶,即使如果你不想在其中发送盒子)。

解法: 我假设您没有 IL DLL 来帮助您,因此您只能使用 CANoe 环境作为通用 FlexRay IL 功能提供的功能。

  1. 您需要识别携带PDU的帧。
  2. 您还需要使用 frUpdateStatFrame() 来操作框架。

frframe FramefromDBCofTEMPPDU InstanceofFrameTemp;

在 frStartCycle * {

if (@FR_namespace::TEMP_Enablebutton==1)

{

mframe.fr_flags=0x0;

frUpdateStatFrame(mframe);

TEMP_Pdu.byte(0xAA);

FrUpdatePDU(TEMP_Pdu, 1, 1));

}

else 

{

mframe.fr_flags=0x80;

frUpdateStatFrame(mframe);

}

}

所以,其实你也需要修改框架。关于frame flags,查看Help中frframe的定义。