如何在CAPL中将信号用作功能参数

时间:2019-07-05 01:00:55

标签: function capl canalyzer

我正在尝试用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;

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

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

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

像这样打电话

myMessage1.mySignalA

即调用函数时,必须提供信号的限定名称(用冒号而不是点)。据我所知,由于信号本身不是CAPL数据类型,因此无法使用on message

除此之外,您可能会重新考虑是否确实应该使用on signal,而是切换到DOMDocument。不管通过哪种消息发送信号值,都由CANoe的信号服务器完成。

答案 1 :(得分:0)

请注意,CANoe已经具有一个功能,该功能可以完全完成您要执行的操作(乘以系数并添加偏移量)。叫做getSignal

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

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