天天看點

IoTClient開發3 - ModBusTcp協定用戶端實作

進過前面兩章的介紹,今天開始正式的實戰。

很多朋友對于進制轉換可能是在剛學計算機的時候有接觸,後來做進階語言開發可能就慢慢忘記了。我們做工控開發的時候需要經常進行進制轉換,這裡和大家一起複習下。

一個位元組等8位(1byte = 8bit),可以存儲2^8(0-255)共計256個數字。是以我們要對8、256等數字要敏感。

int16(short), int32(int), int64(long) 分别是占用2個位元組、4個位元組、8個位元組,Single(float)也是占用4個位元組。

IoTClient開發3 - ModBusTcp協定用戶端實作

是以最好轉成二進制是:0101 0110

我們用二進制 0101 0110來示範,也就是上面十進制的86。

IoTClient開發3 - ModBusTcp協定用戶端實作

當然,你最好用電腦驗證下

IoTClient開發3 - ModBusTcp協定用戶端實作

我們在對進制轉換進行複習過後,接下來講ModBusTcp協定。

ModBus協定是現在工控裡面用的比較多比較通用的一種協定,什麼可靠啊、簡單啊等等一些優點就不說了,直接入正題。

ModBus分為RTU、ASCII、TCP三種方式進行通信,今天我們隻講TCP。

在ModBus裡面有站号、功能碼、寄存器位址等概念。

站号:多裝置的辨別号

功能碼:一些功能的辨別号

功能碼詳解:

協定的了解和實作主要就是要對協定封包了解。(注意:以下封包資料都是十六進制)

19 B2 是用戶端發的檢驗資訊,随意定義。

00 00 代表是基于tcp/ip協定的modbus

00 06 辨別後面還有多長的位元組

02 表示站号位址

03 為功能碼(讀保持寄存器)

00 04 為寄存器位址

00 01 為寄存器的長度(寄存器個數)

第一次擷取前八個位元組(Map封包頭):19 B2 00 00 00 05 02 03 02 00 20

19 B2 檢驗驗證資訊(複制的用戶端發的,配件檢驗)

00 00 代表是基于tcp/ip協定的modbus(複制的用戶端發的)

00 05 為目前位置到最後的長度

02 表示站号位址(複制的用戶端發的)

03 為功能碼(複制的用戶端發的)

第二次擷取的封包:02 00 20

02 位元組個數

00 20 響應的資料

00 09 從本位元組下一個到最後

02 站号

10 功能碼(轉十進制就是16)

00 04 寄存器位址

00 01 寄存器的長度(寄存器個數)

02 寫位元組的個數

00 20 要寫入的值(轉十進制為32)

和請求封包的差別

沒有了請求封包的資料值

00 09 變成了00 06 因為封包長度變了

其他的封包意義和請求封包一緻

有了上面的三個封包做參考,我們就可以用Socket來實作ModBusTcp協定了。其實協定就是按照封包的規定來,也沒有想的那麼複雜,和我們前面實作的聊天通訊軟體差別不大。

第一步,我們先實作資料讀取封包的組裝:

第二步,就是建立我們的Socket連接配接,并發送請求封包

第三步,解析響應封包,得到資料值

對于資料寫入就更簡單了。

第一步,組裝請求封包

第二步,建立Socket連接配接,并發送封包

同步至索引目錄:《物聯網基礎元件IoTClient開發系列》

參考1:https://www.cnblogs.com/any91/p/3530540.html

參考2:https://www.cnblogs.com/DreamRecorder/p/9081134.html

demo:https://github.com/zhaopeiym/BlogDemoCode/tree/master/IoTClient/ModbusTCP

完整實作:https://github.com/zhaopeiym/IoTClient

學習本是一個不斷抄襲、模仿、練習、創新的過程。

雖然,園中已有本人無法超越的同主題博文,為什麼還是要寫。

對于自己,博文隻是總結。在總結的過程發現問題,解決問題。

對于他人,在此過程如果還能附帶幫助他人,那就再好不過了。

由于部落客能力有限,文中可能存在描述不正确,歡迎指正、補充!

感謝您的閱讀。如果文章對您有用,那麼請輕輕點個贊,以資鼓勵。

工控物聯Q群:995475200