modbus-tcp协议通过Java代码获取从机数据

一、软件下载

1、modscan32软件下载,里面包含modscan32(主机),以及modsim32(从机),下载地址有很多大家可以直接到网上搜索下载modsacn32

二、modsim32从机配置准备

1.连接从机
连接从机
2.设置端口号,这里默认端口号为502
设置端口号,这里默认端口号为502
3.设置参数
设置参数
4.点击坐标例设置对应的值
这里设置值有两中方式,一种是设置固定值,第二种是点击自动模拟获取随机数
点击坐标例设置对应的值

三、编写Java代码充当主机获取数据

1.添加jlibmodbus依赖

<dependency>
            <groupId>com.intelligt.modbus</groupId>
            <artifactId>jlibmodbus</artifactId>
            <version>1.2.9.7</version>
        </dependency>

2.这里用来演示的是功能码03

public static void main(String[] args) {
        try {
            // 设置主机TCP参数
            TcpParameters tcpParameters = new TcpParameters();

            // 设置TCP的ip地址-本地地址
            InetAddress adress = InetAddress.getByName("127.0.0.1");
            // tcpParameters.setHost(InetAddress.getLocalHost());
            tcpParameters.setHost(adress);

            // TCP设置长连接
            tcpParameters.setKeepAlive(true);
            // TCP设置端口,这里设置是默认端口502
            tcpParameters.setPort(502);

            // 创建一个主机
            ModbusMaster master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
            Modbus.setAutoIncrementTransactionId(true);

            int slaveId = 1;//从机地址
            int offset = 0;//寄存器读取开始地址
            int quantity = 10;//读取的寄存器数量

            System.out.println("准备执行开启连接");
            try {
                if (!master.isConnected()) {
                    master.connect();// 开启连接
                }
                System.out.println("读取对应从机的数据");
                //读取对应从机的数据,这里演示的是功能码03
                //功能码01 readCoils()
                //功能码02 readDiscreteInputs()
                //功能码03 readHoldingRegisters()
                //功能码04 readInputRegisters()
                int[] registerValues = master.readHoldingRegisters(slaveId, offset, quantity);
                System.out.println("成功!");
                // 控制台输出
                for (int value : registerValues) {
                    System.out.println("Address: " + offset++ + ", Value: " + value);
                }
            } catch (ModbusProtocolException e) {
                e.printStackTrace();
            } catch (ModbusNumberException e) {
                e.printStackTrace();
            } catch (ModbusIOException e) {
                e.printStackTrace();
            } finally {
                try {
                    master.disconnect();
                } catch (ModbusIOException e) {
                    e.printStackTrace();
                }
            }
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.输出结果

准备执行开启连接
读取对应从机的数据
成功!
address: 0, value: 11
address: 1, value: 23
address: 2, value: 30
address: 3, value: 47
address: 4, value: 33
address: 5, value: 0
address: 6, value: 24
address: 7, value: 0
address: 8, value: 66
address: 9, value: 0
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个简单的MODBUS-TCPjava示例代码: ```java import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; public class ModbusTCPExample { // Modbus TCP通信参数 private static final int SERVER_PORT = 502; private static final InetAddress SERVER_ADDRESS = InetAddress.getByName("127.0.0.1"); // Modbus TCP指令 private static final byte[] READ_COILS = { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x00, 0x00, 0x00, 0x08 }; private static final byte[] READ_INPUTS = { 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08 }; private static final byte[] READ_HOLDING_REGISTERS = { 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x00, 0x00, 0x08 }; private static final byte[] READ_INPUT_REGISTERS = { 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x01, 0x04, 0x00, 0x00, 0x00, 0x08 }; private static final byte[] WRITE_SINGLE_COIL = { 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, (byte) 0xFF, 0x00, 0x00 }; private static final byte[] WRITE_SINGLE_REGISTER = { 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00 }; public static void main(String[] args) { // 建立Socket连接 try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT)) { // 获取输入输出流 InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); // 读取线圈状态 byte[] response = ModbusTCPUtils.sendRequest(READ_COILS, in, out); boolean[] coils = ModbusTCPUtils.parseCoils(response, READ_COILS.length); // 读取输入状态 response = ModbusTCPUtils.sendRequest(READ_INPUTS, in, out); boolean[] inputs = ModbusTCPUtils.parseInputs(response, READ_INPUTS.length); // 读取保持寄存器 response = ModbusTCPUtils.sendRequest(READ_HOLDING_REGISTERS, in, out); int[] holdingRegisters = ModbusTCPUtils.parseRegisters(response, READ_HOLDING_REGISTERS.length / 2); // 读取输入寄存器 response = ModbusTCPUtils.sendRequest(READ_INPUT_REGISTERS, in, out); int[] inputRegisters = ModbusTCPUtils.parseRegisters(response, READ_INPUT_REGISTERS.length / 2); // 写入单个线圈 response = ModbusTCPUtils.sendRequest(WRITE_SINGLE_COIL, in, out); // 写入单个保持寄存器 response = ModbusTCPUtils.sendRequest(WRITE_SINGLE_REGISTER, in, out); } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例代码中,我们使用了ModbusTCPUtils类来发送请求和解析响应。SEND_COILS、SEND_INPUTS、SEND_HOLDING_REGISTERS和SEND_INPUT_REGISTERS分别代表读取线圈、输入状态、保持寄存器和输入寄存器的指令。WRITE_SINGLE_COIL和WRITE_SINGLE_REGISTER分别代表写入单个线圈和保持寄存器的指令。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值