modbus4j初次使用总结
因为要开发一套监控系统,涉及到与监控设备间通过modbus协议进行通讯
先解释一下什么是modbus协议
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。[1] Modbus比其他通信协议使用的更广泛的主要原因有:
公开发表并且无版权要求
易于部署和维护
对供应商来说,修改移动本地的比特或字节没有很多限制
Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。
摘自维基百科
研究了一下java的解决框架有j2mod、jamod、modbus4j等,对比了一下感觉modbus4j不错,因此采用modbus4j来实现。
由于没有拿到测试硬件,我们只能采用模拟工具进行程序调试,需要安装的模拟工具有
Virtual Serial Port Driver仿真串口、创建虚拟 COM 对
Modbus Slave
Virtual Serial Port Driver用来创建仿真串口,Modbus Slave模拟slave端
我在使用Virtual Serial Port Driver创建串口时出现过不能创建的错误,后来重新下载了一个新的8.0版本解决问题.
下面说一下程序调试需要注意的问题
modbus4j中MasterTest.java,这里面包含各种操作的测试代码
但是我在运行测试RTU方式时,发现总是报空指针错误,最后定位到需要使用RXTXcomm.jar包,支持Java串口通信操作的jar包,后来发现配置这个包很烦,还要在jdk的bin目录下增加rxtxSerial.dll文件,windows操作系统是这个文件,其它操作系统需要参考https://github.com/rxtx/rxtx具体设置,最后放弃此种方法,寻求其它解决办法。
最后发现TestSerialPortWrapper.java可疑,这个类里实现了SerialPortWrapper接口,但是没有实现对应的方法。因此从实现SerialPortWrapper入手,后来在freedomotic这个开源架构中查到一个SerialPortWrapper接口的实现,我就直接把其中几个类迁移了过来,主要有com.freedomotic.plugins.devices.modbus.gateways目录下的SerialPortWrapperImpl.java、SerialInputStream.java.java、SerialOutputStream.java三个类。其中在SerialInputStream.java.java类中的125行中System.arraycopy(readBuf, 0, buf, offset, length);length值会导致数组越界错误,把此处改为 System.arraycopy(readBuf, 0, buf, offset, readBuf.length);即可,这几个类引用jSSC来解决串口通讯,不需要RXTX那种复杂配置,直接引入包就可以。
在测试MasterTest.java类中的不同操作方法时一定要注意调整Modbus Slave中的Function参数,使之二者相对应。
整个工程需要引用的包如下,
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