package com.zy.acs.charge.impl; 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 lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; /** * 爱普拉AGV锂电智能充电机调度 */ @Service @Primary @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 { // AGV车报告到位 -> true modbusAdapter.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); return true; } @Override public ChargerStatus getStatus() throws Exception { 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 // ---------- 批量读取保持寄存器(地址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]); return status; } @Override public boolean setVoltage(int voltageDecivolts) throws Exception { // BMS无时才允许写入,这里假设允许 modbusAdapter.writeHoldingRegister(AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getAddr(), voltageDecivolts); return true; } @Override public boolean setCurrent(int currentDecamperes) throws Exception { modbusAdapter.writeHoldingRegister(AiPowerChargerRegisterEnum.CHARGE_CURRENT.getAddr(), currentDecamperes); return true; } @Override public boolean clearFault() throws Exception { // 写入调度标识地址为1:清除故障 modbusAdapter.writeHoldingRegister(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), 1); return true; } }