1
z8018
2025-05-05 b6837f097e9cdb2645368aed4ddb03f580c331e4
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Gantry/GantryJob.cs
@@ -8,10 +8,12 @@
using WIDESEAWCS_Common;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
namespace WIDESEAWCS_Tasks
{
@@ -25,12 +27,14 @@
        private readonly ITaskService _taskService;
        private readonly IContainerItemRepository _containerItemRepository;
        private readonly WebSocketServer _webSocketServer;
        public GantryJob(ITaskRepository taskRepository, ITaskService taskService, IContainerItemRepository containerItemRepository, WebSocketServer webSocketServer)
        private readonly IOrderDetailsService _orderDetailsService;
        public GantryJob(ITaskRepository taskRepository, ITaskService taskService, IContainerItemRepository containerItemRepository, WebSocketServer webSocketServer, IOrderDetailsService orderDetailsService)
        {
            _taskRepository = taskRepository;
            _taskService = taskService;
            _containerItemRepository = containerItemRepository;
            _webSocketServer = webSocketServer;
            _orderDetailsService = orderDetailsService;
        }
        public Task Execute(IJobExecutionContext context)
@@ -57,38 +61,40 @@
                            string[] takePositions = task.CurrentAddress.Split("*");
                            if (takePositions.Length != 5)
                            {
                                //WriteError
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", "取货位置错误");
                                return Task.CompletedTask;
                            }
                            string[] putPositions = task.NextAddress.Split("*");
                            if (putPositions.Length != 5)
                            {
                                //WriteError
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", "放货位置错误");
                                return Task.CompletedTask;
                            }
                            Dt_ContainerItem containerItem = _containerItemRepository.QueryFirst(x => x.ItemCode == task.PalletCode);
                            if (containerItem == null)
                            {
                                //WriteError
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", "板材尺寸获取错误");
                                return Task.CompletedTask;
                            }
                            if (LightStatusStorage.LightStatusDic.TryGetValue(putPositions[0], out LightStatusEnum lightStatusDic))
                            {
                                if (lightStatusDic != LightStatusEnum.LightWorking)
                                {
                                    LightStatusStorage.LightStatusDic[putPositions[0]] = LightStatusEnum.LightWorking;
                                }
                            }
                            otherDevice.SetValue(GantryDBName.TwoHand, true);
                            otherDevice.SetValue(GantryDBName.TaskNum, task.TaskNum);
                            if (!LightStatusStorage.StationStautsDic.TryGetValue(putPositions[0],out bool stationStatus))
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", $"工位【{putPositions[0]}】有无垫板数据错误,{LightStatusStorage.StationStautsDic.Serialize()}");
                                return Task.CompletedTask;
                            }
                            if (!stationStatus)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", $"工位【{putPositions[0]}】无垫板,{LightStatusStorage.StationStautsDic.Serialize()}");
                                return Task.CompletedTask;
                            }
                            int takePoX = Convert.ToInt32(takePositions[1]);
                            int takePoY = Convert.ToInt32(takePositions[2]);
                            int takePoZ = OPositions.HPositions[takePositions[0]].PositionZ + 30 * 1000 - Convert.ToInt32(takePositions[3]) * 1000;
                            if(OPositions.HPositions[takePositions[0]].PositionZ == 0)
                            if (OPositions.HPositions[takePositions[0]].PositionZ == 0)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", "取货Z坐标读取为0");
                                return Task.CompletedTask;
