前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >64位浮点转32位浮点

64位浮点转32位浮点

作者头像
剑指工控
发布2021-11-09 14:45:49
2.1K0
发布2021-11-09 14:45:49
举报
文章被收录于专栏:剑指工控

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 剑指工控 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档