最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用modbus-master-tcp實(shí)現(xiàn)modbus tcp通訊

 更新時(shí)間:2023年12月27日 10:43:35   作者:左搜  
這篇文章主要為大家詳細(xì)介紹了另外一種Java語言的modbux tcp通訊方案,那就是modbus-master-tcp,文中的示例代碼講解詳細(xì),需要的可以了解下

引言

modbus tcp通訊Java的方案之前已經(jīng)講解過一種,modbus4j實(shí)現(xiàn)Java語言的modbus tcp協(xié)議通訊。從上一個(gè)方案中我們不難發(fā)現(xiàn)modbus4j的通訊實(shí)現(xiàn)方式是同步的。實(shí)際應(yīng)用中可能會讀取大量的數(shù)據(jù)。同步處理對于應(yīng)用的響應(yīng)還是不太友好的。本博客主要講解另外一種Java語言的modbux tcp通訊方案。那就是modbus-master-tcp。

一、創(chuàng)建一個(gè)demo項(xiàng)目

創(chuàng)建一個(gè)簡單的maven項(xiàng)目,項(xiàng)目結(jié)構(gòu)圖如下:

二、pom.xml maven依賴

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.leftso.demo.modbus</groupId>
	<artifactId>demo-modbus-master-slave</artifactId>
	<version>1.0</version>

	<dependencies>

		<dependency>
			<groupId>com.digitalpetri.modbus</groupId>
			<artifactId>modbus-master-tcp</artifactId>
			<version>1.1.0</version>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>

	</build>
</project>

pom.xml注意,需要將java的編譯版本指定到1.8.因?yàn)橹挥?.8以后才支持lambda表達(dá)式。

配置完成后,我們觀察引入的依賴包:

觀察可以發(fā)現(xiàn),modbus-master-tcp項(xiàng)目的底層是基于netty框架開發(fā)。天然的支持異步處理。在性能方面有很好的提升。

三、編寫modbus tcp讀取案例

package com.leftso.demo.modbus;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

import com.digitalpetri.modbus.codec.Modbus;
import com.digitalpetri.modbus.master.ModbusTcpMaster;
import com.digitalpetri.modbus.master.ModbusTcpMasterConfig;
import com.digitalpetri.modbus.requests.ReadCoilsRequest;
import com.digitalpetri.modbus.requests.ReadDiscreteInputsRequest;
import com.digitalpetri.modbus.requests.ReadHoldingRegistersRequest;
import com.digitalpetri.modbus.requests.ReadInputRegistersRequest;
import com.digitalpetri.modbus.responses.ReadCoilsResponse;
import com.digitalpetri.modbus.responses.ReadDiscreteInputsResponse;
import com.digitalpetri.modbus.responses.ReadHoldingRegistersResponse;
import com.digitalpetri.modbus.responses.ReadInputRegistersResponse;

import io.netty.buffer.ByteBuf;
import io.netty.util.ReferenceCountUtil;

/***
 * modbus TCP協(xié)議Java通訊讀取例子
 * 
 * @author xqlee
 *
 */
public class SimpleMasterExample {

	static ModbusTcpMaster master;

	/**
	 * 獲取TCP協(xié)議的Master
	 * 
	 * @return
	 */
	public static void initModbusTcpMaster() {
		if (master == null) {
			// 創(chuàng)建配置
			ModbusTcpMasterConfig config = new ModbusTcpMasterConfig.Builder("localhost").setPort(502).build();
			master = new ModbusTcpMaster(config);
		}
	}

	/***
	 * 釋放資源
	 */
	public static void release() {
		if (master != null) {
			master.disconnect();
		}
		Modbus.releaseSharedResources();
	}

	/**
	 * 讀取HoldingRegister數(shù)據(jù)
	 * 
	 * @param address
	 *            寄存器地址
	 * @param quantity
	 *            寄存器數(shù)量
	 * @param unitId
	 *            id
	 * @return 讀取結(jié)果
	 * @throws InterruptedException
	 *             異常
	 * @throws ExecutionException
	 *             異常
	 */
	public static Number readHoldingRegisters(int address, int quantity, int unitId)
			throws InterruptedException, ExecutionException {
		Number result = null;
		CompletableFuture<ReadHoldingRegistersResponse> future = master
				.sendRequest(new ReadHoldingRegistersRequest(address, quantity), unitId);
		ReadHoldingRegistersResponse readHoldingRegistersResponse = future.get();// 工具類做的同步返回.實(shí)際使用推薦結(jié)合業(yè)務(wù)進(jìn)行異步處理
		if (readHoldingRegistersResponse != null) {
			ByteBuf buf = readHoldingRegistersResponse.getRegisters();
			result = buf.readFloat();
			ReferenceCountUtil.release(readHoldingRegistersResponse);
		}
		return result;
	}

