国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java實(shí)現(xiàn)使用jlibmodbus讀取Modbus TCP數(shù)據(jù)

這篇具有很好參考價(jià)值的文章主要介紹了Java實(shí)現(xiàn)使用jlibmodbus讀取Modbus TCP數(shù)據(jù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

提示:可以使用Modbus slave工具模擬Modbus數(shù)據(jù)站并添加一些數(shù)據(jù)。
1、pom引入依賴(lài)

<dependency>
	 <groupId>com.intelligt.modbus</groupId>
	 <artifactId>jlibmodbus</artifactId>
	 <version>1.2.9.7</version>
</dependency>

2、創(chuàng)建modbus主機(jī)連接

public class JlibModbusBase {
    static ModbusMaster modbusMaster;
    public static void initJlibModbusMaster(String ip) {
        // 如果連接不存在,創(chuàng)建一個(gè)主機(jī)連接
        if (ObjectUtils.isEmpty(modbusMaster)) {
            // 設(shè)置主機(jī)TCP參數(shù)
            TcpParameters tcpParameters = new TcpParameters();
            // 設(shè)置TCP的ip地址-本地地址
            InetAddress address = null;
            try {
                address = InetAddress.getByName(ip);
            } catch (UnknownHostException e) {
                throw new RuntimeException(e);
            }
            tcpParameters.setHost(address);
            // TCP設(shè)置長(zhǎng)連接
            tcpParameters.setKeepAlive(true);
            // TCP設(shè)置端口,這里設(shè)置是默認(rèn)端口502
            tcpParameters.setPort(502);
            modbusMaster = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
            Modbus.setAutoIncrementTransactionId(true);
        }
    }
    public static void release() {
        if (modbusMaster != null) {
            try {
                modbusMaster.disconnect();
            } catch (ModbusIOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

3、通過(guò)連接獲取功能碼0x04與0x03的數(shù)據(jù)

public class JlibModbusBaseTool {
    /**
     * "功能碼0x04"
     * 讀取HoldingRegister數(shù)據(jù)
     *
     * @param slaveId  寄存器地址ID
     * @param offset   寄存器讀取開(kāi)始地址
     * @param quantity 讀取寄存器數(shù)量
     * @return int數(shù)組
     */
    public static int[] readInputRegisters(int slaveId, int offset, int quantity) {
        try {
            return modbusMaster.readInputRegisters(slaveId, offset, quantity);
        } catch (ModbusProtocolException | ModbusNumberException | ModbusIOException e) {
            throw new RuntimeException(e);
        } finally {
            release();
        }
    }
    /**
     * "功能碼0x03"
     * 讀取HoldingRegister數(shù)據(jù)
     *
     * @param slaveId  寄存器地址ID
     * @param offset   寄存器讀取開(kāi)始地址
     * @param quantity 讀取寄存器數(shù)量
     * @return int數(shù)組
     */
    public static int[] readHoldingRegisters(int slaveId, int offset, int quantity) {
        try {
            return modbusMaster.readHoldingRegisters(slaveId, offset, quantity);
        } catch (ModbusProtocolException | ModbusNumberException | ModbusIOException e) {
            throw new RuntimeException(e);
        } finally {
            release();
        }
    }

4、根據(jù)具體業(yè)務(wù)情況,進(jìn)行方法的調(diào)用與數(shù)據(jù)解析。在本人實(shí)際業(yè)務(wù)中,存在兩個(gè)IP地址(實(shí)際中上文的主機(jī)連接,可以根據(jù)IP的不同,實(shí)時(shí)創(chuàng)建不同的連接)。因?yàn)樽x取寄存器數(shù)量時(shí),最多可以讀取124個(gè)寄存器。所以根據(jù)業(yè)務(wù)實(shí)際情況,進(jìn)行多次的循環(huán)取數(shù)。

//讀取的寄存器數(shù)量,一次讀取兩臺(tái)設(shè)備寄存器數(shù)據(jù)
//因?yàn)閷?shí)際使用中數(shù)據(jù)為float數(shù)據(jù),下文還會(huì)進(jìn)行數(shù)據(jù)的轉(zhuǎn)換
int quantity = 96;
int[] result = null;
int salveId = 0;
//獲取數(shù)據(jù)
result = JlibModbusBaseTool.readInputRegisters(salveId,offset,quantity);
//首先將int[]轉(zhuǎn)化為集合,然后將讀取到的數(shù)據(jù)集合,分成兩個(gè)集合
List<Integer> intList = Arrays.stream(result).boxed().toList();
int LIMIT_TOW = 48;
ArrayList<List<Integer>> dataList = new ArrayList<>();
Stream.iterate(0, n -> n + 1).limit(countStep(intList.size(), LIMIT_TOW)).forEach(i -> {
  dataList.add(intList.stream().skip(i * LIMIT_TOW).limit(LIMIT_TOW).collect(Collectors.toList()));
});
//計(jì)算分組數(shù)量
public static Integer countStep(Integer size,int limt) {
   return (size + limt - 1) / limt;
}
//然后讀取int[]數(shù)據(jù),轉(zhuǎn)化為浮點(diǎn)類(lèi)型
// 兩個(gè)數(shù)據(jù)一組,組成16進(jìn)制字符轉(zhuǎn),轉(zhuǎn)化為float數(shù)據(jù)類(lèi)型
public static CcElectricityMeterNew convertFloat(int[] array, CcElectricityMeterNew meterNew){
   for (int i = 0; i < array.length; i++) {
       if ((i+1)%2==0) {
           int first = array[i-1];
           int second = array[i];
           //在進(jìn)行字符串轉(zhuǎn)化時(shí),轉(zhuǎn)化的16進(jìn)制會(huì)存在缺少一位的情況,進(jìn)行左側(cè)補(bǔ)零操作
           String hexStr = addZeroForStr(Integer.toHexString(first),4,1)+""+addZeroForStr(Integer.toHexString(second),4,1);
           System.out.println(new BigDecimal(sfloat(hexStr)));
       }
   }
   return meterNew;
}
//將字符串類(lèi)型的16進(jìn)制數(shù)據(jù),轉(zhuǎn)化為float字符串
private static String sfloat(String str){
      Float value =  Float.intBitsToFloat(new BigInteger(str, 16).intValue());
      return String.valueOf(value);
  }

/**
  * 給字符串的左補(bǔ)0或右補(bǔ)0
  * @param str  要處理的字符串
  * @param length 補(bǔ)0后字符串總長(zhǎng)度
  * @return 返回補(bǔ)零字符串
  */
 public static String addZeroForStr(String str, int length,int type) {
     int strLen = str.length();
     if (strLen < length) {
         while (strLen < length) {
             StringBuffer sb = new StringBuffer();
           		if(type==1){
                    // 左補(bǔ)0
                    sb.append("0").append(str);
                }else if(type==2){
                    //右補(bǔ)0
                    sb.append(str).append("0");
                }
             str = sb.toString();
             strLen = str.length();
         }
     }
     return str;
 }

備注:使用jlibmodbus讀取Modbus TCP數(shù)據(jù)是非常簡(jiǎn)單的,在使用中需要根據(jù)自己需要的數(shù)據(jù)類(lèi)型進(jìn)行轉(zhuǎn)化;同時(shí)一次獲取寄存器的數(shù)量需要注意,合理進(jìn)行循環(huán)的數(shù)據(jù)獲取。在進(jìn)行modbus數(shù)據(jù)獲取時(shí),碰到一個(gè)問(wèn)題,在大量進(jìn)行重復(fù)連接數(shù)據(jù)獲取時(shí),modbus存在Connection reset 的問(wèn)題,導(dǎo)致數(shù)據(jù)獲取無(wú)法進(jìn)行后續(xù)數(shù)據(jù)獲取中斷,暫時(shí)沒(méi)有找到問(wèn)題的原因,如果有知道原理的大神,希望給與解答?。?!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-508200.html

到了這里,關(guān)于Java實(shí)現(xiàn)使用jlibmodbus讀取Modbus TCP數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JAVA modbus4j 實(shí)現(xiàn)modbus tcp通訊

    JAVA modbus4j 實(shí)現(xiàn)modbus tcp通訊

    1.maven依賴(lài) 2.在modbus進(jìn)行讀寫(xiě)之前,需要先建立連接,例如:建立modbus tcp通訊 ?3.modbus4j 讀工具類(lèi) 4. modbus4j 寫(xiě)工具類(lèi)

    2024年02月16日
    瀏覽(25)
  • 【2023】java通過(guò)modbus4j實(shí)現(xiàn)modus TCP通訊

    【2023】java通過(guò)modbus4j實(shí)現(xiàn)modus TCP通訊

    主要分為三個(gè)子協(xié)議 RTU ASCII TCP Modbus RTU:——傳輸?shù)氖亲止?jié)數(shù)組(bit[]) 通信:讀寫(xiě) 輸出:可以讀寫(xiě) 輸入:只能讀 存儲(chǔ)區(qū):輸出線(xiàn)圈、輸入線(xiàn)圈、輸出寄存器、輸入寄存器 線(xiàn)圈:代表一個(gè)布爾量、最小單位是一個(gè)布爾(1或者0), 寄存器:一個(gè)寄存器代表16個(gè)最小單位,主

    2024年02月12日
    瀏覽(20)
  • C++基于開(kāi)源Modbus Tcp 通訊應(yīng)用客戶(hù)端(穩(wěn)定高效,多線(xiàn)程后臺(tái)狀態(tài)讀取,不卡頓)

    C++基于開(kāi)源Modbus Tcp 通訊應(yīng)用客戶(hù)端(穩(wěn)定高效,多線(xiàn)程后臺(tái)狀態(tài)讀取,不卡頓)

    使用多線(xiàn)程后臺(tái)批量刷寄存器的狀態(tài),在某種程度上保證了上層接口讀取的時(shí)候,不會(huì)卡頓, 整體應(yīng)用效果比較友好。程序應(yīng)用簡(jiǎn)單穩(wěn)定高效,是一個(gè)比較不錯(cuò)的嘗試。 代碼如下: 代碼如下: https://download.csdn.net/download/u013083044/87062401

    2024年02月16日
    瀏覽(24)
  • Java實(shí)現(xiàn)Modbus讀寫(xiě)數(shù)據(jù)

    Java實(shí)現(xiàn)Modbus讀寫(xiě)數(shù)據(jù)

    由于當(dāng)時(shí)項(xiàng)目周期趕,引入了一個(gè)PLC4X組件,上手快。接下來(lái)就是使用這個(gè)組件遇到的一些問(wèn)題: 關(guān)閉連接NioEventLoop沒(méi)有釋放導(dǎo)致oom 設(shè)計(jì)思想是一個(gè)設(shè)備一個(gè)連接,而不是一個(gè)網(wǎng)關(guān)一個(gè)連接 連接斷開(kāi)后客戶(hù)端無(wú)從感知 前兩個(gè)問(wèn)題解決方案參考上篇文章,最后一個(gè)問(wèn)題雖然可

    2024年02月09日
    瀏覽(24)
  • Java 整合 Modbus TCP

    Java 整合 Modbus TCP

    概念 Modbus 是一種 串行通信協(xié)議 ,是Modicon公司(現(xiàn)在的施耐德電氣 Schneider Electric)于1979年為使用可編程邏輯控制器(PLC)通信而發(fā)表。Modbus已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議的業(yè)界標(biāo)準(zhǔn)(De facto),并且現(xiàn)在是工業(yè)電子設(shè)備之間常用的連接方式。 優(yōu)勢(shì) Modbus協(xié)議標(biāo)準(zhǔn)開(kāi)放、公開(kāi)發(fā)

    2024年02月13日
    瀏覽(27)
  • Java與Modbus-TCP/IP網(wǎng)絡(luò)通訊

    通過(guò)Java與Modbus-TCP/IP網(wǎng)絡(luò)通訊實(shí)現(xiàn)舉例5中的功能

    2024年02月10日
    瀏覽(31)
  • LabVIEW實(shí)現(xiàn)Modbus-TCP通信

    LabVIEW實(shí)現(xiàn)Modbus-TCP通信

    Modbus協(xié)議是一種已廣泛應(yīng)用于當(dāng)今工業(yè)控制領(lǐng)域的通用通訊協(xié)議,按其格式可分為Modbus-RTU、Modbus-ASCII和Modbus-TCP。其中,前兩者適用于串行通信控制網(wǎng)絡(luò)中,例如RS485、RS232等,而Modbus-TCP主要應(yīng)用于基于以太網(wǎng)TCP/IP通信的控制網(wǎng)絡(luò)中。通過(guò)此協(xié)議,控制器相互之間、或控制器經(jīng)

    2024年02月15日
    瀏覽(34)
  • MODBUS TCP協(xié)議實(shí)例數(shù)據(jù)幀詳細(xì)分析

    MODBUS TCP協(xié)議實(shí)例數(shù)據(jù)幀詳細(xì)分析

    Modbus由MODICON公司于1979年開(kāi)發(fā),是一種工業(yè)現(xiàn)場(chǎng)總線(xiàn)協(xié)議標(biāo)準(zhǔn)。1996年施耐德公司推出基于以太網(wǎng)TCP/IP的Modbus協(xié)議:ModbusTCP。Modbus協(xié)議是一項(xiàng)應(yīng)用層報(bào)文傳輸協(xié)議,包括ASCII、RTU、TCP三種報(bào)文類(lèi)型。標(biāo)準(zhǔn)的Modbus協(xié)議物理層接口有RS232、RS422、RS485和以太網(wǎng)接口,采用master/slave方式

    2024年02月05日
    瀏覽(39)
  • C# 使用NModbus4進(jìn)行TCP讀取,并且實(shí)現(xiàn)自動(dòng)斷線(xiàn)重連

    C# 使用NModbus4進(jìn)行TCP讀取,并且實(shí)現(xiàn)自動(dòng)斷線(xiàn)重連

    2024年02月09日
    瀏覽(14)
  • python使用pymodbus庫(kù)進(jìn)行modbus tcp通信

    使用python解決工業(yè)通信問(wèn)題是一個(gè)非常好的選擇,python具有豐富的生態(tài),可以輕松解決工業(yè)通信的各種問(wèn)題。本篇主要介紹使用pymodbus庫(kù)進(jìn)行modbus tcp仿真,實(shí)現(xiàn)pc端讀取plc或工業(yè)設(shè)備modbus變量。 安裝pymodbus: 這里我們先創(chuàng)建一個(gè)虛擬的modbus設(shè)備,如果你手里有一個(gè)plc或者工業(yè)

    2024年01月22日
    瀏覽(97)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包