1
huangxiaoqiang
3 天以前 3296ae7c136f405db78c395635e72efa1c0d0125
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -23,6 +23,11 @@
using WIDESEAWCS_Common;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_BasicInfoService;
using WIDESEAWCS_Model.BasicInfo;
using WIDESEAWCS_Tasks.RGVJob;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using WIDESEAWCS_TaskInfoRepository;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
namespace WIDESEAWCS_Tasks
{
@@ -55,13 +60,11 @@
                CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams");
                if (commonStackerCrane != null)
                {
                    if (!commonStackerCrane.IsEventSubscribed)
                    if (commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.TaskCompleted))
                    {
                        commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                        var x = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.CurrentTaskNum);
                        StackerCraneTaskFinish(commonStackerCrane, commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.CurrentTaskNum));
                    }
                    commonStackerCrane.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                    if (commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Automatic) && !commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Fault) && !commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Running))
                    {
@@ -104,17 +107,69 @@
                    var userTokenIds = tokenInfos?.Select(x => x.Token_ID).ToList();
                    var userIds = tokenInfos?.Select(x => x.UserId).ToList();
                    string StackerCraneAutoStatus(bool AutoStatus) => AutoStatus switch
                    {
                        true => "联机模式",
                        false => "单机模式",
                    };
                    string StackerCraneWorkStatus(bool WorkStatus) => WorkStatus switch
                    {
                        true => "运行中",
                        false => "待机",
                    };
                    string StackerCraneStatus(bool Status) => Status switch
                    {
                        true => "故障",
                        false => "正常",
                    };
                    string StackerCraneAlarm(uint alarm) => alarm switch
                    {
                        0 => "指令或地址错误",
                        1 => "急停",
                        2 => "光通讯中断",
                        3 => "组态失联",
                        4 => "行走变频故障",
                        5 => "行走极限触发",
                        6 => "行走运行超时",
                        7 => "提升变频故障",
                        8 => "提升极限触发",
                        9 => "提升运行超时",
                        10 => "载货台超载",
                        11 => "载货台欠载(松绳)",
                        12 => "载货台失速",
                        13 => "货叉变频报警",
                        14 => "货叉运行超时",
                        15 => "货叉极限触发",
                        16 => "货叉不居中",
                        17 => "左侧超高",
                        18 => "右侧超高",
                        19 => "左侧超宽",
                        20 => "右侧超宽",
                        21 => "左超出",
                        22 => "右超出",
                        23 => "取货时载货台有货",
                        24 => "取货后载货台无货",
                        25 => "取深货位时浅货位有货",
                        26 => "放货时载货台无货",
                        27 => "放货时货架有货",
                        28 => "放货后载货台有货",
                        29 => "放深货时浅货位有货",
                        30 => "",
                        31 => "",
                    };
                    object obj = new
                    {
                        Automatic = commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Automatic),
                        Fault = commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Fault),
                        Running = commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Running),
                        commonStackerCrane.StackerCraneAutoStatusDes,
                        commonStackerCrane.StackerCraneWorkStatusDes,
                        Automatic = StackerCraneAutoStatus(commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Automatic)),
                        Fault = StackerCraneStatus(commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Fault)),
                        Running = StackerCraneWorkStatus(commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Running)),
                        CurrentColumn = Convert.ToInt32(commonStackerCrane.GetValue<StackerCraneDBName, byte>(StackerCraneDBName.CurrentColumn)),
                        CurrentLayer = Convert.ToInt32(commonStackerCrane.GetValue<StackerCraneDBName, byte>(StackerCraneDBName.CurrentLayer)),
                        LevelPoint = commonStackerCrane.GetValue<StackerCraneDBName, int>(StackerCraneDBName.LevelPoint),
                        CurrentTaskNum = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.CurrentTaskNum),
                        StackerAlarm = StackerCraneAlarm(commonStackerCrane.GetValue<StackerCraneDBName, uint>(StackerCraneDBName.StackerAlarm)),
                        commonStackerCrane.DeviceCode,
                        commonStackerCrane.DeviceName,
                        commonStackerCrane.CurrentTaskNum,
                        commonStackerCrane.LastTaskNum,
                    };
                    _noticeService.StackerData(userIds?.FirstOrDefault(), userTokenIds, new { commonStackerCrane.DeviceName, data = obj });
