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

java對接Modbus協(xié)議代碼示例

 更新時間:2024年03月27日 11:54:38   作者:cocoon-breaking  
Modbus是一種串行通信協(xié)議,Modbus已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議的業(yè)界標(biāo)準(zhǔn),并且現(xiàn)在是工業(yè)電子設(shè)備之間常用的連接方式,這篇文章主要給大家介紹了關(guān)于java對接Modbus協(xié)議的相關(guān)資料,需要的朋友可以參考下

一、Modbus含義

Modbus是一種單主站的主/從通信模式,它定義了一種通訊規(guī)范,用于在工業(yè)自動化系統(tǒng)中實現(xiàn)設(shè)備之間的數(shù)據(jù)交換。Modbus網(wǎng)絡(luò)上只能有一個主站存在,主站在Modbus網(wǎng)絡(luò)上沒有地址,而從站的地址范圍為0-247,其中0為廣播地址,從站的實際地址范圍為1-247。

Modbus通信協(xié)議可以通過多種傳輸方式傳播,如RS232C、RS485、光纖和無線電等。它具有兩種串行傳輸模式,即ASCII和RTU,它們定義了數(shù)據(jù)如何打包和解碼的方式。一般來說,支持Modbus協(xié)議的設(shè)備都會支持RTU格式,通信雙方必須同時支持這兩種模式中的一種。

總結(jié)來說,Modbus是一種用于工業(yè)自動化系統(tǒng)的通信協(xié)議,它定義了通信格式和規(guī)范,可以通過不同的傳輸方式進行數(shù)據(jù)交換

二、Java如何對接Modbus

1、讀取數(shù)據(jù)

public class Modbus4jUtils {
	/**
	 * 工廠。
	 */
	static ModbusFactory modbusFactory;
	static {
		if (modbusFactory == null) {
			modbusFactory = new ModbusFactory();
		}
	}

	/**
	 * 獲取master
	 * 
	 * @return
	 * @throws ModbusInitException
	 */
	public static ModbusMaster getMaster() throws ModbusInitException {
		IpParameters params = new IpParameters();
		params.setHost("你的硬件ip");
		params.setPort("端口號");
		//
		// modbusFactory.createRtuMaster(wapper); //RTU 協(xié)議
		// modbusFactory.createUdpMaster(params);//UDP 協(xié)議
		// modbusFactory.createAsciiMaster(wrapper);//ASCII 協(xié)議
		ModbusMaster master = modbusFactory.createTcpMaster(params, false);// TCP 協(xié)議
		master.init();

		return master;
	}

	/**
	 * 讀取[01 Coil Status 0x]類型 開關(guān)數(shù)據(jù)
	 * 
	 * @param slaveId
	 *            slaveId
	 * @param offset
	 *            位置
	 * @return 讀取值
	 * @throws ModbusTransportException
	 *             異常
	 * @throws ErrorResponseException
	 *             異常
	 * @throws ModbusInitException
	 *             異常
	 */
	public static Boolean readCoilStatus(int slaveId, int offset)
			throws ModbusTransportException, ErrorResponseException, ModbusInitException {
		// 01 Coil Status
		BaseLocator<Boolean> loc = BaseLocator.coilStatus(slaveId, offset);
		Boolean value = getMaster().getValue(loc);
		return value;
	}

	/**
	 * 讀取[02 Input Status 1x]類型 開關(guān)數(shù)據(jù)
	 * 
	 * @param slaveId
	 * @param offset
	 * @return
	 * @throws ModbusTransportException
	 * @throws ErrorResponseException
	 * @throws ModbusInitException
	 */
	public static Boolean readInputStatus(int slaveId, int offset)
			throws ModbusTransportException, ErrorResponseException, ModbusInitException {
		// 02 Input Status
		BaseLocator<Boolean> loc = BaseLocator.inputStatus(slaveId, offset);
		Boolean value = getMaster().getValue(loc);
		return value;
	}

	/**
	 * 讀取[03 Holding Register類型 2x]模擬量數(shù)據(jù)
	 * 
	 * @param slaveId
	 *            slave Id
	 * @param offset
	 *            位置
	 * @param dataType
	 *            數(shù)據(jù)類型,來自com.serotonin.modbus4j.code.DataType
	 * @return
	 * @throws ModbusTransportException
	 *             異常
	 * @throws ErrorResponseException
	 *             異常
	 * @throws ModbusInitException
	 *             異常
	 */
	public static Number readHoldingRegister(int slaveId, int offset, int dataType)
			throws ModbusTransportException, ErrorResponseException, ModbusInitException {
		// 03 Holding Register類型數(shù)據(jù)讀取
		BaseLocator<Number> loc = BaseLocator.holdingRegister(slaveId, offset, dataType);
		Number value = getMaster().getValue(loc);
		return value;
	}

