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);
    }

 

posted @ 2017-08-08 10:29  lensener  阅读(236)  评论(0)    收藏  举报