Java通过Modbus简单实现数采的示例代码
一、引入pom依赖
<dependency> <groupId>io.github.jimmy-j</groupId> <artifactId>modbus4</artifactId> <version>1.2.0</version> </dependency>
二、代码实现
package com.example.demo; import com.zgkxzx.modbus4And.ModbusFactory; import com.zgkxzx.modbus4And.ModbusMaster; import com.zgkxzx.modbus4And.exception.ModbusInitException; import com.zgkxzx.modbus4And.exception.ModbusTransportException; import com.zgkxzx.modbus4And.ip.IpParameters; import com.zgkxzx.modbus4And.msg.*; import com.zgkxzx.modbus4And.sero.util.queue.ByteQueue; public class ReadAWriteUtil { /** * 批量写数据到保持寄存器 * @param ip 从站IP * @param port modbus端口 * @param slaveId 从站ID * @param start 起始地址偏移量 * @param values 待写数据 */ public static void modbusWTCP(String ip, int port, int slaveId, int start, short[] values) { ModbusFactory modbusFactory = new ModbusFactory(); // 设备ModbusTCP的Ip与端口,如果不设定端口则默认为502 IpParameters params = new IpParameters(); params.setHost(ip); // 设置端口,默认502 if (502 != port) { params.setPort(port); } ModbusMaster tcpMaster = null; // 参数1:IP和端口信息 参数2:保持连接激活 tcpMaster = modbusFactory.createTcpMaster(params, true); try { tcpMaster.init(); System.out.println("=======初始化成功========"); } catch (ModbusInitException e) { System.out.println("初始化异常"); } try { WriteRegistersRequest request = new WriteRegistersRequest(slaveId, start, values); WriteRegistersResponse response = (WriteRegistersResponse) tcpMaster.send(request); if (response.isException()){ System.out.println("Exception response: message=" + response.getExceptionMessage()); }else{ System.out.println("Success"); } } catch (ModbusTransportException e) { e.printStackTrace(); } } /** * 读保持寄存器上的内容 * @param ip 从站IP * @param port modbus端口 * @param start 起始地址偏移量 * @param readLenth 待读寄存器个数 * @return */ 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); //设置端口,默认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; } ModbusRequest modbusRequest=null; try { //功能码03 读取保持寄存器的值 modbusRequest = new ReadHoldingRegistersRequest(1, start, readLenth); } 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("功能码:"+modbusRequest.getFunctionCode()); System.out.println("从站地址:"+modbusRequest.getSlaveId()); System.out.println("收到的响应信息大小:"+byteQueue.size()); System.out.println("收到的响应信息值:"+byteQueue); return byteQueue; } public static void main(String[] args) { // short [] list={100,20,30,9,67,0,65,0,89,90}; // modbusWTCP("127.0.0.1",502,1,0,list); //读数据 modbusTCP("10.34.194.18",8080,0,2); } }
三、代码详情
这段代码是使用Java语言编写的Modbus TCP通信的示例代码,主要用于与Modbus TCP从设备进行通信。
ModbusFactory modbusFactory = new ModbusFactory();
这行代码创建了一个ModbusFactory对象,用于创建ModbusMaster实例。
IpParameters params = new IpParameters(); params.setHost(ip); if(502 != port){ params.setPort(port); }
在这里,创建了一个IpParameters对象,用于设置Modbus TCP通信的IP地址和端口号。如果端口不是默认的502端口,则设置指定的端口号。
ModbusMaster tcpMaster = null; tcpMaster = modbusFactory.createTcpMaster(params, true);
这行代码创建了一个ModbusMaster实例,使用之前设置的IpParameters对象来初始化。第二个参数设置为true表示使用了非阻塞模式。
try { tcpMaster.init(); System.out.println("========初始化成功======="); } catch (ModbusInitException e) { return null; } 在这里,通过tcpMaster.init()方法初始化了ModbusMaster实例,如果初始化成功,就会打印"========初始化成功======="。 ModbusRequest modbusRequest = null; try { modbusRequest = new ReadHoldingRegistersRequest(1, start, readLenth); } catch (ModbusTransportException e) { e.printStackTrace(); }
这段代码创建了一个Modbus请求对象,使用功能码03(读取保持寄存器的值),并指定了起始地址和读取长度。
ModbusResponse modbusResponse = null; try { modbusResponse = tcpMaster.send(modbusRequest); } catch (ModbusTransportException e) { e.printStackTrace(); }
这段代码发送了之前创建的Modbus请求对象,并尝试接收从设备返回的响应数据。
ByteQueue byteQueue = new ByteQueue(1024); modbusResponse.write(byteQueue);
最后,这段代码将从设备返回的响应数据写入到一个ByteQueue对象中,以便后续对数据进行处理。
这些代码主要是用于建立与Modbus TCP从设备的连接,并向其发送读取保持寄存器的请求,然后处理从设备返回的响应数据。
到此这篇关于Java通过Modbus简单实现数采的文章就介绍到这了,更多相关Java Modbus数采内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
dubbo filter中有关bean注入和配置文件读取方式
这篇文章主要介绍了dubbo filter中有关bean注入和配置文件读取方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-05-05Java同学找工作最懵圈的问题:到底啥是分布式系统开发经验?(推荐)
这篇文章主要介绍了分布式系统开发经验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-04-04springcloud-gateway整合jwt+jcasbin实现权限控制的详细过程
这篇文章主要介绍了springcloud-gateway整合jwt+jcasbin实现权限控制,基于springboot+springcloud+nacos的简单分布式项目,项目交互采用openFeign框架,单独提取出来成为一个独立的model,需要的朋友可以参考下2023-02-02
最新评论