modbus协议下串口连接的数据获取
前段时间公司要求与物联对接,将物理设备传感器获取的信息抓取出来发送到mq,以便其他需要的人订阅处理。为了加强印象,这里记录下数据的抓取。
特殊jar包准备(上传图片无响应,这里直接贴名字了,直接度娘即可) jamod.jar modbus4j.jar
一、串口连接下:
1 public class Serial { 2 3 /** 4 * 建立串口连接 5 * @param portChoice 6 * @param stopbitChoice 7 * @param parityChoice 8 * @param beginbitChoice 9 * @param baudChoice 10 * @return 11 * @throws ModbusInitException 12 */ 13 public static ModbusMaster creatConnetion(String portChoice, String stopbitChoice, String parityChoice, 14 String beginbitChoice, String baudChoice) throws ModbusInitException { 15 SerialParameters serialParameters = new SerialParameters(); 16 serialParameters.setCommPortId(portChoice);// 设置串口号 17 serialParameters.setStopBits(Integer.parseInt(stopbitChoice)); // 设置停止位 18 serialParameters.setParity(0); // 设置奇偶校验为无 19 serialParameters.setDataBits(Integer.parseInt(beginbitChoice)); // 设置数据位 20 serialParameters.setBaudRate(Integer.parseInt(baudChoice)); // 设置串口波特率 21 serialParameters.setPortOwnerName("one"); 22 ModbusFactory modbusFactory = new ModbusFactory(); 23 ModbusMaster modbusMaster = modbusFactory.createRtuMaster(serialParameters); 24 modbusMaster.init(); 25 return modbusMaster; 26 } 27 28 /** 29 * 中断连接 30 * @param modbusMaster 31 */ 32 public static void interruptConnection(ModbusMaster modbusMaster) { 33 if (modbusMaster != null) { 34 modbusMaster.destroy(); 35 } 36 } 37 38 /** 39 * 01 Read Coil(0x) 40 * @param modbusMaster 41 * @param responseText 42 * @param sweepSpacingText 43 * @param equipmentIDText 44 * @param addressText 45 * @param amountText 46 * @return 47 */ 48 public static String readCoil(ModbusMaster modbusMaster, String responseText, String sweepSpacingText, 49 String equipmentIDText, String addressText, String amountText) { 50 try { 51 synchronized (addressText) { 52 ReadCoilsRequest readCoilsRequest = new ReadCoilsRequest(Integer.parseInt(equipmentIDText), 53 Integer.parseInt(addressText), Integer.parseInt(amountText)); 54 ReadCoilsResponse readCoilsResponse = (ReadCoilsResponse) modbusMaster.send(readCoilsRequest); 55 String result = readCoilsResponse.getBooleanData().toString(); 56 return result; 57 } 58 } catch (NumberFormatException e) { 59 e.printStackTrace(); 60 } catch (ModbusTransportException e) { 61 e.printStackTrace(); 62 } 63 return null; 64 } 65 66 /** 67 * 02 Read Discrete Inputs(1x) 68 * @param modbusMaster 69 * @param responseText 70 * @param sweepSpacingText 71 * @param equipmentIDText 72 * @param addressText 73 * @param amountText 74 * @return 75 * @throws NumberFormatException 76 * @throws ModbusTransportException 77 */ 78 public static String readDiscreteInput(ModbusMaster modbusMaster, String responseText, String sweepSpacingText, 79 String equipmentIDText, String addressText, String amountText) 80 throws NumberFormatException, ModbusTransportException { 81 synchronized (addressText){ 82 ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(Integer.parseInt(equipmentIDText), 83 Integer.parseInt(addressText), Integer.parseInt(amountText)); 84 ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) modbusMaster.send(request); 85 short[] dataShort = null; 86 if (!response.isException()) { 87 dataShort = response.getShortData(); 88 for (short s : dataShort) { 89 System.out.println("收到数据:" + s); 90 } 91 } 92 StringBuffer result = new StringBuffer(); 93 for (int i = 0; i < dataShort.length; i++) { 94 result.append(dataShort[i]); 95 } 96 String newStr = result.toString(); 97 return newStr; 98 } 99 } 100 /** 101 * 03 Read Holding Registers(4x) 102 * @param modbusMaster 103 * @param responseText 104 * @param sweepSpacingText 105 * @param equipmentIDText 106 * @param addressText 107 * @param amountText 108 * @return 109 * @throws NumberFormatException 110 * @throws ModbusTransportException 111 * @throws ModbusInitException 112 */ 113 public static String ReadHoldingRegistersRequest(ModbusMaster modbusMaster, String responseText, 114 String sweepSpacingText, String equipmentIDText, String addressText, String amountText) 115 throws NumberFormatException, ModbusTransportException, ModbusInitException { 116 synchronized (addressText){ 117 ReadHoldingRegistersRequest holdingRegistersRequest = new ReadHoldingRegistersRequest( 118 Integer.parseInt(equipmentIDText), Integer.parseInt(addressText), Integer.parseInt(amountText)); 119 ReadHoldingRegistersResponse holdingRegistersResponse = (ReadHoldingRegistersResponse) modbusMaster 120 .send(holdingRegistersRequest); 121 short[] dataShort = null; 122 if (!holdingRegistersResponse.isException()) { 123 dataShort = holdingRegistersResponse.getShortData(); 124 for (short s : dataShort) { 125 System.out.println("收到数据:" + s); 126 } 127 } 128 // modbusMaster.destroy(); 129 StringBuffer result = new StringBuffer(); 130 for (int i = 0; i < dataShort.length; i++) { 131 result.append(dataShort[i]); 132 } 133 String newStr = result.toString(); 134 return newStr; 135 } 136 } 137 138 /** 139 * 04 Read Input Registers(3x) 140 * @param modbusMaster 141 * @param responseText 142 * @param sweepSpacingText 143 * @param equipmentIDText 144 * @param addressText 145 * @param amountText 146 * @return 147 * @throws NumberFormatException 148 * @throws ModbusTransportException 149 */ 150 public static String readInputRegisters(ModbusMaster modbusMaster, String responseText, String sweepSpacingText, 151 String equipmentIDText, String addressText, String amountText) 152 throws NumberFormatException, ModbusTransportException { 153 synchronized (addressText){ 154 ReadInputRegistersRequest readInputRegistersRequest = new ReadInputRegistersRequest( 155 Integer.parseInt(equipmentIDText), Integer.parseInt(addressText), Integer.parseInt(amountText)); 156 ReadInputRegistersResponse readInputRegistersResponse = (ReadInputRegistersResponse) modbusMaster 157 .send(readInputRegistersRequest); 158 short[] dataShort = null; 159 if (!readInputRegistersResponse.isException()) { 160 dataShort = readInputRegistersResponse.getShortData(); 161 for (short s : dataShort) { 162 System.out.println("收到数据:" + s); 163 } 164 } 165 // modbusMaster.destroy(); 166 StringBuffer result = new StringBuffer(); 167 for (int i = 0; i < dataShort.length; i++) { 168 result.append(dataShort[i]); 169 } 170 String newStr = result.toString(); 171 return newStr; 172 } 173 174 }
测试一下:注意串口连接上后再测试,或下载modbus Slave模拟串口连接测试。
@Test public void testConnection(){ String ip = "localhost"; int port = 502; TCPMasterConnection tcp = ModbusTcp.connectionTCP(ip, String.valueOf(port),"2000"); System.out.println("连接是否存在:"+tcp.isConnected()); //ModbusTcp.closeConnectionTcp(tcp); System.out.println("连接是否存在:"+tcp.isConnected()); String address = "0"; String slaveId = "1"; String amountTextResult = "10"; ModbusTcp.readCoilStatusTCP(address, slaveId, tcp, amountTextResult); }