zhangchengsong
2 天以前 ce70974f99cd377579e9b07873c8ce79df6e05c3
ÏîÄ¿´úÂë/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -8,9 +8,12 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Eventing.Reader;
using System.DirectoryServices.Protocols;
using System.IO.Ports;
using System.Linq;
using System.Net;
using System.Reflection.Metadata;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
@@ -18,6 +21,7 @@
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
@@ -29,6 +33,7 @@
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
using WIDESEAWCS_TaskInfoService;
using WIDESEAWCS_Tasks.StackerCraneJob;
namespace WIDESEAWCS_Tasks
@@ -56,8 +61,12 @@
            try
            {
                CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams");
                if (commonStackerCrane != null)
                {
                    UpdateHandShake(commonStackerCrane.CurrentTaskNum, commonStackerCrane.StackerCraneWorkStatusDes);
                    //任务完成StackerCraneWorkStatus
                    if (commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.WorkCompleted)
                    {
@@ -65,33 +74,42 @@
                        Dt_Task? currtask = _taskService.CurrtaskInfo(commonStackerCrane.CurrentTaskNum);
                        if(currtask != null)
                        {
                            string PalletCode = "";
                            //判断任务类型
                            if(currtask.TaskType==  (int)TaskTypeEnum.Inventorybound)
                            if (currtask.TaskType==  (int)TaskTypeEnum.Inventorybound)
                            {
                                //读取条码,进行配对
                                DeviceProDTO? deviceProDTO = commonStackerCrane.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == "SCBarcode");
                                byte[] bytes = commonStackerCrane.Communicator.Read(deviceProDTO.DeviceProAddress, 64);
                                string result = Encoding.ASCII.GetString(bytes).Replace(" ", "");
                                bool pandianBort = false;
                                if(currtask.PalletCode== result) pandianBort= true;
                                //读取的托盘条码
                                PalletCode = Encoding.ASCII.GetString(bytes).Replace(" ", "");
                            }
                            WebResponseContent webResponse = _taskService.StackCraneTaskCompleted(commonStackerCrane.CurrentTaskNum);
                            Console.WriteLine(webResponse.ToJsonString());
                            WebResponseContent webResponse = _taskService.StackCraneTaskCompleted(commonStackerCrane.CurrentTaskNum, PalletCode);
                            if (webResponse.Status)
                            {
                                WriteLog.Write_Log("堆垛机任务上报完成信息", "堆垛机任务上报完成信息", $"【{commonStackerCrane.DeviceCode}】库堆垛机上报任务号:【{commonStackerCrane.CurrentTaskNum}】完成信号!");
                            bool ddjfk = commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5);
                                bool ddjfk = commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5);
                            }
                        }
                    }
                    WriteLog.Write_Log("堆垛机当前状态", "堆垛机当前状态信息", $"堆垛机设备地址:【DB105.2.0】,读取的数据:【{commonStackerCrane.StackerCraneAutoStatusDes}】\n" +
                           $"堆垛机工作模式地址:【DB105.3.0】,读取的数据:【{commonStackerCrane.StackerCraneStatusDes}】\n" +
                           $"堆垛机作业状态地址:【DB105.22.0】,读取的数据:【{commonStackerCrane.StackerCraneWorkStatusDes}】\n" +
                           $"堆垛机当前任务执行中地址:【DB105.18.0】,读取的数据:【{commonStackerCrane.CurrentTaskNum}】\n");
                    if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal)
                    {
                        if (commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
                        {
                            Dt_Task? task = GetTask(commonStackerCrane);
                            if (task != null)
@@ -115,6 +133,8 @@
            catch (Exception ex)
            {
                Console.WriteLine(nameof(CommonStackerCraneJob) + ":" + ex.ToString());
                WriteLog.Write_Log("堆垛机报错信息", "堆垛机报错信息", $"堆垛机报错信息:【{ex.ToString()}】");
            }
            return Task.CompletedTask;
        }
@@ -132,7 +152,7 @@
                if (commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5 && e.TaskNum !=0)
                {
                    //Console.Out.WriteLine("TaskCompleted" + e.TaskNum);
                    _taskService.StackCraneTaskCompleted(e.TaskNum);
                    //_taskService.StackCraneTaskCompleted(e.TaskNum,);
                    commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5);
                }
            }
@@ -165,6 +185,7 @@
                        }
                        else if (taskItem.TaskType == (int)TaskTypeEnum.Inbound || taskItem.TaskType == (int)TaskTypeEnum.Inventorybound)
                        {
                            InTaskStationIsOccupied(taskItem.SourceAddress, taskItem.Roadway);
                            return taskItem;
                        }
                    }
