From 12c3f4de5ce151b50e187066a3c105260523abb8 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期四, 30 四月 2026 10:04:56 +0800
Subject: [PATCH] 充电机代码提交

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java                 |   34 ++++++-
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java           |   63 ++++++++++++---
 zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java                            |    8 +
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/charge/ChargeTestController.java |    4 
 zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java                |   97 ++++++++++++++++++++----
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java        |    8 +-
 6 files changed, 169 insertions(+), 45 deletions(-)

diff --git a/zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java b/zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java
index 71474a7..07ef5fe 100644
--- a/zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java
+++ b/zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java
@@ -63,7 +63,13 @@
      * @return
      */
     int getChargeMode(ModbusTCPMaster client);
-
+    /**
+     * 鑾峰彇鍏呯數鏈篿d
+     *
+     * @param client
+     * @return
+     */
+    int getChargeId(ModbusTCPMaster client);
     /**
      * 鑾峰彇鍏呯數鏈虹姸鎬�
      * @param client
diff --git a/zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java b/zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java
index 678af15..4b2cad9 100644
--- a/zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java
+++ b/zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.ghgande.j2mod.modbus.ModbusException;
 import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
+import com.ghgande.j2mod.modbus.io.AbstractModbusTransport;
 import com.ghgande.j2mod.modbus.procimg.Register;
 import com.ghgande.j2mod.modbus.procimg.SimpleRegister;
 import com.ghgande.j2mod.modbus.util.BitVector;
@@ -19,7 +20,7 @@
 @Service
 @Primary
 @Slf4j
-public class AiPowerChargeServiceImpl implements ChargeCoreService {
+public  class AiPowerChargeServiceImpl implements ChargeCoreService {
 
     /**
      * 寮�濮嬪厖鐢�
@@ -28,12 +29,17 @@
      * @return
      */
     @Override
-    public boolean startCharging(ModbusTCPMaster client) {
+    public  boolean startCharging(ModbusTCPMaster client) {
         // AGV杞︽姤鍛婂埌浣� -> true
         try {
+            if (!client.isConnected()) {
+                client.connect();
+            }
             return client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), true);
-        } catch (ModbusException e) {
+        } catch (Exception e) {
             log.info("鍐欏叆寮�濮嬪厖鐢垫寚浠ゆ姤閿�:{} ", e.getMessage());
+        }finally {
+            //client.disconnect();
         }
         return false;
     }
@@ -47,9 +53,14 @@
     @Override
     public boolean stopCharging(ModbusTCPMaster client) {
         try {
+            if (!client.isConnected()) {
+                client.connect();
+            }
             return client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false);
-        } catch (ModbusException e) {
+        } catch (Exception e) {
             log.info("鍐欏叆鍋滄鍏呯數鎸囦护鎶ラ敊:{} ", e.getMessage());
+        }finally {
+            //client.disconnect();
         }
         return false;
     }
@@ -63,9 +74,14 @@
     @Override
     public boolean checkForwardRelayOnline(ModbusTCPMaster client) {
         try {
+            if (!client.isConnected()) {
+                client.connect();
+            }
             return client.readCoils(AiPowerChargerCoilEnum.FORWARD_RELAY_ONLINE.getAddr(), 1).getBit(0);
-        } catch (ModbusException e) {
+        } catch (Exception e) {
             log.info("璇诲彇鍦ㄧ嚎姝g户鐢靛櫒鐘舵�佹姤閿�:{} ", e.getMessage());
+        }finally {
+            //client.disconnect();
         }
         return false;
     }
@@ -79,9 +95,14 @@
     @Override
     public boolean checkBackwardRelayOffline(ModbusTCPMaster client) {
         try {
+            if (!client.isConnected()) {
+                client.connect();
+            }
             return client.readCoils(AiPowerChargerCoilEnum.BACKWARD_RELAY_OFFLINE.getAddr(), 1).getBit(0);
-        } catch (ModbusException e) {
+        } catch (Exception e) {
             log.info("璇诲彇绂荤嚎姝g户鐢靛櫒鐘舵�佹姤閿�:{} ", e.getMessage());
+        }finally {
+            //client.disconnect();
         }
         return false;
     }
