using HslCommunication; using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_Tasks.ConveyorLineJob; using WIDESEAWCS_Tasks.ElevatorJob; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class CommonAGVJob : JobBase, IJob { private readonly ITaskRepository _taskRepository; private readonly ITaskService _taskService; public CommonAGVJob(ITaskRepository taskRepository,ITaskService taskService) { _taskRepository = taskRepository; _taskService = taskService; } public Task Execute(IJobExecutionContext context) { #region AGV跨楼层任务 var AcrossFloorTask = _taskRepository.QueryFirst(x => x.TaskState == (int)TaskAcrossFloorStatusEnum.CarryNew); if (AcrossFloorTask != null) { var task = _taskRepository.QueryFirst(x => x.TaskState > (int)TaskAcrossFloorStatusEnum.CarryNew && x.TaskState < (int)TaskAcrossFloorStatusEnum.SecondCarryFinish); if(task == null) { CommonElevator? elevator = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "TSJ1") as CommonElevator; if (elevator != null) { if (elevator.GetValue(ElevatorDBName.Model) == 1) { if (AcrossFloorTask.Floor == "1F") { elevator.SetValue(ElevatorDBName.FlagBit, Convert.ToInt16(1)); elevator.SetValue(ElevatorDBName.StartFloor, Convert.ToInt16(1)); elevator.SetValue(ElevatorDBName.EdnFloor, Convert.ToInt16(2)); Thread.Sleep(1000); elevator.SetValue(ElevatorDBName.StartCommand, Convert.ToInt16(1)); _taskService.SendAgvTask("AAA", AcrossFloorTask.TaskNum); AcrossFloorTask.TaskState = (int)TaskAcrossFloorStatusEnum.FirstCarry; _taskRepository.UpdateData(AcrossFloorTask); } else { elevator.SetValue(ElevatorDBName.FlagBit, Convert.ToInt16(1)); elevator.SetValue(ElevatorDBName.StartFloor, Convert.ToInt16(2)); elevator.SetValue(ElevatorDBName.EdnFloor, Convert.ToInt16(1)); Thread.Sleep(1000); elevator.SetValue(ElevatorDBName.StartCommand, Convert.ToInt16(1)); _taskService.SendAgvTask("DDD", AcrossFloorTask.TaskNum); AcrossFloorTask.TaskState = (int)TaskAcrossFloorStatusEnum.FirstCarry; _taskRepository.UpdateData(AcrossFloorTask); } } } } } #endregion #region AGV同层搬运任务 var Carry = _taskRepository.QueryFirst(x => x.TaskState == (int)TaskAGVCarryStatusEnum.CarryNew); if (Carry != null) { if (Carry.Floor == "1F") { _taskService.SendAgvTask("forkAutoTemplate1", Carry.TaskNum); Carry.TaskState = (int)TaskAGVCarryStatusEnum.AGV_CarryExecuting; _taskRepository.UpdateData(Carry); } else { _taskService.SendAgvTask("cattleCarry1", Carry.TaskNum); Carry.TaskState = (int)TaskAGVCarryStatusEnum.AGV_CarryExecuting; _taskRepository.UpdateData(Carry); } } #endregion #region 1楼AGV入库任务 var InTask = _taskRepository.QueryFirst(x => x.TaskState == (int)TaskInStatusEnum.InNew); if (InTask != null) { var OutTask = _taskRepository.QueryFirst(x => x.TaskState >= (int)TaskOutStatusEnum.OutNew && x.TaskState <(int)TaskOutStatusEnum.AGV_OutExecuting); var Task = _taskRepository.QueryFirst(x => x.TaskState > (int)TaskInStatusEnum.InNew && x.TaskState < (int)TaskInStatusEnum.SC_InExecuting); if (OutTask == null && Task == null) { CommonConveyorLine? conveyorLine = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "1001") as CommonConveyorLine; if (conveyorLine != null) { short InteractiveSignal = conveyorLine.GetValue(ConveyorLineDBName.InteractiveSignal, "LK001"); var structs = BitConverter.GetBytes(InteractiveSignal).Reverse().ToArray().ToBoolArray(); if (structs[0]) { conveyorLine.Communicator.WriteNoRead("DB100.0", 9999); _taskService.SendAgvTask("LIFANG", InTask.TaskNum); _taskService.UpdateTaskStatusToNext(InTask.TaskNum); } } } } #endregion return Task.CompletedTask; } } }