最近手上接了個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"就會消失了。
我這里記錄的有點亂,不過我記錄這些都是為了方便我自己隨時可以查看,並且主要我還都是看代碼方面,如果有不明白的可以隨時看代碼。
