package com.ld.igds.protocol.modbus; import com.serotonin.modbus4j.ModbusFactory; import com.serotonin.modbus4j.ModbusMaster; 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.*; /** * Modbus 工具类 */ public class ModbusTest { /** * 工厂 */ static ModbusFactory modbusFactory; static ModbusMaster modbusMaster; static { if (modbusFactory == null) { modbusFactory = new ModbusFactory(); } } /** * 获取master * * @return */ public static ModbusMaster getMaster() throws ModbusInitException { if (modbusMaster == null) { IpParameters ipParameters = new IpParameters(); ipParameters.setHost("127.0.0.1"); ipParameters.setPort(502); modbusMaster = modbusFactory.createTcpMaster(ipParameters, true); modbusMaster.init(); return modbusMaster; } return modbusMaster; } /** * 读取线圈开关状态数据 0x01 * * @param slaveId * @param offset * @return * @throws ModbusInitException * @throws ModbusTransportException * @throws ErrorResponseException */ public static Boolean readCoilStatus(int slaveId, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException { BaseLocator coilStatus = BaseLocator.coilStatus(slaveId, offset); Boolean res = getMaster().getValue(coilStatus); return res; } /** * 读离散输入寄存器状态数据 0x02 * * @param slaveId * @param offset * @return * @throws ModbusInitException * @throws ModbusTransportException * @throws ErrorResponseException */ public static Boolean inputStatus(int slaveId, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException { BaseLocator inputStatus = BaseLocator.inputStatus(slaveId, offset); Boolean res = getMaster().getValue(inputStatus); return res; } /** * 读保持寄存器数据 0x03 * * @param slaveId * @param offset * @param dataType * @return * @throws ModbusInitException * @throws ModbusTransportException * @throws ErrorResponseException */ public static Number holdingRegister(int slaveId, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException { BaseLocator holdingRegister = BaseLocator.holdingRegister(slaveId, offset, dataType); Number value = getMaster().getValue(holdingRegister); return value; } /** * 读输入寄存器数据 0x04 * * @param slaveId * @param offset * @param dataType * @return * @throws ModbusInitException * @throws ModbusTransportException * @throws ErrorResponseException */ public static Number inputRegister(int slaveId, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException { BaseLocator inputRegister = BaseLocator.inputRegister(slaveId, offset, dataType); Number value = getMaster().getValue(inputRegister); return value; } /** * 写线圈开关状态数据 0x05 * * @param slaveId * @param offset * @param status * @return * @throws ModbusTransportException * @throws ModbusInitException */ public static Boolean writeCoilStatus(int slaveId, int offset, boolean status) throws ModbusTransportException, ModbusInitException { boolean coilValue = status; WriteCoilRequest coilRequest = new WriteCoilRequest(slaveId, offset, coilValue); WriteCoilResponse coilResponse = (WriteCoilResponse) getMaster().send(coilRequest); return !coilResponse.isException(); } /** * 写单个保持寄存器数据 0x06 * * @param slaveId * @param offset * @param vlaue * @return * @throws ModbusTransportException * @throws ModbusInitException */ public static Boolean writeRegister(int slaveId, int offset, int vlaue) throws ModbusTransportException, ModbusInitException { WriteRegisterRequest registerRequest = new WriteRegisterRequest(slaveId, offset, vlaue); WriteRegisterResponse registerResponse = (WriteRegisterResponse) getMaster().send(registerRequest); return !registerResponse.isException(); } /** * 写线圈开关状态数据【多】 0x0f * * @param slaveId * @param offset * @param booleans * @return * @throws ModbusTransportException * @throws ModbusInitException */ public static Boolean writeCoils(int slaveId, int offset, boolean[] booleans) throws ModbusTransportException, ModbusInitException { WriteCoilsRequest writeCoils = new WriteCoilsRequest(slaveId, offset, booleans); WriteCoilsResponse coilsResponse = (WriteCoilsResponse) getMaster().send(writeCoils); return !coilsResponse.isException(); } /** * 写保存寄存器数据【多】 0x10 * * @param slaveId * @param offset * @param nums * @return * @throws ModbusTransportException * @throws ModbusInitException */ public static Boolean writeRegisters(int slaveId, int offset, short[] nums) throws ModbusTransportException, ModbusInitException { WriteRegistersRequest writeRegisters = new WriteRegistersRequest(slaveId, offset, nums); WriteRegistersResponse registersResponse = (WriteRegistersResponse) getMaster().send(writeRegisters); return !registersResponse.isException(); } public static void main(String[] args) throws ModbusInitException, ModbusTransportException, ErrorResponseException { // 01测试 Boolean v0001 = readCoilStatus(1, 2148); System.out.println("get 2148 :" + v0001); // 03测试 // Number v0001 = holdingRegister(136, 3, DataType.TWO_BYTE_INT_SIGNED); // Number v0003 = holdingRegister(1, 2, DataType.TWO_BYTE_INT_SIGNED); // Number v0009 = holdingRegister(1, 8, DataType.TWO_BYTE_INT_SIGNED); // System.out.println("get v0001 result:" + v0001); // System.out.println("get v0003 result:" + v0003); // System.out.println("get v0009 result:" + v0009); // 04测试 // Number v0001 = inputRegister(136, 0, DataType.TWO_BYTE_INT_SIGNED); // Number v0003 = inputRegister(136, 2, DataType.TWO_BYTE_INT_SIGNED); // Number v0009 = inputRegister(136, 8, DataType.TWO_BYTE_INT_SIGNED); // System.out.println("get v0001 result:" + v0001); // System.out.println("get v0003 result:" + v0003); // System.out.println("get v0009 result:" + v0009); // 05测试 // Boolean v0001 = writeCoilStatus(1, 0, true); // Boolean v0002 = writeCoilStatus(1, 1, false); // Boolean v0007 = writeCoilStatus(1, 6, true); // System.out.println("update v0001 status result:" + v0001); // System.out.println("update v0002 status result:" + v0002); // System.out.println("update v0007 status result:" + v0007); // 06测试 // Boolean v0001 = writeRegister(136, 0, 98); // Boolean v0002 = writeRegister(136, 1, 0); // Boolean v0007 = writeRegister(136, 6, 100); // System.out.println("update v0001 status result:" + v0001); // System.out.println("update v0002 status result:" + v0002); // System.out.println("update v0007 status result:" + v0007); // 0f测试 //Boolean res1 = writeCoils(1, 1, new boolean[]{true, true, false, true}); // 10测试 //Boolean res2 = writeRegisters(136, 7, new short[]{1, 2, 3}); //Boolean res3 = writeRegisters(136, 7, new short[]{991, 778, 25, 0}); } }