首页 > 解决方案 > 如何使用 capl 在 FlexRay 中停止发送 PDU

问题描述

在我们的例子中,我有一个名为 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 都会在每个循环中传输。

标签: capl

解决方案


FRUpdatePDU() 不是发送另一个 PDU 实例,它只是使用来自 frPDU 对象的数据更新下一次迭代,因为我们正在谈论静态帧的 PDU,一旦 VN 开始发送它,您就不能通过 PDU 单独停止它控制。 在此处输入图像描述

帧与 PDU 帧是网络上的物理 Flexray 帧。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);

}

}

所以,实际上你也需要修改框架。关于框架标志,请查看帮助中的 frframe 定义。

在此处输入图像描述


推荐阅读