package com.ruoyi.fuzhou.utils; import com.serotonin.modbus4j.BatchRead; import com.serotonin.modbus4j.BatchResults; import com.serotonin.modbus4j.ModbusFactory; import com.serotonin.modbus4j.ModbusMaster; import com.serotonin.modbus4j.code.DataType; import com.serotonin.modbus4j.exception.ErrorResponseException; import com.serotonin.modbus4j.exception.ModbusInitException; import com.serotonin.modbus4j.exception.ModbusTransportException; import com.serotonin.modbus4j.ip.IpParameters; import com.serotonin.modbus4j.locator.BaseLocator; import com.serotonin.modbus4j.msg.ModbusResponse; import com.serotonin.modbus4j.msg.ReadCoilsRequest; import com.serotonin.modbus4j.msg.ReadCoilsResponse; import com.serotonin.modbus4j.msg.WriteRegistersRequest; /** * modbus通讯工具类,采用modbus4j实现 * * @author zhangyy */ public class ModbusReadTcpUtils { /** * 工厂。 */ static ModbusFactory modbusFactory; static { if (modbusFactory == null) { modbusFactory = new ModbusFactory(); } } /** * 获取master * * @return * @throws ModbusInitException */ public static ModbusMaster getTcpMaster(String ip, int port) throws ModbusInitException { IpParameters params = new IpParameters(); /** * 设置ip端口 */ params.setHost(ip); params.setPort(port); params.setEncapsulated(true); System.out.println(params.getHost() + ":" + params.getPort()); // TCP 协议 ModbusMaster master = modbusFactory.createTcpMaster(params, false); master.setTimeout(5000); master.setRetries(3); master.init(); return master; } /** * 读取[01 Coil Status 0x]类型 开关数据 * * @param slaveId slaveId * @param offset 位置 * @return 读取值 * @throws ModbusTransportException 异常 * @throws ErrorResponseException 异常 * @throws ModbusInitException 异常 */ public static Boolean readCoilStatus(String ip, int slaveId, int offset) throws ModbusTransportException, ErrorResponseException, ModbusInitException { BaseLocator loc = BaseLocator.coilStatus(slaveId, offset); Boolean value = getTcpMaster(ip, 502).getValue(loc); return value; } /** * 读取[02 Input Status 1x]类型 开关数据 * * @param slaveId * @param offset * @return * @throws ModbusTransportException * @throws ErrorResponseException * @throws ModbusInitException */ public static Boolean readInputStatus(String ip, int slaveId, int offset) throws ModbusTransportException, ErrorResponseException, ModbusInitException { BaseLocator loc = BaseLocator.inputStatus(slaveId, offset); Boolean value = getTcpMaster(ip, 502).getValue(loc); return value; } /** * 读取[03 Holding Register类型 2x]模拟量数据 * * @param ip ip * @param slaveId slave Id * @param offset 位置 * @param dataType 数据类型,来自com.serotonin.modbus4j.code.DataType * @return * @throws ModbusTransportException 异常 * @throws ErrorResponseException 异常 * @throws ModbusInitException 异常 */ public static Number readHoldingRegister(String ip, int slaveId, int offset, int dataType, int port) throws ModbusTransportException, ErrorResponseException, ModbusInitException { BaseLocator loc = BaseLocator.holdingRegister(slaveId, offset, dataType); Number value = getTcpMaster(ip, port).getValue(loc); return value; } public static Number readHoldingRegisterTest(String ip, int slaveId, int offset, int dataType, int port) throws ModbusTransportException, ErrorResponseException, ModbusInitException { BaseLocator locator = BaseLocator.createLocator(slaveId, 1, 4001, dataType, 8, 22); Object value1 = getTcpMaster(ip, port).getValue(locator); //Number value = (Number) getMaster().getValue(locator); return 1; } /** * 读取[04 Input Registers 3x]类型 模拟量数据 * * @param slaveId slaveId * @param offset 位置 * @param dataType 数据类型,来自com.serotonin.modbus4j.code.DataType * @return 返回结果 * @throws ModbusTransportException 异常 * @throws ErrorResponseException 异常 * @throws ModbusInitException 异常 */ public static Number readInputRegisters(String ip, int slaveId, int offset, int dataType, int port) throws ModbusTransportException, ErrorResponseException, ModbusInitException { // 04 Input Registers类型数据读取 BaseLocator loc = BaseLocator.inputRegister(slaveId, offset, dataType); Number value = getTcpMaster(ip, port).getValue(loc); return value; } /** * 批量读取使用方法 * * @throws ModbusTransportException * @throws ErrorResponseException * @throws ModbusInitException */ public static void batchRead(String ip, int port) throws ModbusTransportException, ErrorResponseException, ModbusInitException { BatchRead batch = new BatchRead(); batch.addLocator(0, BaseLocator.holdingRegister(1, 1535, DataType.FOUR_BYTE_FLOAT)); //连接 ModbusMaster master = getTcpMaster(ip, port); batch.setContiguousRequests(false); BatchResults results = master.send(batch); System.out.println("高压进线Uab电压采集:" + results.getValue(0)); } /** * 测试 * * @param args */ public static void main(String[] args) { try { //todo 单个读取 ModbusMaster master = getTcpMaster("192.168.0.7", 23); // 从机地址1,起始地址0,读取10个线圈 ReadCoilsRequest request = new ReadCoilsRequest(1, 1, 10); ReadCoilsResponse response = (ReadCoilsResponse) master.send(request); String s = response.toString(); System.out.println(s); master.destroy(); } catch (Exception e) { e.printStackTrace(); } } }