CAPL - преобразование 4 необработанных байтов в число с плавающей запятой

CAPL - Вектор.

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

0x3E6978D5 -> 0,228

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

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

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

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

3 ответа

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

скриншот dbc-редактора файлов

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

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

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

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);
}

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

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

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

Новый дополнительный интерфейс Sysvar,

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

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

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

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

float4byte = 0,23

Я просто повторно использовал решение Vinícius Oliveira, чтобы избежать создания переменной окружения. это сработало

float floatvalue; floatvalue = интерпретировать AsFloat(HexValue);

input (HexValue) = 0x3fe20e3a output (floatvalue () = 1.76606

Другие вопросы по тегам