@@ -107,45 +113,87 @@
                            }
                            int putPoR = 0;
                            if (Convert.ToInt32(takePositions[4]) == 1)
                            int temp = 1000;
                            if(otherDevice.DeviceCode == "GT02")
                            {
                                takePoX = takePoX * 1000 + OPositions.HPositions[takePositions[0]].PositionX;
                                takePoY = takePoY * 1000 + OPositions.HPositions[takePositions[0]].PositionY;
                                putPoX = putPoX * 1000 + OPositions.HPositions[putPositions[0]].PositionX;
                                putPoY = putPoY * 1000 + OPositions.HPositions[putPositions[0]].PositionY;
                                temp = -1000;
                            }
                            if (Convert.ToInt32(takePositions[4]) == 1 || Convert.ToInt32(takePositions[4]) == 2)
                            {
                                takePoX = takePoX * temp + OPositions.HPositions[takePositions[0]].PositionX;
                                takePoY = takePoY * temp + OPositions.HPositions[takePositions[0]].PositionY;
                                putPoX = putPoX * temp + OPositions.HPositions[putPositions[0]].PositionX;
                                putPoY = putPoY * temp + OPositions.HPositions[putPositions[0]].PositionY;
                                takePoR = OPositions.HPositions[takePositions[0]].PositionR;
                                putPoR = OPositions.HPositions[putPositions[0]].PositionR;
                                if (Convert.ToInt32(takePositions[4]) == 1)
                                    putPoR = OPositions.HPositions[putPositions[0]].PositionR;
                                else
                                {
                                    if (otherDevice.DeviceCode == "GT03")
                                        putPoR = otherDevice.Communicator.Read<int>("DB10.840");
                                    else if (otherDevice.DeviceCode == "GT02")
                                        putPoR = otherDevice.Communicator.Read<int>("DB10.836");
                                    else if (otherDevice.DeviceCode == "GT01")
                                        putPoR = otherDevice.Communicator.Read<int>("DB10.832");
                                    else
                                    {
                                        WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", "R坐标错误");
                                        return Task.CompletedTask;
                                    }
                                }
                                WriteDebug($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"取货位:{takePositions[0]},放货位:{putPositions[0]}{Environment.NewLine}取货坐标:X:{takePoX} Y:{takePoY} Z:{takePoZ} R:{takePoR}{Environment.NewLine}放货坐标:X:{putPoX} Y:{putPoY} Z:{putPoZ} R:{putPoR}{Environment.NewLine}读取PLC取货坐标:X:{OPositions.HPositions[takePositions[0]].PositionX} Y:{OPositions.HPositions[takePositions[0]].PositionY} Z:{OPositions.HPositions[takePositions[0]].PositionZ} R:{OPositions.HPositions[takePositions[0]].PositionR}{Environment.NewLine}读取PLC放货坐标:X:{OPositions.HPositions[putPositions[0]].PositionX} Y:{OPositions.HPositions[putPositions[0]].PositionY} Z:{OPositions.HPositions[putPositions[0]].PositionZ} R:{OPositions.HPositions[putPositions[0]].PositionR}");
                            }
                            else
                            {
                                takePoX = takePoX * 1000 + OPositions.ZPositions[takePositions[0]].PositionX;
                                takePoY = takePoY * 1000 + OPositions.ZPositions[takePositions[0]].PositionY;
                                putPoX = putPoX * 1000 + OPositions.ZPositions[putPositions[0]].PositionX;
                                putPoY = putPoY * 1000 + OPositions.ZPositions[putPositions[0]].PositionY;
                                takePoX = takePoX * temp + OPositions.ZPositions[takePositions[0]].PositionX;
                                takePoY = takePoY * temp + OPositions.ZPositions[takePositions[0]].PositionY;
                                putPoX = putPoX * temp + OPositions.ZPositions[putPositions[0]].PositionX;
                                putPoY = putPoY * temp + OPositions.ZPositions[putPositions[0]].PositionY;
                                takePoR = OPositions.ZPositions[takePositions[0]].PositionR;
                                putPoR = OPositions.ZPositions[putPositions[0]].PositionR;
                                WriteDebug($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"取货位:{takePositions[0]},放货位:{putPositions[0]}{Environment.NewLine}取货坐标:X:{takePoX} Y:{takePoY} Z:{takePoZ} R:{takePoR}{Environment.NewLine}放货坐标:X:{putPoX} Y:{putPoY} Z:{putPoZ} R:{putPoR}{Environment.NewLine}读取PLC取货坐标:X:{OPositions.ZPositions[takePositions[0]].PositionX} Y:{OPositions.ZPositions[takePositions[0]].PositionY} Z:{OPositions.ZPositions[takePositions[0]].PositionZ} R:{OPositions.ZPositions[takePositions[0]].PositionR}{Environment.NewLine}读取PLC放货坐标:X:{OPositions.ZPositions[putPositions[0]].PositionX} Y:{OPositions.ZPositions[putPositions[0]].PositionY} Z:{OPositions.ZPositions[putPositions[0]].PositionZ} R:{OPositions.ZPositions[putPositions[0]].PositionR}");
                            }
                            #region
                            List<DeviceProDTO> devicePros = otherDevice.DeviceProDTOs.Where(x => x.DeviceProParamType == "MaxPosition").ToList();
                            int maxX = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxX);
                            int minX = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinX);
                            int maxY = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxY);
                            int minY = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinY);
                            int maxZ = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxZ);
                            int minZ = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinZ);
                            int maxR = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxR);
                            int minR = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinR);
                            DeviceProDTO? devicePro = devicePros.OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                            if(devicePro == null)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", "设备协议参数错误,未找到最大最小坐标地址");
                                return Task.CompletedTask;
                            }
                            int[] data = otherDevice.Communicator.Read<int>(devicePro.DeviceProAddress, (ushort)(devicePros.Count));
                            if(takePoX < minX || takePoX > maxX)
                            int maxX = data[0];
                            int minX = data[1];
                            int maxY = data[2];
                            int minY = data[3];
                            int maxZ = data[4];
                            int minZ = data[5];
                            int maxR = data[6];
                            int minR = data[7];
                            //int maxX = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxX);
                            //int minX = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinX);
                            //int maxY = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxY);
                            //int minY = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinY);
                            //int maxZ = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxZ);
                            //int minZ = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinZ);
                            //int maxR = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxR);
                            //int minR = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinR);
                            if (takePoX < minX || takePoX > maxX)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"X取货坐标超出范围,取货坐标:{takePoX},最大值:{maxX},最小值:{minX}");
                                return Task.CompletedTask;
                            }
                            if(putPoX < minX || putPoX > maxX)
                            if (putPoX < minX || putPoX > maxX)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"X放货坐标超出范围,取货坐标:{putPoX},最大值:{maxX},最小值:{minX}");
                                return Task.CompletedTask;
