EDN博客精華文章 作者:weitongguo
工作中碰到的一個小問題,經(jīng)過了一番研究,終于搞明白了,為了以后大家不再撓頭,寫了這個供大家參考。其中涉及到MODTEST 軟件 MODBUS協(xié)議 IEEE32位二進(jìn)制浮點(diǎn)數(shù)與十進(jìn)制小數(shù)轉(zhuǎn)換的方法等內(nèi)容。
IEEE標(biāo)準(zhǔn)的32位浮點(diǎn)數(shù)轉(zhuǎn)換為十進(jìn)制的計(jì)算方法
下面是用筆記本電腦的MODTEST軟件在COM 1口經(jīng)232轉(zhuǎn)485轉(zhuǎn)換器轉(zhuǎn)變?yōu)?85口后連接到流量計(jì)算機(jī),通過MODBUS協(xié)議讀取到的流量計(jì)內(nèi)部數(shù)據(jù),下面通過分析,解釋了如何把十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的計(jì)算過程。即下面記錄里面的十六進(jìn)制數(shù)據(jù)轉(zhuǎn)換為左上角顯示的十進(jìn)制數(shù)據(jù)。

點(diǎn)擊看原圖
流量計(jì)計(jì)算機(jī)通過485端口以MODBUS協(xié)議把內(nèi)部IEEE32位浮點(diǎn)數(shù)傳送到DCS的數(shù)據(jù)
經(jīng)過研究試驗(yàn),其數(shù)據(jù)格式如下
數(shù)據(jù)請求依次為:十六進(jìn)制
從站地址:01;讀命令:03;數(shù)據(jù)起始高位地址:0F;數(shù)據(jù)起始低位地址:A0;(0FA0=4000即地址44001);數(shù)據(jù)長度高位:00;數(shù)據(jù)長度低位:28;(0028=40即40個地址);CRC效驗(yàn)碼:46,E2
數(shù)據(jù)應(yīng)答格式:
從站地址:01;讀命令反饋:03;數(shù)據(jù)長度:50;第一個地址:69;C0;48;A9;第二個地址:C5;00;48;A2;以下類推,直到最后兩位CRC:E8;86
第一個地址:69;C0;48;A9是如何換算為346958的呢?
流量計(jì)發(fā)送的是IEEE標(biāo)準(zhǔn)的32位浮點(diǎn)數(shù)
首先要把69;C0;48;A9進(jìn)行高低16位交換變成:48;A9;69;C0
變?yōu)?2位二進(jìn)制數(shù):01001000 10101001 01101001 11000000
其中最高位為0,代表是正數(shù)
接下來的八位:10010001變成十進(jìn)制是145,根據(jù)IEEE規(guī)范應(yīng)減去127得18,這是小數(shù)點(diǎn)右移的位數(shù);
剩下的23位是純二進(jìn)制小數(shù)即:0.0101001 01101001 11000000
加1后得1.0101001 01101001 11000000
小數(shù)點(diǎn)右移18位后得10101001 01101001 110.00000
變?yōu)槭M(jìn)制得346958
其它地址的32位浮點(diǎn)數(shù)計(jì)算方法同上