zhang
2 天以前 bd956ec24c5995e6a2a585d6a4987c6b7de372c1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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;
            }
        }
    }
}