【问题标题】:[CAPL]How to route the signals from one PDU of CAN channel to another CAN channel in CANoe?[CAPL]CANoe中如何将信号从一个CAN通道的PDU路由到另一个CAN通道?
【发布时间】:2021-05-27 03:16:08
【问题描述】:

我是 CAPL 编程的新手。 如何将属于一个 CAN 通道的一个 PDU 的信号路由到另一个 CAN 通道。 谁能建议我怎么做?

【问题讨论】:

  • 您好,请问您可以澄清一些话题吗?我的意思是,您是否想将信号值从 PDU1 镜像到另一个信号值 PDU2?
  • 这就像重新路由。例如,一个 PDU 包含 4 个来自 CAN 通道 1 的信号。我希望这个特定的 PDU(所有信号)路由到 CAN 通道 2。
  • 如何模拟 CAN 通道 2 中的 PDU?你在使用交互层吗?还是您只是使用 CAPL 发送所有 PDU 和帧?

标签: capl canoe


【解决方案1】:

如果我理解得很好,您正在尝试做一个网关模块,在该模块中您将从一个通道接收消息,并且您必须将接收到的消息发送到另一个通道。 请尝试这段代码,可能对您有所帮助。

variables
{
   message 0x123 Chanl1 = 
   {
      ID = 0x111;
      DLC = 8,
      CAN = 1,
   };
   message 0x123 Chanl2 = 
   {
      ID = 0x111;
      DLC = 8,
      CAN = 2;
   };
} 
    
on message *
{
   if((this.ID == 0x111) && (this.CAN == 1)) // 0x111 is your channel1 id
   {
      chanl2.byte(0) = this.byte(0);
      chanl2.byte(1) = this.byte(1);
      chanl2.byte(7) = this.byte(7);
      chanl2.id = 0x111;
      output(chanl2);               
   }
}

【讨论】:

    【解决方案2】:

    声明系统变量:

    • isPDUGoingToBeSent - 值更改将触发事件on sysvar sysvar::isPDUGoingToBeSent

    • some_signal_sysvar

    将接收到的信号值写入系统变量,并触发另一个事件。

    on PDU ReceivedPDU
    {
        @sysvar::some_signal_sysvar = $ReceivedPDU::signal_name;
        @sysvar::isPDUGoingToBeSent = 1;
    }
    

    在触发事件时检查是否已设置 sysvar 并发送 PDU。

    on sysvar sysvar::isPDUGoingToBeSent
    {
        if(@this)
        {
            pdu PDU_FROM_DB mirrored_pdu;
            mirrored_pdu.some_signal = @sysvar::some_signal_sysvar;
            triggerPDU(mirrored_pdu);
        }
    }
    

    【讨论】:

    • 如果数据库中有 1000 个信号,那么这个解决方案将是一个巨大的开销。如果使用交互层,最好的方法是在 pdu 上使用,然后直接在交互层变量中设置信号。
    • 您好,感谢您的回答。我假设所有者已经在问题下的 cmets 中指定了 PDU(one particular,假设还有更多我们不想传递给 CAN2)和信号(4)的数量。恕我直言,它仍然适用,但我对其他解决方案很好奇。请发布答案或编辑我的答案,而不是在 cmets 中解决它。问候。
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多