From fde40418c24abc757075c033b46f8543c5b347c4 Mon Sep 17 00:00:00 2001 From: cbs <18617195505@163.com> Date: Sat, 22 Mar 2025 09:03:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=85=E7=94=B5=E6=A1=A9=E4=BC=B8=E7=BC=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/robot/RobotTaskStatusApiImpl.java | 16 ++- .../information/DeviceInformationService.java | 12 ++ .../DeviceInformationServiceImpl.java | 106 ++++++++++++++++++ .../service/robot/RobotTaskServiceImpl.java | 11 +- .../system/util/modbus3/ModbusUtils.java | 5 +- .../util/modbus3/SerialPortMasterTest.java | 22 +++- 6 files changed, 164 insertions(+), 8 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java index 66e7db68d..5b84969a1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java @@ -27,6 +27,7 @@ import cn.iocoder.yudao.module.system.enums.robot.charge.ChargeTaskStatusEnum; import cn.iocoder.yudao.module.system.enums.robot.task.RobotStatusCodeEnum; import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaskStageEnum; import cn.iocoder.yudao.module.system.enums.wait.WaitStatusEnum; +import cn.iocoder.yudao.module.system.service.information.DeviceInformationService; import cn.iocoder.yudao.module.system.service.path.PathPlanningService; import cn.iocoder.yudao.module.system.service.robot.RobotInformationService; import cn.iocoder.yudao.module.system.service.robot.RobotTaskDetailService; @@ -112,6 +113,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { @Resource private RobotTaskService taskService; + @Resource + private DeviceInformationService deviceInformationService; + @Value("${zn.robot_doing_action.doing_action_cache_time:2*24*60*60}") private Long doingActionCacheTime; @@ -159,6 +163,16 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { taskDoing(robotCompleteTaskDTO, robotDoingActionKey); } + if ((PathTaskTypeEnum.AUTO_CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType()) + || PathTaskTypeEnum.CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType())) + && ObjectUtil.isNotEmpty(robotCompleteTaskDTO.getCommandStatus()) + && CommandTypeEnum.MOVE_POSES.getType().equals(robotCompleteTaskDTO.getCommandStatus().getCommandType()) + && RobotExecutionStateConstant.DONE.equals(robotCompleteTaskDTO.getCommandStatus().getExecutionState())) { + log.info("充电任务准备让充电设备自动伸出 :{}",robotCompleteTaskDTO.getOrderId()); + RobotChargeLogDO robotChargeLog = chargeLogMapper.selectById(robotCompleteTaskDTO.getOrderId()); + deviceInformationService.chargeDeviceExtend(robotChargeLog.getDeviceNo()); + } + sendStartDoActionToPP(robotCompleteTaskDTO.getCommandStatus(), robotCompleteTaskDTO.getMac(), String.valueOf(robotCompleteTaskDTO.getOrderId())); } @@ -273,7 +287,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { .warnCode(robotCompleteTaskDTO.getStatusCode()) .robotNo(robotNo) .warnType(RobotWarnType.ROBOT_WARN.getType()) - .warnMsg(robotNo +"_"+robotCompleteTaskDTO.getMessage()) + .warnMsg(robotNo + "_" + robotCompleteTaskDTO.getMessage()) .warnSolve(robotCompleteTaskDTO.getSolution()) .build(); warnMsgMapper.insert(warnMsg); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationService.java index 52cbc2345..ca3d2fbca 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationService.java @@ -118,4 +118,16 @@ public interface DeviceInformationService extends IService * @return */ List getDeviceInfoBindByMapId(Long positionMapId); + + /** + * 充电任务,让设备伸出 + * @param deviceNo + */ + void chargeDeviceExtend(String deviceNo); + + /** + * 充电设备, 缩 + * @param deviceNo + */ + void chargeDeviceShrink(String deviceNo); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java index ec66cdfd6..55ea7d32d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java @@ -18,14 +18,21 @@ import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformati import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO; import cn.iocoder.yudao.module.system.dal.mysql.information.DeviceInformationMapper; import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper; +import cn.iocoder.yudao.module.system.enums.device.DeviceAttributeEnum; import cn.iocoder.yudao.module.system.enums.device.DeviceStatusEnum; +import cn.iocoder.yudao.module.system.enums.device.DeviceTypeEnum; import cn.iocoder.yudao.module.system.enums.device.PictureConfigEnum; import cn.iocoder.yudao.module.system.service.dict.DictDataService; import cn.iocoder.yudao.module.system.service.log.UserOperationLogService; +import cn.iocoder.yudao.module.system.util.modbus3.ModbusUtils; import cn.iocoder.yudao.module.system.util.redis.RedisUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.serotonin.modbus4j.ModbusMaster; +import com.serotonin.modbus4j.exception.ModbusInitException; +import com.serotonin.modbus4j.exception.ModbusTransportException; import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -317,6 +324,105 @@ public class DeviceInformationServiceImpl extends ServiceImpl() + .eq(DeviceInformationDO::getDeviceNo, deviceNo)); + if (ObjectUtil.isEmpty(deviceInformationDO)) { + log.info("查不到此充电设备 :{}", deviceNo); + return; + } + if (DeviceAttributeEnum.HAND_MOVEMENT.getType().equals(deviceInformationDO.getDeviceAttribute())) { + log.info("手动充电设备,不需要伸出 :{}", deviceNo); + return; + } + if (!DeviceTypeEnum.CHARGING_STATION.getType().equals(deviceInformationDO.getDeviceType())) { + log.info("非充电设备,不能伸出 :{}", deviceNo); + return; + } + if (ObjectUtil.isEmpty(deviceInformationDO.getDeviceIp()) || ObjectUtil.isEmpty(deviceInformationDO.getDevicePort())) { + log.info("没有设备IP、端口不能伸出 :{}", deviceNo); + return; + } + log.info("设备伸出 :{}",deviceNo); + extend(deviceInformationDO.getDeviceIp(), Integer.parseInt(deviceInformationDO.getDevicePort())); + } + + /** + * 充电任务,缩 + * @param deviceNo + */ + @Override + @Async + public void chargeDeviceShrink(String deviceNo) { + DeviceInformationDO deviceInformationDO = informationMapper.selectOne(new LambdaQueryWrapperX() + .eq(DeviceInformationDO::getDeviceNo, deviceNo)); + if (DeviceAttributeEnum.HAND_MOVEMENT.getType().equals(deviceInformationDO.getDeviceAttribute())) { + log.info("手动充电设备,不需要缩 :{}", deviceNo); + return; + } + if (!DeviceTypeEnum.CHARGING_STATION.getType().equals(deviceInformationDO.getDeviceType())) { + log.info("非充电设备,不能缩回 :{}", deviceNo); + return; + } + if (ObjectUtil.isEmpty(deviceInformationDO.getDeviceIp()) || ObjectUtil.isEmpty(deviceInformationDO.getDevicePort())) { + log.info("没有设备IP、端口不能缩回 :{}", deviceNo); + return; + } + log.info("设备缩回 :{}",deviceNo); + shrink(deviceInformationDO.getDeviceIp(), Integer.parseInt(deviceInformationDO.getDevicePort())); + } + + public void shrink(String ip, int port) { + boolean success = true; + short[] shrinkArr = {0}; + for (int i = 0; i < 3; i++) { + try { + ModbusMaster asciiMaster = ModbusUtils.getMaster(ip, port); + ModbusUtils.writeHoldingRegisters(asciiMaster, 1, 0, shrinkArr); + } catch (ModbusInitException | ModbusTransportException e) { + log.info("充电设备缩回时,出现异常 :{}", ip); + success = false; + } + + if (success) { + return; + } + } + } + + /** + * 控制设备伸缩 + * @param ip + * @param port + */ + public void extend(String ip, int port) { + boolean success = true; + short[] extendArr = {1}; + short[] shrinkArr = {0}; + for (int i = 0; i < 3; i++) { + try { + ModbusMaster asciiMaster = ModbusUtils.getMaster(ip, port); + ModbusUtils.writeHoldingRegisters(asciiMaster, 1, 0, shrinkArr); + Thread.sleep(2500); + ModbusUtils.writeHoldingRegisters(asciiMaster, 1, 0, extendArr); + } catch (ModbusInitException | ModbusTransportException | InterruptedException e) { + log.info("充电设备伸出时,出现异常 :{}", ip); + success = false; + } + + if (success) { + return; + } + } + } + @Override public void mapBindDeviceInfo(MapBindDeviceInfoDTO dto) { DeviceInformationDO deviceInformationDO = informationMapper.selectById(dto.getDeviceInfoId()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java index 698051b98..61bd2288d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java @@ -49,6 +49,7 @@ import cn.iocoder.yudao.module.system.enums.robot.charge.ChargeTaskStatusEnum; import cn.iocoder.yudao.module.system.enums.robot.task.RobotCommandTypeEnum; //import cn.iocoder.yudao.module.system.service.robot.job.RobotCommonTaskService; import cn.iocoder.yudao.module.system.enums.wait.WaitStatusEnum; +import cn.iocoder.yudao.module.system.service.information.DeviceInformationService; import cn.iocoder.yudao.module.system.service.log.UserOperationLogService; import cn.iocoder.yudao.module.system.service.wait.MoveToWaitService; import cn.iocoder.yudao.module.system.util.redis.RedisUtil; @@ -154,6 +155,9 @@ public class RobotTaskServiceImpl extends ServiceImpl deviceNoMap = new HashMap<>(); - RobotChargeLogDO robotChargeLogs = null; - Integer robotStatus = RobotStatusEnum.DOING.getType(); if (PathTaskTypeEnum.AUTO_CHARGE.getType().equals(taskAssignDTO.getOrderType())) { - robotChargeLogs = chargeLogMapper.selectById(taskAssignDTO.getOrderId()); + RobotChargeLogDO robotChargeLogs = chargeLogMapper.selectById(taskAssignDTO.getOrderId()); robotChargeLogs.setTaskStatus(ChargeTaskStatusEnum.DOING.getType()); chargeLogMapper.updateById(robotChargeLogs); @@ -1270,8 +1272,9 @@ public class RobotTaskServiceImpl extends ServiceImpl loc = BaseLocator.holdingRegister(1, 9, DataType.TWO_BYTE_INT_UNSIGNED); + Number value = master.getValue(loc); + byte b = value.byteValue(); + System.out.println("----------"+b); + System.out.println("结果 "+ value.longValue()); + } catch (Exception e) { + throw new RuntimeException(e); + } } } \ No newline at end of file