jiazx0107@163.com
2023-08-24 af5cd94403e6b594c5bccca0fef3a4c6d79af274
更新MODBUS-TCP协议 4
已添加2个文件
已修改1个文件
465 ■■■■■ 文件已修改
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusTest.java 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusTest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,234 @@
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});
    }
}
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil2.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,189 @@
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();
    }
}
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
@@ -14,7 +14,7 @@
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;
@@ -43,8 +43,6 @@
    private HDeviceModbusService deviceModbusService;
    @Resource
    private AnalysisService analysisService;
    @Resource
    private ModbusUtil modbusUtil;
    @Override
@@ -89,8 +87,7 @@
                    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());
@@ -180,8 +177,9 @@
    }
    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);
        }
    }
@@ -200,13 +198,10 @@
            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) {
@@ -223,14 +218,9 @@
                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);
@@ -247,7 +237,7 @@
                modbusTcpLink.setAddrExe(this.getAddrExe(modbusTcp.getDeviceModbus().getOpenEnd()));
                doReadExe(modbusTcpLink);
                doReadStatus(modbusTcpLink);
            }
        } catch (Exception e) {
@@ -266,17 +256,25 @@
     * @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());
        }
    }