CAPL - преобразование 4 необработанных байтов в число с плавающей запятой - PullRequest
0 голосов
/ 01 октября 2018

CAPL - Vector.

Я получаю сообщение с идентификатором 0x110, в котором хранится текущая информация:

0x3E6978D5 -> 0,228

В настоящее время я могу прочитать данные и сохранить их в переменной Enviroment.для отображения в Panel с помощью:

putValue (slow_current, this.long (4));

Но я не знаю, как преобразовать 4 байта HEX в переменную типа float, поскольку не могуиспользовать адрес или приведение (float * x = (float *) & vBuffer;)

Как сделать это преобразование в сценарии CAPL?Спасибо.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Альтернативное решение, если вы не хотите принудительно преобразовывать значение:

  1. Вы определяете sysvar тип float (double) и используете этоsysvar на панели (ссылка на него) вместо envVar
  2. или вы измените тип envVar на float (double) .

enter image description here Перевод на float будет выполнен автоматически

New Sysvar addition interface.

Предостережение : обычно этот трюк требует, чтобывходной номер также составляет 8 байтов, так как определенный диапазон с плавающей запятой CAPL 8 байтов. Но у вас есть это ограничение длины полезной нагрузки сообщения = 8 байтов.

0 голосов
/ 04 октября 2018

Обычно ваш dbc-файл должен содержать информацию о преобразовании из необработанного значения (в вашем случае длиной 4B) в физическое значение в виде определения коэффициента и смещения:

dbc-file editor++ screenshot

Таким образом, ваше физическое значение тока должно быть рассчитано следующим образом: phys_val = (raw_value * factor) + offset

Примечание: если вы определяете отрицательное смещение, тогда вы фактически вычитаете его вуравнение выше.

Но, похоже, у вас нет dbc-файла, поэтому вам нужно вычислить коэффициент и смещение самостоятельно (если у вас есть 2 примера необработанных значений и вы знаете их физический эквивалент, тогда это будет так же просто, как найти линейныйПараметры уравнения -> y = ax + b).

CAPL должен выглядеть следующим образом:

variables

{
    float current_phys;
    /* adjust below values to your needs */
    float factor = 0.001 
    dword offset = -1000
}
on message 0x110
{
    current_phys = (this.long(4) * factor) + offset;
    write(current_phys);
}
0 голосов
/ 01 октября 2018

Не выглядит хорошо, но работает:

получено сообщение: 0x3E6978D5

putValue (float4byte, interpretAdFloat (this.long (4)));

float4byte =0,23

...