| | |
| | | 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锂电智能充电机调度 |
| | |
| | | @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; |
| | | } |
| | | } |