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