@@ -199,6 +220,10 @@
                    int StationNum = conveyorLine.Communicator.Read<ushort>(deviceProDTO.DeviceProAddress);
                    int HandShake = conveyorLine.Communicator.Read<ushort>(HandShakeprodto.DeviceProAddress);
                     conveyorLine.Communicator.Write<short>(HandShakeprodto.DeviceProAddress, 1);
                    WriteLog.Write_Log("出库库口状态信息", "出库库口状态信息", $"库口是【{NextAddress}】,申请状态地址:【{HandShakeprodto.DeviceProAddress}】,读取的数据:【{HandShake}】\n" +
                         $"库口是否有货状态地址:【{deviceProDTO.DeviceProAddress}】,读取的数据【{StationNum}】");
                    if (StationNum == 0 && HandShake == 0 && Roadway == "C")
                    {
                        return true;
@@ -215,6 +240,9 @@
                    int StationNum = conveyorLine.Communicator.Read<ushort>(deviceProDTO.DeviceProAddress);
                    int HandShake = conveyorLine.Communicator.Read<ushort>(HandShakeprodto.DeviceProAddress);
                    WriteLog.Write_Log("出库库口状态信息", "出库库口状态信息", $"库口是【{NextAddress}】,申请状态地址:【{HandShakeprodto.DeviceProAddress}】,读取的数据:【{HandShake}】\n" +
                        $"库口是否有货状态地址:【{deviceProDTO.DeviceProAddress}】,读取的数据【{StationNum}】");
                    if ((StationNum == 1 && HandShake == 0 && Roadway == "B") || (StationNum == 0 && HandShake == 0 && Roadway != "B"))
                    {
                        return true;
@@ -228,7 +256,44 @@
            return false;
        }
        /// <summary>
        /// å…¥åº“任务库口有货无货状态
        /// </summary>
        private void InTaskStationIsOccupied(string SourceAddress, string Roadway)
        {
            try
            {
                if (Roadway == "C")
                {
                    IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "1004");
                    CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                    DeviceProDTO? deviceProDTO = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == SourceAddress && x.DeviceProParamName == "StationNum");
                    DeviceProDTO? HandShakeprodto = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == SourceAddress && x.DeviceProParamName == "HandShake");
                    int StationNum = conveyorLine.Communicator.Read<ushort>(deviceProDTO.DeviceProAddress);
                    int HandShake = conveyorLine.Communicator.Read<ushort>(HandShakeprodto.DeviceProAddress);
                    WriteLog.Write_Log("入库库口状态信息", "入库库口状态信息", $"库口是【{SourceAddress}】,申请状态地址:【{HandShakeprodto.DeviceProAddress}】,读取的数据:【{HandShake}】\n" +
                        $"库口是否有货状态地址:【{deviceProDTO.DeviceProAddress}】,读取的数据【{StationNum}】");
                }
                else
                {
                    IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "1003");
                    CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                    DeviceProDTO? deviceProDTO = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == SourceAddress && x.DeviceProParamName == "StationNum");
                    DeviceProDTO? HandShakeprodto = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == SourceAddress && x.DeviceProParamName == "HandShake");
                    int StationNum = conveyorLine.Communicator.Read<ushort>(deviceProDTO.DeviceProAddress);
                    int HandShake = conveyorLine.Communicator.Read<ushort>(HandShakeprodto.DeviceProAddress);
                    WriteLog.Write_Log("入库库口状态信息", "入库库口状态信息", $"库口是【{SourceAddress}】,申请状态地址:【{HandShakeprodto.DeviceProAddress}】,读取的数据:【{HandShake}】\n" +
                        $"库口是否有货状态地址:【{deviceProDTO.DeviceProAddress}】,读取的数据【{StationNum}】");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("读取站台信息错误:" + ex.Message);
            }
        }
        /// <summary>
        /// ä»»åŠ¡å®žä½“è½¬æ¢æˆå‘½ä»¤Model
