因?yàn)橐_發(fā)一套監(jiān)控系統(tǒng),涉及到與監(jiān)控設(shè)備間通過modbus協(xié)議進(jìn)行通訊
先解釋一下什么是modbus協(xié)議
Modbus是一種串行通信協(xié)議,是Modicon公司(現(xiàn)在的施耐德電氣?Schneider Electric)于1979年為使用可編程邏輯控制器(PLC)通信而發(fā)表。Modbus已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議的業(yè)界標(biāo)準(zhǔn)(De facto),并且現(xiàn)在是工業(yè)電子設(shè)備之間常用的連接方式。[1]?Modbus比其他通信協(xié)議使用的更廣泛的主要原因有:
公開發(fā)表并且無版權(quán)要求
易于部署和維護(hù)
對(duì)供應(yīng)商來說,修改移動(dòng)本地的比特或字節(jié)沒有很多限制
Modbus允許多個(gè) (大約240個(gè)) 設(shè)備連接在同一個(gè)網(wǎng)絡(luò)上進(jìn)行通信,舉個(gè)例子,一個(gè)由測(cè)量溫度和濕度的裝置,并且將結(jié)果發(fā)送給計(jì)算機(jī)。在數(shù)據(jù)采集與監(jiān)視控制系統(tǒng)(SCADA)中,Modbus通常用來連接監(jiān)控計(jì)算機(jī)和遠(yuǎn)程終端控制系統(tǒng)(RTU)。
摘自維基百科
研究了一下java的解決框架有j2mod、jamod、modbus4j等,對(duì)比了一下感覺modbus4j不錯(cuò),因此采用modbus4j來實(shí)現(xiàn)。
由于沒有拿到測(cè)試硬件,我們只能采用模擬工具進(jìn)行程序調(diào)試,需要安裝的模擬工具有
Virtual Serial Port Driver仿真串口、創(chuàng)建虛擬 COM 對(duì)

Modbus Slave

Virtual Serial Port Driver用來創(chuàng)建仿真串口,Modbus Slave模擬slave端
我在使用Virtual Serial Port Driver創(chuàng)建串口時(shí)出現(xiàn)過不能創(chuàng)建的錯(cuò)誤,后來重新下載了一個(gè)新的8.0版本解決問題.
下面說一下程序調(diào)試需要注意的問題
modbus4j中MasterTest.java,這里面包含各種操作的測(cè)試代碼

但是我在運(yùn)行測(cè)試RTU方式時(shí),發(fā)現(xiàn)總是報(bào)空指針錯(cuò)誤,最后定位到需要使用RXTXcomm.jar包,支持Java串口通信操作的jar包,后來發(fā)現(xiàn)配置這個(gè)包很煩,還要在jdk的bin目錄下增加rxtxSerial.dll文件,windows操作系統(tǒng)是這個(gè)文件,其它操作系統(tǒng)需要參考https://github.com/rxtx/rxtx具體設(shè)置,最后放棄此種方法,尋求其它解決辦法。
最后發(fā)現(xiàn)TestSerialPortWrapper.java可疑,這個(gè)類里實(shí)現(xiàn)了SerialPortWrapper接口,但是沒有實(shí)現(xiàn)對(duì)應(yīng)的方法。因此從實(shí)現(xiàn)SerialPortWrapper入手,后來在freedomotic這個(gè)開源架構(gòu)中查到一個(gè)SerialPortWrapper接口的實(shí)現(xiàn),我就直接把其中幾個(gè)類遷移了過來,主要有com.freedomotic.plugins.devices.modbus.gateways目錄下的SerialPortWrapperImpl.java、SerialInputStream.java.java、SerialOutputStream.java三個(gè)類。其中在SerialInputStream.java.java類中的125行中System.arraycopy(readBuf, 0, buf, offset, length);length值會(huì)導(dǎo)致數(shù)組越界錯(cuò)誤,把此處改為 System.arraycopy(readBuf, 0, buf, offset, readBuf.length);即可,這幾個(gè)類引用jSSC來解決串口通訊,不需要RXTX那種復(fù)雜配置,直接引入包就可以。
在測(cè)試MasterTest.java類中的不同操作方法時(shí)一定要注意調(diào)整Modbus Slave中的Function參數(shù),使之二者相對(duì)應(yīng)。


整個(gè)工程需要引用的包如下,
dependencies {
? ? compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
? ? //modbus
? ? compile group: 'com.infiniteautomation', name: 'modbus4j', version: '3.0.3'
? ? compile group: 'org.scream3r', name: 'jssc', version: '2.8.0'
}
參考文檔:
https://zh.wikipedia.org/wiki/Modbus
Virtual Serial Port Driver
https://www.eltima.com/cn/products/vspdxp/
https://github.com/freedomotic/freedomotic
https://github.com/infiniteautomation/modbus4j
jSSC
https://github.com/scream3r/java-simple-serial-connector
RXTX
https://github.com/rxtx/rxtx
http://www.cnblogs.com/Dreamer-1/p/5523046.html
https://blog.csdn.net/u013150916/article/details/78065479
https://www.cnblogs.com/Dn9x/p/4298146.html
https://github.com/infiniteautomation/modbus4j/issues/5