	/**
	 * 讀取InputRegisters模擬量數(shù)據(jù)
	 * 
	 * @param address
	 *            寄存器開始地址
	 * @param quantity
	 *            數(shù)量
	 * @param unitId
	 *            ID
	 * @return 讀取值
	 * @throws InterruptedException
	 *             異常
	 * @throws ExecutionException
	 *             異常
	 */
	public static Number readInputRegisters(int address, int quantity, int unitId)
			throws InterruptedException, ExecutionException {
		Number result = null;
		CompletableFuture<ReadInputRegistersResponse> future = master
				.sendRequest(new ReadInputRegistersRequest(address, quantity), unitId);
		ReadInputRegistersResponse readInputRegistersResponse = future.get();// 工具類做的同步返回.實(shí)際使用推薦結(jié)合業(yè)務(wù)進(jìn)行異步處理
		if (readInputRegistersResponse != null) {
			ByteBuf buf = readInputRegistersResponse.getRegisters();
			result = buf.readFloat();
			ReferenceCountUtil.release(readInputRegistersResponse);
		}
		return result;
	}

	/**
	 * 讀取Coils開關(guān)量
	 * 
	 * @param address
	 *            寄存器開始地址
	 * @param quantity
	 *            數(shù)量
	 * @param unitId
	 *            ID
	 * @return 讀取值
	 * @throws InterruptedException
	 *             異常
	 * @throws ExecutionException
	 *             異常
	 */
	public static Boolean readCoils(int address, int quantity, int unitId)
			throws InterruptedException, ExecutionException {
		Boolean result = null;
		CompletableFuture<ReadCoilsResponse> future = master.sendRequest(new ReadCoilsRequest(address, quantity),
				unitId);
		ReadCoilsResponse readCoilsResponse = future.get();// 工具類做的同步返回.實(shí)際使用推薦結(jié)合業(yè)務(wù)進(jìn)行異步處理
		if (readCoilsResponse != null) {
			ByteBuf buf = readCoilsResponse.getCoilStatus();
			result = buf.readBoolean();
			ReferenceCountUtil.release(readCoilsResponse);
		}
		return result;
	}

	/**
	 * 讀取readDiscreteInputs開關(guān)量
	 * 
	 * @param address
	 *            寄存器開始地址
	 * @param quantity
	 *            數(shù)量
	 * @param unitId
	 *            ID
	 * @return 讀取值
	 * @throws InterruptedException
	 *             異常
	 * @throws ExecutionException
	 *             異常
	 */
	public static Boolean readDiscreteInputs(int address, int quantity, int unitId)
			throws InterruptedException, ExecutionException {
		Boolean result = null;
		CompletableFuture<ReadDiscreteInputsResponse> future = master
				.sendRequest(new ReadDiscreteInputsRequest(address, quantity), unitId);
		ReadDiscreteInputsResponse discreteInputsResponse = future.get();// 工具類做的同步返回.實(shí)際使用推薦結(jié)合業(yè)務(wù)進(jìn)行異步處理
		if (discreteInputsResponse != null) {
			ByteBuf buf = discreteInputsResponse.getInputStatus();
			result = buf.readBoolean();
			ReferenceCountUtil.release(discreteInputsResponse);
		}
		return result;
	}