@@ -240,16 +305,34 @@
        {
            StackerCraneTaskCommand stackerCraneTaskCommand = new StackerCraneTaskCommand();
            stackerCraneTaskCommand.Barcode = task.PalletCode;
            stackerCraneTaskCommand.TaskNum = task.TaskNum;
            stackerCraneTaskCommand.WorkType = 1;
            stackerCraneTaskCommand.TrayType = 0;
            if (task.Roadway == "B" || task.Roadway == "C")
            {
                //判断 task.PalletCode æ˜¯ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„ GUID
                stackerCraneTaskCommand.Barcode = stackerCraneTaskCommand.Barcode = Guid.TryParse(task.PalletCode, out var guid) ? guid.ToString("N")[0..6] : task.PalletCode;
            }
            else if (task.Roadway == "G" )
            {
                if (Guid.TryParse(task.PalletCode, out var palletGuid))
                {
                    stackerCraneTaskCommand.Barcode = palletGuid.ToString("N")[0..6];
                    // æ ‡å‡†GUID就是36位,所以直接判断长度即可
                    stackerCraneTaskCommand.TrayType = (short)(task.PalletCode.Length == 36 ? 1 : 2);
                }
                else
                {
                    stackerCraneTaskCommand.Barcode = task.PalletCode;
                    stackerCraneTaskCommand.TrayType = 2;
                }
            }
            if (task.TaskType == (int)TaskTypeEnum.Inbound)//判断是否是入库任务
            {
                //获取站台编号
                Dt_PlatformStation dt_Platform=_DtPlatformStationService.getStatiomInfo(task.SourceAddress);
                Dt_PlatformStation dt_Platform = _DtPlatformStationService.getStatiomInfo(task.SourceAddress);
                string[] targetCodest = dt_Platform.Station_storey.Split("-");
                if (targetCodest.Length == 3)
                {
@@ -270,7 +353,7 @@
                    string EndRow = EndCodest[0].Substring(1);
                    string SCEndRow = LaneModification(task.Roadway, int.Parse(EndRow));
                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(SCEndRow );
                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(SCEndRow);
                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(EndCodest[1]);
                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(EndCodest[2]);
                }
@@ -328,7 +411,7 @@
                if (EndCodest.Length == 3)
                {
                    string EndRow = EndCodest[0].Substring(1);
                   string SCEnRow=LaneModification(task.Roadway,int.Parse(EndRow));
                    string SCEnRow = LaneModification(task.Roadway, int.Parse(EndRow));
                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(SCEnRow);
                    stackerCraneTaskCommand.EndColumn = (short)(Convert.ToInt16(EndCodest[1]) + 1);
@@ -336,13 +419,13 @@
                }
                else
                {
                    //数据配置错误
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务起点错误,起点:【{task.CurrentAddress}】");
                    return null;
                }
            }
            return stackerCraneTaskCommand;
        }
@@ -361,5 +444,61 @@
                return SCRow.ToString();
            }
        }
        /// <summary>
        /// ç›‘测G库、C库出库放货时屏蔽光栅
        /// </summary>
        /// <param name="taskNum"></param>
        /// <param name="stackerCraneWorkStatusDes"></param>
        public void UpdateHandShake(int taskNum, string stackerCraneWorkStatusDes)
        {
            // 1. æŸ¥è¯¢ä»»åŠ¡ï¼Œç©ºå€¼ç›´æŽ¥è¿”å›ž
            Dt_Task? dtTask = _taskRepository.QueryFirst(x => x.TaskNum == taskNum);
            if (dtTask == null) return;
            // 2. å®šä¹‰å›ºå®šåœ°å€
            string[] targetAddresses = { "G03", "G04", "C02", "C01" };
            // 3. æ¡ä»¶åˆ¤æ–­ + ç¡®å®šå†™å…¥å€¼
            short writeValue = -1;
            if (dtTask.TaskType == 100 && targetAddresses.Contains(dtTask.TargetAddress))
            {
                writeValue = stackerCraneWorkStatusDes switch
                {
                    "放货中" => 1,
                    "任务完成" => 0,
                    _ => -1
                };
            }
            // 4. èŽ·å–è®¾å¤‡ç¼–ç 
            string deviceCode = dtTask.CurrentAddress.StartsWith("C") ? "1004" : "1003";
            // 5. èŽ·å–è®¾å¤‡ï¼Œç©ºå€¼ç›´æŽ¥è¿”å›ž
            IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == deviceCode);
            if (device != null && writeValue != -1)
            {
                CommonConveyorLine? conveyorLine = (CommonConveyorLine)device;
                // 6. èŽ·å–æ¡æ‰‹ç‚¹ä½ï¼Œç©ºå€¼ç›´æŽ¥è¿”å›ž
                DeviceProDTO? handShake = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == dtTask.TargetAddress && x.DeviceProParamName == "HandShake");
                if (handShake == null)
                {
                    WriteLog.Write_Log("出库库口光栅状态错误信息", "出库库口光栅状态错误信息", $"WCS未找到库口信息是【{dtTask.TargetAddress}】,任务号:【{dtTask.TaskNum}】,堆垛机作业状态:【{stackerCraneWorkStatusDes}】");
                    return;
                }
                    // 7. å†™å…¥å€¼
                 conveyorLine.Communicator.Write<short>(handShake.DeviceProAddress, writeValue);
                WriteLog.Write_Log("出库库口光栅状态正常信息", "出库库口光栅状态正常信息", $"库口是【{dtTask.TargetAddress}】,申请状态地址:【{handShake.DeviceProAddress}】,读取的数据:【{conveyorLine.Communicator.Read<ushort>(handShake.DeviceProAddress)}】\n" +
                 $"任务号:【{dtTask.TaskNum}】,堆垛机作业状态:【{stackerCraneWorkStatusDes}】");
                return;
            }
            else
            {
                WriteLog.Write_Log("出库库口光栅状态错误信息", "出库库口光栅状态错误信息", $"库口是【{dtTask.TargetAddress}】,任务号:【{dtTask.TaskNum}】,堆垛机作业状态:【{stackerCraneWorkStatusDes}】");
                return;
            }
        }
    }
}