Как использовать сигнал в качестве параметра функции в CAPL - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь написать в 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;

Это уже сделало мой код намного короче, но есть другие операции, которые мне нужно выполнить для нескольких сигналов, поэтому возможность использовать сигналы в качестве параметра функции все равно будет полезна.

1 Ответ

0 голосов
/ 10 июля 2019

Что вы можете сделать, это:

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.

Помимо этого, вы можете переосмыслить, действительно ли вы должны использовать on message, а вместо этого переключиться на on signal. Обработка значений сигналов независимо от того, с каким сообщением они отправляются, выполняется сервером сигналов CANoe.

...