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 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; } }