@@ -95,9 +116,14 @@
     @Override
     public double getVoltage(ModbusTCPMaster client) {
         try {
+            if (!client.isConnected()) {
+               client.connect();
+            }
             return client.readMultipleRegisters(AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getAddr(), 1)[0].getValue() * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
-        } catch (ModbusException e) {
+        } catch (Exception e) {
             log.info("璇诲彇鍏呯數鐢靛帇鎶ラ敊:{} ", e.getMessage());
+        }finally {
+            //client.disconnect();
         }
         return 0;
     }
@@ -111,9 +137,14 @@
     @Override
     public double getCurrent(ModbusTCPMaster client) {
         try {
+            if (!client.isConnected()) {
+                client.connect();
+            }
             return client.readMultipleRegisters(AiPowerChargerRegisterEnum.CHARGE_CURRENT.getAddr(), 1)[0].getValue() * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
-        } catch (ModbusException e) {
+        } catch (Exception e) {
             log.info("璇诲彇鍏呯數鐢垫祦鎶ラ敊:{} ", e.getMessage());
+        }finally {
+            //client.disconnect();
         }
         return 0;
     }
@@ -127,9 +158,37 @@
     @Override
     public int getChargeMode(ModbusTCPMaster client) {
         try {
+            if (!client.isConnected()) {
+               client.connect();
+            }
             return client.readMultipleRegisters(AiPowerChargerRegisterEnum.CHARGE_MODE.getAddr(), 1)[0].getValue();
-        } catch (ModbusException e) {
+        } catch (Exception e) {
+            e.printStackTrace();
             log.info("璇诲彇鍏呯數妯″紡鎶ラ敊:{} ", e.getMessage());
+        }finally {
+            //client.disconnect();
+        }
+        return -1;
+    }
+
+    /**
+     * 鑾峰彇鍏呯數鏈虹紪鍙�
+     *
+     * @param client
+     * @return
+     */
+    @Override
+    public int getChargeId(ModbusTCPMaster client) {
+        try {
+            if (!client.isConnected()) {
+                client.connect();
+            }
+            return client.readMultipleRegisters(AiPowerChargerRegisterEnum.CHARGER_ID.getAddr(), 1)[0].getValue();
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("璇诲彇鍏呯數鏈虹紪鍙锋姤閿�:{} ", e.getMessage());
+        }finally {
+            //client.disconnect();
         }
         return -1;
     }
@@ -142,11 +201,15 @@
      */
     @Override
     public ChargerStatus getStatus(ModbusTCPMaster client) {
+
         ChargerStatus status = new ChargerStatus();
 
         // ---------- 鎵归噺璇诲彇绾垮湀锛堝湴鍧�100~115鍏�16涓級 ----------
         BitVector coils = null;
         try {
+            if (!client.isConnected()) {
+                client.connect();
+            }
             coils = client.readCoils(AiPowerChargerCoilEnum.WORK_STATUS.getAddr(), AiPowerChargerCoilEnum.values().length);
             for (int i = 0; i < coils.size(); i++) {
                 switch (i) {
@@ -202,12 +265,9 @@
                         break;
                 }
             }
-        } catch (ModbusException e) {
-            log.info("鎵归噺璇诲彇绾垮湀鎶ラ敊:{} ", e.getMessage());
-        }
 
-        // ---------- 鎵归噺璇诲彇淇濇寔瀵勫瓨鍣紙鍦板潃100~116鍏�17涓級 ----------
-        try {
+            // ---------- 鎵归噺璇诲彇淇濇寔瀵勫瓨鍣紙鍦板潃100~116鍏�17涓級 ----------
+
             Register[] registers = client.readMultipleRegisters(AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getAddr(), AiPowerChargerRegisterEnum.values().length);
             for (int i = 0; i < registers.length; i++) {
                 switch (i) {
@@ -266,8 +326,11 @@
                         break;
                 }
             }
-        } catch (ModbusException e) {
-           log.info("鎵归噺璇诲彇淇濇寔瀵勫瓨鍣ㄦ姤閿�:{} ", e.getMessage());
+        } catch (Exception e) {
+            log.info("鎵归噺璇诲彇绾垮湀鎶ラ敊:{} ", e.getMessage());
+            log.info("鎵归噺璇诲彇淇濇寔瀵勫瓨鍣ㄦ姤閿�:{} ", e.getMessage());
+        }finally {
+            //client.disconnect();
         }
 
         return status;
@@ -321,5 +384,7 @@
         }
         return true;
     }