@@ -186,7 +234,10 @@
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"R放货坐标超出范围,取货坐标:{putPoR},最大值:{maxR},最小值:{minR}");
                                return Task.CompletedTask;
                            }
                            #endregion
                            otherDevice.SetValue(GantryDBName.TwoHand, true);
                            otherDevice.SetValue(GantryDBName.TaskNum, task.TaskNum);
                            otherDevice.SetValue(GantryDBName.TakePositionX, takePoX);
                            otherDevice.SetValue(GantryDBName.TakePositionY, takePoY);
                            otherDevice.SetValue(GantryDBName.TakePositionZ, takePoZ);
@@ -203,11 +254,19 @@
                            task.TaskState = TaskStatusEnum.Gantry_Executing.ObjToInt();
                            _taskRepository.UpdateData(task);
                            if (LightStatusStorage.LightStatusDic.TryGetValue(putPositions[0], out LightStatusEnum lightStatusDic))
                            {
                                if (lightStatusDic != LightStatusEnum.LightWorking)
                                {
                                    LightStatusStorage.LightStatusDic[putPositions[0]] = LightStatusEnum.LightWorking;
                                }
                            }
                        }
                    }
                    else if (gantryWorkStatus == 5)
                    {
                        int currentTaskNum = otherDevice.GetValue<GantryDBName, int>(GantryDBName.CurrentTaskNum);
                        int currentTaskNum = otherDevice.GetValue<GantryDBName, int>(GantryDBName.TaskNum);
                        if (currentTaskNum > 0)
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == currentTaskNum);
@@ -215,6 +274,12 @@
                            {
                                _taskService.TaskComplete(task);
                                Task.Run(() =>
                                {
                                    _orderDetailsService.ToMes(task.PalletCode, 4);
                                });
                                string[] putPositions = task.NextAddress.Split("*");
                                if (putPositions.Length != 5)
                                {