平時Modbus常用的通訊。比如傳輸某寄存器的數據 “0x3F” 裝換成十進制后是“63”。這種類型直觀、簡單。但是需要處理到正負數、浮點數時就不是很方便了,即使加標志位判斷,數據的范圍有局限性,可移植性差。在PLC,觸摸屏中它們通訊這類數據則用了另一種格式。即IEEE32數據處理格式。下邊簡單介紹一下,廢話不多說,直接說主題。(詳情百度)從名字可以看出,本數據是32位。
下邊 隨便寫個32位數跟大家一塊算
十六進制 0x41 0xc5 0x3b 0x28
二進制 01000001 11000101 00111011 00101000
分解 sppppppp pzzzzzzz zzzzzzzz zzzzzzzz
說明 : S表示本數據的正負,0表示本數據正數,1表示本數據為負數
P是后面位偏移,算法是把p整合為一組轉換為十進制為131,于127比較
大4,那么待會向右位移(大幾移幾位),若小向左移位。
在"S P"后面都省去“1.” 復原后為 1.1000101 00111011 00101000
右移后為11000.101 00111011 00101000
小數左邊算法 1*2^4+1*2^3+0*2^2+0*2^1+0*2^0=24;
小數右邊算法1*2^-1+0*2^-2+1*2^-3+0*2^-4+0*2^-5+1*2^-6……
后邊就不說了,結果是0.6678.
兩個相加是24.6678.
可以表示任意一個數據,編寫這種程序可移植性強,無局限性,比如發個整數30我們可以計算出來。 正負標志位為0,向右移動4位p的值就是127+4= 131 二進制 10000011 Z為11110000 00000000 00000000 移位整合后
0x 41 0xf0 0x00 0x00
用KEIL編寫程序時,包含math.h內有計算冪運算函數 pow(float x,float y);程序具體怎么寫這里就不多說 。畢竟不是很容易寫,尊重下個人成果。哈哈。