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();
這行代碼創(chuàng)建了一個ModbusFactory對象,用于創(chuàng)建ModbusMaster實例。
IpParameters params = new IpParameters(); params.setHost(ip); if(502 != port){ params.setPort(port); }
在這里,創(chuàng)建了一個IpParameters對象,用于設置Modbus TCP通信的IP地址和端口號。如果端口不是默認的502端口,則設置指定的端口號。
ModbusMaster tcpMaster = null; tcpMaster = modbusFactory.createTcpMaster(params, true);
這行代碼創(chuàng)建了一個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(); }
這段代碼創(chuàng)建了一個Modbus請求對象,使用功能碼03(讀取保持寄存器的值),并指定了起始地址和讀取長度。
ModbusResponse modbusResponse = null; try { modbusResponse = tcpMaster.send(modbusRequest); } catch (ModbusTransportException e) { e.printStackTrace(); }
這段代碼發(fā)送了之前創(chuàng)建的Modbus請求對象,并嘗試接收從設備返回的響應數據。
ByteQueue byteQueue = new ByteQueue(1024); modbusResponse.write(byteQueue);
最后,這段代碼將從設備返回的響應數據寫入到一個ByteQueue對象中,以便后續(xù)對數據進行處理。
這些代碼主要是用于建立與Modbus TCP從設備的連接,并向其發(fā)送讀取保持寄存器的請求,然后處理從設備返回的響應數據。
到此這篇關于Java通過Modbus簡單實現數采的文章就介紹到這了,更多相關Java Modbus數采內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring boot aop 記錄方法執(zhí)行時間代碼示例
這篇文章主要介紹了spring boot aop 記錄方法執(zhí)行時間代碼示例,分享了相關代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02Mybatisplus創(chuàng)建Spring?Boot工程打包錯誤的解決方式
最近在實戰(zhàn)springboot遇到了一些坑,記錄一下,下面這篇文章主要給大家介紹了關于Mybatisplus創(chuàng)建Spring?Boot工程打包錯誤的解決方式,文中通過圖文介紹的介紹的非常詳細,需要的朋友可以參考下2023-03-03