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

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