Modbus

Modbus初体验

package com.zz.modbus;

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;

/**
 * @Projectname: modbusTest
 * @Filename: ModusTest
 * @Author: wyf
 * @Data: 2022/12/7 13:56
 * @Description: TODO
 */
public class ModbusTest {
    public static void main(String[] args) throws UnknownHostException {
        //设置主机参数
        TcpParameters tcpParameters = new TcpParameters();

        //设置Tcp的ip地址
        InetAddress address = InetAddress.getByName("127.0.0.1");

        //Tcp参数设置主机地址
        tcpParameters.setHost(address);

        //Tcp设置长连接
        tcpParameters.setKeepAlive(true);

        //Tcp设置端口
        tcpParameters.setPort(502);

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

        int slaveId = 1;
        int offset = 0;
        int quantity = 10;

        try {
            if (!master.isConnected()){
                master.connect();
            }

            //04功能码,读取输入寄存器
            int[] registersValues = master.readInputRegisters(slaveId, offset, quantity);

            //03功能码,读取保持寄存器
            int[] readHoldingRegistersValues = master.readHoldingRegisters(slaveId, offset, quantity);

            //01功能码,读取线圈
            boolean[] coilsValues = master.readCoils(slaveId, offset, quantity);

            //02功能码,读取离散输入
            boolean[] discreteInputsValues = master.readDiscreteInputs(slaveId, offset, quantity);

            // 控制台输出
            for (int value : registersValues) {
                System.out.println("Address: " + offset++ + ", Value: " + value);
            }
            System.out.println("================================================");
            for (int value : readHoldingRegistersValues) {
                System.out.println("Address: " + offset++ + ", Value: " + value);
            }
            System.out.println("================================================");
            for (boolean value : coilsValues){
                System.out.println("Address: " + offset++ + ", Value: " + value);
            }
            System.out.println("================================================");
            for (boolean value : discreteInputsValues){
                System.out.println("Address: " + offset++ + ", Value: " + value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                master.disconnect();
            } catch (ModbusIOException e) {
                e.printStackTrace();
            }
        }
    }
}

04功能码,读取输入寄存器,只读

//04功能码
//编写请求
ModbusRequest inputRequest = ModbusRequestBuilder.getInstance().buildReadInputRegisters(slaveId, offset, quantity);
//发送请求
ReadInputRegistersResponse inputResponse = (ReadInputRegistersResponse) master.processRequest(inputRequest);
//获取值
int[] registers01 = inputResponse.getHoldingRegisters().getRegisters();

for (int value : registers01){
   System.out.println(value);
}

03功能码,读取保持寄存器,读写

//03功能码,读取保持寄存器
//编写请求
ModbusRequest holdRequest = ModbusRequestBuilder.getInstance().buildReadHoldingRegisters(slaveId, offset, quantity);
//发送请求
ReadHoldingRegistersResponse holdResponse =(ReadHoldingRegistersResponse) master.processRequest(holdRequest);
//获取值
int[] registers02 = holdResponse.getHoldingRegisters().getRange(2, 3);

for (int value : registers02){
    System.out.println(value);
}

写入寄存器
三个参数分别是:从机地址,写入位置,写入的值

ModbusRequest request = ModbusRequestBuilder.getInstance().buildWriteSingleRegister(slaveId, 1, 5);
            WriteSingleRegisterResponse response = (WriteSingleRegisterResponse) master.processRequest(request);

02功能码,读取离散输入,只读

boolean[] discreteInputsValues = master.readDiscreteInputs(slaveId, offset, quantity);

01功能码,读取线圈,读写

boolean[] coilsValues = master.readCoils(slaveId, offset, quantity);
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 简述 Modbus寄存器分为四种,如表1.1所示: 表1.1 寄存器分类 2 常用功能码 Modbus中常用的...
    lakerszhy阅读 49,289评论 0 16
  • 在上一期中,我们了解了1.Modbus通信协议的含义2/业内使用的Modbus通信类型。在此章中,我们将了解Mod...
    yiwatercool阅读 629评论 0 2
  • Modbus Poll是Modbus主站设备仿真器,可用于测试和调试Modbus从站设备。便于观察Modbus通讯...
    腊鸡爱学习阅读 18,595评论 1 5
  • 一、Modbus 协议简介 ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或...
    漠漠彡阅读 96,224评论 2 21
  • 读线圈状态 读取从设备的线圈或离散量输出状态,即DO(Discrete Output,离散输出)请求码:01地址范...
    中_中_阅读 19,032评论 0 1

友情链接更多精彩内容