zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java
@@ -1,6 +1,6 @@ package com.zy.acs.charge; import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp; import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp; import com.zy.acs.charge.model.ChargerStatus; /** @@ -8,20 +8,63 @@ */ public interface ChargeCoreService { /** * 调度开启充电 * * @param client * @return */ boolean startCharging(ModbusRtuOverTcp client); boolean startCharging(ModbusTcp modbusTcp) ; /** * 调度停止充电 * * @param client * @return */ boolean stopCharging(ModbusRtuOverTcp client); boolean stopCharging(ModbusTcp modbusTcp) ; ChargerStatus getStatus(ModbusTcp modbusTcp) ; /** * 在线正继电器状态(前进到位) * * @param client * @return */ boolean checkForwardRelayOnline(ModbusRtuOverTcp client); /** * 离线正继电器状态(后退到位) * * @param client * @return */ boolean checkBackwardRelayOffline(ModbusRtuOverTcp client); boolean clearFault(ModbusTcp modbusTcp) ; /** * 获取充电机充电电压 * * @param client * @return */ double getVoltage(ModbusRtuOverTcp client); boolean finishRetract(ModbusTcp modbusTcp) ; /** * 获取充电机充电电流 * * @param client * @return */ double getCurrent(ModbusRtuOverTcp client); boolean restoreStandby(ModbusTcp modbusTcp) ; ChargerStatus getStatus(ModbusRtuOverTcp client); boolean clearFault(ModbusRtuOverTcp client); boolean finishRetract(ModbusRtuOverTcp client); boolean restoreStandby(ModbusRtuOverTcp client); } zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java
@@ -1,17 +1,15 @@ package com.zy.acs.charge.impl; import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp; 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.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.List; /** @@ -22,30 +20,46 @@ @Slf4j public class AiPowerChargeServiceImpl implements ChargeCoreService { @Override public boolean startCharging(ModbusTcp modbusTcp) { public boolean startCharging(ModbusRtuOverTcp client) { // AGV车报告到位 -> true modbusTcp.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), true); client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), true); return true; } @Override public boolean stopCharging(ModbusTcp modbusTcp) { modbusTcp.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false); public boolean stopCharging(ModbusRtuOverTcp client) { client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false); return true; } @Override public ChargerStatus getStatus(ModbusTcp modbusTcp) { 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<Boolean> coils = modbusTcp.readCoil(100, 16); List<Boolean> coils = client.readCoil(100, 16); status.setWorking(coils.get(0)); // 地址100 status.setOverheat(coils.get(0)); // 101 status.setFault(coils.get(0)); // 102 @@ -64,24 +78,24 @@ status.setCommBmsSuccess(!coils.get(15)); // 115 // ---------- 批量读取保持寄存器(地址100~116共17个) ---------- 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)); 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; } @@ -89,22 +103,22 @@ // 清除故障 @Override public boolean clearFault(ModbusTcp modbusTcp) { modbusTcp.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 1); public boolean clearFault(ModbusRtuOverTcp client) { client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 1); return true; } // 完成退回命令 @Override public boolean finishRetract(ModbusTcp modbusTcp) { modbusTcp.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 2); public boolean finishRetract(ModbusRtuOverTcp client) { client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 2); return true; } // 恢复待机状态 @Override public boolean restoreStandby(ModbusTcp modbusTcp) { modbusTcp.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 3); public boolean restoreStandby(ModbusRtuOverTcp client) { client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 3); return true; } } zy-acs-common/src/main/java/com/zy/acs/common/constant/RedisConstant.java
@@ -54,7 +54,9 @@ public static final String MAP_LANE_DATA = "MAP_LANE_DATA"; public static final String MAP_AREA_DATA_FLAG = "MAP_AREA_DATA_FLAG"; /** * 在redis中存MAP,value表示状态:1小车到位,2下发充电命令,3后退到位消失,4前进到位出现,5电流电压>0,6 */ public static final String AGV_CHARGE_FLAG = "AGV_CHARGE_FLAG"; } zy-acs-flow/src/page/funcTask/FuncTaskCreate.jsx
File was deleted zy-acs-flow/src/page/funcTask/FuncTaskEdit.jsx
File was deleted zy-acs-flow/src/page/funcTask/FuncTaskList.jsx
File was deleted zy-acs-flow/src/page/funcTask/FuncTaskPanel.jsx
File was deleted zy-acs-flow/src/page/funcTask/index.jsx
File was deleted zy-acs-manager/pom.xml
@@ -171,6 +171,12 @@ <artifactId>iot-communication</artifactId> <version>1.5.6</version> </dependency> <dependency> <groupId>com.zy</groupId> <artifactId>acs-charge</artifactId> <version>1.0.0</version> <scope>compile</scope> </dependency> </dependencies> <build> zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -1,6 +1,10 @@ package com.zy.acs.manager.core.scheduler; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp; import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp; import com.zy.acs.charge.ChargeCoreService; import com.zy.acs.common.constant.RedisConstant; import com.zy.acs.common.enums.AgvStatusType; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.framework.common.Cools; @@ -8,6 +12,7 @@ import com.zy.acs.manager.common.config.UplinkProperties; import com.zy.acs.manager.core.integrate.wms.TaskReportService; import com.zy.acs.manager.core.integrate.wms.FaultReportService; import com.zy.acs.manager.core.service.ChargeService; import com.zy.acs.manager.core.service.MainLockWrapService; import com.zy.acs.manager.manager.entity.*; import com.zy.acs.manager.manager.enums.*; @@ -23,6 +28,7 @@ import java.util.Date; import java.util.List; import java.util.Optional; import java.util.Set; /** * judge whether agv go to funcSta which be charging or standby @@ -59,7 +65,9 @@ @Autowired private FaultReportService faultReportService; @Autowired private FuncTaskService funcTaskService; private ChargeService chargeService; @Autowired private ChargeCoreService chargeCoreService; @Scheduled(cron = "0/5 * * * * ? ") @@ -119,6 +127,10 @@ // if (agvDetailService.isPowerLoss(agv, agvDetail, agvModel)) { // continue; // } // 存在充电标记,跳过 if (redis.getMap(RedisConstant.AGV_CHARGE_FLAG, agv.getUuid()) != null) { continue; } // is charging ? if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) { if (agvDetail.getSoc() < agvModel.getQuaBattery()) { @@ -221,12 +233,46 @@ } /** * 调度对接充电桩 */ @Scheduled(cron = "0/5 * * * * ? ") private synchronized void workFuncTask() { List<FuncTask> funcTaskList = funcTaskService.list(new LambdaQueryWrapper<FuncTask>().eq(FuncTask::getFuncTaskSts, TaskStsType.INIT.toString())); for (FuncTask funcTask : funcTaskList) { // 调度小车去对接充电桩 private synchronized void startCharge() { Set<String> mapKeys = redis.getMapKeys(RedisConstant.AGV_CHARGE_FLAG); for (String key : mapKeys) { Integer status = redis.getMap(RedisConstant.AGV_CHARGE_FLAG, key); AgvDetail agvDetail = agvDetailService.selectByAgvNo(key); FuncSta funcSta = funcStaService.getByCodeAndType(agvDetail.getCode(), FuncStaType.CHARGE.toString()); ModbusRtuOverTcp modbusTcp = chargeService.get(funcSta.getUuid()); if (status != null && status == 1) { // 后退信号消失,说明马达正在前进 if (chargeCoreService.checkBackwardRelayOffline(modbusTcp)) { chargeCoreService.startCharging(modbusTcp); } while (chargeCoreService.checkForwardRelayOnline(modbusTcp)) { double current = chargeCoreService.getCurrent(modbusTcp); double voltage = chargeCoreService.getVoltage(modbusTcp); if (current > 0 && voltage > 0) { redis.setMap(RedisConstant.AGV_CHARGE_FLAG, key, 2); log.info("charge complete"); }else { log.info("read charge current and voltage: {},{}", current, voltage); } } } else if (status != null && status == 2) { // 后退信号消失,说明马达正在前进 if (chargeCoreService.checkForwardRelayOnline(modbusTcp)) { chargeCoreService.startCharging(modbusTcp); } while (chargeCoreService.checkBackwardRelayOffline(modbusTcp)) { redis.deleteMap(RedisConstant.AGV_CHARGE_FLAG, key); log.info("charge over"); } } } } } zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java
@@ -1,6 +1,7 @@ package com.zy.acs.manager.core.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp; import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp; import com.github.xingshuangs.iot.utils.HexUtil; import com.zy.acs.framework.common.Cools; @@ -25,7 +26,7 @@ @Autowired private FuncStaService funcStaService; private final Map<String, ModbusTcp> CHARGE_CACHE = new ConcurrentHashMap<>(); private final Map<String, ModbusRtuOverTcp> CHARGE_CACHE = new ConcurrentHashMap<>(); @PostConstruct @@ -42,7 +43,7 @@ public void add(FuncSta funcSta) { ModbusTcp modbusTcp = new ModbusTcp(funcSta.getIp(), funcSta.getPort()); ModbusRtuOverTcp modbusTcp = new ModbusRtuOverTcp(funcSta.getIp(), funcSta.getPort()); modbusTcp.setComCallback((tag, bytes) -> log.info("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes))); CHARGE_CACHE.put(funcSta.getUuid(), modbusTcp); } @@ -51,14 +52,15 @@ CHARGE_CACHE.remove(chargePointId); } public ModbusTcp get(String chargePointId) { ModbusTcp modbusTcp = CHARGE_CACHE.get(chargePointId); public ModbusRtuOverTcp get(String chargePointId) { ModbusRtuOverTcp modbusTcp = CHARGE_CACHE.get(chargePointId); if (modbusTcp != null) { return modbusTcp; } FuncSta funcSta = funcStaService.getOne(new LambdaQueryWrapper<FuncSta>().eq(FuncSta::getUuid, chargePointId)); modbusTcp = new ModbusTcp(funcSta.getIp(), funcSta.getPort()); modbusTcp = new ModbusRtuOverTcp(funcSta.getIp(), funcSta.getPort()); modbusTcp.setComCallback((tag, bytes) -> log.info("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes))); CHARGE_CACHE.put(chargePointId, modbusTcp); return modbusTcp; } zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -98,8 +98,7 @@ private StaReserveService staReserveService; @Autowired private ConveyorStationService conveyorStationService; @Autowired private FuncTaskService funcTaskService; @SuppressWarnings("all") @Transactional @@ -1990,13 +1989,7 @@ // 在充电任务行走到终点,同时判断充电桩的类型 if (segment.getPosType().equals(TaskPosDto.PosType.TO_CHARGE)){ // 保存一条数据 FuncTask funcTask = new FuncTask(); FuncSta destFuncSta = funcStaService.getByCodeAndType(task.getDestCode(), FuncStaType.CHARGE.toString()); funcTask.setFuncStaId(destFuncSta.getId()); funcTask.setAgvId(segment.getAgvId()); funcTask.setTaskId(segment.getTaskId()); funcTask.setFuncTaskSts(TaskStsType.INIT.val()); funcTaskService.save(funcTask); redis.setMap(RedisConstant.AGV_CHARGE_FLAG,segment.getAgvId$(),1); } task.setTaskSts(TaskStsType.COMPLETE.val()); task.setEndTime(now); zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/FuncTaskController.java
File was deleted zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/FuncSta.java
@@ -86,6 +86,12 @@ private Integer port; /** * 故障信息 */ @ApiModelProperty(value= "故障信息") private String error; /** * 现状 */ @ApiModelProperty(value= "现状") zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/FuncTask.java
File was deleted zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/FuncStaStateType.java
@@ -6,6 +6,7 @@ IDLE, OCCUPIED, ERROR, ; public static FuncStaStateType query(String state) { zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/FuncTaskMapper.java
File was deleted zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/FuncTaskService.java
File was deleted zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
@@ -224,6 +224,10 @@ return false; } } if (redis.getMap(RedisConstant.AGV_CHARGE_FLAG,agvDetail.getUuid()) != null) { log.warn("[{}]号Agv在redis存在充电标识......", agvNo); return false; } if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) { if (agvDetail.getSoc() < agvModel.getQuaBattery()) { return false; zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncTaskServiceImpl.java
File was deleted zy-acs-manager/src/main/java/funcTask.sql
File was deleted