【问题标题】:Twincat 3: How to convert 4 HEX array to Float?Twincat 3:如何将 4 个 HEX 数组转换为浮点数?
【发布时间】:2018-12-04 23:30:15
【问题描述】:

我们正在接收(通过 UDP 数据报)一个由 4 字节十六进制数组编码的浮点值。

我们需要将 4 个十六进制字节转换为浮点数。

udp_data[0] = 'BE';
udp_data[1] = '7A';
udp_data[2] = 'E0';
udp_data[3] = 'F4';

在给定的例子中,正确的等价,经过变换后,udp_data等价于-0.24499:

Twincat 3 PLC 中的最佳转换是什么?也许一些图书馆?这种类型我们需要一次性进行52次变换。

我附上了一个来自在线计算器的例子:

谢谢!!

【问题讨论】:

    标签: plc twincat


    【解决方案1】:

    您可以使用 UNION 类型,该类型将在同一地址保存一个字节数组(就像您从 UDP 通信中获得的那个)和您要转换为的真实 var。
    当你改变字节数组时,real 会自动反映它。事实上,转换也可以反过来进行。

    TYPE U_Convert :  
    UNION  
        arrUDP_Data: ARRAY [0 .. 3] OF BYTE; // Array must start with LSB  
        rReal : REAL;  
    END_UNION  
    END_TYPE  
    

    您可以在 MAIN 中声明以下变量。

    VAR
        uConvert: U_Convert;
        fValue : REAL;
    END_VAR
    

    并在 MAIN 的主体中,将字节数组更新为请求的值。

    // Here we update the byte array
    uConvert.arrUDP_Data[0] := 16#F4; // LSB
    uConvert.arrUDP_Data[1] := 16#E0;
    uConvert.arrUDP_Data[2] := 16#7A;
    uConvert.arrUDP_Data[3] := 16#BE; // MSB
    
    // Here we 'use' the converted value
    fValue := uConvert.rReal;
    

    【讨论】:

    • 为此 +1。这是最优雅的转换方式,唯一的问题是您必须在此工作之前重新排序数组中的这些字节(如果数据来自其他来源,就像我想的那样)。一个简单的辅助函数就可以做到这一点,只需编写一个改变数组顺序的函数。
    • 我也为此+1,这确实是比我建议的更优雅的解决方案。工会的绝佳使用!
    【解决方案2】:

    我假设你有一个字节数组。 标头(如果需要,可以将其放入自己的功能块中):

    PROGRAM MAIN
    VAR
        aByteArray : ARRAY[1..4] OF BYTE := [16#F4, 16#E0, 16#7A, 16#BE];
        pt : POINTER TO REAL;
        fRealValue : REAL;
    END_VAR
    

    正文:

    pt := ADR(aByteArray);
    fRealValue := pt^;
    

    会给你想要的结果:

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      相关资源
      最近更新 更多