zhangchengsong
12 小时以前 f59f3b24814387573b5bca9a9b6c832a3720ee7e
ÏîÄ¿´úÂë/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -60,32 +60,6 @@
        }
        private static readonly Dictionary<string, bool> _deviceLastStatus = new Dictionary<string, bool>();
        public string urlWMSdeverror = WIDESEAWCS_Core.Helper.AppSettings.Configuration["urlWMSdeverror"];
        private static readonly Dictionary<string, string> _stackerFaultMap = new Dictionary<string, string>
        {
            { "DB107.26.0", "载货台货物超宽" },{ "DB107.26.1", "载货台货物超长" },{ "DB107.26.2", "载货台货物超高" },
            { "DB107.26.3", "载货台货物检测传感器异常" },{ "DB107.26.4", "货叉编码器值错误" },{ "DB107.26.5", "货叉动作超时" },
            { "DB107.26.6", "货叉编码器值与中位信号不一致" },{ "DB107.26.7", "无效的任务类型" },{ "DB107.27.0", "无效的作业地址" },
            { "DB107.27.1", "重入库" },{ "DB107.27.2", "空出库" },{ "DB107.27.3", "货物高度与货位不匹配" },
            { "DB107.27.4", "取货通道堵塞" },{ "DB107.27.5", "放货通道堵塞" },{ "DB107.27.6", "放货完成后载货台仍然有货" },
            { "DB107.27.7", "任务未完成超时报警" },{ "DB107.28.0", "就地柜急停触发" },{ "DB107.28.1", "机载柜急停触发" },
            { "DB107.28.2", "远程急停触发" },{ "DB107.28.3", "安全门被打开" },{ "DB107.28.4", "安全继电器断开" },
            { "DB107.28.5", "松绳检测" },{ "DB107.28.6", "超速保护" },{ "DB107.28.7", "行走变频器故障" },
            { "DB107.29.0", "升降变频器故障" },{ "DB107.29.1", "货叉1变频器故障" },{ "DB107.29.2", "货叉2变频器故障" },
            { "DB107.29.3", "升降行走定位超时" },{ "DB107.29.4", "货叉1编码器值与中位信号不一致" },{ "DB107.29.5", "货叉2编码器值与中位信号不一致" },
            { "DB107.29.6", "行走激光值错误" },{ "DB107.29.7", "升降激光值错误" },{ "DB107.30.0", "前进极限行程" },
            { "DB107.30.1", "后退极限行程" },{ "DB107.30.2", "上升极限行程" },{ "DB107.30.3", "下降极限行程" },
            { "DB107.30.4", "货叉1左极限行程" },{ "DB107.30.5", "货叉1右极限行程" },{ "DB107.30.6", "货叉2左极限行程" },
            { "DB107.30.7", "货叉2右极限行程" },{ "DB107.31.0", "前进激光极限保护" },{ "DB107.31.1", "后退激光极限保护" },
            { "DB107.31.2", "上升激光极限保护" },{ "DB107.31.3", "下降激光极限保护" },{ "DB107.31.4", "货叉1左软极限" },
            { "DB107.31.5", "货叉1右软极限" },{ "DB107.31.6", "货叉2左软极限" },{ "DB107.31.7", "货叉2右软极限" },
            { "DB107.32.0", "与地面站网络断开" },{ "DB107.32.1", "与输送线网络断开" },{ "DB107.32.2", "与WCS网络断开" },
            { "DB107.32.3", "无效命令:堆垛机有货" },{ "DB107.32.4", "无效命令:堆垛机无货" },{ "DB107.32.5", "消防误报" },
            { "DB107.32.6", "前进雷达报警" },{ "DB107.32.7", "后退雷达报警" },{ "DB107.33.0", "左防火门超时" },
            { "DB107.33.1", "右防火门超时" },{ "DB107.33.2", "替罪羊检测报警" },{ "DB107.33.3", "近叉运行异常" },
            { "DB107.33.4", "远叉运行异常" },{ "DB107.33.5", "水平运行异常" },{ "DB107.33.6", "升降运行异常" },
            { "DB107.34.0", "升降刹车异常" },{ "DB107.34.1", "行走刹车异常" },{ "DB107.34.2", "近叉刹车异常" },
            { "DB107.34.3", "远叉刹车异常" },{ "DB107.34.4", "左侧过载" },{ "DB107.34.5", "右侧过载" }
        };
        public Task Execute(IJobExecutionContext context)