	/**
	 * 讀取[04 Input Registers 3x]類型 模擬量數(shù)據(jù)
	 * 
	 * @param slaveId
	 *            slaveId
	 * @param offset
	 *            位置
	 * @param dataType
	 *            數(shù)據(jù)類型,來自com.serotonin.modbus4j.code.DataType
	 * @return 返回結(jié)果
	 * @throws ModbusTransportException
	 *             異常
	 * @throws ErrorResponseException
	 *             異常
	 * @throws ModbusInitException
	 *             異常
	 */
	public static Number readInputRegisters(int slaveId, int offset, int dataType)
			throws ModbusTransportException, ErrorResponseException, ModbusInitException {
		// 04 Input Registers類型數(shù)據(jù)讀取
		BaseLocator<Number> loc = BaseLocator.inputRegister(slaveId, offset, dataType);
		Number value = getMaster().getValue(loc);
		return value;
	}
}

2.寫入數(shù)據(jù)

public class Modbus4jWriteUtils {
	static Log log = LogFactory.getLog(Modbus4jWriteUtils.class);
	/**
	 * 工廠。
	 */
	static ModbusFactory modbusFactory;
	static {
		if (modbusFactory == null) {
			modbusFactory = new ModbusFactory();
		}
	}

	/**
	 * 獲取tcpMaster
	 *
	 * @return
	 * @throws ModbusInitException
	 */
	public static ModbusMaster getMaster() throws ModbusInitException {
		IpParameters params = new IpParameters();
		params.setHost("你的硬件地址");
		params.setPort("端口號");

		ModbusMaster tcpMaster = modbusFactory.createTcpMaster(params, false);
		tcpMaster.init();

		return tcpMaster;
	}

	/**
	 * 寫 [01 Coil Status(0x)]寫一個 function ID = 5
	 *
	 * @param slaveId
	 *            slave的ID
	 * @param writeOffset
	 *            位置
	 * @param writeValue
	 *            值
	 * @return 是否寫入成功
	 * @throws ModbusTransportException
	 * @throws ModbusInitException
	 */
	public static boolean writeCoil(int slaveId, int writeOffset, boolean writeValue)
			throws ModbusTransportException, ModbusInitException {
		// 獲取master
		ModbusMaster tcpMaster = getMaster();
		// 創(chuàng)建請求
		WriteCoilRequest request = new WriteCoilRequest(slaveId, writeOffset, writeValue);
		// 發(fā)送請求并獲取響應(yīng)對象
		WriteCoilResponse response = (WriteCoilResponse) tcpMaster.send(request);
		if (response.isException()) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 寫[01 Coil Status(0x)] 寫多個 function ID = 15
	 *
	 * @param slaveId
	 *            slaveId
	 * @param startOffset
	 *            開始位置
	 * @param bdata
	 *            寫入的數(shù)據(jù)
	 * @return 是否寫入成功
	 * @throws ModbusTransportException
	 * @throws ModbusInitException
	 */
	public static boolean writeCoils(int slaveId, int startOffset, boolean[] bdata)
			throws ModbusTransportException, ModbusInitException {
		// 獲取master
		ModbusMaster tcpMaster = getMaster();
		// 創(chuàng)建請求
		WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startOffset, bdata);
		// 發(fā)送請求并獲取響應(yīng)對象
		WriteCoilsResponse response = (WriteCoilsResponse) tcpMaster.send(request);
		if (response.isException()) {
			return false;
		} else {
			return true;
		}

	}

	/***
	 * 寫[03 Holding Register(4x)] 寫一個 function ID = 6
	 *
	 * @param slaveId
	 * @param writeOffset
	 * @param writeValue
	 * @return
	 * @throws ModbusTransportException
	 * @throws ModbusInitException
	 */
	public static boolean writeRegister(int slaveId, int writeOffset, short writeValue)
			throws ModbusTransportException, ModbusInitException {
		// 獲取master
		ModbusMaster tcpMaster = getMaster();
		// 創(chuàng)建請求對象
		WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);
		WriteRegisterResponse response = (WriteRegisterResponse) tcpMaster.send(request);
		if (response.isException()) {
			log.error(response.getExceptionMessage());
			return false;
		} else {
			return true;
		}

	}

	/**
	 *
	 * 寫入[03 Holding Register(4x)]寫多個 function ID=16
	 *
	 * @param slaveId
	 *            modbus的slaveID
	 * @param startOffset
	 *            起始位置偏移量值
	 * @param sdata
	 *            寫入的數(shù)據(jù)
	 * @return 返回是否寫入成功
	 * @throws ModbusTransportException
	 * @throws ModbusInitException
	 */
	public static boolean writeRegisters(int slaveId, int startOffset, short[] sdata)
			throws ModbusTransportException, ModbusInitException {
		// 獲取master
		ModbusMaster tcpMaster = getMaster();
		// 創(chuàng)建請求對象
		WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, sdata);
		// 發(fā)送請求并獲取響應(yīng)對象
		ModbusResponse response = tcpMaster.send(request);
		if (response.isException()) {
			log.error(response.getExceptionMessage());
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 寫入數(shù)字類型的模擬量(如:寫入Float類型的模擬量、Double類型模擬量、整數(shù)類型Short、Integer、Long)
	 *
	 * @param slaveId
	 * @param offset
	 * @param value
	 *            寫入值,Number的子類,例如寫入Float浮點類型,Double雙精度類型,以及整型short,int,long
	 * @param registerCount
	 * ,com.serotonin.modbus4j.code.DataType
	 * @throws ModbusTransportException
	 * @throws ErrorResponseException
	 * @throws ModbusInitException
	 */
	public static void writeHoldingRegister(int slaveId, int offset, Number value, int dataType)
			throws ModbusTransportException, ErrorResponseException, ModbusInitException {
		// 獲取master
		ModbusMaster tcpMaster = getMaster();
		// 類型
		BaseLocator<Number> locator = BaseLocator.holdingRegister(slaveId, offset, dataType);
		tcpMaster.setValue(locator, value);
	}
 
}

