capl - 如何使用 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 都会在每个循环中传输。
解决方案
FRUpdatePDU() 不是发送另一个 PDU 实例,它只是使用来自 frPDU 对象的数据更新下一次迭代,因为我们正在谈论静态帧的 PDU,一旦 VN 开始发送它,您就不能通过 PDU 单独停止它控制。
帧与 PDU 帧是网络上的物理 Flexray 帧。PDU 是帧有效载荷的一部分(或全部)的虚拟化。类比:邮政卡车是 FlexRay Frame,里面的箱子是 PDU。对于邮政服务(Flexray 协议 - OSI 第 1 层)而言,重要的单元是卡车本身,而对于您(客户)来说,则是其中的箱子。你永远不会对什么样的卡车在盒子里运送你的好东西感兴趣,你只对内容本身感兴趣。
当您调用 FrUpdatePDU() 时,您不仅开始发送 PDU,而且还激活(发送非空帧)它的插槽。通过将下面的帧设置为非空帧,您确保(在静态帧的情况下)它将自动从该点循环发送,无论您想对 PDU 做什么(卡车仍然在行驶,即使如果您不想在其中发送盒子)。
解决方案: 我假设您没有 IL DLL 来帮助您,因此您仅限于 CANoe 环境提供的作为通用 FlexRay IL 功能的功能。
- 您需要识别承载 PDU 的帧。
- 您还需要使用 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 定义。
推荐阅读
- corda - Corda - 参考状态和“当前性”
- python - 我可以告诉机器学习模型因变量是正态分布的吗?
- rasa-nlu - 实现 Sql_tracker_store 的问题
- typescript - 抽象类需要一个属性。实现该属性时我不能使用“私有”。为什么?
- python-3.x - 5分钟后自动删除对象
- python - 熊猫发现缺少 15 分钟的间隔
- javascript - 从 Knex 更新中的连接表返回数据
- tensorflow - 时间序列 CNN,尝试使用 1,1 输入形状
- python - 无法从 pipeline.py 内部停止 Scrapy
- azure-devops - 在 Azure Devops 变量范围值发布意味着