CAPL-将4个原始字节转换为浮点数

时间:2018-10-01 11:47:54

标签: type-conversion capl

CAPL-矢量。

我收到消息ID 0x110,其中包含当前信息:

0x3E6978D5-> 0.228

当前,我可以读取数据并将其保存到环境变量中,以使用以下方法在面板中显示:

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

但是我不知道如何将4个十六进制字节转换为float变量,因为我不能使用地址或强制转换(float * x =(float *)&vBuffer;)

如何使用CAPL脚本进行此转换?谢谢。

4 个答案:

答案 0 :(得分:2)

通常,您的dbc文件应以因子和偏移量定义的形式包含从原始值(在您的情况下为4B长)到物理值的转换信息:

dbc-file editor++ screenshot

因此,您的电流物理值应按以下公式计算: phys_val =(原始值*因子)+偏移量

注意::如果您定义负偏移量,那么您实际上在上面的公式中减去了它。

但是似乎您没有dbc文件,因此您需要自己弄清楚系数和偏移量(如果您有2个示例原始值并且知道它们的物理等效项,那么它就像查找线性方程参数一样容易- > y =轴+ 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);
}

答案 1 :(得分:1)

如果不想强制转换值的替代解决方案:

  1. 您定义 sysvar 类型 float(double),然后在面板中使用该sysvar (链接到它),而不是envVar
  2. 或者您将envVar的类型更改为 float(double)

enter image description here 转换为float会自动完成

New Sysvar addition interface

注意:通常,此技巧要求输入数字也是8个字节,因为定义的CAPL浮动范围是8个字节。 但是通过消息有效负载长度约束= 8bytes可以做到这一点。

答案 2 :(得分:0)

外观不好,但是可以工作:

收到的味精:0x3E6978D5

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

float4byte = 0.23

答案 3 :(得分:-1)

我只是重用了ViníciusOliveira解决方案,以避免创建环境变量。有效

float floatvalue;
floatvalue = interpretAsFloat(HexValue);

输入(HexValue)= 0x3fe20e3a 输出(floatvalue()= 1.76606