1
zhang
2 天以前 c42a7c76e24940db9e81307dc67104d9068c3119
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
package com.zy.acs.charge.impl;
 
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp;
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锂电智能充电机调度
 */
@Service
@Primary
@Slf4j
public class AiPowerChargeServiceImpl implements ChargeCoreService {
 
 
    @Override
    public boolean startCharging(ModbusRtuOverTcp client) {
        // AGV车报告到位 -> true
        client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), true);
        return true;
    }
 
    @Override
    public boolean stopCharging(ModbusRtuOverTcp client) {
        client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false);
        return true;
    }
 
    @Override
    public boolean checkForwardRelayOnline(ModbusRtuOverTcp client) {
        return client.readBoolean(AiPowerChargerCoilEnum.FORWARD_RELAY_ONLINE.getAddr(), 1);
    }
 
    @Override
    public boolean checkBackwardRelayOffline(ModbusRtuOverTcp client) {
        return client.readBoolean(AiPowerChargerCoilEnum.BACKWARD_RELAY_OFFLINE.getAddr(), 1);
    }
 
    @Override
    public double getVoltage(ModbusRtuOverTcp client) {
        return client.readInt16(AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getAddr(), 1) * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
    }
 
    @Override
    public double getCurrent(ModbusRtuOverTcp client) {
        return client.readInt16(AiPowerChargerRegisterEnum.CHARGE_CURRENT.getAddr(), 1) * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
    }
 
    @Override
    public ChargerStatus getStatus(ModbusRtuOverTcp 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
 
        // ---------- 批量读取保持寄存器(地址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));
 
        return status;
    }
 
 
    // 清除故障
    @Override
    public boolean clearFault(ModbusRtuOverTcp client) {
        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 1);
        return true;
    }
 
    // 完成退回命令
    @Override
    public boolean finishRetract(ModbusRtuOverTcp client) {
        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 2);
        return true;
    }
 
    // 恢复待机状态
    @Override
    public boolean restoreStandby(ModbusRtuOverTcp client) {
        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 3);
        return true;
    }
}