Java通過Modbus簡單實(shí)現(xiàn)數(shù)采的示例代碼
一、引入pom依賴
<dependency> <groupId>io.github.jimmy-j</groupId> <artifactId>modbus4</artifactId> <version>1.2.0</version> </dependency>
二、代碼實(shí)現(xiàn)
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 { /** * 批量寫數(shù)據(jù)到保持寄存器 * @param ip 從站IP * @param port modbus端口 * @param slaveId 從站ID * @param start 起始地址偏移量 * @param values 待寫數(shù)據(jù) */ public static void modbusWTCP(String ip, int port, int slaveId, int start, short[] values) { ModbusFactory modbusFactory = new ModbusFactory(); // 設(shè)備ModbusTCP的Ip與端口,如果不設(shè)定端口則默認(rèn)為502 IpParameters params = new IpParameters(); params.setHost(ip); // 設(shè)置端口,默認(rèn)502 if (502 != port) { params.setPort(port); } ModbusMaster tcpMaster = null; // 參數(shù)1:IP和端口信息 參數(shù)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(); } } /** * 讀保持寄存器上的內(nèi)容 * @param ip 從站IP * @param port modbus端口 * @param start 起始地址偏移量 * @param readLenth 待讀寄存器個(gè)數(shù) * @return */ public static ByteQueue modbusTCP(String ip, int port, int start, int readLenth) { ModbusFactory modbusFactory = new ModbusFactory(); // 設(shè)備ModbusTCP的Ip與端口,如果不設(shè)定端口則默認(rèn)為502 IpParameters params = new IpParameters(); params.setHost(ip); //設(shè)置端口,默認(rèn)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("收到的響應(yīng)信息大小:"+byteQueue.size()); System.out.println("收到的響應(yīng)信息值:"+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); //讀數(shù)據(jù) modbusTCP("10.34.194.18",8080,0,2); } }
三、代碼詳情
這段代碼是使用Java語言編寫的Modbus TCP通信的示例代碼,主要用于與Modbus TCP從設(shè)備進(jìn)行通信。
ModbusFactory modbusFactory = new ModbusFactory();
這行代碼創(chuàng)建了一個(gè)ModbusFactory對象,用于創(chuàng)建ModbusMaster實(shí)例。
IpParameters params = new IpParameters(); params.setHost(ip); if(502 != port){ params.setPort(port); }
在這里,創(chuàng)建了一個(gè)IpParameters對象,用于設(shè)置Modbus TCP通信的IP地址和端口號。如果端口不是默認(rèn)的502端口,則設(shè)置指定的端口號。
ModbusMaster tcpMaster = null; tcpMaster = modbusFactory.createTcpMaster(params, true);
這行代碼創(chuàng)建了一個(gè)ModbusMaster實(shí)例,使用之前設(shè)置的IpParameters對象來初始化。第二個(gè)參數(shù)設(shè)置為true表示使用了非阻塞模式。
try { tcpMaster.init(); System.out.println("========初始化成功======="); } catch (ModbusInitException e) { return null; } 在這里,通過tcpMaster.init()方法初始化了ModbusMaster實(shí)例,如果初始化成功,就會打印"========初始化成功======="。 ModbusRequest modbusRequest = null; try { modbusRequest = new ReadHoldingRegistersRequest(1, start, readLenth); } catch (ModbusTransportException e) { e.printStackTrace(); }
這段代碼創(chuàng)建了一個(gè)Modbus請求對象,使用功能碼03(讀取保持寄存器的值),并指定了起始地址和讀取長度。
ModbusResponse modbusResponse = null; try { modbusResponse = tcpMaster.send(modbusRequest); } catch (ModbusTransportException e) { e.printStackTrace(); }
這段代碼發(fā)送了之前創(chuàng)建的Modbus請求對象,并嘗試接收從設(shè)備返回的響應(yīng)數(shù)據(jù)。
ByteQueue byteQueue = new ByteQueue(1024); modbusResponse.write(byteQueue);
最后,這段代碼將從設(shè)備返回的響應(yīng)數(shù)據(jù)寫入到一個(gè)ByteQueue對象中,以便后續(xù)對數(shù)據(jù)進(jìn)行處理。
這些代碼主要是用于建立與Modbus TCP從設(shè)備的連接,并向其發(fā)送讀取保持寄存器的請求,然后處理從設(shè)備返回的響應(yīng)數(shù)據(jù)。
到此這篇關(guān)于Java通過Modbus簡單實(shí)現(xiàn)數(shù)采的文章就介紹到這了,更多相關(guān)Java Modbus數(shù)采內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Restful接口調(diào)用方法總結(jié)(超詳細(xì))
下面小編就為大家?guī)硪黄赗estful接口調(diào)用方法總結(jié)(超詳細(xì))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08spring boot aop 記錄方法執(zhí)行時(shí)間代碼示例
這篇文章主要介紹了spring boot aop 記錄方法執(zhí)行時(shí)間代碼示例,分享了相關(guān)代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02使用Java實(shí)現(xiàn)希爾排序算法的簡單示例
這篇文章主要介紹了使用Java實(shí)現(xiàn)希爾排序算法的簡單示例,希爾排序可以被看作是插入排序的一種更高效的改進(jìn)版本,需要的朋友可以參考下2016-05-05Mybatisplus創(chuàng)建Spring?Boot工程打包錯(cuò)誤的解決方式
最近在實(shí)戰(zhàn)springboot遇到了一些坑,記錄一下,下面這篇文章主要給大家介紹了關(guān)于Mybatisplus創(chuàng)建Spring?Boot工程打包錯(cuò)誤的解決方式,文中通過圖文介紹的介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03關(guān)于Mybatis的mapper接口函數(shù)重載問題
這篇文章主要介紹了關(guān)于Mybatis的mapper接口函數(shù)重載問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02mybatis根據(jù)表逆向自動化生成代碼的實(shí)現(xiàn)
若采用mybatis框架,數(shù)據(jù)庫新建表,手動編寫的話,需要編寫大量的實(shí)體類、mapper文件、mapper.xml文件,都是一些重復(fù)且有規(guī)律的工作。我們可以引用插件,然后做配置,自動生成這些文件,本文就來詳細(xì)的介紹一下2021-08-08