modbus 如何读取浮点数

通信技术

40人已加入

描述

本文为大家介绍modbus读取浮点数的两个程序设计。

Modbus 还原浮点数函数

//// 将从串口接收到的浮点数四个字节,还原成浮点数 ////

//// p[0] 从串口接收到的浮点数第1个字节……p[3] 从串口接收到的浮点数第4个字节 ////

//// 返回 浮点数

float get_float_from_4u8(u8 *p)

{ float a;

u8 *r;

r=(u8*)&a;

*r=p[1]; r++;

*r=p[0]; r++;

*r=p[3]; r++;

*r=p[2];

return(a);

}

/* 应用范例

pp[0]=0x00; pp[1]=0x00;

pp[2]=0x43; pp[3]=0x5c;

mf1=get_float_from_4u8(pp); // mf1 = 220.0

pp[0]=0xb2; pp[1]=0x2d; pp[2]=0x3f; pp[3]=0x5d;

mf2=get_float_from_4u8(pp); // mf2 = 0.8666

pp[0]=0x00; pp[1]=0x00; pp[2]=0x42; pp[3]=0xc8;

mf3=get_float_from_4u8(pp); // mf3 = 100.0;

pp[0]=0x00; pp[1]=0x00; pp[2]=0x42; pp[3]=0x48;

mf4=get_float_from_4u8(pp); // mf4 = 50.0;

*/

关于MODBUS DOUBLE型数据读取问题(64位浮点数)

FUNCTION “LREAL2REAL_XXD” : REAL

TITLE =

VERSION : 0.1

VAR_INPUT

IN : ARRAY [1 。。 2 ] OF DWORD ;

END_VAR

VAR_TEMP

E : DWORD ;

MT : REAL ;

S : DWORD ;

TEMP0 : DWORD ;

MM : DWORD ;

TEMP1 : DWORD ;

M1 : REAL ;

TEMP_1 : REAL ;

M2 : REAL ;

REAL1 : REAL ;

REAL2 : REAL ;

REAL3 : REAL ;

M_REAL : REAL ;

END_VAR

BEGIN

NETWORK

TITLE =

L 0;

T #M1;

NETWORK

TITLE =

//************判断第63位S,为1:负数,为0:正数****************

L #IN[1]; // 取MODBUS传过来的第1,2个字

SRD 31; //取符号位

L 1;

==D ;

JCN _001;

L DW#16#80000000; //为1就设定63位为1

T #S;

JU _002;

_001: L 0; //为0 就设定为0

T #S;

_002: NOP 0;

//*************************************************************************

NETWORK

TITLE =

//*********************************取阶码E,共11位*****************************

L #IN[1];

SRD 20; //去掉尾数位,共20位

L DW#16#7FF; //去掉符号位

AD ;

L DW#16#FFFFFC01; //减去1023(此数为-1023)

+D ;

T #E;

//*******************************************计算第1,2个字的尾数******************************

L #IN[1];

L DW#16#FFFFF; //取第1,2个字的共20位的尾数

AD ;

T #MM;

//********************** 20位,逐个移位进行计算**************************

L 20;

LOOP: T #TEMP0;

L 1;

L #MM;

SRD ;

T #MM;

JZ _003;

L 2.000000e+000; //1/2^#MM

LN ;

L #TEMP0;

DTR ;

*R ;

EXP ;

L 1.000000e+000;

TAK ;

/R ;

T #M_REAL;

L #M1; //逐位移出计算并累加

+R ;

T #M1;

_003: NOP 0;

L #TEMP0;

LOOP LOOP;

//************************************************第3,4个字的尾数逐位移出计算,共32位**********************

L #IN[2];

T #MM;

L 32;

LOP: T #TEMP0;

L 20;

+D ;

T #TEMP1;

L 1;

L #MM;

SRD ;

T #MM;

JZ _004;

L 2.000000e+000;

LN ;

L #TEMP1;

DTR ;

*R ;

EXP ;

L 1.000000e+000;

TAK ;

/R ;

T #M_REAL;

L #M2;

+R ;

T #M2;

_004: NOP 0;

L #TEMP0;

LOOP LOP;

//***************************************

L #M1;

L #M2;

+R ;

T #MT;

NETWORK

TITLE =

//********************F=(-1)^S*2^(E[10进制]-127)*(1+M[尾数])*************************

L 2.000000e+000;

LN ;

L #E;

DTR ;

*R ;

EXP ;

T #REAL2;

L 1.000000e+000;

L #MT;

+R ;

T #REAL3;

L #REAL2;

L #REAL3;

*R ;

L #S;

OD ;

T #RET_VAL;

END_FUNCTION

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分