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 }