充电逻辑补充,充电桩分为手动充电和自动充电,手动充电模式下也不可以发任务给小车;协议补充0x71和0x72
7个文件已修改
144 ■■■■ 已修改文件
version/doc/AGV-RCS 通信协议 V1.1.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/doc/AGV-RCS ͨÐÅЭÒé V1.1.xlsx
Binary files differ
zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java
@@ -57,7 +57,18 @@
     */
    double getCurrent(ModbusRtuOverTcp client);
    /**
     * èŽ·å–å……ç”µæœºå……ç”µæ¨¡å¼
     * @param client
     * @return
     */
    Short getChargeMode(ModbusRtuOverTcp client);
    /**
     * èŽ·å–å……ç”µæœºçŠ¶æ€
     * @param client
     * @return
     */
    ChargerStatus getStatus(ModbusRtuOverTcp client);
zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java
@@ -20,7 +20,11 @@
@Slf4j
public class AiPowerChargeServiceImpl implements ChargeCoreService {
    /**
     * å¼€å§‹å……电
     * @param client
     * @return
     */
    @Override
    public boolean startCharging(ModbusRtuOverTcp client) {
        // AGV车报告到位 -> true
@@ -28,32 +32,71 @@
        return true;
    }
    /**
     * åœæ­¢å……电
     * @param client
     * @return
     */
    @Override
    public boolean stopCharging(ModbusRtuOverTcp client) {
        client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false);
        return true;
    }
    /**
     * åœ¨çº¿æ­£ç»§ç”µå™¨çŠ¶æ€(前进到位)
     * @param client
     * @return
     */
    @Override
    public boolean checkForwardRelayOnline(ModbusRtuOverTcp client) {
        return client.readBoolean(AiPowerChargerCoilEnum.FORWARD_RELAY_ONLINE.getAddr(), 1);
    }
    /**
     * ç¦»çº¿æ­£ç»§ç”µå™¨çŠ¶æ€(后退到位)
     * @param client
     * @return
     */
    @Override
    public boolean checkBackwardRelayOffline(ModbusRtuOverTcp client) {
        return client.readBoolean(AiPowerChargerCoilEnum.BACKWARD_RELAY_OFFLINE.getAddr(), 1);
    }
    /**
     * èŽ·å–å……ç”µæœºå……ç”µç”µåŽ‹
     * @param client
     * @return
     */
    @Override
    public double getVoltage(ModbusRtuOverTcp client) {
        return client.readInt16(AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getAddr(), 1) * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
    }
    /**
     * èŽ·å–å……ç”µæœºå……ç”µç”µæµ
     * @param client
     * @return
     */
    @Override
    public double getCurrent(ModbusRtuOverTcp client) {
        return client.readInt16(AiPowerChargerRegisterEnum.CHARGE_CURRENT.getAddr(), 1) * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
    }
    /**
     * èŽ·å–å……ç”µæœºå……ç”µæ¨¡å¼
     * @param client
     * @return
     */
    @Override
    public Short getChargeMode(ModbusRtuOverTcp client) {
        return client.readInt16(AiPowerChargerRegisterEnum.CHARGE_MODE.getAddr(), 1);
    }
    /**
     * èŽ·å–å……ç”µæœºçŠ¶æ€
     * @param client
     * @return
     */
    @Override
    public ChargerStatus getStatus(ModbusRtuOverTcp client) {
        ChargerStatus status = new ChargerStatus();
@@ -101,21 +144,33 @@
    }
    // æ¸…除故障
    /**
     * æ¸…除故障
     * @param client
     * @return
     */
    @Override
    public boolean clearFault(ModbusRtuOverTcp client) {
        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 1);
        return true;
    }
    // å®Œæˆé€€å›žå‘½ä»¤
    /**
     * å®Œæˆé€€å›ž
     * @param client
     * @return
     */
    @Override
    public boolean finishRetract(ModbusRtuOverTcp client) {
        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 2);
        return true;
    }
    // æ¢å¤å¾…机状态
    /**
     * æ¢å¤å¾…机
     * @param client
     * @return
     */
    @Override
    public boolean restoreStandby(ModbusRtuOverTcp client) {
        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 3);
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -132,8 +132,8 @@
//            if (agvDetailService.isPowerLoss(agv, agvDetail, agvModel)) {
//                continue;
//            }
            // å­˜åœ¨å……电标记,跳过
            if (redis.getMap(RedisConstant.AGV_CHARGE_FLAG, agv.getUuid()) != null) {
            // åˆ¤è¯»æ˜¯å¦å¯ä»¥è‡ªåŠ¨æ–­å¼€å……ç”µï¼ˆå³å……ç”µè¿‡ç¨‹ä¸­ä¸èƒ½æŽ¥å—ä»»åŠ¡ï¼‰ï¼Œè·³è¿‡
            if (!agvService.judgeAutoStopCharge(agvModel,agvDetail, agv)) {
                continue;
            }
            // is charging ?
@@ -260,6 +260,9 @@
                continue;
            }
            AgvDetail agvDetail = agvDetailService.selectByAgvNo(key);
            if (agvDetail.getCode() == null) {
                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) {
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -1988,10 +1988,14 @@
            if (taskComplete) {
                // åœ¨å……电任务行走到终点,同时判断充电桩的类型
                if (segment.getPosType().equals(TaskPosDto.PosType.TO_CHARGE)){
                    FuncSta destFuncSta = funcStaService.getByCodeAndType(task.getDestCode(), FuncStaType.CHARGE.toString());
                    if (destFuncSta != null) {
                        if (Cools.isEmpty(destFuncSta.getProtocol()) && destFuncSta.getProtocol().equalsIgnoreCase(ProtocolType.MODBUS.toString())) {
                            redis.setMap(RedisConstant.AGV_CHARGE_FLAG,segment.getAgvId$(),1);
                    AgvModel agvModel = agvModelService.getByAgvId(task.getAgvId());
                    // åˆ¤æ–­æ˜¯å¦éœ€è¦æ–­å……操作
                    if (null != agvModel.getNeedUndocking() && agvModel.getNeedUndockingBool()){
                        FuncSta destFuncSta = funcStaService.getByCodeAndType(task.getDestCode(), FuncStaType.CHARGE.toString());
                        if (destFuncSta != null) {
                            if (Cools.isEmpty(destFuncSta.getProtocol()) && destFuncSta.getProtocol().equalsIgnoreCase(ProtocolType.MODBUS.toString())) {
                                redis.setMap(RedisConstant.AGV_CHARGE_FLAG,segment.getAgvId$(),1);
                            }
                        }
                    }
                }
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvService.java
@@ -7,6 +7,8 @@
import com.zy.acs.manager.core.domain.VehicleDto;
import com.zy.acs.manager.manager.controller.result.AgvResult;
import com.zy.acs.manager.manager.entity.Agv;
import com.zy.acs.manager.manager.entity.AgvDetail;
import com.zy.acs.manager.manager.entity.AgvModel;
import java.util.List;
@@ -44,4 +46,6 @@
    int getBackpackRemainingCapacity(Long agvId);
    Boolean judgeAutoStopCharge(AgvModel agvModel, AgvDetail agvDetail, Agv agv);
}
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
@@ -2,6 +2,8 @@
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.zy.acs.charge.ChargeCoreService;
import com.zy.acs.common.constant.RedisConstant;
import com.zy.acs.common.enums.AgvStatusType;
import com.zy.acs.common.utils.RedisSupport;
@@ -12,12 +14,11 @@
import com.zy.acs.manager.common.domain.PageResult;
import com.zy.acs.manager.core.cache.CoreCache;
import com.zy.acs.manager.core.domain.VehicleDto;
import com.zy.acs.manager.core.service.ChargeService;
import com.zy.acs.manager.core.service.astart.MapDataDispatcher;
import com.zy.acs.manager.manager.controller.result.AgvResult;
import com.zy.acs.manager.manager.entity.Agv;
import com.zy.acs.manager.manager.entity.AgvDetail;
import com.zy.acs.manager.manager.entity.AgvModel;
import com.zy.acs.manager.manager.entity.Segment;
import com.zy.acs.manager.manager.entity.*;
import com.zy.acs.manager.manager.enums.FuncStaType;
import com.zy.acs.manager.manager.enums.SegmentStateType;
import com.zy.acs.manager.manager.mapper.AgvMapper;
import com.zy.acs.manager.manager.service.*;
@@ -66,6 +67,15 @@
    private AreaAgvService areaAgvService;
    @Autowired
    private MapDataDispatcher mapDataDispatcher;
    @Autowired
    private FuncStaService funcStaService;
    @Autowired
    private ChargeService chargeService;
    @Autowired
    private ChargeCoreService chargeCoreService;
    @Autowired
    private AgvService agvService;
    @PostConstruct
    public void init() {
@@ -224,8 +234,8 @@
                return false;
            }
        }
        if (redis.getMap(RedisConstant.AGV_CHARGE_FLAG,agvDetail.getUuid()) != null) {
            log.warn("[{}]号Agv在redis存在充电标识......", agvNo);
        if (judgeAutoStopCharge(agvModel, agvDetail,agvService.getById(agvId))) {
            log.warn("[{}]号Agv需要断充操作,无法执行任务......", agvNo);
            return false;
        }
        if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
@@ -324,4 +334,27 @@
        return Math.max(agvModel.getBackpack() - usedSlots, 0); // if less than zero, then return zero
    }
    /**
     * åˆ¤æ–­å……电过程,自动断开
     * @param agvModel
     * @param agvDetail
     * @return
     */
    @Override
    public Boolean judgeAutoStopCharge(AgvModel agvModel, AgvDetail agvDetail, Agv agv ) {
        if (redis.getMap(RedisConstant.AGV_CHARGE_FLAG, agv.getUuid()) != null){
            return  false;
        }
        // æ‰‹åŠ¨å……ç”µæ¨¡å¼ï¼Œè·³è¿‡
        if (agvModel.getNeedUndocking() != null && agvModel.getNeedUndockingBool()) {
            FuncSta funcSta = funcStaService.getByCodeAndType(agvDetail.getCode(), FuncStaType.CHARGE.toString());
            ModbusRtuOverTcp modbusTcp = chargeService.get(funcSta.getUuid());
            // æ‰‹åŠ¨å……ç”µæ¨¡å¼,跳过
            if (chargeCoreService.getChargeMode(modbusTcp) != 1) {
                return  false;
            }
        }
        return true;
    }
}