modbus 如何讀取浮點(diǎn)數(shù)
本文為大家介紹modbus讀取浮點(diǎn)數(shù)的兩個(gè)程序設(shè)計(jì)。
Modbus 還原浮點(diǎn)數(shù)函數(shù)
//// 將從串口接收到的浮點(diǎn)數(shù)四個(gè)字節(jié),還原成浮點(diǎn)數(shù) ////
//// p[0] 從串口接收到的浮點(diǎn)數(shù)第1個(gè)字節(jié)……p[3] 從串口接收到的浮點(diǎn)數(shù)第4個(gè)字節(jié) ////
//// 返回 浮點(diǎn)數(shù)
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);
}
/* 應(yīng)用范例
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;
*/
關(guān)于MODBUS DOUBLE型數(shù)據(jù)讀取問題(64位浮點(diǎn)數(shù))
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:負(fù)數(shù),為0:正數(shù)****************
L #IN[1]; // 取MODBUS傳過來的第1,2個(gè)字
SRD 31; //取符號(hào)位
L 1;
==D ;
JCN _001;
L DW#16#80000000; //為1就設(shè)定63位為1
T #S;
JU _002;
_001: L 0; //為0 就設(shè)定為0
T #S;
_002: NOP 0;
//*************************************************************************
NETWORK
TITLE =
//*********************************取階碼E,共11位*****************************
L #IN[1];
SRD 20; //去掉尾數(shù)位,共20位
L DW#16#7FF; //去掉符號(hào)位
AD ;
L DW#16#FFFFFC01; //減去1023(此數(shù)為-1023)
+D ;
T #E;
//*******************************************計(jì)算第1,2個(gè)字的尾數(shù)******************************
L #IN[1];
L DW#16#FFFFF; //取第1,2個(gè)字的共20位的尾數(shù)
AD ;
T #MM;
//********************** 20位,逐個(gè)移位進(jìn)行計(jì)算**************************
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; //逐位移出計(jì)算并累加
+R ;
T #M1;
_003: NOP 0;
L #TEMP0;
LOOP LOOP;
//************************************************第3,4個(gè)字的尾數(shù)逐位移出計(jì)算,共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進(jìn)制]-127)*(1+M[尾數(shù)])*************************
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
非常好我支持^.^
(21) 100%
不好我反對(duì)
(0) 0%
相關(guān)閱讀:
- [電子說] EtherCAT從站轉(zhuǎn)modbus RTU協(xié)議轉(zhuǎn)換網(wǎng)關(guān)用modbus slave測(cè)試的方法 2023-10-24
- [電子說] DLT698轉(zhuǎn)modbus協(xié)議網(wǎng)關(guān)把電能數(shù)據(jù)接到wincc的方法 2023-10-24
- [電子說] 軟啟動(dòng)器與PLC通過ModbusRTU轉(zhuǎn)Profinet網(wǎng)關(guān)連接的配置案例 2023-10-24
- [電子說] Modbus485轉(zhuǎn)profinet網(wǎng)關(guān)連接伺服主軸驅(qū)動(dòng)器與PLC的具體應(yīng)用 2023-10-24
- [電子說] 通過MODBUS轉(zhuǎn)PROFINET(PROFINET轉(zhuǎn)MODBUS)網(wǎng)關(guān)連接EP1C系列通用伺服驅(qū)動(dòng)器 2023-10-24
- [電子說] 軟啟動(dòng)器與PLC通過ModbusRTU轉(zhuǎn)Profinet網(wǎng)關(guān)連接的配置案例 2023-10-24
- [電子說] Modbus485轉(zhuǎn)profinet網(wǎng)關(guān)連接伺服主軸驅(qū)動(dòng)器與PLC的具體應(yīng)用 2023-10-24
- [電子說] CRT-通用3-6軸MF系列多功能運(yùn)動(dòng)控制系統(tǒng)示教編輯案例 2023-10-21
( 發(fā)表人:李建兵 )