總結(jié) 

到此這篇關(guān)于java對接Modbus協(xié)議的文章就介紹到這了,更多相關(guān)java對接Modbus內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea如何通過maven指定JDK版本

    idea如何通過maven指定JDK版本

    這篇文章主要介紹了idea如何通過maven指定JDK版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • SpringCloud-feign使用詳解

    SpringCloud-feign使用詳解

    Feign是Spring?Cloud中的輕量級RESTful?HTTP服務(wù)客戶端,它通過定義接口和注解簡化了服務(wù)調(diào)用,Feign支持Ribbon進行負(fù)載均衡,并且可以通過OpenFeign與Spring?MVC注解結(jié)合使用,文章詳細(xì)介紹了Feign的使用方法、自定義配置以及與其他組件的集成
    2025-01-01
  • Java中實現(xiàn)String.padLeft和String.padRight的示例

    Java中實現(xiàn)String.padLeft和String.padRight的示例

    本篇文章主要介紹了Java中實現(xiàn)String.padLeft和String.padRight,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Spring Boot與前端配合與Idea配置部署操作過程

    Spring Boot與前端配合與Idea配置部署操作過程

    這篇文章主要介紹了Spring Boot與前端配合與Idea配置部署的操作過程,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-02-02
  • Java中連接Mongodb進行增刪改查的操作詳解

    Java中連接Mongodb進行增刪改查的操作詳解

    MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫,由C++語言編寫,旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案,本文給大家介紹了Java中連接Mongodb進行操作,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • Java中實現(xiàn)可拖放圖片剪裁入門教程

    Java中實現(xiàn)可拖放圖片剪裁入門教程

    這篇文章主要介紹了Java中實現(xiàn)可拖放圖片剪裁入門教程,本文寫給新手,分步驟講解如何實現(xiàn)圖片裁剪,并對每步的代碼作注釋,需要的朋友可以參考下
    2015-01-01
  • 基于注解的組件掃描詳解

    基于注解的組件掃描詳解

    這篇文章主要介紹了基于注解的組件掃描詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Spring Gateway的入門概述及主要功能

    Spring Gateway的入門概述及主要功能

    Spring Gateway是Spring Cloud微服務(wù)生態(tài)下的網(wǎng)關(guān)組件,網(wǎng)絡(luò)層使用了基于非阻塞的 Netty使用異步IO增加了系統(tǒng)的性能,Gateway 是基于 Spring 5 和 Spring Boot 2 搭建的,這篇文章主要介紹了Spring Gateway的入門概述簡介,需要的朋友可以參考下
    2024-04-04
  • Java生成微信小程序二維碼完整實例代碼

    Java生成微信小程序二維碼完整實例代碼

    微信小程序是一種輕量級的應(yīng)用程序,用戶無需下載安裝即可使用,因此受到了廣泛的歡迎,這篇文章主要介紹了Java生成微信小程序二維碼的相關(guān)資料,包含上傳圖片、參數(shù)傳遞及二維碼生成邏輯,詳細(xì)說明了各組件作用及使用方法,需要的朋友可以參考下
    2025-09-09
  • 當(dāng)Mybatis遇上目錄樹超全完美解決方案

    當(dāng)Mybatis遇上目錄樹超全完美解決方案

    這篇文章主要介紹了當(dāng)Mybatis遇上目錄樹有哪些解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論

新沂市| 迭部县| 疏勒县| 贵溪市| 普定县| 邵武市| 富锦市| 太保市| 江津市| 涟水县| 巢湖市| 罗江县| 大同县| 新丰县| 共和县| 绥棱县| 山阳县| 吕梁市| 江门市| 大足县| 迁安市| 文水县| 雷山县| 乌兰县| 房山区| 西丰县| 姜堰市| 法库县| 高邮市| 德州市| 永兴县| 井冈山市| 密云县| 临漳县| 乌拉特中旗| 大理市| 陵水| 大关县| 惠来县| 郧西县| 成武县|