我正在尝试用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;
这已经使我的代码短了很多,但是我还需要对多个信号执行其他操作,因此能够将信号用作功能参数仍然有用。
答案 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文件。