¶Ô±ÈÐÂÎļþ |
| | |
| | | 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<Boolean> 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<Boolean> 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<Number> 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<Number> 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}); |
| | | |
| | | } |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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.*; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.HashMap; |
| | | |
| | | /** |
| | | * @Desc: å·¥å
·ç±» |
| | | * @author: Andy |
| | | * @update-time: 2023/8/11 |
| | | */ |
| | | @Slf4j |
| | | public class ModbusUtil2 { |
| | | |
| | | //仿ºé»è®¤å¼ |
| | | private static Integer slaveId = 1; |
| | | |
| | | private static HashMap<String, ModbusMaster> masterMap = new HashMap<>(); |
| | | |
| | | /** |
| | | * å·¥å |
| | | */ |
| | | static ModbusFactory modbusFactory; |
| | | //static ModbusMaster modbusMaster; |
| | | |
| | | static { |
| | | if (modbusFactory == null) { |
| | | modbusFactory = new ModbusFactory(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åmaster |
| | | * |
| | | * @return |
| | | */ |
| | | public static ModbusMaster getMaster(String ip, int port) throws ModbusInitException { |
| | | String key = ip; |
| | | ModbusMaster modbusMaster = masterMap.get(key); |
| | | if (modbusMaster == null || !modbusMaster.isConnected()) { |
| | | IpParameters ipParameters = new IpParameters(); |
| | | ipParameters.setHost(ip); |
| | | ipParameters.setPort(port); |
| | | modbusMaster = modbusFactory.createTcpMaster(ipParameters, true); |
| | | modbusMaster.init(); |
| | | masterMap.put(key, modbusMaster); |
| | | return modbusMaster; |
| | | } |
| | | return modbusMaster; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 读å线åå¼å
³ç¶ææ°æ® 0x01 |
| | | * |
| | | * @param offset |
| | | * @return |
| | | * @throws ModbusInitException |
| | | * @throws ModbusTransportException |
| | | * @throws ErrorResponseException |
| | | */ |
| | | public static Boolean readCoilStatus(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException { |
| | | BaseLocator<Boolean> coilStatus = BaseLocator.coilStatus(slaveId, offset); |
| | | Boolean res = getMaster(ip, port).getValue(coilStatus); |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 读离æ£è¾å
¥å¯åå¨ç¶ææ°æ® 0x02 |
| | | * |
| | | * @param offset |
| | | * @return |
| | | * @throws ModbusInitException |
| | | * @throws ModbusTransportException |
| | | * @throws ErrorResponseException |
| | | */ |
| | | public static Boolean readInputStatus(String ip, int port, int offset) throws ModbusInitException, ModbusTransportException, ErrorResponseException { |
| | | BaseLocator<Boolean> inputStatus = BaseLocator.inputStatus(slaveId, offset); |
| | | Boolean res = getMaster(ip, port).getValue(inputStatus); |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * è¯»ä¿æå¯å卿°æ® 0x03 |
| | | * |
| | | * @param offset |
| | | * @param dataType |
| | | * @return |
| | | * @throws ModbusInitException |
| | | * @throws ModbusTransportException |
| | | * @throws ErrorResponseException |
| | | */ |
| | | public static Number readHoldingRegister(String ip, int port, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException { |
| | | BaseLocator<Number> holdingRegister = BaseLocator.holdingRegister(slaveId, offset, dataType); |
| | | Number value = getMaster(ip, port).getValue(holdingRegister); |
| | | return value; |
| | | } |
| | | |
| | | /** |
| | | * 读è¾å
¥å¯å卿°æ® 0x04 |
| | | * |
| | | * @param offset |
| | | * @param dataType |
| | | * @return |
| | | * @throws ModbusInitException |
| | | * @throws ModbusTransportException |
| | | * @throws ErrorResponseException |
| | | */ |
| | | public static Number readInputRegister(String ip, int port, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException { |
| | | BaseLocator<Number> inputRegister = BaseLocator.inputRegister(slaveId, offset, dataType); |
| | | Number value = getMaster(ip, port).getValue(inputRegister); |
| | | return value; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * å线åå¼å
³ç¶ææ°æ® 0x05 |
| | | * |
| | | * @param offset |
| | | * @param status |
| | | * @return |
| | | * @throws ModbusTransportException |
| | | * @throws ModbusInitException |
| | | */ |
| | | public static Boolean writeCoilStatus(String ip, int port, int offset, boolean status) throws ModbusTransportException, ModbusInitException { |
| | | boolean coilValue = status; |
| | | WriteCoilRequest coilRequest = new WriteCoilRequest(slaveId, offset, coilValue); |
| | | WriteCoilResponse coilResponse = (WriteCoilResponse) getMaster(ip, port).send(coilRequest); |
| | | return !coilResponse.isException(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * ååä¸ªä¿æå¯å卿°æ® 0x06 |
| | | * |
| | | * @param offset |
| | | * @param value |
| | | * @return |
| | | * @throws ModbusTransportException |
| | | * @throws ModbusInitException |
| | | */ |
| | | public static Boolean writeRegister(String ip, int port, int offset, int value) throws ModbusTransportException, ModbusInitException { |
| | | WriteRegisterRequest registerRequest = new WriteRegisterRequest(slaveId, offset, value); |
| | | WriteRegisterResponse registerResponse = (WriteRegisterResponse) getMaster(ip, port).send(registerRequest); |
| | | return !registerResponse.isException(); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * å线åå¼å
³ç¶ææ°æ®ãå¤ã 0x0f |
| | | * |
| | | * @param offset |
| | | * @param booleans |
| | | * @return |
| | | * @throws ModbusTransportException |
| | | * @throws ModbusInitException |
| | | */ |
| | | public static Boolean writeCoils(String ip, int port, int offset, boolean[] booleans) throws ModbusTransportException, ModbusInitException { |
| | | WriteCoilsRequest writeCoils = new WriteCoilsRequest(slaveId, offset, booleans); |
| | | WriteCoilsResponse coilsResponse = (WriteCoilsResponse) getMaster(ip, port).send(writeCoils); |
| | | return !coilsResponse.isException(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * åä¿åå¯å卿°æ®ãå¤ã 0x10 |
| | | * |
| | | * @param offset |
| | | * @param nums |
| | | * @return |
| | | * @throws ModbusTransportException |
| | | * @throws ModbusInitException |
| | | */ |
| | | public static Boolean writeRegisters(String ip, int port, int offset, short[] nums) throws ModbusTransportException, ModbusInitException { |
| | | WriteRegistersRequest writeRegisters = new WriteRegistersRequest(slaveId, offset, nums); |
| | | WriteRegistersResponse registersResponse = (WriteRegistersResponse) getMaster(ip, port).send(writeRegisters); |
| | | return !registersResponse.isException(); |
| | | } |
| | | } |
| | |
| | | import com.ld.igds.modbus.service.HDeviceModbusService; |
| | | import com.ld.igds.models.Device; |
| | | import com.ld.igds.models.DeviceModbus; |
| | | import com.ld.igds.protocol.modbus.ModbusUtil; |
| | | import com.ld.igds.protocol.modbus.ModbusUtil2; |
| | | import com.ld.igds.protocol.modbus.ServerUtil; |
| | | import com.ld.igds.protocol.modbus.data.ModbusTcp; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | private HDeviceModbusService deviceModbusService; |
| | | @Resource |
| | | private AnalysisService analysisService; |
| | | @Resource |
| | | private ModbusUtil modbusUtil; |
| | | |
| | | |
| | | @Override |
| | |
| | | temp = modbusTcp.getDeviceModbus().getOpen(); |
| | | } |
| | | |
| | | |
| | | if (StringUtils.isEmpty(exeDevice.getLink())) { |
| | | if (StringUtils.isBlank(exeDevice.getLink()) || "null".equals(exeDevice.getLink())) { |
| | | //æ ¹æ®è®¾å¤ç®æ ç¶æï¼è°ç¨MODBUSæ§è¡ |
| | | modbusTcp.setAddrExe(this.getAddrExe(temp)); |
| | | doWriteExe(modbusTcp, exeDevice.getTargetStatus()); |
| | |
| | | } |
| | | |
| | | private void doWriteExe(ModbusTcp modbusTcp, String targetStatus) throws Exception { |
| | | boolean exeResult = modbusUtil.writeValue05(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true); |
| | | boolean exeResult = ModbusUtil2.writeCoilStatus(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), true); |
| | | if (exeResult) { |
| | | log.debug("--------åå
¥å¼---{}-{}-{}", modbusTcp.getSerId(), modbusTcp.getDeviceCode(), targetStatus); |
| | | ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), targetStatus); |
| | | } |
| | | } |
| | |
| | | if (null == list || list.isEmpty()) { |
| | | return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "æªè·åå°è®¾å¤å表信æ¯"); |
| | | } |
| | | |
| | | DeviceModbus deviceModbus; |
| | | ModbusTcp modbusTcp; |
| | | ModbusTcp modbusTcpLink; |
| | | int i = 1; |
| | | for (Device device : list) { |
| | | |
| | | deviceModbus = deviceModbusService.getCacheDeviceModbus(request.getCompanyId(), device.getPassCode() + ""); |
| | | |
| | | if (null == deviceModbus) { |
| | |
| | | modbusTcp.setSerId(device.getSerId()); |
| | | modbusTcp.setCompanyId(device.getCompanyId()); |
| | | |
| | | // modbusTcp.setAddrExe(this.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd())); |
| | | doReadStatus(modbusTcp); |
| | | |
| | | modbusTcp.setAddrExe(1024); |
| | | doReadExe(modbusTcp); |
| | | |
| | | if (i == 1) break; |
| | | |
| | | if (StringUtils.isEmpty(device.getLink())) continue; |
| | | if (StringUtils.isBlank(device.getLink()) || "null".equals(device.getLink())) continue; |
| | | |
| | | Thread.sleep(300); |
| | | |
| | |
| | | |
| | | modbusTcpLink.setAddrExe(this.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd())); |
| | | |
| | | doReadExe(modbusTcpLink); |
| | | doReadStatus(modbusTcpLink); |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | |
| | | * @param modbusTcp |
| | | * @throws Exception |
| | | */ |
| | | private void doReadExe(ModbusTcp modbusTcp) throws Exception { |
| | | private void doReadStatus(ModbusTcp modbusTcp) throws Exception { |
| | | |
| | | if (Constant.YN_N.equals(modbusTcp.getDeviceModbus().getOpen())) return; |
| | | |
| | | boolean[] result = modbusUtil.readStatus02(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrExe(), 2); |
| | | log.debug("---------读åç¶æ------{}--{}", modbusTcp.getDeviceCode(), result.toString()); |
| | | int addrExe = getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd()); |
| | | |
| | | if (result[0]) { |
| | | boolean result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe); |
| | | log.debug("---------读å¼å°ä½ç¶æ------{}-{}-{}", modbusTcp.getDeviceCode(), addrExe, result); |
| | | |
| | | if (result) { |
| | | ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), DeviceStatus.OPEN.getCode()); |
| | | } |
| | | if (result[1]) { |
| | | |
| | | |
| | | addrExe = getAddrExe(modbusTcp.getDeviceModbus().getCloseEnd()); |
| | | result = ModbusUtil2.readInputStatus(modbusTcp.getIp(), modbusTcp.getPort(), addrExe); |
| | | log.debug("---------读å
³å°ä½ç¶æ------{}-{}-{}", modbusTcp.getDeviceCode(), addrExe, result); |
| | | |
| | | if (result) { |
| | | ServerUtil.add2StatusMap(modbusTcp.getCompanyId(), modbusTcp.getSerId(), modbusTcp.getDeviceCode(), DeviceStatus.CLOSE.getCode()); |
| | | } |
| | | } |