本文为大家介绍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;
*/
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
你还在用Win7吗?Win10系统安装量已超过Win...
时间:2026-03-06
提升有几许?RX 480新老驱动性能对比测试
时间:2026-03-06
兼顾高性能与颜值的显卡:AMD全新14nm工艺的...
时间:2026-03-06
CentOS系统宣布为ARM硬件架构发布CentOS Li...
时间:2026-03-06
我国发展高端服务器CPU条件已具备
时间:2026-03-06
CPU用硅不用锗 原因有哪些?
时间:2026-03-06
七彩虹再推iGame GTX 1070:信仰三风扇
时间:2026-03-06
AMD新卡P12和Vega10现身,吹响反攻NV的号角...
时间:2026-03-06
2016全球存储器市场同比下降1% 2020年将达千...
时间:2026-03-06
英伟达GTX 1060获8.9高评分 完全物有所值
时间:2026-03-06
瞬间抑制二极管(TVS)/瞬间抑制二极管(TVS)是...
时间:2026-03-04
什么是霍尔传感器
时间:2026-03-05
半导体材料的主要种类有哪些?
时间:2026-03-04
高级封装,高级封装是什么意思
时间:2026-03-04
数字比较器,数字比较器是什么意思
时间:2026-03-04
常用整流二极管型号大全
时间:2026-03-04
S/HS固态继电器原理简介
时间:2026-03-04
稳压二极管的选用和代换
时间:2026-03-04
TVS器件的电特性有哪些
时间:2026-03-04
TVS二极管的分类/应用,TVS二极管的特点/选用...
时间:2026-03-04