@@ -153,6 +208,47 @@
                    str = $"{commonStackerCrane.DeviceName}】WMS|WCS任务完成:【{content.Status}】,堆垛机完成信号写入:【{isWorkType}】,任务号:【{e.TaskNum}】时间【{DateTime.Now}】";
                    WriteInfo(commonStackerCrane.DeviceName, str);
                    ConsoleHelper.WriteColorLine(str, ConsoleColor.Blue);
                }
            }
        }
        public void StackerCraneTaskFinish(CommonStackerCrane commonStackerCrane, int TaskNum)
        {
            if (commonStackerCrane != null)
            {
                WriteInfo("堆垛机任务完成", $"{commonStackerCrane.DeviceName}完成任务号{TaskNum}");
                var task = _taskRepository.QueryFirst(x => x.TaskNum == TaskNum);
                if (task != null)
                {
                    if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
                    {
                        if (Convert.ToInt32(task.TargetAddress) > 1999 && Convert.ToInt32(task.TargetAddress) < 3000)
                        {
                            Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.Roadway == task.Roadway && x.stationChildCode == task.TargetAddress);
                            if (stationManager != null)
                            {
                                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManager.stationPLC);
                                if (device != null)
                                {
                                    CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                                    var InteractiveSignal = conveyorLine.GetValue<ConveyorLineDBName, byte>(ConveyorLineDBName.InteractiveSignal, stationManager.stationChildCode);
                                    var structs = BitConverter.GetBytes(InteractiveSignal).ToArray().ToBoolArray();
                                    if (structs[2])
                                    {
                                        conveyorLine.SetValue(ConveyorLineDBName.WriteConveyorLineTargetAddress, Convert.ToInt16(stationManager.stationNextChildCode), stationManager.stationChildCode);
                                        Thread.Sleep(100);
                                        conveyorLine.SetValue(ConveyorLineDBName.WriteConveyorLineTaskNum, Convert.ToInt16(task.TaskNum), stationManager.stationChildCode);
                                        Thread.Sleep(100);
                                        conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(2), stationManager.stationChildCode);
                                    }
                                }
                            }
                        }
                    }
                    var content = _taskService.StackCraneTaskCompleted(TaskNum);
                }
            }
        }
