package com.zy.acs.charge.impl; import com.ghgande.j2mod.modbus.ModbusException; import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster; import com.ghgande.j2mod.modbus.procimg.Register; import com.ghgande.j2mod.modbus.procimg.SimpleRegister; import com.ghgande.j2mod.modbus.util.BitVector; import com.zy.acs.charge.ChargeCoreService; import com.zy.acs.charge.constant.AiPowerChargeCoilEnum; import com.zy.acs.charge.constant.AiPowerChargeRegisterEnum; import com.zy.acs.charge.constant.ChargerType; import com.zy.acs.charge.model.ChargerStatus; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** * 爱普拉AGV锂电智能充电机调度 */ @Service("aiPowerChargeService") @Slf4j public class AiPowerChargeServiceImpl implements ChargeCoreService { @Override public ChargerType supportedType() { return ChargerType.Modbus; } /** * 开始充电 * * @param client * @return */ @Override public boolean startCharging(ModbusTCPMaster client) { // AGV车报告到位 -> true try { if (!client.isConnected()) { client.connect(); } return client.writeCoil(AiPowerChargeCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), true); } catch (Exception e) { log.info("写入开始充电指令报错:{} ", e.getMessage()); }finally { //client.disconnect(); } return false; } /** * 停止充电 * * @param client * @return */ @Override public boolean stopCharging(ModbusTCPMaster client) { try { if (!client.isConnected()) { client.connect(); } return client.writeCoil(AiPowerChargeCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false); } catch (Exception e) { log.info("写入停止充电指令报错:{} ", e.getMessage()); }finally { //client.disconnect(); } return false; } /** * 在线正继电器状态(前进到位) * * @param client * @return */ @Override public boolean checkForwardRelayOnline(ModbusTCPMaster client) { try { if (!client.isConnected()) { client.connect(); } return client.readCoils(AiPowerChargeCoilEnum.FORWARD_RELAY_ONLINE.getAddr(), 1).getBit(0); } catch (Exception e) { log.info("读取在线正继电器状态报错:{} ", e.getMessage()); }finally { //client.disconnect(); } return false; } /** * 离线正继电器状态(后退到位) * * @param client * @return */ @Override public boolean checkBackwardRelayOffline(ModbusTCPMaster client) { try { if (!client.isConnected()) { client.connect(); } return client.readCoils(AiPowerChargeCoilEnum.BACKWARD_RELAY_OFFLINE.getAddr(), 1).getBit(0); } catch (Exception e) { log.info("读取离线正继电器状态报错:{} ", e.getMessage()); }finally { //client.disconnect(); } return false; } /** * 获取充电机充电电压 * * @param client * @return */ @Override public double getVoltage(ModbusTCPMaster client) { try { if (!client.isConnected()) { client.connect(); } return client.readMultipleRegisters(AiPowerChargeRegisterEnum.CHARGE_VOLTAGE.getAddr(), 1)[0].getValue() * AiPowerChargeRegisterEnum.CHARGE_CURRENT.getRaw(); } catch (Exception e) { log.info("读取充电电压报错:{} ", e.getMessage()); }finally { //client.disconnect(); } return 0; } /** * 获取充电机充电电流 * * @param client * @return */ @Override public double getCurrent(ModbusTCPMaster client) { try { if (!client.isConnected()) { client.connect(); } return client.readMultipleRegisters(AiPowerChargeRegisterEnum.CHARGE_CURRENT.getAddr(), 1)[0].getValue() * AiPowerChargeRegisterEnum.CHARGE_CURRENT.getRaw(); } catch (Exception e) { log.info("读取充电电流报错:{} ", e.getMessage()); }finally { //client.disconnect(); } return 0; } /** * 获取充电机充电模式 * * @param client * @return */ @Override public int getChargeMode(ModbusTCPMaster client) { try { if (!client.isConnected()) { client.connect(); } return client.readMultipleRegisters(AiPowerChargeRegisterEnum.CHARGE_MODE.getAddr(), 1)[0].getValue(); } catch (Exception e) { e.printStackTrace(); log.info("读取充电模式报错:{} ", e.getMessage()); }finally { //client.disconnect(); } return -1; } /** * 获取充电机编号 * * @param client * @return */ @Override public int getChargeId(ModbusTCPMaster client) { try { if (!client.isConnected()) { client.connect(); } return client.readMultipleRegisters(AiPowerChargeRegisterEnum.CHARGER_ID.getAddr(), 1)[0].getValue(); } catch (Exception e) { e.printStackTrace(); log.info("读取充电机编号报错:{} ", e.getMessage()); }finally { //client.disconnect(); } return -1; } /** * 获取充电机状态 * * @param client * @return */ @Override public ChargerStatus getStatus(ModbusTCPMaster client) { ChargerStatus status = new ChargerStatus(); // ---------- 批量读取线圈(地址100~115共16个) ---------- BitVector coils = null; try { if (!client.isConnected()) { client.connect(); } coils = client.readCoils(AiPowerChargeCoilEnum.WORK_STATUS.getAddr(), AiPowerChargeCoilEnum.values().length); for (int i = 0; i < coils.size(); i++) { switch (i) { case 0: status.setWorking(coils.getBit(i)); break; case 1: status.setOverheat(coils.getBit(i)); break; case 2: status.setFault(coils.getBit(i)); break; case 3: status.setCvMode(coils.getBit(i)); break; case 4: status.setBatteryConnected(coils.getBit(i)); break; case 5: status.setFanAbnormal(coils.getBit(i)); break; case 6: status.setPlateOverheat(coils.getBit(i)); break; case 7: status.setBrushPressed(coils.getBit(i)); break; case 8: status.setAgvReportedInPosition(coils.getBit(i)); break; case 9: status.setChargerConfirmedAgvReady(coils.getBit(i)); break; case 10: status.setForwardRelayOnline(coils.getBit(i)); break; case 11: status.setBackwardRelayOffline(coils.getBit(i)); break; case 12: status.setBmsChargeEnable(coils.getBit(i)); break; case 13: status.setCommRs485Success(!coils.getBit(i)); break; case 14: status.setCommCanSuccess(!coils.getBit(i)); break; case 15: status.setCommBmsSuccess(!coils.getBit(i)); break; default: break; } } // ---------- 批量读取保持寄存器(地址100~116共17个) ---------- Register[] registers = client.readMultipleRegisters(AiPowerChargeRegisterEnum.CHARGE_VOLTAGE.getAddr(), AiPowerChargeRegisterEnum.values().length); for (int i = 0; i < registers.length; i++) { switch (i) { case 0: status.setVoltage(registers[i].getValue() * AiPowerChargeRegisterEnum.CHARGE_VOLTAGE.getRaw()); break; case 1: status.setCurrent(registers[i].getValue() * AiPowerChargeRegisterEnum.CHARGE_CURRENT.getRaw()); break; case 2: status.setChargingTime(registers[i].getValue()); break; case 3: status.setCapacity(registers[i].getValue() * AiPowerChargeRegisterEnum.CHARGE_CAPACITY.getRaw()); break; case 4: status.setEnergy(registers[i].getValue() * AiPowerChargeRegisterEnum.CHARGE_ENERGY.getRaw()); break; case 5: status.setCellMaxVoltage(registers[i].getValue()); break; case 6: status.setCellMinVoltage(registers[i].getValue()); break; case 7: status.setPackVoltage(registers[i].getValue() * AiPowerChargeRegisterEnum.BMS_PACK_VOLTAGE.getRaw()); break; case 8: status.setVoltageDemand(registers[i].getValue() * AiPowerChargeRegisterEnum.BMS_VOLTAGE_DEMAND.getRaw()); break; case 9: status.setCurrentDemand(registers[i].getValue() * AiPowerChargeRegisterEnum.BMS_CURRENT_DEMAND.getRaw()); break; case 10: status.setTemperature(registers[i].getValue()); break; case 11: status.setSoc(registers[i].getValue() * AiPowerChargeRegisterEnum.BMS_SOC.getRaw()); break; case 12: status.setEndFlag(registers[i].getValue()); break; case 13: status.setChargerId(registers[i].getValue()); break; case 14: status.setFaultCode(registers[i].getValue()); break; case 15: status.setChargeMode(registers[i].getValue()); break; case 16: status.setScheduleFlag(registers[i].getValue()); break; default: break; } } } catch (Exception e) { log.info("批量读取线圈报错:{} ", e.getMessage()); log.info("批量读取保持寄存器报错:{} ", e.getMessage()); }finally { //client.disconnect(); } return status; } /** * 清除故障 * * @param client * @return */ @Override public boolean clearFault(ModbusTCPMaster client) { try { client.writeSingleRegister(AiPowerChargeRegisterEnum.SCHEDULE_FLAG.getAddr(), new SimpleRegister(1)); } catch (ModbusException e) { log.error("充电器清除故障失败......"); } return true; } /** * 完成退回 * * @param client * @return */ @Override public boolean finishRetract(ModbusTCPMaster client) { try { client.writeSingleRegister(AiPowerChargeRegisterEnum.SCHEDULE_FLAG.getAddr(), new SimpleRegister(2)); } catch (ModbusException e) { log.error("充电器完成退回失败......"); } return true; } /** * 恢复待机 * * @param client * @return */ @Override public boolean restoreStandby(ModbusTCPMaster client) { try { client.writeSingleRegister(AiPowerChargeRegisterEnum.SCHEDULE_FLAG.getAddr(), new SimpleRegister(3)); } catch (ModbusException e) { log.error("充电器恢复待机失败......"); } return true; } }