Twincat 3:如何将 4 个 HEX 数组转换为 Float?
Twincat 3: How to convert 4 HEX array to Float?
我们正在接收(通过 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次转换。
我附上了一个示例,示例来自在线计算器:
谢谢!!
我假设你有一个字节数组。
Header(如果需要,将其放在自己的功能块中):
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
Body:
pt := ADR(aByteArray);
fRealValue := pt^;
会给你想要的结果:
您可以使用 UNION 类型,它将在同一地址保存一个字节数组(就像您从 UDP 通信中获得的那个)和您要转换为的真实变量。
当您更改字节数组时,真实会自动反映出来。事实上,转换也可以反过来进行。
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;
我们正在接收(通过 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次转换。
我附上了一个示例,示例来自在线计算器:
谢谢!!
我假设你有一个字节数组。 Header(如果需要,将其放在自己的功能块中):
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
Body:
pt := ADR(aByteArray);
fRealValue := pt^;
会给你想要的结果:
您可以使用 UNION 类型,它将在同一地址保存一个字节数组(就像您从 UDP 通信中获得的那个)和您要转换为的真实变量。
当您更改字节数组时,真实会自动反映出来。事实上,转换也可以反过来进行。
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;