modbus-tcp协议学习-java

1. 前言

  • 由于已经进行了相关的树莓派和电脑python互联实验,所以不再对于其他预备知识做说明。
  • modbus4j是java语言下的modbus模块jar包

2. 准备工作

  1. 查阅modbus4j
  2. 下载modbus4j.jar包

3. 环境

  • 环境:jdk 1.80
  • 生产工具:IntelliJ IDEA 2016.3.5

4. 基础示例

  • java主机程序
    • 需要开启树莓派客户端
/**
 * Created by peter on 2017/3/18.
 */


import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.msg.*;
import com.serotonin.util.queue.ByteQueue;




public class MT{
    public static ByteQueue modbusTCP(String ip, int port)
    {
        ModbusFactory modbusFactory = new ModbusFactory();
        // 设备ModbusTCP的Ip与端口,如果不设定端口则默认为502
        IpParameters params = new IpParameters();
        params.setHost(ip);
        //设置端口,默认502
        if(502!=port)
        {
            params.setPort(port);
        }
        ModbusMaster tcpMaster = null;
        tcpMaster = modbusFactory.createTcpMaster(params, true);
        try
        {
            tcpMaster.init();
            System.out.println("========初始化成功=======");
        }
        catch (ModbusInitException e)
        {
            return null;
        }
        short[] short1={0, 1, 2};
        boolean[] b1={true, false, false, false,true};
        ModbusRequest modbusRequest=null;
        for(int i=1;i<=8;i++) {
            try {
                switch (i)
                {
                    //读保持寄存器
                    case 1: modbusRequest = new ReadHoldingRegistersRequest(1, 0, 4);break;
                    case 2: modbusRequest = new ReadHoldingRegistersRequest(1, 4, 14);break;
                    //写保存寄存器
                    case 3: modbusRequest = new WriteRegistersRequest(1, 0, short1);break;
                    case 4: modbusRequest = new ReadHoldingRegistersRequest(1, 0, 4);break;
                    //读线圈
                    case 5: modbusRequest = new ReadCoilsRequest(2, 0, 5);break;
                    //写线圈
                    case 6: modbusRequest = new WriteCoilsRequest(2, 0, b1);break;
                    case 7: modbusRequest = new ReadCoilsRequest(2, 0, 6);break;
                    case 8: modbusRequest = new ReadHoldingRegistersRequest(2, 0, 4);break;
                }
            } catch (ModbusTransportException e) {
                e.printStackTrace();
            }
            ModbusResponse modbusResponse=null;
            try {
                modbusResponse = tcpMaster.send(modbusRequest);
            } catch (ModbusTransportException e) {
                e.printStackTrace();
            }
            ByteQueue byteQueue= new ByteQueue(1024);
            modbusResponse.write(byteQueue);
            System.out.println(i+"收到的响应信息值:"+byteQueue);
        }
        return null;
    }

    public static void main(String[] args)
    {
    //从机IP“192.168.1.111”,端口开放1100
        modbusTCP("192.168.1.111", 1100);
    }
}

5.结果贴图

  • java主机结果图
  • 与python端实现比较

6.结果分析

  1. 消息中显示都是16进制
  2. 响应消息中的第一位为slaved号,第二位为功能号,第三位后面返回消息位数
  3. 写入成功,只返回写入数或数组长度
  4. 读取保持寄存器是按寄存器地址返回
  5. 读取线圈是返回一个16进制数,跟python中数相加相同

你可能感兴趣的:(modbus-tcp,java,modbus-tcp,modbus4j-jar)