標籤:
最近手上接了個Unity3D的項目,這個項目需要和真機聯動,和真機聯動我們需要通過Modbus協議。所以Modbus這一塊的就我來實現,因為項目最好會打包為android的,所以就用java來做,看了下java中還真有不少相關的庫,最後決定用Jamod這個庫,地址:Jamod
在使用的過程中發現,Jamod再封裝某些對象的時候都是單例的,比如說我想在一台電腦上類比出一個Slave端出來,但是這個庫限定了在同一台電腦的同一個程式中只能類比出一個,如果我想類比多個就需要弄出多個程式出來,這顯然不符合實際情況,所以我重新了這個庫裡面的大概整個TCP這一塊的代碼,修改成可以在一個程式中執行個體化出多個監聽器出來並且可以再同一個程式中綁定同一個ip下的多個連接埠,這樣就可以做到再同一個程式中類比出多個Slave來,
因為這個項目需要再一個程式裡面類比出Slave端和Master端(無語啊), 所以這裡會寫的比較多,也會寫的比較詳細,首先會講如何讀取真機裝置上的資料。至於有關Modbus協議的問題我這裡不做說明,不明白的可以自己去看資料,再我寫這個隨筆的時候,我還沒有收到modbus的真機,所以所有的測試我都是基於模擬器來的,如果到時候有出入我會在修改隨筆,下面開始記錄,
模擬器我用的是這一組,這個不錯提供了Master端和Slave端,地址,可以根據自己的需求下載相關的模擬器,這裡先記錄讀取Slave端資料,所以這裡要下載Slave模擬器,
這個軟體只有windows版本的,所以我是在虛擬機器裡面使用的,下載之後,直接安裝就行了,這個Slave和Pull端都需要註冊碼,試用30天,
下面開始介紹Java方面的代碼,
因為項目的需要,所以我把這塊代碼單獨出來了,這樣可以打包成jar檔案,這塊代碼我放到了github上面,地址:https://github.com/Dn9x/dn-modbus
這裡說明下,因為項目的需要和需求,所以我這裡處理的比較複雜,但是讀取Slave上面資料的代碼其實是很簡單的,都在ModbusUtil類中,
如果你只是簡單的使用,那麼你完全只看這一個檔案就夠了,其他的不用看,因為這裡我也是只介紹這些,其他的不說明,
如果你需要讀取Slave裝置上面的資料,Slave裝置上的資料分四種類型,模擬器中是這樣的:
我個人的理解就是:
- 可以讀寫的布爾類型(0x)
- 只能讀的布爾類型(1x)
- 只能讀的數字類型(3x)
- 可以讀寫的數字類型(4x)
jamod也提供了操作每種不同類型使用不同的類,這裡我列個表
- 可以讀寫的布爾類型(0x) 請求類:ReadCoilsRequest 響應類:ReadCoilsResponse
- 只能讀的布爾類型(1x) 請求類:ReadInputDiscretesRequest 響應類:ReadInputDiscretesResponse
- 只能讀的數字類型(3x) 請求類:ReadInputRegistersRequest 響應類:ReadInputRegistersResponse
- 可以讀寫的數字類型(4x) 請求類:ReadMultipleRegistersRequest 響應類:ReadMultipleRegistersResponse
寫入的類都是對應的,但是只有可以寫入的才有對應的類,這四個讀取的類在使用的時候基本都是一致的,不管哪種再讀取的時候三個值一定非常重要,一個是SlaveId, 這裡設定的值:
一定要和模擬器上的對應,
如果不對應是會拋異常的。
第二個是每個寄存器對應的地址也一定要對應,這裡:
和這裡對應
至於程式中制定的ip和連接埠就比較好處理,ip就用模擬器所在機器的ip就行了,連接埠預設是502,你也可以修改,jamod也提供了預設連接埠,
1 Modbus.DEFAULT_PORT;
連接埠指定:
模擬器方面:
這樣就可以讀取到模擬器上面的值了,讀取的時候,模擬器的串連一定要開啟,這樣才能讀取到值,
因為我的項目中是程式只對應控制器,每個控制器下有很多的寄存器,所以我的模擬器裡面就開了很多的寄存器,SlaveId都是3,只是寄存器的地址和類型不同,
如:
設定完成之後,開啟模擬器上面的串連,上面紅色的"No connection"就會消失了。
我這裡記錄的有點亂,不過我記錄這些都是為了方便我自己隨時可以查看,並且主要我還都是看代碼方面,如果有不明白的可以隨時看代碼。
Modbus: 1. Java使用Modbus讀取Slave端資料(TCP)