java使用modbus tcp协议与设备通讯,获取设备状态

本文档介绍了如何在Java项目中通过Modbus4j库进行Modbus TCP通信,实现对水泵状态和污水坑液位报警等设备状态的监测。首先,引入了InfiniteAutomation的Maven仓库和modbus4j依赖。接着展示了一个测试用例,包括建立TCP连接、读取设备状态、发送读取寄存器请求并解析响应。同时推荐使用ModScan32作为测试工具模拟Modbus从站设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考地址:
https://blog.youkuaiyun.com/sifanlook/article/details/81251626

最近项目应用场景:
采集污水坑中水泵状态、污水坑溢出液位报警等设备状态。

引入相关maven依赖

<repositories>
    <repository>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <id>ias-snapshots</id>
        <name>Infinite Automation Snapshot Repository</name>
        <url>https://maven.mangoautomation.net/repository/ias-snapshot/</url>
    </repository>
    <repository>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
        <id>ias-releases</id>
        <name>Infinite Automation Release Repository</name>
        <url>https://maven.mangoautomation.net/repository/ias-release/</url>
    </repository>
</repositories>

<dependencies>
	 <dependency>
        <groupId>com.infiniteautomation</groupId>
        <artifactId>modbus4j</artifactId>
        <version>3.0.3</version>
    </dependency>
</dependencies>

Java代码
@Test
public void testModbusTCP(){
modbusTCP(“192.168.5.103”,502,1,0);
}

public static ByteQueue modbusTCP(String ip, int port, int start, int readLenth) {
    ModbusFactory modbusFactory = new ModbusFactory();
    // 设备ModbusTCP的Ip与端口,如果不设定端口则默认为502
    IpParameters params = new IpParameters();
    params.setHost(ip);
    if(502!=port){params.setPort(port);}//设置端口,默认502
    ModbusMaster tcpMaster = null;
    tcpMaster = modbusFactory.createTcpMaster(params, false);
    try {
        tcpMaster.init();
        System.out.println("==============="+1111111);
    } catch (ModbusInitException e) {
        return null;
    }

    BaseLocator<Boolean> loc = BaseLocator.inputStatus(1, 1);
    try {
        Boolean value = tcpMaster.getValue(loc);
        System.out.println("读输入寄存器状态值:" +value);
    } catch (ModbusTransportException e) {
        e.printStackTrace();
    } catch (ErrorResponseException e) {
        e.printStackTrace();
    }
    ModbusRequest modbusRequest=null;
    try {
        modbusRequest = new ReadInputRegistersRequest(1, 1, 1);//功能码03
    } catch (ModbusTransportException e) {
        e.printStackTrace();
    }
    ModbusResponse modbusResponse=null;
    try {
       modbusResponse = tcpMaster.send(modbusRequest);
    } catch (ModbusTransportException e) {
        e.printStackTrace();
    }
    ByteQueue byteQueue= new ByteQueue(12);
    modbusResponse.write(byteQueue);
    System.out.println("功能码:"+modbusResponse.getFunctionCode());
    System.out.println("从站地址:"+modbusResponse.getSlaveId());
    System.out.println("收到的响应信息大小:"+byteQueue.size());
    System.out.println("收到的响应信息值:"+byteQueue);
    //Boolean value = tcpMaster.getValue();
    return byteQueue;
}

api说明文档参考:
https://help.aliyun.com/document_detail/161095.html
在这里插入图片描述
根据api文档说明找到引入jar包中的相关api
在这里插入图片描述

测试工具Modscan32
打开modsim32创建从主机设备模拟服务端
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
打开modsan32模拟客户端连接服务端
相关参数跟服务端一一对应

在这里插入图片描述
在这里插入图片描述
关键代码说明
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值