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; /** * modbus通讯工具类,采用modbus4j实现 * * @author zhangyy */ public class ModbusReadUdpUtils { /** * 工厂。 */ static ModbusFactory modbusFactory; static { if (modbusFactory == null) { modbusFactory = new ModbusFactory(); } } /** * 获取master * * @return * @throws ModbusInitException */ public static ModbusMaster getUdpMaster(String ip) throws ModbusInitException { IpParameters params = new IpParameters(); /** * 设置ip端口 */ params.setHost(ip); params.setPort(502); /** * 设置协议 */ //UDP 协议 ModbusMaster master = modbusFactory.createUdpMaster(params); master.setTimeout(2000); 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 = getUdpMaster(ip).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 = getUdpMaster(ip).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) throws ModbusTransportException, ErrorResponseException, ModbusInitException { BaseLocator loc = BaseLocator.holdingRegister(slaveId, offset, dataType); Number value = getUdpMaster(ip).getValue(loc); return value; } public static Number readHoldingRegisterTest(String ip, int slaveId, int offset, int dataType) throws ModbusTransportException, ErrorResponseException, ModbusInitException { BaseLocator locator = BaseLocator.createLocator(slaveId, 1, 4001, dataType, 8, 22); Object value1 = getUdpMaster(ip).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) throws ModbusTransportException, ErrorResponseException, ModbusInitException { // 04 Input Registers类型数据读取 BaseLocator loc = BaseLocator.inputRegister(slaveId, offset, dataType); Number value = getUdpMaster(ip).getValue(loc); return value; } /** * 批量读取使用方法 * * @throws ModbusTransportException * @throws ErrorResponseException * @throws ModbusInitException */ public static void batchRead(String ip) throws ModbusTransportException, ErrorResponseException, ModbusInitException { BatchRead batch = new BatchRead(); batch.addLocator(0, BaseLocator.holdingRegister(1, 1535, DataType.FOUR_BYTE_FLOAT)); //连接 ModbusMaster master = getUdpMaster(ip); 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 单个读取 getUdpMaster("192.168.0.210"); //高压进线Ubc电压采集-四舍五入保留两位 Number number = readHoldingRegister("192.168.0.210", 1, 1587, DataType.FOUR_BYTE_FLOAT); System.out.println("高压进线Ubc电压采集=" + number.doubleValue()); } catch (Exception e) { e.printStackTrace(); } } }