dengjunjie
2025-07-09 7ca9651f81d7b84f054194d3d46fdbd1d9c8b922
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/ConveyorLineExtend/AGVsignal.cs
@@ -12,6 +12,7 @@
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_Tasks.ConveyorLineJob.ConveyorLineExtend;
using WIDESEAWCS_Tasks.ProductionLineJob;
namespace WIDESEAWCS_Tasks
{
@@ -29,23 +30,81 @@
            {
                if (conveyor == null) throw new Exception("请求数据为空");
                if (string.IsNullOrEmpty(conveyor.Station)) throw new Exception("站点编号为空");
                CommonConveyorLine conveyorLine = Storage.Devices.FirstOrDefault(x => x.DeviceName == "输送线") as CommonConveyorLine;
                if (!conveyorLine.IsConnected) throw new Exception($"通讯连接错误,请检查网络");
                switch (conveyor.Station)
                {
                    case "1001":
                    case "1008":
                        content = AGVRequestinConveyorLine(conveyor);
                        break;
                    case "MDX01":
                        content = AGVRequestinProductionLine(conveyor);
                        break;
                    default: throw new Exception($"未定义站台号[Station:{conveyor.Station}]");
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// AGV和输送线交互
        /// </summary>
        /// <returns></returns>
        public static WebResponseContent AGVRequestinConveyorLine(ConveyorLineDTO conveyor)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                CommonConveyorLine? conveyorLine = Storage.Devices.FirstOrDefault(x => x.DeviceName == "输送线") as CommonConveyorLine;
                if (conveyorLine == null) throw new Exception("未找到输送线设备信息");
                if (!conveyorLine.IsConnected) throw new Exception($"输送线设备通讯异常");
                switch (conveyor.Type)
                {
                    case 1:
                        content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVRequestPut, true, conveyor.Station);
                        if (content.Status) content.Status = conveyorLine.GetValue<ConveyorLine_AGV, bool>(ConveyorLine_AGV.ConveyorLinePermitPut, conveyor.Station);
                        {
                            if (conveyor.Station == "1001")
                            {
                                content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVRequestPut, true, conveyor.Station);
                                if (content.Status) content.Status = conveyorLine.GetValue<ConveyorLine_AGV, bool>(ConveyorLine_AGV.ConveyorLinePermitPut, conveyor.Station);
                            }
                            else
                            {
                                content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVRequestTake, true, conveyor.Station);
                                if (content.Status) content.Status = conveyorLine.GetValue<ConveyorLine_AGV, bool>(ConveyorLine_AGV.ConveyorLinePermitTake, conveyor.Station);
                            }
                        }
                        break;
                    case 2:
                        content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVPutComplete, true, conveyor.Station);
                        break;
                    case 3:
                        content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVRequestTake, true, conveyor.Station);
                        if (content.Status) content.Status = conveyorLine.GetValue<ConveyorLine_AGV, bool>(ConveyorLine_AGV.ConveyorLinePermitTake, conveyor.Station);
                        {
                            if (conveyor.Station == "1001")
                            {
                                content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVPutComplete, true, conveyor.Station);
                                //if (content.Status)
                                //{
                                //    Thread.Sleep(1000);
                                //    conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVRequestPut, false, conveyor.Station);
                                //    conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVPutComplete, false, conveyor.Station);
                                //}
                            }
                            else
                            {
                                content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVTakeComplete, true, conveyor.Station);
                                //if (content.Status)
                                //{
                                //    Thread.Sleep(1000);
                                //    conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVRequestTake, false, conveyor.Station);
                                //    conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVTakeComplete, false, conveyor.Station);
                                //}
                            }
                        }
                        break;
                    case 4:
                        content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVTakeComplete, true, conveyor.Station);
                        break;
                    default: throw new Exception($"类型有误[Type:{conveyor.Type}]");
                }
@@ -57,41 +116,65 @@
            }
            return content;
        }
        public static WebResponseContent AGVRequestin<T>(T conveyor) where T : ConveyorLineDTO, new()
        /// <summary>
        /// AGV和产线交互
        /// </summary>
        /// <returns></returns>
        public static WebResponseContent AGVRequestinProductionLine(ConveyorLineDTO conveyor)
        {
            WebResponseContent content = new WebResponseContent();
            OtherDevice? ProductionLine = Storage.Devices.FirstOrDefault(x => x.DeviceCode == conveyor.Station) as OtherDevice;
            try
            {
                if (conveyor == null) throw new Exception("请求数据为空");
                if (string.IsNullOrEmpty(conveyor.Station)) throw new Exception("站点编号为空");
                CommonConveyorLine conveyorLine = Storage.Devices.FirstOrDefault(x => x.DeviceName == "输送线") as CommonConveyorLine;
                if (!conveyorLine.IsConnected) throw new Exception($"通讯连接错误,请检查网络");
                if (ProductionLine == null) throw new Exception("未找到产线设备信息");
                if (!ProductionLine.IsConnected) throw new Exception($"产线设备通讯异常");
                content.Status = ProductionLine.SetValue(ProductionLineDBName.WagvState, conveyor.Type);
                if (!content.Status) throw new Exception("写入AGV信号失败");
                var agvState = ProductionLine.GetValue<ProductionLineDBName, short>(ProductionLineDBName.agvState);
                if (agvState == 3) throw new Exception("产线设备异常");
                switch (conveyor.Type)
                {
                    case 1:
                        content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVRequestPut, true, conveyor.Station);
                        if (content.Status) content.Status = conveyorLine.GetValue<ConveyorLine_AGV, bool>(ConveyorLine_AGV.ConveyorLinePermitPut, conveyor.Station);
                        if (agvState != conveyor.Type) throw new Exception($"AGV申请进入,产线不允许进入作业,产线信号【{agvState}】");
                        ProductionLine?.Communicator.LogNet.WriteDebug($"AGV申请进入,产线允许进入作业,产线信号【{agvState}】");
                        content.OK();
                        break;
                    case 2:
                        content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVPutComplete, true, conveyor.Station);
                        //if (agvState != conveyor.Type) throw new Exception("产线不允许离开");
                        content.OK();
                        break;
                    case 3:
                        content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVRequestTake, true, conveyor.Station);
                        if (content.Status) content.Status = conveyorLine.GetValue<ConveyorLine_AGV, bool>(ConveyorLine_AGV.ConveyorLinePermitTake, conveyor.Station);
                        content.Status = ProductionLine.SetValue(ProductionLineDBName.Wrequest, 2);
                        ProductionLine?.Communicator.LogNet.WriteDebug($"AGV已离开,任务完成");
                        break;
                    case 4:
                        content.Status = conveyorLine.SetValue(ConveyorLine_AGV.WriteAGVTakeComplete, true, conveyor.Station);
                        break;
                    default: throw new Exception($"类型有误[Type:{conveyor.Type}]");
                }
                content = content.Status ? content.OK() : content.Error();
                content = content.Status ? content.OK() : content.Error("写入失败");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
                ProductionLine?.Communicator.LogNet.WriteDebug(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// å…¥åº“输送线人工放货完成
        /// </summary>
        /// <returns></returns>
        public static WebResponseContent ReleaseCompleted()
        {
            try
            {
                CommonConveyorLine? conveyorLine = Storage.Devices.FirstOrDefault(x => x.DeviceName == "输送线") as CommonConveyorLine;
                if (conveyorLine == null) throw new Exception("未找到输送线设备信息");
                if (!conveyorLine.IsConnected) throw new Exception($"输送线设备通讯异常");
                conveyorLine.SetValue(ConveyorLine_AGV.WriteRGPutComplete, true, "1001");//人工放货完成
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}