@@ -95,7 +69,7 @@
                CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams");
                if (commonStackerCrane != null)
                {
                    WriteLog.Write_Log("堆垛机当前状态信息", $"{commonStackerCrane.DeviceCode}库堆垛机当前状态",
                WriteLog.Write_Log("堆垛机当前状态信息", $"{commonStackerCrane.DeviceCode}库堆垛机当前状态",
                                                $"堆垛机设备状态地址:【DB105.2.0】,读取的数据:【{commonStackerCrane.StackerCraneAutoStatusDes}】\n" +
                                               $"堆垛机工作模式地址:【DB105.3.0】,读取的数据:【{commonStackerCrane.StackerCraneStatusDes}】\n" +
                                               $"堆垛机作业状态地址:【DB105.22.0】,读取的数据:【{commonStackerCrane.StackerCraneWorkStatusDes}】\n" +
@@ -150,7 +124,7 @@
                            WebResponseContent webResponse = _taskService.StackCraneTaskCompleted(commonStackerCrane.CurrentTaskNum, PalletCode);
                            if (webResponse.Status)
                            {
                                WriteLog.Write_Log("堆垛机任务上报完成信息", "堆垛机任务上报完成信息", $"【{commonStackerCrane.DeviceCode}】库堆垛机上报任务号:【{commonStackerCrane.CurrentTaskNum}】完成信号!");
                                Task.Run(() => WriteLog.Write_Log("堆垛机任务上报完成信息", "堆垛机任务上报完成信息", $"【{commonStackerCrane.DeviceCode}】库堆垛机上报任务号:【{commonStackerCrane.CurrentTaskNum}】完成信号!"));
                                bool ddjfk = commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5);
                            }
@@ -196,7 +170,7 @@
        /// <summary>
        /// æ•…障上报(改为await调用,修复异步BUG)
        /// </summary>
        private async Task SendDevError(CommonStackerCrane crane, string errorcode, string dealType, string errorInfo = "")
        public void SendDevError(CommonStackerCrane crane, string errorcode, string dealType, string errorInfo = "")
        {
            CommandResult commandResult = new CommandResult();
            try
@@ -221,8 +195,7 @@
                    psd = "akjfapjfpadaoif",
                };
                
                // åŒæ­¥HTTP改为异步(推荐),保持你原有代码也可以
                commandResult =  await Task.Run(() => HttpHelper.Post<CommandResult>(urlWMSdeverror, deviceErrorRequest, "设备故障回调"));
                commandResult = HttpHelper.Post<CommandResult>(urlWMSdeverror, deviceErrorRequest, "设备故障回调");
                WriteLog.Write_Log("同步给上游设备故障信息", "设备故障信息", $"设备id:【{crane.DeviceCode}】,成功", $"设备回调状态:【{dealType}】,异常信息:【{errorInfo}】\n" +
                    $"调用上游返回结果信息:【{commandResult?.ToJsonString() ?? "返回结果为null"}】");
            }
@@ -258,9 +231,9 @@
                                return taskItem;
                            }
                        }
                        else if (taskItem.TaskType == (int)TaskTypeEnum.Inbound || taskItem.TaskType == (int)TaskTypeEnum.Inventorybound)
                        else if ((InTaskStationIsOccupied(taskItem.SourceAddress, taskItem.Roadway) && taskItem.TaskType == (int)TaskTypeEnum.Inbound) || taskItem.TaskType == (int)TaskTypeEnum.Inventorybound)
                        {
                            InTaskStationIsOccupied(taskItem.SourceAddress, taskItem.Roadway);
                            return taskItem;
                        }
                    }