@@ -227,12 +323,12 @@
        /// <returns>如果未被占用,返回传入的任务信息,否则,返回null</returns>
        private Dt_Task? OutTaskStationIsOccupied([NotNull] Dt_Task task)
        {
            var stationinfo = _stationManagerRepository.QueryFirst(x => x.stationLocation == task.TargetAddress && x.Roadway == task.Roadway);
            var stationinfo = _stationManagerRepository.QueryFirst(x => x.stationChildCode==task.NextAddress && x.Roadway == task.Roadway);
            IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationinfo.stationPLC);
            if (device != null)
            {
                CommonConveyorLine_After conveyorLine = (CommonConveyorLine_After)device;
                if (conveyorLine.IsOccupied(stationinfo.stationChildCode))//出库站台未被占用
                CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                if (conveyorLine.IsOccupiedx(stationinfo.stationChildCode))//出库站台未被占用
                {
                    return task;
                }
@@ -288,24 +384,34 @@
        {
            StackerCraneTaskCommand stackerCraneTaskCommand = new StackerCraneTaskCommand();
            stackerCraneTaskCommand.TaskNum = (byte)Convert.ToSByte(task.TaskNum);
            stackerCraneTaskCommand.WorkType = 1;
            stackerCraneTaskCommand.TaskNum = (short)Convert.ToInt16(task.TaskNum);
            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//判断是否是入库任务
            {
                List<Dt_Router> routers = _routerService.QueryNextRoutes(task.CurrentAddress, task.Roadway);
                if (routers.Count > 0)
                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.Roadway == task.Roadway && x.stationChildCode == task.CurrentAddress);
                if (stationManager != null)
                {
                    stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(Convert.ToInt16(routers.FirstOrDefault().SrmRow));
                    stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(routers.FirstOrDefault().SrmColumn);
                    stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(routers.FirstOrDefault().SrmLayer);
                    stackerCraneTaskCommand.WorkType = (byte)Convert.ToSByte(17);
                    string[] sourceCodes = stationManager.stationLocation.Split("-");
                    if (sourceCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(GetRowCode(Convert.ToInt32(sourceCodes[0])));
                        stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(sourceCodes[2]);
                        stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(sourceCodes[1]);
                    }
                    else
                    {
                        //数据配置错误
                        _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"入库任务终点错误,起点:【{task.NextAddress}】");
                        return null;
                    }
                    string[] targetCodes = task.NextAddress.Split("-");
                    string[] targetCodes = task.TargetAddress.Split("-");
                    if (targetCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(Convert.ToInt16(targetCodes[0]) % 2 != 0 ? (short)1 : (short)2);
                        stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[1]);
                        stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[2]);
                        stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(GetRowCode(Convert.ToInt32(targetCodes[0])));
                        stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[2]);
                        stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[1]);
                    }
                    else
                    {
@@ -322,20 +428,29 @@
            }
            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                List<Dt_Router> routers = _routerService.QueryNextRoutes(task.Roadway, task.TargetAddress);
                if (routers.Count > 0)
                stackerCraneTaskCommand.WorkType = (byte)Convert.ToSByte(18);
                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.Roadway == task.Roadway && x.stationChildCode == task.NextAddress);
                if (stationManager != null)
                {
                    stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(routers.FirstOrDefault().SrmRow);
                    stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(routers.FirstOrDefault().SrmColumn);
                    stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(routers.FirstOrDefault().SrmLayer);
                    string[] sourceCodes = task.CurrentAddress.Split("-");
                    if (sourceCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(Convert.ToInt16(sourceCodes[0]) % 2 != 0 ? (short)1 : (short)2);
                        stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(sourceCodes[1]);
                        stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(sourceCodes[2]);
                        stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(GetRowCode(Convert.ToInt32(sourceCodes[0])));
                        stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(sourceCodes[2]);
                        stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(sourceCodes[1]);
                    }
                    else
                    {
                        //数据配置错误
                        _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"出库任务起点错误,起点:【{task.CurrentAddress}】");
                        return null;
                    }
                    string[] targetCodes = stationManager.stationLocation.Split("-");
                    if (targetCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(GetRowCode(Convert.ToInt32(targetCodes[0])));
                        stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[2]);
                        stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[1]);
                    }
                    else
                    {
@@ -352,25 +467,13 @@
            }
            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
            {
                string[] targetCodes = task.NextAddress.Split("-");
                if (targetCodes.Length == 3)
                {
                    stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(Convert.ToInt16(targetCodes[0]) % 2 != 0 ? (short)1 : (short)2);
                    stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[1]);
                    stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[2]);
                }
                else
                {
                    //数据配置错误
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务终点错误,起点:【{task.NextAddress}】");
                    return null;
                }
                string[] sourceCodes = task.CurrentAddress.Split("-");
                stackerCraneTaskCommand.WorkType = (byte)Convert.ToSByte(20);
                string[] sourceCodes = task.SourceAddress.Split("-");
                if (sourceCodes.Length == 3)
                {
                    stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(Convert.ToInt16(sourceCodes[0]) % 2 != 0 ? (short)1 : (short)2);
                    stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(sourceCodes[1]);
                    stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(sourceCodes[2]);
                    stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(GetRowCode(Convert.ToInt32(sourceCodes[0])));
                    stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(sourceCodes[2]);
                    stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(sourceCodes[1]);
                }
                else
                {
@@ -378,8 +481,45 @@
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务起点错误,起点:【{task.CurrentAddress}】");
                    return null;
                }
                string[] targetCodes = task.TargetAddress.Split("-");
                if (targetCodes.Length == 3)
                {
                    stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(GetRowCode(Convert.ToInt32(targetCodes[0])));
                    stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[2]);
                    stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[1]);
                }
                else
                {
                    //数据配置错误
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务终点错误,起点:【{task.NextAddress}】");
                    return null;
                }
            }
            return stackerCraneTaskCommand;
        }
        public int GetRowCode(int number)
        {
            if (number == 1 || number == 15 || number == 11 || number == 19)
            {
                return 1;
            }
            else if (number == 2 || number == 5 || number == 8 || number == 12 || number == 16 || number == 20)
            {
                return 2;
            }
            else if (number == 3 || number == 6 || number == 9 || number == 13 || number == 17 || number == 21)
            {
                return 3;
            }
            else if (number == 4 || number == 7 || number == 10 || number == 14 || number == 18 || number == 22)
            {
                return 4;
            }
            else
            {
                throw new ArgumentOutOfRangeException(nameof(number), "输入的数字必须在1-16范围内");
            }
        }
    }
}