【Reproduced】modbus4j userguide


  1 使用modbus4j開源項目,通過串口讀取數據,過程中遇到點小問題。(轉的demo按自己的需求修改的)
  2 
  3 1.串口不對應,導致 gnu.io.NoSuchPortException。
  4 
  5 2.PLC485串口轉COMM口,發/送線連接不對,導致讀不到數據
  6 
  7 3.rxtxSerial.dll放置的路徑,查了下有人說放到myeclipse/jre/bin下,可我是放到C:\Windows\System32下,不知道原因。
  8 
  9 4.RXTXcomm.jar包和rxtxSerial.dll文件不對應,可去官網下載同一版本。
 10 
 11 5.讀保持型寄存器和讀輸入型寄存器方法不一樣。這是由於modbus協議,保持型功能碼為03,輸入型為04。通過api可找到對應的方法,用法也差不多一樣。
 12 
 13 class="java">package com.test.modbus;
 14 
 15 import java.util.Arrays;
 16 
 17 import com.serotonin.io.serial.SerialParameters;
 18 import com.serotonin.modbus4j.ModbusFactory;
 19 import com.serotonin.modbus4j.ModbusMaster;
 20 import com.serotonin.modbus4j.exception.ModbusInitException;
 21 import com.serotonin.modbus4j.exception.ModbusTransportException;
 22 import com.serotonin.modbus4j.msg.ReadDiscreteInputsRequest;
 23 import com.serotonin.modbus4j.msg.ReadDiscreteInputsResponse;
 24 import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest;
 25 import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;
 26 import com.serotonin.modbus4j.msg.WriteRegistersRequest;
 27 import com.serotonin.modbus4j.msg.WriteRegistersResponse;
 28 
 29 /**
 30  * 通過串口解析MODBUS協議
 31  * @author cl2
 32  *
 33  */
 34 public class TestModbusDemo {
 35     //設定MODBUS網絡上從站地址
 36     private final static int SLAVE_ADDRESS = 1;
 37     // 串行波特率
 38     private final static int BAUD_RATE = 9600;
 39 
 40     public static void main(String[] args) {
 41         SerialParameters serialParameters = new SerialParameters();
 42         // 設定MODBUS通訊的串行口
 43         serialParameters.setCommPortId("COM3");
 44         // 設定成無奇偶校驗
 45         serialParameters.setParity(0);
 46         // 設定成數據位是8位
 47         serialParameters.setDataBits(8);
 48         // 設定為1個停止位
 49         serialParameters.setStopBits(1);
 50         // 設定端口名稱
 51         serialParameters.setPortOwnerName("Numb nuts");
 52         // 設定端口波特率
 53         serialParameters.setBaudRate(BAUD_RATE);
 54 
 55         // 創建ModbusFactory工廠實例
 56         ModbusFactory modbusFactory = new ModbusFactory();
 57         // 創建ModbusMaster實例
 58         ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);
 59 
 60         // 初始化
 61         try {
 62             master.init();
 63             readHoldingRegistersTest(master,SLAVE_ADDRESS,0,100);
 64 
 65         } catch (ModbusInitException e) {
 66             e.printStackTrace();
 67         } finally {
 68             master.destroy();
 69         }
 70         
 71     }
 72     
 73     /**
 74     * 讀開關量型的輸入信號
 75     * @param master 主站
 76     * @param slaveId 從站地址
 77     * @param start 起始偏移量
 78     * @param len 待讀的開關量的個數
 79     */
 80     private static void readDiscreteInputTest(ModbusMaster master, int slaveId, int start, int len) {
 81     try {
 82         ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, start, len);
 83         ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request);
 84         if (response.isException())
 85             System.out.println("Exception response: message=" + response.getExceptionMessage());
 86         else
 87             System.out.println(Arrays.toString(response.getBooleanData()));
 88         }
 89         catch (ModbusTransportException e) {
 90             e.printStackTrace();
 91         }
 92     }
 93 
 94     
 95     
 96     /**
 97      * 讀保持寄存器上的內容
 98      * @param master 主站
 99      * @param slaveId 從站地址
100      * @param start 起始地址的偏移量
101      * @param len 待讀寄存器的個數
102      */
103     private static void readHoldingRegistersTest(ModbusMaster master,
104             int slaveId, int start, int len) {
105         try {
106             ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(
107                     slaveId, start, len);
108             ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master
109                     .send(request);
110             if (response.isException()) {
111                 System.out.println("Exception response: message="
112                         + response.getExceptionMessage());
113             } else {
114                 System.out.println(Arrays.toString(response.getShortData()));
115                 short[] list = response.getShortData();
116                 for(int i = 0; i < list.length; i++){
117                     System.out.print(list[i] + " ");
118                 }
119             }
120         } catch (ModbusTransportException e) {
121             e.printStackTrace();
122         }
123     }
124     
125     
126     
127      /**
128      * 批量寫數據到保持寄存器
129      * @param master 主站
130      * @param slaveId 從站地址
131      * @param start 起始地址的偏移量
132      * @param values 待寫數據
133      */
134     public static void writeRegistersTest(ModbusMaster master, int slaveId, int start, short[] values) {
135         try {
136             WriteRegistersRequest request = new WriteRegistersRequest(slaveId, start, values);
137             WriteRegistersResponse response = (WriteRegistersResponse) master.send(request);
138             if (response.isException()){
139                 System.out.println("Exception response: message=" + response.getExceptionMessage());
140             }
141             else {
142                 System.out.println("Success");
143             }
144         }
145         catch (ModbusTransportException e) {
146             e.printStackTrace();
147         }
148     }
149 }

 


免責聲明!

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



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