	public static void main(String[] args) {
		try {
			// 初始化資源
			initModbusTcpMaster();
			// 執(zhí)行操作
			// 讀取模擬量
			System.out.println(readHoldingRegisters(0, 4, 1));
			System.out.println(readInputRegisters(0, 4, 1));

			// 讀取開關(guān)量
			System.out.println(readCoils(0, 1, 1));
			System.out.println(readDiscreteInputs(0, 1, 1));
			System.out.println(readDiscreteInputs(2, 1, 1));

			// 釋放資源
			release();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

上面的代碼中模擬量的讀取需要注意,根據(jù)實(shí)際類型來讀取相應(yīng)的類型,例子中讀取的double類型數(shù)據(jù)

四、運(yùn)行上面的案例演示modbus tcp數(shù)據(jù)讀取

首先打開軟件Modbus Slave(沒有的可以百度下載)。啟動(dòng)連接:

連接完成后,創(chuàng)建四個(gè)文檔如下圖所示:

好了,現(xiàn)在運(yùn)行我們剛才編寫的Java demo程序,SimpleMasterExample:

通過執(zhí)行結(jié)果可以看到與Modbus Slave軟件中的文檔數(shù)據(jù)一致。

以上就是Java使用modbus-master-tcp實(shí)現(xiàn)modbus tcp通訊的詳細(xì)內(nèi)容,更多關(guān)于Java modbustcp通訊的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于Java數(shù)組查詢的相關(guān)問題及實(shí)例

    關(guān)于Java數(shù)組查詢的相關(guān)問題及實(shí)例

    這篇文章主要介紹了關(guān)于Java數(shù)組查詢的相關(guān)問題及實(shí)例,需要的朋友可以參考下。
    2017-08-08
  • Java中的泛型詳解

    Java中的泛型詳解

    這篇文章主要介紹了Java中的泛型詳解,本文講解了泛型類或接口、從泛型類派生子類、偽泛型、類型通配符、通配符的上限、通配符的下限、擦除和轉(zhuǎn)換等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • mybatis時(shí)間范圍查詢代碼示例

    mybatis時(shí)間范圍查詢代碼示例

    這篇文章主要給大家介紹了關(guān)于mybatis時(shí)間范圍查詢的相關(guān)資料,在項(xiàng)?中避免不了要?到時(shí)間范圍查詢,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • 將Swagger2文檔導(dǎo)出為HTML或markdown等格式離線閱讀解析

    將Swagger2文檔導(dǎo)出為HTML或markdown等格式離線閱讀解析

    這篇文章主要介紹了將Swagger2文檔導(dǎo)出為HTML或markdown等格式離線閱讀,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java實(shí)現(xiàn)動(dòng)態(tài)代理方法淺析

    java實(shí)現(xiàn)動(dòng)態(tài)代理方法淺析

    這篇文章主要介紹了java實(shí)現(xiàn)動(dòng)態(tài)代理方法淺析,很實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • springboot+thymeleaf+druid+mybatis 多模塊實(shí)現(xiàn)用戶登錄功能

    springboot+thymeleaf+druid+mybatis 多模塊實(shí)現(xiàn)用戶登錄功能

    這篇文章主要介紹了springboot+thymeleaf+druid+mybatis 多模塊實(shí)現(xiàn)用戶登錄功能,本文通過示例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java中全排列的生成算法匯總

    java中全排列的生成算法匯總

    本文給大家匯總介紹了常見的6種全排列的生成算法,包括字典序法、遞增進(jìn)位數(shù)制法、遞減進(jìn)位數(shù)制法、鄰位交換法、遞歸類算法、元素增值法,有需要的小伙伴可以參考下
    2015-07-07
  • Java面試題沖刺第十三天--數(shù)據(jù)庫(3)

    Java面試題沖刺第十三天--數(shù)據(jù)庫(3)

    這篇文章主要為大家分享了最有價(jià)值的三道數(shù)據(jù)庫面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java循環(huán)練習(xí)的簡單代碼實(shí)例

    java循環(huán)練習(xí)的簡單代碼實(shí)例

    本篇文章介紹了,java中循環(huán)練習(xí)的一些簡單代碼實(shí)例。需要的朋友參考下
    2013-04-04
  • SpringBoot整合Redis將對象寫入redis的實(shí)現(xiàn)

    SpringBoot整合Redis將對象寫入redis的實(shí)現(xiàn)

    本文主要介紹了SpringBoot整合Redis將對象寫入redis的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評論

锡林郭勒盟| 卓资县| 乌拉特中旗| 平陆县| 甘肃省| 铜山县| 岳池县| 大兴区| 县级市| 望奎县| 宝丰县| 云浮市| 彝良县| 子长县| 昌宁县| 潮州市| 四川省| 甘洛县| 华容县| 龙门县| 渑池县| 平和县| 土默特右旗| 辽阳县| 延川县| 仪陇县| 潜山县| 文水县| 玛纳斯县| 拉萨市| 江孜县| 富宁县| 黄冈市| 松原市| 房产| 六枝特区| 信丰县| 南郑县| 福清市| 都匀市| 灌南县|