+
+
 }
 
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/charge/ChargeTestController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/charge/ChargeTestController.java
index 3953dc3..b4b8e1e 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/charge/ChargeTestController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/charge/ChargeTestController.java
@@ -30,8 +30,8 @@
 
     @IntegrationAuth(name = NamespaceType.RCS_STA_QUERY)
     @GetMapping("/charge/{type}")
-    public R test(@PathVariable("type") Integer type){
-        ModbusTCPMaster modbusTCPMaster = chargeService.get("10");
+    public R test(@PathVariable("type") String type){
+        ModbusTCPMaster modbusTCPMaster = chargeService.get(type);
         ChargerStatus status = chargeCoreService.getStatus(modbusTCPMaster);
         return R.ok(status);
     }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
index c6da001..2b6de2f 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -133,7 +133,7 @@
 //                continue;
 //            }
             // 鍒よ鏄惁鍙互鑷姩鏂紑鍏呯數锛堝嵆鍏呯數杩囩▼涓笉鑳芥帴鍙椾换鍔★級锛岃烦杩�
-            if (!agvService.judgeAutoStopCharge(agvModel,agvDetail, agv)) {
+            if (!agvService.judgeAutoStopCharge(agvModel, agvDetail, agv)) {
                 continue;
             }
             // is charging ?
@@ -252,6 +252,7 @@
      * 璋冨害瀵规帴鍏呯數妗�
      * 鐘舵��1锛氬紑濮嬪厖鐢�
      * 鐘舵��2锛氬厖鐢典腑
+     * 鐘舵��3锛氫汉涓烘搷浣滀笅鍙戞柇寮�鍏呯數鎿嶄綔
      */
     @Scheduled(cron = "0/5 * * * * ? ")
     private synchronized void startCharge() {
@@ -262,7 +263,7 @@
                 continue;
             }
             AgvDetail agvDetail = agvDetailService.selectByAgvNo(key);
-            if (agvDetail == null){
+            if (agvDetail == null) {
                 log.error("{} 鍙峰緟鍏呯數灏忚溅涓嶅瓨鍦�", key);
                 continue;
             }
@@ -275,39 +276,71 @@
             if (null == agvDetail || null == agvDetail.getSoc() || null == agvDetail.getAgvStatus() || funcSta == null || null == modbusTCPMaster) {
                 continue;
             }
-            if (chargeCoreService.getChargeMode(modbusTCPMaster) != 0) {
-                log.info("{} 璇ュ厖鐢垫満涓嶆槸鑷姩鍏呯數妯″紡", funcSta.getName());
-               continue;
+            int chargeMode = chargeCoreService.getChargeMode(modbusTCPMaster);
+            if (chargeMode != 0) {
+                log.info("{} 璇ュ厖鐢垫満涓嶆槸鑷姩鍏呯數妯″紡", chargeMode);
+                continue;
             }
             switch (status) {
                 case 1:
                     // 鍚庨��淇″彿娑堝け锛岃鏄庨┈杈炬鍦ㄥ墠杩�
                     if (chargeCoreService.checkBackwardRelayOffline(modbusTCPMaster)) {
+                        log.info("鍙戦�佸厖鐢垫満鍏呯數鎸囦护锛氳溅鍙凤細{}", agvDetail.getAgvId$());
                         chargeCoreService.startCharging(modbusTCPMaster);
+                        continue;
                     }
                     if (chargeCoreService.checkForwardRelayOnline(modbusTCPMaster)) {
                         double current = chargeCoreService.getCurrent(modbusTCPMaster);
                         double voltage = chargeCoreService.getVoltage(modbusTCPMaster);
                         if (current > 0 && voltage > 0) {
                             redis.setMap(RedisConstant.AGV_CHARGE_FLAG, key, 2);
-                            log.info("charge complete");
+                            log.info("charge start:{}", agvDetail.getAgvId$());
                         } else {
                             log.info("read charge current and voltage: {},{}", current, voltage);
                         }
+                    } else {
+                        log.info("鍓嶈繘鍒颁綅淇″彿澶辫触锛氳溅鍙凤細{}", agvDetail.getAgvId$());
                     }
                     break;
 
                 case 2:
-                    AgvModel agvModel = agvModelService.getByAgvId(agvDetail.getAgvId());
-                    if (agvDetail.getSoc() >= agvModel.getQuaBattery()) {
-                        // 鍓嶈繘淇″彿瀛樺湪锛岃鏄庢満姊拌噦鏈几鍥�
-                        if (chargeCoreService.checkForwardRelayOnline(modbusTCPMaster)) {
-                            chargeCoreService.stopCharging(modbusTCPMaster);
+                    // 濡傛灉鍏呯數鏈哄畬鎴愬厖鐢典細鑷姩鏂紑
+                    // 浣嗗厖鐢垫爣璇嗗搱鍦ㄧ紦瀛樹腑锛岄偅涔堥渶瑕佹竻闄ょ紦瀛樻爣璁�
+                    // 鑾峰彇鍏呯數鏈虹紪鍙蜂笖鍚庨��鍒颁綅淇″彿瀛樺湪锛岄偅涔堣鏄庢満姊拌噦宸茬粡浼稿洖锛岄偅涔堝氨闇�瑕佹竻闄ょ紦瀛�
+                    if (chargeCoreService.getChargeId(modbusTCPMaster) > 0 && chargeCoreService.checkBackwardRelayOffline(modbusTCPMaster)) {
+                        redis.deleteMap(RedisConstant.AGV_CHARGE_FLAG, key);
+                        log.info("charge over By Auto:{}", agvDetail.getAgvId$());
+                    }else {
+                        AgvModel agvModel = agvModelService.getByAgvId(agvDetail.getAgvId());
+                        if (agvDetail.getSoc() >= agvModel.getQuaBattery()) {
+                            // 鍓嶈繘淇″彿瀛樺湪锛岃鏄庢満姊拌噦鏈几鍥�
+                            if (chargeCoreService.checkForwardRelayOnline(modbusTCPMaster)) {
+                                log.info("鍙戦�佸厖鐢垫満鏂厖鎸囦护锛氳溅鍙凤細{}", agvDetail.getAgvId$());
+                                chargeCoreService.stopCharging(modbusTCPMaster);
+                                continue;
+                            }
+                            if (chargeCoreService.checkBackwardRelayOffline(modbusTCPMaster)) {
+                                redis.deleteMap(RedisConstant.AGV_CHARGE_FLAG, key);
+                                log.info("charge over:{}", agvDetail.getAgvId$());
+                            } else {
+                                log.info("鍚庨��鍒颁綅淇″彿澶辫触锛氳溅鍙凤細{}", agvDetail.getAgvId$());
+                            }
                         }
-                        if (chargeCoreService.checkBackwardRelayOffline(modbusTCPMaster)) {
-                            redis.deleteMap(RedisConstant.AGV_CHARGE_FLAG, key);
-                            log.info("charge over");
-                        }
+                    }
+                    break;
+                case 3:
+                    // 鎵嬪姩鏂紑鍏呯數
+                    // 鍓嶈繘淇″彿瀛樺湪锛岃鏄庢満姊拌噦鏈几鍥�
+                    if (chargeCoreService.checkForwardRelayOnline(modbusTCPMaster)) {
+                        log.info("鍙戦�佸厖鐢垫満鎵嬪姩鏂厖鎸囦护锛氳溅鍙凤細{}", agvDetail.getAgvId$());
+                        chargeCoreService.stopCharging(modbusTCPMaster);
+                        continue;
+                    }
+                    if (chargeCoreService.checkBackwardRelayOffline(modbusTCPMaster)) {
+                        redis.deleteMap(RedisConstant.AGV_CHARGE_FLAG, key);
+                        log.info("charge over by handle:{}", agvDetail.getAgvId$());
+                    } else {
+                        log.info("鎵嬪姩鍚庨��鍒颁綅淇″彿澶辫触锛氳溅鍙凤細{}", agvDetail.getAgvId$());
                     }
                     break;
                 default:
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java
index 23ecd1d..8a47f01 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java
@@ -26,6 +26,7 @@
 
     private final Map<String, ModbusTCPMaster> CHARGE_CACHE = new ConcurrentHashMap<>();
 
+    private final Map<String, Object> deviceLocks = new ConcurrentHashMap<>();
 
     @PostConstruct
     public void init() {
@@ -42,22 +43,41 @@
 
     public void add(FuncSta funcSta) {
         ModbusTCPMaster modbusTcp = new ModbusTCPMaster(funcSta.getIp(), funcSta.getPort(), true);
+        try {
+            modbusTcp.connect();
+        } catch (Exception e) {
+            log.info("杩炴帴澶辫触");
+        }
         CHARGE_CACHE.put(funcSta.getUuid(), modbusTcp);
     }
 
     public void remove(String chargePointId) {
-        CHARGE_CACHE.remove(chargePointId);
+        ModbusTCPMaster master = CHARGE_CACHE.remove(chargePointId);
+        if (master != null && master.isConnected()) {
+            master.disconnect();
+        }
     }
 
     public ModbusTCPMaster get(String chargePointId) {
-        ModbusTCPMaster modbusTcp = CHARGE_CACHE.get(chargePointId);
-        if (modbusTcp != null) {
+        // 鑾峰彇鎴栧垱寤鸿澶囬攣
+        Object lock = deviceLocks.computeIfAbsent(chargePointId, k -> new Object());
+        synchronized (lock) {
+            ModbusTCPMaster modbusTcp = CHARGE_CACHE.get(chargePointId);
+            if (modbusTcp != null) {
+                return modbusTcp;
+            }
+            FuncSta funcSta = funcStaService.getOne(new LambdaQueryWrapper<FuncSta>().eq(FuncSta::getUuid, chargePointId));
+            modbusTcp = new ModbusTCPMaster(funcSta.getIp(), funcSta.getPort(),true);
+            try {
+                modbusTcp.connect();
+            } catch (Exception e) {
+                log.info("杩炴帴澶辫触");
+                return null;
+            }
+            CHARGE_CACHE.put(chargePointId, modbusTcp);
             return modbusTcp;
         }
-        FuncSta funcSta = funcStaService.getOne(new LambdaQueryWrapper<FuncSta>().eq(FuncSta::getUuid, chargePointId));
-        modbusTcp = new ModbusTCPMaster(funcSta.getIp(), funcSta.getPort(),true);
-        CHARGE_CACHE.put(chargePointId, modbusTcp);
-        return modbusTcp;
+
     }
 
 
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
index bf630fe..cf1c4b6 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
@@ -343,18 +343,18 @@
     @Override
     public Boolean judgeAutoStopCharge(AgvModel agvModel, AgvDetail agvDetail, Agv agv ) {
         if (redis.getMap(RedisConstant.AGV_CHARGE_FLAG, agv.getUuid()) != null){
-            return  false;
+            return true;
         }
         // 鎵嬪姩鍏呯數妯″紡锛岃烦杩�
         if (agvModel.getNeedUndocking() != null && agvModel.getNeedUndockingBool()) {
             FuncSta funcSta = funcStaService.getByCodeAndType(agvDetail.getCode(), FuncStaType.CHARGE.toString());
             ModbusTCPMaster modbusTCPMaster = chargeService.get(funcSta.getUuid());
             // 鎵嬪姩鍏呯數妯″紡,璺宠繃
-            if (chargeCoreService.getChargeMode(modbusTCPMaster) != 1) {
-                return false;
+            if (chargeCoreService.getChargeMode(modbusTCPMaster) == 1) {
+                return true;
             }
         }
-        return true;
+        return false;
     }
 
 }

--
Gitblit v1.9.1