CAPL-矢量。
我收到消息ID 0x110,其中包含当前信息:
0x3E6978D5-> 0.228
当前,我可以读取数据并将其保存到环境变量中,以使用以下方法在面板中显示:
putValue(slow_current,this.long(4));
但是我不知道如何将4个十六进制字节转换为float变量,因为我不能使用地址或强制转换(float * x =(float *)&vBuffer;)
如何使用CAPL脚本进行此转换?谢谢。
答案 0 :(得分:2)
通常,您的dbc文件应以因子和偏移量定义的形式包含从原始值(在您的情况下为4B长)到物理值的转换信息:
因此,您的电流物理值应按以下公式计算: 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)
如果不想强制转换值的替代解决方案:
注意:通常,此技巧要求输入数字也是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