2016-02-20 432 views
3

我需要構建一個基於NodeJS服務器的原型來讀取工業modbus數據。在JavaScript中將兩個16位數組合並轉換爲一個32位數(浮點數)

我讀我提供一個陣列,兩個條目兩個連續的16位小數寄存器:
// eg transaction = [ 17007, -2621 ]// eg transaction = [ 17007, 0000 ]

此值應轉化爲電頻率,約=〜60.00(HZ)(至少它應該如果我給出的數據是正確的)

我知道我需要兩個寄存器值數組中結合和轉換數據要麼32位浮點..但如何:

一)如何將它們組合起來而不用將它們鑄造爲一些他們不
二)如何將它們隱蔽到32位浮點

我想我需要使用某種類型的parseInt()然後toString(10) - 一個建議是,將每個使用parseInt(num, 10).toString(16)爲十六進制,然後再轉換是加入十六進制到一個字符串或可能浮動使用parseFloat()但又是如何首先加入兩個單獨的部分。

我還沒有找到解決方案,令人驚訝的。

+0

(我不熟悉modbus;如果這應該從上下文中顯而易見,請原諒)。我不太清楚你想如何組合這些值。原始值是帶符號的16位整數,並且您希望基本連接它們的位並獲得生成的32位有符號整數?如果它們沒有簽名,那可能就像'(firstValue << 16)| secondValue';理想情況下,可以避免任何字符串轉換。你能提供一個期望的輸入/輸出對的例子嗎? –

+0

我實際上是在尋找concat的float。我期待60.00 ...或其他非常接近的東西。 (頻率不會超過一位或兩位小數) –

+0

它是否真的爲您提供'Array'?提交他們應該使用'Uint16Array'的錯誤。 – Bergi

回答

2

您可以使用ArrayBufferDataView直接操作二進制數據,使用定義的類型和字節順序。通過連續爲16位整數寫入寄存器值和解釋結果作爲大端(false)32位浮點,我們得到你正在尋找的結果是:

var buffer = new ArrayBuffer(4); 
 
var view = new DataView(buffer); 
 

 
view.setInt16(0, 17007, false); 
 
view.setInt16(2, -2621, false); 
 

 
document.body.textContent = view.getFloat32(0, false);

+0

傑里米確實很完美,謝謝 –

相關問題