Я пытаюсь написать в 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 нет указателей, а * просто означает что-либо.
Без * мне нужно было бы использовать определенный сигнал, который бы победил назначение функции.
EDIT:
К настоящему времени я нашел атрибут .phys, который делает именно то, что сделала бы моя демонстрационная функция.
double physValue = myMessage1.mySignalA.phys;
Это уже сделало мой код намного короче, но есть другие операции, которые мне нужно выполнить для нескольких сигналов, поэтому возможность использовать сигналы в качестве параметра функции все равно будет полезна.