package com.zy.acs.manager.core.scheduler; import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster; import com.zy.acs.charge.ChargeCoreService; import com.zy.acs.charge.ChargeStrategyFactory; import com.zy.acs.charge.constant.ChargerType; import com.zy.acs.common.constant.RedisConstant; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.manager.common.config.UplinkProperties; import com.zy.acs.manager.core.integrate.wms.FaultReportService; import com.zy.acs.manager.core.integrate.wms.TaskReportService; import com.zy.acs.manager.core.service.ChargeService; import com.zy.acs.manager.core.service.MainLockWrapService; import com.zy.acs.manager.manager.entity.AgvDetail; import com.zy.acs.manager.manager.entity.AgvModel; import com.zy.acs.manager.manager.entity.FuncSta; import com.zy.acs.manager.manager.enums.FuncStaType; import com.zy.acs.manager.manager.service.*; import com.zy.acs.manager.system.service.ConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Set; @Slf4j @Component public class ChargeScheduler { private final RedisSupport redis = RedisSupport.defaultRedisSupport; @Autowired private AgvDetailService agvDetailService; @Autowired private FuncStaService funcStaService; @Autowired private AgvModelService agvModelService; @Autowired private ChargeService chargeService; @Autowired private ChargeStrategyFactory chargeStrategyFactory; /** * 调度对接充电桩 * 状态1:开始充电 * 状态2:充电中 * 状态3:人为操作下发断开充电操作 */ @Scheduled(cron = "0/5 * * * * ? ") private synchronized void startCharge() { Set mapKeys = redis.getMapKeys(RedisConstant.AGV_CHARGE_FLAG); for (String key : mapKeys) { Integer status = redis.getMap(RedisConstant.AGV_CHARGE_FLAG, key); if (null == status) { 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()); ModbusTCPMaster modbusTCPMaster = chargeService.get(funcSta.getUuid()); if (null == agvDetail || null == agvDetail.getSoc() || null == agvDetail.getAgvStatus() || funcSta == null || null == modbusTCPMaster) { continue; } ChargeCoreService chargeCoreService = chargeStrategyFactory.getService(ChargerType.getByCode(funcSta.getProtocol())); 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 start:{}", agvDetail.getAgvId$()); } else { log.info("read charge current and voltage: {},{}", current, voltage); } } else { log.info("前进到位信号失败:车号:{}", agvDetail.getAgvId$()); } break; case 2: // 如果充电机完成充电会自动断开 // 但充电标识哈在缓存中,那么需要清除缓存标记 // 获取充电机编号且后退到位信号存在,那么说明机械臂已经伸回,那么就需要清除缓存 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$()); } } } 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: log.error("charge status error: {}", status); break; } } } }