modbus4j使用教程

windows | 2023-05-13 22:09:06

先解释一下什么是modbus协议

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。[1] Modbus比其他通信协议使用的更广泛的主要原因有:

公开发表并且无版权要求

易于部署和维护

对供应商来说,修改移动本地的比特或字节没有很多限制

Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。

摘自维基百科

研究了一下java的解决框架有j2modjamod、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'

}

 

 

 

登录后即可回复 登录 | 注册
    
关注编程学问公众号