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

Function 如何在CAPL中使用信号作为函数参数,function,capl,canalyzer,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(t

我试图在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数据类型


除此之外,您可能会重新考虑是否真的应该在消息上使用
,而是在信号上切换到
。处理信号值,无论发送的是哪条消息,都是由CANoe的信号服务器完成的。

注意,CANoe已经有了一个功能,它可以完成您想要做的事情(乘以因子并添加偏移量)。它被称为
getSignal

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

偏移量和系数在DBC文件中定义。

请显示代码好吗?首先,什么是
消息
?是CAN信息吗?我从来没有见过,你可以访问这样的can信息的信号。除此之外,当您直接访问CAPL中的信号值时,您已经获得了物理值,无需自己计算。我希望我所做的更改澄清了这个问题。我想信号上的
事件将不适合您的目的,对吗?然而,我不明白为什么。因为你想把它推广?如果是这样,您可以使用系统变量镜像任何所需的信号,并可能将其用作事件的触发器?我从未尝试过,所以这纯粹是想象。让我知道你的想法。我考虑过使用系统变量,但我得出的结论是,它不会改变问题,因为我仍然需要单独处理每个信号。这也是我不能在信号上使用的原因。当然,我可以用on signal代替on message+id检查,但这意味着需要很多额外的代码。谢谢你的回答。不幸的是,我得到了一个错误“当前上下文中不允许使用面向信号的CAPL(CANalyzer,Analyze,Test…)”,所以我猜$s与CANalyzer不兼容?似乎是这样的。我当时正在使用独木舟,不知道CANalyzer有这个限制。