基於MODBUS-RTU協議的串口編程


       首先給大家描述一下當前樣例串口編程的場景,使用一個水位傳感器來測試水庫水位的高度,水位傳感器連接數據采集器,數據采集器通過485串口和USB口轉換器和電腦連接,電腦程序通過USB口讀取水位傳感器上傳到采集器的數據,網絡連接如下圖所示:

 

       樣例代碼如下,代碼中“int hight = (list[3] - 4000) /160;”這個公式就可以獲取到水位的高度,這個是比較難理解的,為什么這樣就可以得到高度呢,其實這個公式是不完整的,完整公式是這樣的:(傳感器返回的電流值 - 傳感器可輸出電流的最小值)/傳感器可輸出電流的最大最小差值 * 傳感器量程,當然這個計算方式的條件是壓力傳感器的輸出信號與被測壓力是線性的,如果是倒S型非線性或者S型非線性關系計算公式需要另行推算。

       另一個關鍵點就是讀取的長度設置,這個如何選在在代碼注釋中已經說明啦。

public static void main(String[] args) {
        SerialParameters serialParameters = new SerialParameters();
        // 設定MODBUS通訊的串行口
        serialParameters.setCommPortId("com6");
        // 設定成無奇偶校驗
        serialParameters.setParity(0);
        // 設定成數據位是8位
        serialParameters.setDataBits(8);
        // 設定為1個停止位
        serialParameters.setStopBits(1);
        // 設定端口名稱
        serialParameters.setPortOwnerName("Numb nuts");
        // 設定端口波特率
        serialParameters.setBaudRate(BAUD_RATE);
 
        // 創建ModbusFactory工廠實例
        ModbusFactory modbusFactory = new ModbusFactory();
        // 創建ModbusMaster實例
        ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);
 
 
        // 初始化
        try {
            master.init();
            
            /**
             * 讀的位置從零開始,長度4
             * 長度大小是采集器寄存器的數量,寄存器的數量是采集器可接入的電流輸入的路數
             */
            readHoldingRegistersTest(master,SLAVE_ADDRESS,0,4);
 
 
        } catch (ModbusInitException e) {
            e.printStackTrace();
        } finally {
            master.destroy();
        }
        
    }


 private static void readHoldingRegistersTest(ModbusMaster master,
            int slaveId, int start, int len) {
        try {
            ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(
                    slaveId, start, len);
            ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master
                    .send(request);
            if (response.isException()) {
                System.out.println("Exception response: message="
                        + response.getExceptionMessage());
            } else {
                System.out.println(Arrays.toString(response.getShortData()));
                short[] list = response.getShortData();
                for(int i = 0; i < list.length; i++){
                    System.out.print(list[i] + " ");
                }
                System.out.println();
                int hight = (list[3] - 4000) /160;
                if(hight <= 0){
                    System.out.println("水位高度為:0CM");
                }else{
                    System.out.println("水位高度為:" + (hight + 13.5) + "CM");
                }
                               
            }
        } catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

 最后給大家附上官方jar包,這個資源一般是比較難找到的,特別是對一些剛開始研究的同仁更是如此啦,資源包如下:https://files.cnblogs.com/files/cymiao/modbus.zip

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM