紅云123
級別: 略有小成
![]() |
F5UJ進(jìn)行modbusTCP通訊時(shí)當讀取的數據是正數時(shí),設置的讀取數據長(cháng)度和接收的數據長(cháng)度一致,數據也沒(méi)有錯誤。 當讀取到的數據是負數時(shí),收到的數據長(cháng)度在某個(gè)位置是設置的2倍,因為負數的位置不確定所以收到的數據也無(wú)從下手去處理。 也就是負數時(shí)收到的數據地址和服務(wù)器的數據地址對應不上了。 當進(jìn)行modbusTCP通訊時(shí)負數怎么處理? 真誠求助 |
---|---|
|
沖出槍林彈雨
沖出槍林彈雨
級別: 家園?
![]() |
通訊時(shí)都是客戶(hù)端讀取服務(wù)端的寄存器,數據類(lèi)型不同,占用寄存器數量不同(16位,32位,64位,字符串看長(cháng)度);建議將數據轉成16進(jìn)制進(jìn)行查看,看看是不是讀取的數據高低位被調換,也可以先用tcp模擬軟件進(jìn)行測試。 |
|
---|---|---|
|
沖出槍林彈雨
沖出槍林彈雨
級別: 家園?
![]() |
讀取寄存器個(gè)數改為4,PLC監視數據使用16進(jìn)制查看 |
|
---|---|---|
|
沖出槍林彈雨
沖出槍林彈雨
級別: 家園?
![]() |
好吧,說(shuō)下這個(gè)正數和負數 值為5它在計算機中表示為: 00000000 00000000 00000000 00000101 5轉換成二制是101,不過(guò)int類(lèi)型的數占用4字節(32位),前面填了一堆0 -5在計算機中,負數以原碼的補碼形式表達。 原碼: 一個(gè)正數,按照絕對值大小轉換成的二進(jìn)制數就是正數的原碼 一個(gè)負數,按照絕對值大小轉換成的二進(jìn)制數,然后最高位補1,就是負數的原碼 比如 00000000 00000000 00000000 00000101 是5的原碼。 10000000 00000000 00000000 00000101 是-5的原碼。 補碼 正數的補碼與原碼相同 負數的補碼為對該數的原碼除符號位外各位取反,然后在最后一位加1 比如: 10000000 00000000 00000000 00000101 的反碼 是:11111111 11111111 11111111 11111010 那么,補碼為: 11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011 -5 在計算機中表達為:11111111 11111111 11111111 11111011 轉換為十六進(jìn)制:0xFFFFFFFB 樓主留言:道理倒是明白,關(guān)鍵是收到數據后怎么處理。收到的數據有正數也有負數時(shí),怎么才知道自己收到的是負數,負數在哪個(gè)寄存器里。 |
|
---|---|---|
|
紅云123
級別: 略有小成
![]() |
圖片:
![]() 和是否使用16進(jìn)制無(wú)關(guān)。為什么讀取1個(gè)保持寄存器,收到的數據卻占兩個(gè)寄存器。 |
---|---|
|
沖出槍林彈雨
沖出槍林彈雨
級別: 家園?
![]() |
圖片:
![]()
圖片:
![]() 看了你圖中發(fā)送內容,你用的工具多發(fā)了兩個(gè)字節內容 |
|
---|---|---|
|
投湖自盡的魚(yú)
級別: 略有小成
![]() |
換個(gè)調試軟件直接自己寫(xiě)負數的報文,看看是不是還會(huì )多出來(lái)字節 |
---|---|
|
投湖自盡的魚(yú)
級別: 略有小成
![]() |
你用這個(gè)軟件試試,也是這個(gè)網(wǎng)站里面的 樓主留言:真誠感謝! |
---|---|
|