和利时MACSV6.5.3中4byte数据合并转换为单精度浮点数float

发布时间 2023-06-17 12:01:23作者: 生命在等待中延续

和利时MACSV6.5.3中4byte数据合并转换为单精度浮点数float

代码截图

验证

完整可导入代码

复制到记事本中,保存为xml文件,在和利时M6 AutoThink中导入

<?xml version="1.0" encoding="ISO-8859-1"?>
<pou>
	<path><![CDATA[USER]]></path>
	<name>IEEE754</name>
	<secondName></secondName>
	<description>4Byte数据转换为单精度浮点数</description>
	<flags>2048</flags>
	<auto-sort>0</auto-sort>
	<exporttime>2023-06-17 11:40:43</exporttime>
	<amendtime>2023-06-17 11:38:00</amendtime>
	<downloadtime></downloadtime>
	<modifier>AAAA</modifier>
	<PouPaperSize>A4</PouPaperSize>
	<PouPrintType>1</PouPrintType>
	<PouExcuteOrder>0</PouExcuteOrder>
	<interface>
<![CDATA[FUNCTION IEEE754 : REAL
VAR
		S1(2112): INT := 0;
		E1(2112): INT := 0;
		F1(2112): DWORD := 0;
END_VAR
VAR_INPUT
		IB0(2113): BYTE := 0;
		IB1(2113): BYTE := 0;
		IB2(2113): BYTE := 0;
		IB3(2113): BYTE := 0;
END_VAR
VAR_IN_OUT
END_VAR]]>
	</interface>
	<st>
		<body>
<![CDATA[(*
2023年6月17日 11:36 周六

注意:当4个byte数据均为0时,输出是一个非常小的数值,而不是0
原因在与     EXPT(2, INT_TO_REAL(E1 - 127))  不为0,该问题暂未解决

*)

(*--------数据位传输--------*);
F1 := PUTBIT(F1, 0, EXTRACT(IB0,0));
F1 := PUTBIT(F1, 1, EXTRACT(IB0,1));
F1 := PUTBIT(F1, 2, EXTRACT(IB0,2));
F1 := PUTBIT(F1, 3, EXTRACT(IB0,3));
F1 := PUTBIT(F1, 4, EXTRACT(IB0,4));
F1 := PUTBIT(F1, 5, EXTRACT(IB0,5));
F1 := PUTBIT(F1, 6, EXTRACT(IB0,6));
F1 := PUTBIT(F1, 7, EXTRACT(IB0,7));

F1 := PUTBIT(F1, 8, EXTRACT(IB1,0));
F1 := PUTBIT(F1, 9, EXTRACT(IB1,1));
F1 := PUTBIT(F1, 10, EXTRACT(IB1,2));
F1 := PUTBIT(F1, 11, EXTRACT(IB1,3));
F1 := PUTBIT(F1, 12, EXTRACT(IB1,4));
F1 := PUTBIT(F1, 13, EXTRACT(IB1,5));
F1 := PUTBIT(F1, 14, EXTRACT(IB1,6));
F1 := PUTBIT(F1, 15, EXTRACT(IB1,7));

F1 := PUTBIT(F1, 16, EXTRACT(IB2,0));
F1 := PUTBIT(F1, 17, EXTRACT(IB2,1));
F1 := PUTBIT(F1, 18, EXTRACT(IB2,2));
F1 := PUTBIT(F1, 19, EXTRACT(IB2,3));
F1 := PUTBIT(F1, 20, EXTRACT(IB2,4));
F1 := PUTBIT(F1, 21, EXTRACT(IB2,5));
F1 := PUTBIT(F1, 22, EXTRACT(IB2,6));

(*--------指数位传输--------*)
E1 := PUTBIT(E1, 0, EXTRACT(IB2,7));
E1 := PUTBIT(E1, 1, EXTRACT(IB3,0));
E1 := PUTBIT(E1, 2, EXTRACT(IB3,1));
E1 := PUTBIT(E1, 3, EXTRACT(IB3,2));
E1 := PUTBIT(E1, 4, EXTRACT(IB3,3));
E1 := PUTBIT(E1, 5, EXTRACT(IB3,4));
E1 := PUTBIT(E1, 6, EXTRACT(IB3,5));
E1 := PUTBIT(E1, 7, EXTRACT(IB3,6));

(*--------符号位传输--------*)
S1 := PUTBIT(S1, 0, EXTRACT(IB3,7));


IEEE754 := EXPT(-1, INT_TO_REAL(S1)) * EXPT(2, INT_TO_REAL(E1 - 127)) * ( DWORD_TO_REAL(F1) * (EXPT(2, -23)) + 1);]]>
		</body>
	</st>
</pou>