TIA中已经支持64位高精度的浮点格式,当S7-1200/1500与S7300/400通讯的时候,这些高精度的浮点数是无法在300/400里计算,必须转成32为浮点数,剑指工控里很多网友都不知道该如何转换,那在这里我们首先看一下32位浮点数的格式。
而双精度(64位)浮点数的结构与单精度相仿
名称 长度 位置
符号位 Sign (S) : 1bit (63)
指数部分Exponent (E) : 11bit (62-52)
尾数部分Mantissa (M) : 52bit (51-0)
双精度的指数部分(E)采用的偏置码为1023
解决方法:
双精度浮点和单精度浮点主要区别就是:
1、指数,双精度指数11为,最大值为308计算为(指数11位形成的数量-1027),单精度浮点数8位,最大38,计算(8位形成的数值-127),双精度转单精度的指数计算是(指数11位形成的数值-1027) 127.
2、小数,无论单精度还是双精度小数部分计算方式一样,所以可以直接从双精度浮点小数中截取前23位就可以了。
算法代码:
FUNCTION FC1:VOID
TITLE=‘ Double Float to Single Float’
NAME=Jiansiting
VAR_INPUT
DF_INPUT:ANY;
END_VAR
VAR_OUTPUT
F_OUTPUT:REAL;
RETVAL:WORD;
END_VAR
VAR_TEMP
HFORS7:BYTE;
DATA_TYPE:BYTE;
REP_FACTOR:WORD;
DB_NUMBER:WORD;
MEM_AREA:BYTE;
TEMP1:BYTE;
ADDR_1:BYTE;
ADDR_2:BYTE;
ADDR_3:BYTE;
ADDR_4:BYTE;
OUT_T:REAL;
AD_T:DWORD;
END_VAR
BEGIN
L 0.000000e 000
T #OUT_T
L P#DF_INPUT
LAR1
L B[AR1,P#0.0]
T #HFORS7
L B[AR1,P#1.0]
T #DATA_TYPE
L B[AR1,P#2.0]
T #REP_FACTOR
L B[AR1,P#4.0]
T #DB_NUMBER
L B[AR1,P#6.0]
T #MEM_AREA
L B#16#0
T #ADDR_1
L B[AR1,P#7.0]
T #ADDR_2
L B[AR1,P#8.0]
T #ADDR_3
L B[AR1,P#9.0]
T #ADDR_4
L #MEM_AREA
L B#16#80
JC ERR0
L #MEM_AREA
L B#16#81
JC ERR1
L #MEM_AREA
L B#16#82
JC ERR2
L #MEM_AREA
L B#16#83
JC MAR
L #MEM_AREA
L B#16#84
JC DBAR
L #MEM_AREA
L B#16#85
JC ERR5
L #MEM_AREA
L B#16#86
JC ERR6
L #MEM_AREA
L B#16#87
JC ERR7
MAR: LAR1 LD 8
L MW[AR1,P#0.0]
SLW 1
SRW 5
L 1023
-I
L 128
>I
JCB ERRA
TAK
L 127
I
SLW 7
L LW 12
OW
T LW 12
L MD[AR1,#P1.0]
SLD 4
SRD 9
L #OUT_T
OD
T #OUT_T
A M[AR1,P#0.7]
= L 12.7
JU COMP
DBAR: OPN [#DB_NUMBER]
LAR1 LD 8
L DBW[AR1,P#0.0]
SLW 1
SRW 5
L 1023
-I
L 128
>I
JCB ERRA
TAK
L 127
I
SLW 7
L LW 12
OW
T LW 12
L DBD[AR1,P#1.0]
SLD 4
SRD 9
L #OUT_T
OD
T #OUT_T
A DBX[AR1,P#0.7]
= L 12.7
COMP: L #OUT_T
T #F_OUT
SET
SAVE
BE
ERR0: L W#16#8000
JU END
ERR1: L W#16#8001
JU END
ERR2: L W#16#8002
JU END
ERR3: L W#16#8003
JU END
ERR5: L W#16#8005
JU END
ERR6: L W#16#8006
JU END
ERR7: L W#16#8007
JU END
ERRA: L W#16#8100
JU END
END: T #RETVAL
NOP 0
END_FUNCTION