64位浮点转32位浮点

2021-11-09 14:45:49 浏览数 (1)

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

0 人点赞