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<String> 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;
|
}
|
}
|
}
|
}
|