前言这是一个数据采集的项目属于XX数据消防的一个数据采集前面通过 modbus poll 读取过了现在用java 代码去读取需要注意的是这种方法封装好的我们后来根据netty 自己去解析数据因为其本质就是 二进制数据的解析了解完modbus 就了解了如何处理但是呢这个笔记我之前很早就记录了以后估计也用不上了…留着给用到的人做一点参考吧工具类importcom.serotonin.modbus4j.BatchRead;importcom.serotonin.modbus4j.BatchResults;importcom.serotonin.modbus4j.ModbusFactory;importcom.serotonin.modbus4j.ModbusMaster;importcom.serotonin.modbus4j.code.DataType;importcom.serotonin.modbus4j.exception.ErrorResponseException;importcom.serotonin.modbus4j.exception.ModbusInitException;importcom.serotonin.modbus4j.exception.ModbusTransportException;importcom.serotonin.modbus4j.ip.IpParameters;importcom.serotonin.modbus4j.locator.BaseLocator;/** * Modbus TCP协议读取数据 * */publicclassModbusReadUtil{/** * 单列工厂。 */staticModbusFactorymodbusFactory;static{if(modbusFactorynull){modbusFactorynewModbusFactory();}}/** * 获取master * * param host IP地址 * param port 端口号 * return * throws ModbusInitException */publicstaticModbusMastergetMaster(Stringhost,intport)throwsModbusInitException{try{IpParametersparamsnewIpParameters();params.setHost(host);params.setPort(port);ModbusMastermastermodbusFactory.createTcpMaster(params,false);// TCP 协议master.init();//master初始化returnmaster;}catch(Exceptione){e.printStackTrace();}returnnull;}/** * 批量读取使用寄存器数据 * * param master ModbusMaster对象 * param batchRead 批量读取集合 * throws ModbusTransportException * throws ErrorResponseException * throws ModbusInitException */publicstaticBatchResultsIntegerbatchRead(ModbusMastermaster,BatchReadIntegerbatchRead)throwsException{try{batchRead.setContiguousRequests(false);BatchResultsIntegerresultsmaster.send(batchRead);returnresults;}catch(Exceptione){e.printStackTrace();}returnnull;}//测试publicstaticvoidmain(String[]args){try{ModbusMastermastergetMaster(192.168.1.88,2001);BatchReadIntegerbatchnewBatchRead();batch.addLocator(0,BaseLocator.inputRegister(1,0,DataType.FOUR_BYTE_FLOAT));batch.addLocator(1,BaseLocator.inputRegister(1,2,DataType.FOUR_BYTE_FLOAT));batch.addLocator(2,BaseLocator.inputRegister(1,4,DataType.FOUR_BYTE_FLOAT));batch.addLocator(3,BaseLocator.inputRegister(1,6,DataType.FOUR_BYTE_FLOAT));batch.addLocator(4,BaseLocator.inputRegister(1,8,DataType.FOUR_BYTE_FLOAT));batch.addLocator(5,BaseLocator.inputRegister(1,10,DataType.FOUR_BYTE_FLOAT));BatchResultsIntegerbatchReadbatchRead(master,batch);System.out.println(batchRead.getValue(0));System.out.println(batchRead.getValue(1));System.out.println(batchRead.getValue(2));System.out.println(batchRead.getValue(3));System.out.println(batchRead.getValue(4));System.out.println(batchRead.getValue(5));}catch(Exceptione){e.printStackTrace();}}}工具类packagecom.zhuking.datacollection.common.utils;importcom.serotonin.modbus4j.BatchRead;importcom.serotonin.modbus4j.BatchResults;importcom.serotonin.modbus4j.ModbusFactory;importcom.serotonin.modbus4j.ModbusMaster;importcom.serotonin.modbus4j.code.DataType;importcom.serotonin.modbus4j.exception.ErrorResponseException;importcom.serotonin.modbus4j.exception.ModbusInitException;importcom.serotonin.modbus4j.exception.ModbusTransportException;importcom.serotonin.modbus4j.ip.IpParameters;importcom.serotonin.modbus4j.locator.BaseLocator;importcom.serotonin.modbus4j.msg.WriteCoilRequest;importcom.serotonin.modbus4j.msg.WriteCoilResponse;importcom.serotonin.modbus4j.msg.WriteCoilsRequest;importcom.serotonin.modbus4j.msg.WriteCoilsResponse;/** * modbus通讯工具类,采用modbus4j实现 * * website https://github.com/infiniteautomation/modbus4j */publicclassModbus4jUtils{/** * 工厂。 */staticModbusFactorymodbusFactory;static{if(modbusFactorynull){modbusFactorynewModbusFactory();}}/** * 获取master * * return * throws ModbusInitException */publicstaticModbusMastergetMaster(){IpParametersparamsnewIpParameters();params.setHost(192.168.1.88);// 指定IPparams.setPort(2001);// 指定端口// modbusFactory.createRtuMaster(wapper); //RTU 协议// modbusFactory.createUdpMaster(params);//UDP 协议// modbusFactory.createAsciiMaster(wrapper);//ASCII 协议ModbusMastermastermodbusFactory.createTcpMaster(params,false);// TCP 协议try{master.init();}catch(ModbusInitExceptione){e.printStackTrace();}returnmaster;}/** * 读取[01 Coil Status 0x]类型 开关数据 * * param slaveId slaveId * param offset 位置 * return 读取值 * throws ModbusTransportException * throws ErrorResponseException */publicstaticBooleanreadCoilStatus(intslaveId,intoffset)throwsModbusTransportException,ErrorResponseException{// 读取 功能码 01 Coil status0x 数据类型BaseLocatorBooleanlocBaseLocator.coilStatus(slaveId,offset);returngetMaster().getValue(loc);}/** * 往 功能码 01 Coil status0x 写数据 * * param slaveId * param writeOffset 位置 * param writeValue 值 * return * throws ModbusTransportException */publicbooleanwriteCoil(intslaveId,intwriteOffset,booleanwriteValue)throwsModbusTransportException{ModbusMastertcpMastergetMaster();WriteCoilRequestrequestnewWriteCoilRequest(slaveId,writeOffset,writeValue);WriteCoilResponseresponse(WriteCoilResponse)tcpMaster.send(request);return!response.isException();}/** * 往 功能码 01 Coil status0x 写数据 * * param slaveId * param startOffset 开始位 * param data 数组从开始位逐渐的将数组数据写入 例如开始为是 5传递的参数为 5 那就是从 5-10 的位置会被写入数据 * return * throws ModbusTransportException */publicstaticbooleanwriteCoils(intslaveId,intstartOffset,boolean[]data)throwsModbusTransportException{ModbusMastertcpMastergetMaster();WriteCoilsRequestrequestnewWriteCoilsRequest(slaveId,startOffset,data);WriteCoilsResponseresponse(WriteCoilsResponse)tcpMaster.send(request);return!response.isException();}/** * 读取[02 Input Status 1x]类型 开关数据 * * param slaveId * param offset * return * throws ModbusTransportException * throws ErrorResponseException */publicstaticBooleanreadInputStatus(intslaveId,intoffset)throwsModbusTransportException,ErrorResponseException{// 02 Input StatusBaseLocatorBooleanlocBaseLocator.inputStatus(slaveId,offset);BooleanvaluegetMaster().getValue(loc);returnvalue;}/** * 读取[03 Holding Register类型 2x]模拟量数据 * * param slaveId slave Id * param offset 位置 * param dataType 数据类型,来自com.serotonin.modbus4j.code.DataType * return * throws ModbusTransportException 异常 * throws ErrorResponseException 异常 */publicstaticNumberreadHoldingRegister(intslaveId,intoffset,intdataType)throwsModbusTransportException,ErrorResponseException{// 03 Holding Register类型数据读取BaseLocatorNumberlocBaseLocator.holdingRegister(slaveId,offset,dataType);NumbervaluegetMaster().getValue(loc);returnvalue;}/** * 读取[04 Input Registers 3x]类型 模拟量数据 * * param slaveId slaveId * param offset 位置 * param dataType 数据类型,来自com.serotonin.modbus4j.code.DataType * return 返回结果 * throws ModbusTransportException 异常 * throws ErrorResponseException 异常 */publicstaticNumberreadInputRegisters(intslaveId,intoffset,intdataType)throwsModbusTransportException,ErrorResponseException{// 04 Input Registers类型数据读取BaseLocatorNumberlocBaseLocator.inputRegister(slaveId,offset,dataType);NumbervaluegetMaster().getValue(loc);returnvalue;}/** * 批量读取使用方法 * * throws ModbusTransportException * throws ErrorResponseException */publicstaticvoidbatchRead()throwsModbusTransportException,ErrorResponseException{BatchReadIntegerbatchnewBatchRead();batch.addLocator(0,BaseLocator.holdingRegister(1,1,DataType.FOUR_BYTE_FLOAT));batch.addLocator(1,BaseLocator.inputStatus(1,0));ModbusMastermastergetMaster();batch.setContiguousRequests(false);BatchResultsIntegerresultsmaster.send(batch);System.out.println(results.getValue(0));System.out.println(results.getValue(1));}publicstaticvoidmain(String[]args)throwsModbusTransportException,ErrorResponseException{// 0 代表了 寄存器的位 1和2 的值// 2 代表了 寄存器位 2和2 的值NumbernumberreadInputRegisters(1,0,DataType.FOUR_BYTE_FLOAT);System.out.println(number.doubleValue());}/** * 批量读取使用寄存器数据 * * param master ModbusMaster对象 * param batchRead 批量读取集合 * throws ModbusTransportException * throws ErrorResponseException * throws ModbusInitException */publicstaticBatchResultsIntegerbatchRead(ModbusMastermaster,BatchReadIntegerbatchRead)throwsException{try{batchRead.setContiguousRequests(false);BatchResultsIntegerresultsmaster.send(batchRead);returnresults;}catch(Exceptione){e.printStackTrace();}returnnull;}}