Java通过Modbus简单实现数采的示例代码
作者:程序员老王wd
本文介绍了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数采内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!