modbus 如何读取浮点数

本文为大家介绍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

无人驾驶汽车将大量在上海行驶 年内投两千辆
有线防盗与无线防盗的区别,各自应用的优缺点分析
亚马逊万亿美元市值高不高?还能再涨27%
MethodHandle调用示例
常见的几种Modbus网关介绍
modbus 如何读取浮点数
什么是电池材料隔膜剂?
搭建做交易所平台开发币币OTC系统软件公司
Box 模块的使用方法
如何启动本机docker服务
音响工程8大常见问题的检修
linux恢复远端备份文件
热点 | 荣耀正式发布新品类产品——“智慧屏”
智能网联汽车确定通信频段,车路协同开始火爆
四款可视化工具的优缺点
vivoXplay7新机曝光:全面屏+前后双摄,领先苹果三星的屏下指纹识别,vivoxplay7必将大火?
嵌入式工控机在物流领域有着怎样的应用
音频线的接法
【安全算法之MD5】MD5摘要运算的C语言源码实现
可折叠智能手机至少在未来五年内有望继续使用UTG和CPI