Java简单对接modbus串口

背景

我们做物联网的,需要接入一个能耗系统,他说给电表水表值,用modbus传,我们用java集成

Java环境搭建

引入pom

        <dependency>
            <groupId>com.intelligt.modbusgroupId>
            <artifactId>jlibmodbusartifactId>
            <version>1.2.9.7version>
        dependency>

写一个工具类,网上很多,随便找,我贴了一个,改成了类似dbconnection的东西
ModBusConnection


import com.intelligt.modbus.jlibmodbus.Modbus;
import com.intelligt.modbus.jlibmodbus.exception.ModbusIOException;
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
import com.intelligt.modbus.jlibmodbus.tcp.TcpParameters;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class ModBusConnection {
    public final static TcpParameters tcpParameters = new TcpParameters();
    public static ModbusMaster master;
    static {
        try {
            InetAddress adress = InetAddress.getByName("127.0.0.1");
            // TCP参数设置ip地址
            tcpParameters.setHost(adress);
            // TCP设置长连接
            tcpParameters.setKeepAlive(true);
            // TCP设置端口,这里设置是默认端口502
            tcpParameters.setPort(502);
            // 创建一个主机
            master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
            Modbus.setAutoIncrementTransactionId(true);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取ModbusMaster
     * @return
     */
    public static ModbusMaster getModbusMaster(){
        return  master;
    }

    /**
     * 关闭ModbusMaster
     */
    public static void destoryModbusMaster(){
        if(master.isConnected()){
            try {
                master.disconnect();
            } catch (ModbusIOException e) {
                e.printStackTrace();
            }
        }
    }
}

工具类

public class ModBusUtil {


    public static String getModbusValue(String ip, int port, int slaveId, int offset, int quantity) {
        String requestString = "";
        try {
            //是否连接成功
            if (!ModBusConnection.getModbusMaster().isConnected()) {
                ModBusConnection.getModbusMaster().connect();// 开启连接
            }
            // 读取对应从机的数据,readInputRegisters读取的写寄存器,功能码04
            int[] registerValues = ModBusConnection.getModbusMaster().readInputRegisters(slaveId, offset, quantity);

            // 控制台输出
            for (int value : registerValues) {
                //System.out.println("Address: " + offset++ + ", Value: " + value);
                //拼接16进制字符串
                requestString += StringHex.byteToHex(value);
            }
        } catch (ModbusProtocolException e) {
            e.printStackTrace();
        } catch (ModbusNumberException e) {
            e.printStackTrace();
        } catch (ModbusIOException e) {
            e.printStackTrace();
        }
        return requestString;
    }
}

在工具类里测试

    public static void main(String[] args) {
        //ip,端口,从机地址,寄存器读取开始地址,读取的寄存器数量
        System.out.println(getModbusValue("127.0.0.1", 502, 1, 0, 10));
    }

配置电脑模拟modbus环境

1.下载一个ModbusSlaveSetup,他的序列号:5455415451475662

Java简单对接modbus串口_第1张图片
安装完成
Java简单对接modbus串口_第2张图片

2.打开

Java简单对接modbus串口_第3张图片

3.点connection,配置连接

Java简单对接modbus串口_第4张图片
这个502是默认端口,要和java里的对应起来,点击确定

4.右击第二列第一行

slave finitionJava简单对接modbus串口_第5张图片

这里要和Java配置相同(address,quantity)

4.右击第二列第一行

format->hex(16进制)
Java简单对接modbus串口_第6张图片

5.双击0x0000设置值

Java简单对接modbus串口_第7张图片

运行Java的main

Java简单对接modbus串口_第8张图片

你可能感兴趣的:(modbus,java)