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) в физическое значение в форме определения коэффициента и смещения:
Таким образом, ваше физическое значение тока должно быть рассчитано следующим образом: 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);
}
Альтернативное решение, если вы не хотите принудительно преобразовывать значение:
- Вы определяете тип sysvar float (double) и используете этот sysvar на панели (ссылка на него) вместо envVar
- или вы измените тип envVar на float (double).
Перевод в float будет выполнен автоматически
Предостережение: обычно для этого трюка требуется, чтобы входное число также составляло 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