@@ -299,44 +272,45 @@
                int StationNum = conveyorLine.Communicator.Read<ushort>(deviceProDTO.DeviceProAddress);
                int HandShake = conveyorLine.Communicator.Read<ushort>(HandShakeprodto.DeviceProAddress);
                Task.Run(() => WriteLog.Write_Log("出库库口状态信息", "出库库口状态信息", $"库口是【{NextAddress}】,申请状态地址:【{HandShakeprodto.DeviceProAddress}】,读取的数据:【{HandShake}】\n库口是否有货状态地址:【{deviceProDTO.DeviceProAddress}】,读取的数据【{StationNum}】"));
                if (Roadway == "C") return StationNum == 0 && HandShake == 0;
                return (StationNum == 1 && HandShake == 0 && Roadway == "B") || (StationNum == 0 && HandShake == 0);
                WriteLog.Write_Log("出库库口状态信息", "出库库口状态信息", $"库口是【{NextAddress}】,申请状态地址:【{HandShakeprodto.DeviceProAddress}】,读取的数据:【{HandShake}】\n库口是否有货状态地址:【{deviceProDTO.DeviceProAddress}】,读取的数据【{StationNum}】");
                  if (Roadway == "C" || Roadway == "G") return StationNum == 0 && HandShake == 0;
                return (StationNum == 1 && HandShake == 0 && Roadway == "B");
            }
            catch (Exception ex)
            {
                Task.Run(() => Console.WriteLine("读取站台信息错误:" + ex.Message));
              Console.WriteLine("读取站台信息错误:" + ex.Message);
                return false;
            }
        }
        /// <summary>
        /// å…¥åº“任务库口有货无货状态
        /// </summary>
        private void InTaskStationIsOccupied(string SourceAddress, string Roadway)
        public bool InTaskStationIsOccupied(string SourceAddress, string Roadway)
        {
            try
            {
                CommonConveyorLine? conveyorLine = null;
                lock (Storage.Devices)
                {
                    string deviceCode = Roadway == "C" ? "1004" : "1003";
                    conveyorLine = Storage.Devices.FirstOrDefault(x => x.DeviceCode == deviceCode) as CommonConveyorLine;
                }
                if (conveyorLine == null) return;
                if (conveyorLine == null) return false;
                DeviceProDTO? deviceProDTO = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == SourceAddress && x.DeviceProParamName == "StationNum");
                DeviceProDTO? HandShakeprodto = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == SourceAddress && x.DeviceProParamName == "HandShake");
                if (deviceProDTO == null || HandShakeprodto == null) return;
                if (deviceProDTO == null || HandShakeprodto == null) return false;
                int StationNum = conveyorLine.Communicator.Read<ushort>(deviceProDTO.DeviceProAddress);
                int HandShake = conveyorLine.Communicator.Read<ushort>(HandShakeprodto.DeviceProAddress);
                Task.Run(() => WriteLog.Write_Log("入库库口状态信息", "入库库口状态信息", $"库口是【{SourceAddress}】,申请状态地址:【{HandShakeprodto.DeviceProAddress}】,读取的数据:【{HandShake}】\n库口是否有货状态地址:【{deviceProDTO.DeviceProAddress}】,读取的数据【{StationNum}】"));
                WriteLog.Write_Log("入库库口状态信息", "入库库口状态信息", $"库口是【{SourceAddress}】,申请状态地址:【{HandShakeprodto.DeviceProAddress}】,读取的数据:【{HandShake}】\n库口是否有货状态地址:【{deviceProDTO.DeviceProAddress}】,读取的数据【{StationNum}】");
                return (StationNum == 1 && HandShake == 0) ? true : false;
            }
            catch (Exception ex)
            {
                Task.Run(() => Console.WriteLine("读取站台信息错误:" + ex.Message));
               Console.WriteLine("读取站台信息错误:" + ex.Message);
                return false;
            }
        }
@@ -534,17 +508,24 @@
        /// </summary>
        public string ReadStackerFaults(CommonStackerCrane crane)
        {
            string activeFaults = "";
            try
            {
                foreach (var fault in _stackerFaultMap)
                foreach (StackerFault fault in Enum.GetValues(typeof(StackerFault)))
                {
                    try { bool isFault = crane.Communicator.Read<bool>(fault.Key); if (isFault) { activeFaults = fault.Value; break; } } catch { }
                    try
                    {
                        bool isFault = crane.Communicator.Read<bool>(fault.ToPlcAddress());
                        if (isFault)
                            return fault.GetDesc();
                    }
                    catch { }
                }
            }
            catch (Exception ex) { WriteLog.Write_Log("DB107故障读取异常", "错误", ex.ToString()); }
            return activeFaults;
            catch (Exception ex)
            {
                WriteLog.Write_Log("DB107故障读取异常", "错误", ex.ToString());
            }
            return string.Empty;
        }
    }
}