充电桩伸缩

This commit is contained in:
cbs 2025-03-22 09:03:45 +08:00
parent b444194720
commit fde40418c2
6 changed files with 164 additions and 8 deletions

View File

@ -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);

View File

@ -118,4 +118,16 @@ public interface DeviceInformationService extends IService<DeviceInformationDO>
* @return
*/
List<DeviceInformationDO> getDeviceInfoBindByMapId(Long positionMapId);
/**
* 充电任务让设备伸出
* @param deviceNo
*/
void chargeDeviceExtend(String deviceNo);
/**
* 充电设备
* @param deviceNo
*/
void chargeDeviceShrink(String deviceNo);
}

View File

@ -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<DeviceInformationM
.isNotNull(DeviceInformationDO::getPositionMapItemId));
}
/**
* 充电任务让设备伸出
*
* @param deviceNo
*/
@Override
@Async
public void chargeDeviceExtend(String deviceNo) {
DeviceInformationDO deviceInformationDO = informationMapper.selectOne(new LambdaQueryWrapperX<DeviceInformationDO>()
.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<DeviceInformationDO>()
.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());

View File

@ -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<RobotTaskMapper, RobotTask
@Resource
private UserOperationLogService userOperationLogService;
@Resource
private DeviceInformationService deviceInformationService;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createTask(RobotTaskSaveReqVO createReqVO) throws InterruptedException {
@ -472,12 +476,10 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
Long detailId = null;
Map<Long, String> 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<RobotTaskMapper, RobotTask
if (ObjectUtil.isEmpty(robotChargeLogDO) || !ChargeTaskStatusEnum.CHARGEING.getType().equals(robotChargeLogDO.getTaskStatus())) {
return;
}
log.info("开始结束充电,并接任务 :{}", robotNo);
log.info("结束充电任务 :{}", robotNo);
robotChargeLogDO.setEndTime(LocalDateTime.now());
deviceInformationService.chargeDeviceShrink(robotChargeLogDO.getDeviceNo());
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + robotInformationDO.getMacAddress();
Object object = redisUtil.get(pose2dKey);

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.util.modbus3;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
@ -188,7 +189,7 @@ public class ModbusUtils {
* values 写入寄存器里的值
*/
public static void writeHoldingRegisters(ModbusMaster master, int slaveId, int startOffset, short[] values) throws ModbusTransportException {
WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, values);
ModbusResponse response = master.send(request);
WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, values);
master.send(request);
}
}

View File

@ -2,9 +2,11 @@ package cn.iocoder.yudao.module.system.util.modbus3;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.locator.BaseLocator;
public class SerialPortMasterTest {
public static void main(String[] args) throws ModbusTransportException, ErrorResponseException, ModbusInitException {
@ -17,7 +19,25 @@ public class SerialPortMasterTest {
/*float f = ModbusUtils.readHoldingRegister(asciiMaster, 1, 0, DataType.FOUR_BYTE_FLOAT).floatValue();
System.out.println(f);*/
//缩回去
short[] arr = {1};
ModbusUtils.writeHoldingRegisters(asciiMaster,1,1,arr);
//伸出来
// short[] arr = {1};
ModbusUtils.writeHoldingRegisters(asciiMaster,1,0,arr);
asciiMaster.destroy();
}
public void query() {
try {
ModbusMaster master = ModbusUtils.getMaster("192.168.10.234", 8899);
BaseLocator<Number> 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);
}
}
}