【问题标题】:CAPL - Converting 4 raw bytes into floating pointCAPL - 将 4 个原始字节转换为浮点数
【发布时间】:2020-09-06 18:59:48
【问题描述】:

CAPL - 向量。

我收到包含当前信息的消息 ID 0x110:

0x3E6978D5 -> 0.228

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

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

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

如何在 CAPL 脚本中进行这种转换?谢谢。

【问题讨论】:

  • 你不能只添加一个包含这些字节应该代表一个浮点数的信息的 DBC 吗?这样可以避免您自己进行转换。
  • 想一想,如果您使用 CANoe 10 或更高版本,您在环境选项卡中有一个称为符号映射的基本功能,您可以在其中永久链接信号和系统变量之间的关联。但是由于您的消息似乎没有信号映射,因此您必须为整个 8 字节有效负载定义一个信号,以便您可以在符号映射窗口中引用它。

标签: type-conversion capl


【解决方案1】:

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

因此您的电流物理值应计算如下: 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);
}

【讨论】:

    【解决方案2】:

    如果您不想强制转换值,则另一种解决方案:

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

    自动翻译成浮点数

    .

    警告:通常这个技巧要求输入数字也是 8 个字节,因为定义的 CAPL 浮点数范围是 8 个字节。 但是你有这个消息负载长度约束= 8bytes。

    【讨论】:

      【解决方案3】:

      看起来不太好,但有效:

      收到消息:0x3E6978D5

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

      float4byte = 0.23

      【讨论】:

        【解决方案4】:

        我只是重用了 Vinícius Oliveira 解决方案以避免创建环境变量。成功了

        float floatvalue;
        floatvalue = interpretAsFloat(HexValue);
        

        输入(十六进制值)= 0x3fe20e3a 输出(浮点值()= 1.76606

        【讨论】:

          猜你喜欢
          • 2020-04-27
          • 1970-01-01
          • 1970-01-01
          • 2014-08-13
          • 2017-03-25
          • 2012-12-27
          • 2010-09-05
          相关资源
          最近更新 更多