Java串口通讯Modbus Rtu

阅读: 评论:0

Java串口通讯Modbus Rtu

Java串口通讯Modbus Rtu

最近要从modbus总线上读写数据,用java来进行开发,前面用modbus4j进行过modbus tcp的通讯,这次是modbus rtu进行通讯,在这个过程中也踩了不少坑,做个记录

1、环境准备

(1)串口环境(使用virtual serial port driver,请自行下载)

添加虚拟串口对COM1和COM2

设备管理器中要能看到这2个端口

 (2)modbus模拟器

使用ModSim模拟,ModSim下载地址

Connect Port1

 

 新建

 ModSIm基本使用

2、依赖的库

(1)modbus4j

modbus4j源码

(2)rxtx

Download - Rxtx

Rxtx在Linux下配置RXTX和Windows下配置的操作不一样。

  • Windows

将rxtxParallel.dll和rxtxSerial.dll文件放到JDK的jre/bin目录下(如D:Javajdk1.8.0_202jrebin)

  • Linux
    • 将librxtxSerial.so上传到/usr/local/lib下
    • 修改配置文件(/etc/profile)添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
    • 配置文件生效:source /etc/profile
    • 保险起见,在/jre/bin和/jre/lib下也复制一份
    • 同时复制RXTXcomm.jar到/jre/lib下

(3)freedomotic,需要用到modbus模块

访问路径:freedomotic/plugins/devices/modbus/src/main/java/com/freedomotic/plugins/devices/modbus

freedomotic源码

(4)seroUtils.jar

下载地址:

(5)JDK1.8_202(最新的版本可能不支持,JDK的版本不能太高)

3、代码部分

modbus4j的SerialPortWrapper接口没有实现类,推荐使用Freedomotic中的三个类实现:
SerialPortWrapperImpl.java
SerialInputStream.java
SerialOutputStream.java

SerialInputStream.java
126行、127行必须进行如下修改

//            System.arraycopy(readBuf, 0, buf, offset, length);System.arraycopy(readBuf, 0, buf, offset, readBuf.length);

读取代码 

public class ReadFromModbus {// 从站地址private final static int SLAVE_ADDRESS = 1;//串行波特率private final static int BAUD_RATE = 9600;public static void main(String[] args) {SerialPortWrapper serialParameters = newSerialPortWrapperImpl("COM2", BAUD_RATE, 8, 1, 0, 0, 0);/* 创建ModbusFactory工厂实例 */ModbusFactory modbusFactory = new ModbusFactory();/* 创建ModbusMaster实例 */ModbusMaster master = ateRtuMaster(serialParameters);/* 初始化 */try {master.init();readHoldingRegistersTest(master, SLAVE_ADDRESS, 1, 9);} catch (ModbusInitException e) {e.printStackTrace();} finally {master.destroy();}}/*** 读取寄存器上的内容** @param master  主站* @param slaveId 从站地址* @param start   起始地址的偏移量* @param len     待读寄存器的个数*/private static void readHoldingRegistersTest(ModbusMaster master, int slaveId, int start, int len) {try {ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, start, len);ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);if (response.isException()) {System.out.println("Exception response: message=" + ExceptionMessage());} else {System.out.ShortData()));short[] list = ShortData();for (int i = 0; i < list.length; i++) {System.out.print(list[i] + " ");}}} catch (ModbusTransportException e) {e.printStackTrace();}}
}

写入主要代码

/*** 批量写数据到寄存器** @param master  主站* @param slaveId 从站地址* @param start   起始地址的偏移量* @param values  待写数据*/public static void writeRegistersTest(ModbusMaster master, int slaveId, int start,short[] values) {try {WriteRegistersRequest request = new WriteRegistersRequest(slaveId, start, values);WriteRegistersResponse response = (WriteRegistersResponse) master.send(request);if (response.isException())System.out.println("Exception response: message=" + ExceptionMessage());elseSystem.out.println("Success");} catch (ModbusTransportException e) {e.printStackTrace();}}

 

4、源码下载

已实现modbus rtu的读写功能

下载地址:

本文发布于:2024-02-01 01:28:30,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170672211332848.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:串口   通讯   Java   Modbus   Rtu
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23