zhang
9 天以前 5a10e832b6b63a10ff7479789577a4100a440d5b
充电逻辑
1个文件已添加
12个文件已修改
460 ■■■■ 已修改文件
pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-charge/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-charge/src/main/java/com/zy/acs/charge/constant/AiPowerChargerCoilEnum.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java 269 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/pom.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/charge/ChargeTestController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/astart/MapDataDispatcher.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -35,6 +35,7 @@
        <jedis.version>2.9.0</jedis.version>
        <snakeyaml.version>1.33</snakeyaml.version>
        <druid.version>1.2.27</druid.version>
        <j2mod.version>3.2.2</j2mod.version>
    </properties>
    <dependencies>
@@ -76,6 +77,11 @@
                <artifactId>snakeyaml</artifactId>
                <version>${snakeyaml.version}</version>
            </dependency>
            <dependency>
                <groupId>com.ghgande</groupId>
                <artifactId>j2mod</artifactId>
                <version>${j2mod.version}</version> <!-- 可在 Maven 中央仓库查找最新版本 -->
            </dependency>
        </dependencies>
    </dependencyManagement>
zy-acs-charge/pom.xml
@@ -28,9 +28,8 @@
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.xingshuangs</groupId>
            <artifactId>iot-communication</artifactId>
            <version>1.5.6</version>
            <groupId>com.ghgande</groupId>
            <artifactId>j2mod</artifactId>
        </dependency>
    </dependencies>
zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java
@@ -1,6 +1,6 @@
package com.zy.acs.charge;
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp;
import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
import com.zy.acs.charge.model.ChargerStatus;
/**
@@ -14,7 +14,7 @@
     * @param client
     * @return
     */
    boolean startCharging(ModbusRtuOverTcp client);
    boolean startCharging(ModbusTCPMaster client);
    /**
     * 调度停止充电
@@ -22,7 +22,7 @@
     * @param client
     * @return
     */
    boolean stopCharging(ModbusRtuOverTcp client);
    boolean stopCharging(ModbusTCPMaster client);
    /**
     * 在线正继电器状态(前进到位)
@@ -30,7 +30,7 @@
     * @param client
     * @return
     */
    boolean checkForwardRelayOnline(ModbusRtuOverTcp client);
    boolean checkForwardRelayOnline(ModbusTCPMaster client);
    /**
@@ -39,7 +39,7 @@
     * @param client
     * @return
     */
    boolean checkBackwardRelayOffline(ModbusRtuOverTcp client);
    boolean checkBackwardRelayOffline(ModbusTCPMaster client);
    /**
     * 获取充电机充电电压
@@ -47,7 +47,7 @@
     * @param client
     * @return
     */
    double getVoltage(ModbusRtuOverTcp client);
    double getVoltage(ModbusTCPMaster client);
    /**
     * 获取充电机充电电流
@@ -55,27 +55,27 @@
     * @param client
     * @return
     */
    double getCurrent(ModbusRtuOverTcp client);
    double getCurrent(ModbusTCPMaster client);
    /**
     * 获取充电机充电模式
     * @param client
     * @return
     */
    Short getChargeMode(ModbusRtuOverTcp client);
    int getChargeMode(ModbusTCPMaster client);
    /**
     * 获取充电机状态
     * @param client
     * @return
     */
    ChargerStatus getStatus(ModbusRtuOverTcp client);
    ChargerStatus getStatus(ModbusTCPMaster client);
    boolean clearFault(ModbusRtuOverTcp client);
    boolean clearFault(ModbusTCPMaster client);
    boolean finishRetract(ModbusRtuOverTcp client);
    boolean finishRetract(ModbusTCPMaster client);
    boolean restoreStandby(ModbusRtuOverTcp client);
    boolean restoreStandby(ModbusTCPMaster client);
}
zy-acs-charge/src/main/java/com/zy/acs/charge/constant/AiPowerChargerCoilEnum.java
@@ -52,4 +52,6 @@
    public String getDes() {
        return des;
    }
}
zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java
@@ -1,16 +1,17 @@
package com.zy.acs.charge.impl;
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp;
import com.ghgande.j2mod.modbus.ModbusException;
import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
import com.ghgande.j2mod.modbus.procimg.Register;
import com.ghgande.j2mod.modbus.procimg.SimpleRegister;
import com.ghgande.j2mod.modbus.util.BitVector;
import com.zy.acs.charge.ChargeCoreService;
import com.zy.acs.charge.constant.AiPowerChargerCoilEnum;
import com.zy.acs.charge.constant.AiPowerChargerRegisterEnum;
import com.zy.acs.charge.model.ChargerStatus;
import com.zy.acs.common.utils.ByteUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * 爱普拉AGV锂电智能充电机调度
@@ -22,123 +23,252 @@
    /**
     * 开始充电
     *
     * @param client
     * @return
     */
    @Override
    public boolean startCharging(ModbusRtuOverTcp client) {
    public boolean startCharging(ModbusTCPMaster client) {
        // AGV车报告到位 -> true
        client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), true);
        return true;
        try {
            return client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), true);
        } catch (ModbusException e) {
            log.info("写入开始充电指令报错:{} ", e.getMessage());
        }
        return false;
    }
    /**
     * 停止充电
     *
     * @param client
     * @return
     */
    @Override
    public boolean stopCharging(ModbusRtuOverTcp client) {
        client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false);
        return true;
    public boolean stopCharging(ModbusTCPMaster client) {
        try {
            return client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false);
        } catch (ModbusException e) {
            log.info("写入停止充电指令报错:{} ", e.getMessage());
        }
        return false;
    }
    /**
     * 在线正继电器状态(前进到位)
     *
     * @param client
     * @return
     */
    @Override
    public boolean checkForwardRelayOnline(ModbusRtuOverTcp client) {
        return client.readBoolean(AiPowerChargerCoilEnum.FORWARD_RELAY_ONLINE.getAddr(), 1);
    public boolean checkForwardRelayOnline(ModbusTCPMaster client) {
        try {
            return client.readCoils(AiPowerChargerCoilEnum.FORWARD_RELAY_ONLINE.getAddr(), 1).getBit(0);
        } catch (ModbusException e) {
            log.info("读取在线正继电器状态报错:{} ", e.getMessage());
        }
        return false;
    }
    /**
     * 离线正继电器状态(后退到位)
     *
     * @param client
     * @return
     */
    @Override
    public boolean checkBackwardRelayOffline(ModbusRtuOverTcp client) {
        return client.readBoolean(AiPowerChargerCoilEnum.BACKWARD_RELAY_OFFLINE.getAddr(), 1);
    public boolean checkBackwardRelayOffline(ModbusTCPMaster client) {
        try {
            return client.readCoils(AiPowerChargerCoilEnum.BACKWARD_RELAY_OFFLINE.getAddr(), 1).getBit(0);
        } catch (ModbusException e) {
            log.info("读取离线正继电器状态报错:{} ", e.getMessage());
        }
        return false;
    }
    /**
     * 获取充电机充电电压
     *
     * @param client
     * @return
     */
    @Override
    public double getVoltage(ModbusRtuOverTcp client) {
        return client.readInt16(AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getAddr(), 1) * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
    public double getVoltage(ModbusTCPMaster client) {
        try {
            return client.readMultipleRegisters(AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getAddr(), 1)[0].getValue() * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
        } catch (ModbusException e) {
            log.info("读取充电电压报错:{} ", e.getMessage());
        }
        return 0;
    }
    /**
     * 获取充电机充电电流
     *
     * @param client
     * @return
     */
    @Override
    public double getCurrent(ModbusRtuOverTcp client) {
        return client.readInt16(AiPowerChargerRegisterEnum.CHARGE_CURRENT.getAddr(), 1) * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
    public double getCurrent(ModbusTCPMaster client) {
        try {
            return client.readMultipleRegisters(AiPowerChargerRegisterEnum.CHARGE_CURRENT.getAddr(), 1)[0].getValue() * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
        } catch (ModbusException e) {
            log.info("读取充电电流报错:{} ", e.getMessage());
        }
        return 0;
    }
    /**
     * 获取充电机充电模式
     *
     * @param client
     * @return
     */
    @Override
    public Short getChargeMode(ModbusRtuOverTcp client) {
        return client.readInt16(AiPowerChargerRegisterEnum.CHARGE_MODE.getAddr(), 1);
    public int getChargeMode(ModbusTCPMaster client) {
        try {
            return client.readMultipleRegisters(AiPowerChargerRegisterEnum.CHARGE_MODE.getAddr(), 1)[0].getValue();
        } catch (ModbusException e) {
            log.info("读取充电模式报错:{} ", e.getMessage());
        }
        return -1;
    }
    /**
     * 获取充电机状态
     *
     * @param client
     * @return
     */
    @Override
    public ChargerStatus getStatus(ModbusRtuOverTcp client) {
    public ChargerStatus getStatus(ModbusTCPMaster client) {
        ChargerStatus status = new ChargerStatus();
        // ---------- 批量读取线圈(地址100~115共16个) ----------
        List<Boolean> coils = client.readCoil(100, 16);
        status.setWorking(coils.get(0));                      // 地址100
        status.setOverheat(coils.get(0));                     // 101
        status.setFault(coils.get(0));                        // 102
        status.setCvMode(coils.get(0));                       // 103
        status.setBatteryConnected(coils.get(0));              // 104
        status.setFanAbnormal(coils.get(0));                   // 105
        status.setPlateOverheat(coils.get(0));                 // 106
        status.setBrushPressed(coils.get(0));                  // 107
        status.setAgvReportedInPosition(coils.get(8));         // 108
        status.setChargerConfirmedAgvReady(coils.get(9));      // 109
        status.setForwardRelayOnline(coils.get(10));           // 110
        status.setBackwardRelayOffline(coils.get(11));         // 111
        status.setBmsChargeEnable(coils.get(12));              // 112
        status.setCommRs485Success(!coils.get(13));            // 113(注意:0=成功,1=超时)
        status.setCommCanSuccess(!coils.get(14));              // 114
        status.setCommBmsSuccess(!coils.get(15));              // 115
        BitVector coils = null;
        try {
            coils = client.readCoils(AiPowerChargerCoilEnum.WORK_STATUS.getAddr(), AiPowerChargerCoilEnum.values().length);
            for (int i = 0; i < coils.size(); i++) {
                switch (i) {
                    case 0:
                        status.setWorking(coils.getBit(i));
                        break;
                    case 1:
                        status.setOverheat(coils.getBit(i));
                        break;
                    case 2:
                        status.setFault(coils.getBit(i));
                        break;
                    case 3:
                        status.setCvMode(coils.getBit(i));
                        break;
                    case 4:
                        status.setBatteryConnected(coils.getBit(i));
                        break;
                    case 5:
                        status.setFanAbnormal(coils.getBit(i));
                        break;
                    case 6:
                        status.setPlateOverheat(coils.getBit(i));
                        break;
                    case 7:
                        status.setBrushPressed(coils.getBit(i));
                        break;
                    case 8:
                        status.setAgvReportedInPosition(coils.getBit(i));
                        break;
                    case 9:
                        status.setChargerConfirmedAgvReady(coils.getBit(i));
                        break;
                    case 10:
                        status.setForwardRelayOnline(coils.getBit(i));
                        break;
                    case 11:
                        status.setBackwardRelayOffline(coils.getBit(i));
                        break;
                    case 12:
                        status.setBmsChargeEnable(coils.getBit(i));
                        break;
                    case 13:
                        status.setCommRs485Success(!coils.getBit(i));
                        break;
                    case 14:
                        status.setCommCanSuccess(!coils.getBit(i));
                        break;
                    case 15:
                        status.setCommBmsSuccess(!coils.getBit(i));
                        break;
                    default:
                        break;
                }
            }
        } catch (ModbusException e) {
            log.info("批量读取线圈报错:{} ", e.getMessage());
        }
        // ---------- 批量读取保持寄存器(地址100~116共17个) ----------
        byte[] bytes = client.readHoldRegister(100, 16);
        status.setVoltage(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getRaw());
        status.setCurrent(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw());
        status.setChargingTime(ByteUtils.getInt(bytes, 0));
        status.setCapacity(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.CHARGE_CAPACITY.getRaw());
        status.setEnergy(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.CHARGE_ENERGY.getRaw());
        status.setCellMaxVoltage(ByteUtils.getInt(bytes, 0));
        status.setCellMinVoltage(ByteUtils.getInt(bytes, 0));
        status.setPackVoltage(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.BMS_PACK_VOLTAGE.getRaw());
        status.setVoltageDemand(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.BMS_VOLTAGE_DEMAND.getRaw());
        status.setCurrentDemand(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.BMS_CURRENT_DEMAND.getRaw());
        status.setTemperature(ByteUtils.getInt(bytes, 0));
        status.setSoc(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.BMS_SOC.getRaw());
        status.setEndFlag(ByteUtils.getInt(bytes, 0));
        status.setChargerId(ByteUtils.getInt(bytes, 0));
        status.setFaultCode(ByteUtils.getInt(bytes, 0));
        status.setChargeMode(ByteUtils.getInt(bytes, 0));
        status.setScheduleFlag(ByteUtils.getInt(bytes, 0));
        try {
            Register[] registers = client.readMultipleRegisters(AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getAddr(), AiPowerChargerRegisterEnum.values().length);
            for (int i = 0; i < registers.length; i++) {
                switch (i) {
                    case 0:
                        status.setVoltage(registers[i].getValue() * AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getRaw());
                        break;
                    case 1:
                        status.setCurrent(registers[i].getValue() * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw());
                        break;
                    case 2:
                        status.setChargingTime(registers[i].getValue());
                        break;
                    case 3:
                        status.setCapacity(registers[i].getValue() * AiPowerChargerRegisterEnum.CHARGE_CAPACITY.getRaw());
                        break;
                    case 4:
                        status.setEnergy(registers[i].getValue() * AiPowerChargerRegisterEnum.CHARGE_ENERGY.getRaw());
                        break;
                    case 5:
                        status.setCellMaxVoltage(registers[i].getValue());
                        break;
                    case 6:
                        status.setCellMinVoltage(registers[i].getValue());
                        break;
                    case 7:
                        status.setPackVoltage(registers[i].getValue() * AiPowerChargerRegisterEnum.BMS_PACK_VOLTAGE.getRaw());
                        break;
                    case 8:
                        status.setVoltageDemand(registers[i].getValue() * AiPowerChargerRegisterEnum.BMS_VOLTAGE_DEMAND.getRaw());
                        break;
                    case 9:
                        status.setCurrentDemand(registers[i].getValue() * AiPowerChargerRegisterEnum.BMS_CURRENT_DEMAND.getRaw());
                        break;
                    case 10:
                        status.setTemperature(registers[i].getValue());
                        break;
                    case 11:
                        status.setSoc(registers[i].getValue() * AiPowerChargerRegisterEnum.BMS_SOC.getRaw());
                        break;
                    case 12:
                        status.setEndFlag(registers[i].getValue());
                        break;
                    case 13:
                        status.setChargerId(registers[i].getValue());
                        break;
                    case 14:
                        status.setFaultCode(registers[i].getValue());
                        break;
                    case 15:
                        status.setChargeMode(registers[i].getValue());
                        break;
                    case 16:
                        status.setScheduleFlag(registers[i].getValue());
                        break;
                    default:
                        break;
                }
            }
        } catch (ModbusException e) {
           log.info("批量读取保持寄存器报错:{} ", e.getMessage());
        }
        return status;
    }
@@ -146,34 +276,49 @@
    /**
     * 清除故障
     *
     * @param client
     * @return
     */
    @Override
    public boolean clearFault(ModbusRtuOverTcp client) {
        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 1);
    public boolean clearFault(ModbusTCPMaster client) {
        try {
            client.writeSingleRegister(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), new SimpleRegister(1));
        } catch (ModbusException e) {
            log.error("充电器清除故障失败......");
        }
        return true;
    }
    /**
     * 完成退回
     *
     * @param client
     * @return
     */
    @Override
    public boolean finishRetract(ModbusRtuOverTcp client) {
        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 2);
    public boolean finishRetract(ModbusTCPMaster client) {
        try {
            client.writeSingleRegister(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), new SimpleRegister(2));
        } catch (ModbusException e) {
            log.error("充电器完成退回失败......");
        }
        return true;
    }
    /**
     * 恢复待机
     *
     * @param client
     * @return
     */
    @Override
    public boolean restoreStandby(ModbusRtuOverTcp client) {
        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 3);
    public boolean restoreStandby(ModbusTCPMaster client) {
        try {
            client.writeSingleRegister(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), new SimpleRegister(3));
        } catch (ModbusException e) {
            log.error("充电器恢复待机失败......");
        }
        return true;
    }
}
zy-acs-manager/pom.xml
@@ -167,15 +167,13 @@
        </dependency>
        <dependency>
            <groupId>com.github.xingshuangs</groupId>
            <artifactId>iot-communication</artifactId>
            <version>1.5.6</version>
        </dependency>
        <dependency>
            <groupId>com.zy</groupId>
            <artifactId>acs-charge</artifactId>
            <version>1.0.0</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.ghgande</groupId>
            <artifactId>j2mod</artifactId>
        </dependency>
    </dependencies>
zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/charge/ChargeTestController.java
New file
@@ -0,0 +1,46 @@
package com.zy.acs.manager.core.integrate.charge;
import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
import com.zy.acs.charge.ChargeCoreService;
import com.zy.acs.charge.model.ChargerStatus;
import com.zy.acs.common.constant.RedisConstant;
import com.zy.acs.common.utils.RedisSupport;
import com.zy.acs.framework.common.R;
import com.zy.acs.manager.common.annotation.IntegrationAuth;
import com.zy.acs.manager.core.domain.type.NamespaceType;
import com.zy.acs.manager.core.service.ChargeService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Api(tags = "Open Api")
@RestController
@RequestMapping("/api/open")
public class ChargeTestController {
    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
    @Autowired
    private ChargeService chargeService;
    @Autowired
    private ChargeCoreService chargeCoreService;
    @IntegrationAuth(name = NamespaceType.RCS_STA_QUERY)
    @GetMapping("/charge/{type}")
    public R test(@PathVariable("type") Integer type){
        ModbusTCPMaster modbusTCPMaster = chargeService.get("10");
        ChargerStatus status = chargeCoreService.getStatus(modbusTCPMaster);
        return R.ok(status);
    }
    @IntegrationAuth(name = NamespaceType.RCS_STA_QUERY)
    @GetMapping("/write/{agvId}/{type}")
    public R test2(@PathVariable("agvId") Integer agvId,@PathVariable("type") Integer type){
        redis.setMap(RedisConstant.AGV_CHARGE_FLAG, agvId+"", type);
        return R.ok();
    }
}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -1,7 +1,7 @@
package com.zy.acs.manager.core.scheduler;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp;
import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
import com.zy.acs.charge.ChargeCoreService;
import com.zy.acs.common.constant.RedisConstant;
import com.zy.acs.common.enums.AgvStatusType;
@@ -250,6 +250,8 @@
    /**
     * 调度对接充电桩
     * 状态1:开始充电
     * 状态2:充电中
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    private synchronized void startCharge() {
@@ -260,23 +262,32 @@
                continue;
            }
            AgvDetail agvDetail = agvDetailService.selectByAgvNo(key);
            if (agvDetail == null){
                log.error("{} 号待充电小车不存在", key);
                continue;
            }
            if (agvDetail.getCode() == null) {
                log.error("{} 号待充电小车无地址码", key);
                continue;
            }
            FuncSta funcSta = funcStaService.getByCodeAndType(agvDetail.getCode(), FuncStaType.CHARGE.toString());
            ModbusRtuOverTcp modbusTcp = chargeService.get(funcSta.getUuid());
            if (null == agvDetail || null == agvDetail.getSoc() || null == agvDetail.getAgvStatus() || funcSta == null || null == modbusTcp) {
            ModbusTCPMaster modbusTCPMaster = chargeService.get(funcSta.getUuid());
            if (null == agvDetail || null == agvDetail.getSoc() || null == agvDetail.getAgvStatus() || funcSta == null || null == modbusTCPMaster) {
                continue;
            }
            if (chargeCoreService.getChargeMode(modbusTCPMaster) != 0) {
                log.info("{} 该充电机不是自动充电模式", funcSta.getName());
               continue;
            }
            switch (status) {
                case 1:
                    // 后退信号消失,说明马达正在前进
                    if (chargeCoreService.checkBackwardRelayOffline(modbusTcp)) {
                        chargeCoreService.startCharging(modbusTcp);
                    if (chargeCoreService.checkBackwardRelayOffline(modbusTCPMaster)) {
                        chargeCoreService.startCharging(modbusTCPMaster);
                    }
                    if (chargeCoreService.checkForwardRelayOnline(modbusTcp)) {
                        double current = chargeCoreService.getCurrent(modbusTcp);
                        double voltage = chargeCoreService.getVoltage(modbusTcp);
                    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");
@@ -290,10 +301,10 @@
                    AgvModel agvModel = agvModelService.getByAgvId(agvDetail.getAgvId());
                    if (agvDetail.getSoc() >= agvModel.getQuaBattery()) {
                        // 前进信号存在,说明机械臂未伸回
                        if (chargeCoreService.checkForwardRelayOnline(modbusTcp)) {
                            chargeCoreService.stopCharging(modbusTcp);
                        if (chargeCoreService.checkForwardRelayOnline(modbusTCPMaster)) {
                            chargeCoreService.stopCharging(modbusTCPMaster);
                        }
                        if (chargeCoreService.checkBackwardRelayOffline(modbusTcp)) {
                        if (chargeCoreService.checkBackwardRelayOffline(modbusTCPMaster)) {
                            redis.deleteMap(RedisConstant.AGV_CHARGE_FLAG, key);
                            log.info("charge over");
                        }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java
@@ -1,9 +1,7 @@
package com.zy.acs.manager.core.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp;
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
import com.github.xingshuangs.iot.utils.HexUtil;
import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.manager.manager.entity.FuncSta;
import com.zy.acs.manager.manager.enums.FuncStaType;
@@ -26,7 +24,7 @@
    @Autowired
    private FuncStaService funcStaService;
    private final Map<String, ModbusRtuOverTcp> CHARGE_CACHE = new ConcurrentHashMap<>();
    private final Map<String, ModbusTCPMaster> CHARGE_CACHE = new ConcurrentHashMap<>();
    @PostConstruct
@@ -43,8 +41,7 @@
    public void add(FuncSta funcSta) {
        ModbusRtuOverTcp modbusTcp = new ModbusRtuOverTcp(funcSta.getIp(), funcSta.getPort());
        modbusTcp.setComCallback((tag, bytes) -> log.info("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes)));
        ModbusTCPMaster modbusTcp = new ModbusTCPMaster(funcSta.getIp(), funcSta.getPort(), true);
        CHARGE_CACHE.put(funcSta.getUuid(), modbusTcp);
    }
@@ -52,14 +49,13 @@
        CHARGE_CACHE.remove(chargePointId);
    }
    public ModbusRtuOverTcp get(String chargePointId) {
        ModbusRtuOverTcp modbusTcp = CHARGE_CACHE.get(chargePointId);
    public ModbusTCPMaster get(String chargePointId) {
        ModbusTCPMaster modbusTcp = CHARGE_CACHE.get(chargePointId);
        if (modbusTcp != null) {
            return modbusTcp;
        }
        FuncSta funcSta = funcStaService.getOne(new LambdaQueryWrapper<FuncSta>().eq(FuncSta::getUuid, chargePointId));
        modbusTcp = new ModbusRtuOverTcp(funcSta.getIp(), funcSta.getPort());
        modbusTcp.setComCallback((tag, bytes) -> log.info("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes)));
        modbusTcp = new ModbusTCPMaster(funcSta.getIp(), funcSta.getPort(),true);
        CHARGE_CACHE.put(chargePointId, modbusTcp);
        return modbusTcp;
    }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/astart/MapDataDispatcher.java
@@ -383,25 +383,25 @@
            }
            return;
        }
        for (Route route : routeList) {
            Code startCode = codeService.getCacheById(route.getStartCode());
            int[] startCodeIdx = getCodeMatrixIdx(lev, startCode.getData());
            Code endCode = codeService.getCacheById(route.getEndCode());
            int[] codeMatrixIdx = getCodeMatrixIdx(lev, endCode.getData());
            String routeKey = RouteGenerator.generateRouteKey(startCode.getData(), endCode.getData());
            if (Cools.isEmpty(routeKey)) {
                continue;
            }
            redis.setMap(RedisConstant.AGV_MAP_ROUTE_HASH_FLAG, routeKey, Boolean.TRUE);
            String routeCdaKey = RouteGenerator.generateRouteCdaKey(startCodeIdx, codeMatrixIdx);
            if (Cools.isEmpty(routeCdaKey)) {
                continue;
            }
            redis.setMap(RedisConstant.AGV_MAP_ROUTE_CDA_HASH_FLAG, routeCdaKey, Boolean.TRUE);
            this.routeCdaMap.put(routeCdaKey, Boolean.TRUE);
        }
//        for (Route route : routeList) {
//            Code startCode = codeService.getCacheById(route.getStartCode());
//            int[] startCodeIdx = getCodeMatrixIdx(lev, startCode.getData());
//            Code endCode = codeService.getCacheById(route.getEndCode());
//            int[] codeMatrixIdx = getCodeMatrixIdx(lev, endCode.getData());
//
//            String routeKey = RouteGenerator.generateRouteKey(startCode.getData(), endCode.getData());
//            if (Cools.isEmpty(routeKey)) {
//                continue;
//            }
//            redis.setMap(RedisConstant.AGV_MAP_ROUTE_HASH_FLAG, routeKey, Boolean.TRUE);
//
//            String routeCdaKey = RouteGenerator.generateRouteCdaKey(startCodeIdx, codeMatrixIdx);
//            if (Cools.isEmpty(routeCdaKey)) {
//                continue;
//            }
//            redis.setMap(RedisConstant.AGV_MAP_ROUTE_CDA_HASH_FLAG, routeCdaKey, Boolean.TRUE);
//            this.routeCdaMap.put(routeCdaKey, Boolean.TRUE);
//        }
    }
    public synchronized String[][] initCodeMatrix(Integer lev) {
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
@@ -2,7 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp;
import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
import com.zy.acs.charge.ChargeCoreService;
import com.zy.acs.common.constant.RedisConstant;
import com.zy.acs.common.enums.AgvStatusType;
@@ -348,10 +348,10 @@
        // 手动充电模式,跳过
        if (agvModel.getNeedUndocking() != null && agvModel.getNeedUndockingBool()) {
            FuncSta funcSta = funcStaService.getByCodeAndType(agvDetail.getCode(), FuncStaType.CHARGE.toString());
            ModbusRtuOverTcp modbusTcp = chargeService.get(funcSta.getUuid());
            ModbusTCPMaster modbusTCPMaster = chargeService.get(funcSta.getUuid());
            // 手动充电模式,跳过
            if (chargeCoreService.getChargeMode(modbusTcp) != 1) {
                return  false;
            if (chargeCoreService.getChargeMode(modbusTCPMaster) != 1) {
                return false;
            }
        }
        return true;
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncStaServiceImpl.java
@@ -2,7 +2,6 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
import com.zy.acs.common.enums.AgvStatusType;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.manager.common.utils.CommonUtil;
zy-acs-manager/src/main/resources/application.yml
@@ -7,7 +7,7 @@
    static-path-pattern: /**
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/rcs_ctu_stable?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    url: jdbc:mysql://localhost:3306/rcs_ctu_stable?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: xltys1995
    type: com.alibaba.druid.pool.DruidDataSource