Twincat 3:如何将4个HEX数组转换为Float?

Joe*_*les 2 plc twincat

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

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

udp_data[0] = 'BE';
udp_data[1] = '7A';
udp_data[2] = 'E0';
udp_data[3] = 'F4';
Run Code Online (Sandbox Code Playgroud)

在给定的示例中,正确的等价,转换后,udp_data等效于-0.24499:

Twincat 3 PLC的最佳转换是什么?也许有些图书馆?我们需要同时执行52次转换.

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

谢谢!!

小智 6

您可以使用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  
Run Code Online (Sandbox Code Playgroud)

在MAIN中,您可以声明以下var.

VAR
    uConvert: U_Convert;
    fValue : REAL;
END_VAR
Run Code Online (Sandbox Code Playgroud)

在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;
Run Code Online (Sandbox Code Playgroud)


Jak*_*kob 5

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

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
Run Code Online (Sandbox Code Playgroud)

身体:

pt := ADR(aByteArray);
fRealValue := pt^;
Run Code Online (Sandbox Code Playgroud)

会给你想要的结果:

在此处输入图片说明