如何在 CAPL 中使用信号作为函数参数

How to use a signal as function parameter in CAPL

我正在尝试在 CAPL 中编写一个函数,该函数接收信号并使用信号值、信号因子和信号偏移计算物理值。

这是简单网关的正常工作方式:

message CAN1.myMessage1 myMessage1 = {DIR = RX};//message from the database
message CAN2.myMessage2 myMessage2 = {DIR = TX};//another message from the database

on message CAN1.*
{
   if(this.id == myMessage1.id)
   {
      myMessage1 = this;
      myMessage2.mySignalB = myMessage1.mySignalA * myMessage1.mySignalA.factor + myMessage1.mySignalA.offset;
   }
}

这就是我想要做的:

...
on message CAN1.*
{
   if(this.id ==myMessage1.id)
   {
      myMessage1 = this;
      myMessage2.mySignalB = PhysicalValue(myMessage1.mySignalA);
   }
}

double PhysicalValue(signal * s)
{
  return s*s.factor+s.offset;
}

这段代码有两个问题:
首先,当我将信号作为参数传递时,编译器说类型不匹配。第二个问题是函数内部不再识别属性(因子和偏移量)。 这些问题可能与 CAPL 怪异的面向对象但并非真正的性质有关。信号的值可以直接访问但它也有属性?

int rawValue = myMessage1.mySignalA;

如果您熟悉 C,您可能会说问题是我在函数中指定了一个指针,但我没有将指针传递给它。但是在 CAPL 中没有指针,* 只是意味着任何东西。 如果没有 * 我将需要使用一个特定的信号,这将破坏该功能的目的。

编辑:
到目前为止,我已经找到了属性 .phys,它的作用与我的演示函数完全相同。

double physValue = myMessage1.mySignalA.phys;

这已经大大缩短了我的代码,但我还需要对多个信号执行其他操作,因此能够将信号用作函数参数仍然有用。

你能做的是:

double PhysicalValue(signal * s)
{
  // access signal by prepending a $
  return $s.phys;
}

这样调用

on message CAN1.*
{
   if(this.id ==myMessage1.id)
   {
      myMessage1 = this;
      myMessage2.mySignalB = PhysicalValue(CAN1::myMessage1::mySignalA);
   }
}

即当你调用你的函数时,你必须提供信号的限定名称(用冒号而不是点)。据我所知,不可能使用 myMessage1.mySignalA,因为信号本身不是 CAPL 数据类型。

除此之外,您可能 re-think 是否真的应该使用 on message,而是切换到 on signal。处理信号值,无论它们发送的是哪条消息,都是由 CANoe 的信号服务器完成的。

请注意,CANoe 已经有一个函数可以完全按照您的要求执行(乘以因子并添加偏移量)。它被称为 getSignal:

on message CAN1.*
{
   if(this.id == myMessage1.id)
   {
      myMessage2.mySignalB = getSignal(myMessage1::mySignalA);
   }
}

偏移量和因子定义在例如DBC 文件。