1
zhang
2026-03-31 24f6766a113090fb97f9dd399586b61a364702ae
zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java
@@ -1,14 +1,18 @@
package com.zy.acs.charge.impl;
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
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.charge.protocol.ModbusAdapter;
import com.zy.acs.common.utils.ByteUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.List;
/**
 * 爱普拉AGV锂电智能充电机调度
@@ -18,103 +22,89 @@
@Slf4j
public class AiPowerChargeServiceImpl implements ChargeCoreService {
    @Autowired
    private ModbusAdapter modbusAdapter;
    @Override
    public boolean connect() throws Exception {
        modbusAdapter.connect();
        return true;
    }
    @Override
    public void disconnect() {
        modbusAdapter.disconnect();
    }
    @Override
    public boolean isConnected() {
        // 可以通过尝试读取一个寄存器来判断,但为了简单,这里直接返回连接状态(需改造 ModbusAdapter 暴露状态)
        // 可在 ModbusAdapter 中添加 isConnected() 方法
        return false; // 待实现
    }
    @Override
    public boolean startCharging() throws Exception {
    public boolean startCharging(ModbusTcp modbusTcp) {
        // AGV车报告到位 -> true
        modbusAdapter.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), true);
        modbusTcp.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), true);
        return true;
    }
    @Override
    public boolean stopCharging() throws Exception {
        modbusAdapter.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false);
    public boolean stopCharging(ModbusTcp modbusTcp)  {
        modbusTcp.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false);
        return true;
    }
    @Override
    public ChargerStatus getStatus() throws Exception {
    public ChargerStatus getStatus(ModbusTcp modbusTcp)  {
        ChargerStatus status = new ChargerStatus();
        // ---------- 批量读取线圈(地址100~115共16个) ----------
        boolean[] coils = modbusAdapter.readCoils(100, 16);
        status.setWorking(coils[0]);                      // 地址100
        status.setOverheat(coils[1]);                     // 101
        status.setFault(coils[2]);                        // 102
        status.setCvMode(coils[3]);                       // 103
        status.setBatteryConnected(coils[4]);              // 104
        status.setFanAbnormal(coils[5]);                   // 105
        status.setPlateOverheat(coils[6]);                 // 106
        status.setBrushPressed(coils[7]);                  // 107
        status.setAgvReportedInPosition(coils[8]);         // 108
        status.setChargerConfirmedAgvReady(coils[9]);      // 109
        status.setForwardRelayOnline(coils[10]);           // 110
        status.setBackwardRelayOffline(coils[11]);         // 111
        status.setBmsChargeEnable(coils[12]);              // 112
        status.setCommRs485Success(!coils[13]);            // 113(注意:0=成功,1=超时)
        status.setCommCanSuccess(!coils[14]);              // 114
        status.setCommBmsSuccess(!coils[15]);              // 115
        List<Boolean> coils = modbusTcp.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个) ----------
        int[] regs = modbusAdapter.readHoldingRegisters(100, 17);
        status.setVoltage(regs[0] * AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getRaw());
        status.setCurrent(regs[1] * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw());
        status.setChargingTime(regs[2]);
        status.setCapacity(regs[3] * AiPowerChargerRegisterEnum.CHARGE_CAPACITY.getRaw());
        status.setEnergy(regs[4] * AiPowerChargerRegisterEnum.CHARGE_ENERGY.getRaw());
        status.setCellMaxVoltage(regs[5]);
        status.setCellMinVoltage(regs[6]);
        status.setPackVoltage(regs[7] * AiPowerChargerRegisterEnum.BMS_PACK_VOLTAGE.getRaw());
        status.setVoltageDemand(regs[8] * AiPowerChargerRegisterEnum.BMS_VOLTAGE_DEMAND.getRaw());
        status.setCurrentDemand(regs[9] * AiPowerChargerRegisterEnum.BMS_CURRENT_DEMAND.getRaw());
        status.setTemperature(regs[10]);
        status.setSoc(regs[11] * AiPowerChargerRegisterEnum.BMS_SOC.getRaw());
        status.setEndFlag(regs[12]);
        status.setChargerId(regs[13]);
        status.setFaultCode(regs[14]);
        status.setChargeMode(regs[15]);
        status.setScheduleFlag(regs[16]);
        byte[] bytes = modbusTcp.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 setVoltage(int voltageDecivolts) throws Exception {
        // BMS无时才允许写入,这里假设允许
        modbusAdapter.writeHoldingRegister(AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getAddr(), voltageDecivolts);
    public boolean clearFault(ModbusTcp modbusTcp)  {
        modbusTcp.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 1);
        return true;
    }
    // 完成退回命令
    @Override
    public boolean setCurrent(int currentDecamperes) throws Exception {
        modbusAdapter.writeHoldingRegister(AiPowerChargerRegisterEnum.CHARGE_CURRENT.getAddr(), currentDecamperes);
    public boolean finishRetract(ModbusTcp modbusTcp)  {
        modbusTcp.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 2);
        return true;
    }
    // 恢复待机状态
    @Override
    public boolean clearFault() throws Exception {
        // 写入调度标识地址为1:清除故障
        modbusAdapter.writeHoldingRegister(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), 1);
    public boolean restoreStandby(ModbusTcp modbusTcp)  {
        modbusTcp.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 3);
        return true;
    }
}