如何在 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 文件。
我正在尝试在 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 文件。