wangxinhui
2024-11-06 8f392cc88b0768b74efca3b68785cf5aa1c38e70
wcs-server-hbf/WIDESEA_WCS/SchedulerExecute/Equipment/Z_GFSB_DownTask.cs
@@ -6,6 +6,7 @@
using System.Linq;
using System.Security.Policy;
using System.Threading;
using System.Threading.Tasks;
using WIDESEA_Common;
using WIDESEA_Common.LoctionEnum;
using WIDESEA_Common.Tools;
@@ -30,206 +31,105 @@
        {
            if (Interlocked.Exchange(ref _readGFBUPSignalso, 1) == 0)
            {
                try
                Task.Run(() =>
                {
                    VOLContext Context = new VOLContext();
                    Ibase_ware_locationRepository locRepository = new base_ware_locationRepository(Context);
                    Ibase_routing_tableRepository routingRepository = new base_routing_tableRepository(Context);
                    Idt_agvtaskRepository agvRepository = new dt_agvtaskRepository(Context);
                    Idt_agvtask_htyRepository agvhtyRepository = new dt_agvtask_htyRepository(Context);
                    List<string> GFSBS = new List<string> { "辊分机正极1", "辊分机正极2", "辊分机正极3", "辊分机正极4" };
                    //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"--------------开始----------- 时间记录:{DateTime.Now}", $"{GFSBS}下料呼叫");
                    foreach (var GFSB in GFSBS)
                    try
                    {
                        //string SBID = GFSB.Replace("辊分机正极", "");//设备号
                        PLCClient plc = WCSService.Clients.Find(v => v.PLCName == GFSB);
                        if (plc == null)
                        VOLContext Context = new VOLContext();
                        Ibase_ware_locationRepository locRepository = new base_ware_locationRepository(Context);
                        Ibase_routing_tableRepository routingRepository = new base_routing_tableRepository(Context);
                        Idt_agvtaskRepository agvRepository = new dt_agvtaskRepository(Context);
                        Idt_agvtask_htyRepository agvhtyRepository = new dt_agvtask_htyRepository(Context);
                        List<string> GFSBS = new List<string> { "辊分机正极1", "辊分机正极2", "辊分机正极3", "辊分机正极4" };
                        //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"--------------开始----------- 时间记录:{DateTime.Now}", $"{GFSBS}下料呼叫");
                        foreach (var GFSB in GFSBS)
                        {
                            //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"设备:{GFSB} 内容:未连接PLC 时间记录:{DateTime.Now}", $"{GFSBS}下料呼叫");
                            //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"--------------结束----------- 时间记录:{DateTime.Now}{Environment.NewLine}", $"{GFSBS}下料呼叫");
                            continue;
                        }
                        //bool GYC_RFX1 = Convert.ToBoolean(plc.ReadValue("R_Feedingrequest1".ToString(), plc.PLCDescroption));//下料口一下料信号
                        //bool GYC_RFX2 = Convert.ToBoolean(plc.ReadValue("R_Feedingrequest2".ToString(), plc.PLCDownLoc));//下料口二下料信号
                        OperateResult<bool> GYC_RFX1 = plc.MelsecPLCClient.MelsecMcNetClient.ReadBool("D5693.0");
                        if (!GYC_RFX1.IsSuccess)
                        {
                            //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"{GFSBS}下料一口断开连接  时间:{DateTime.Now}  -------------- {Environment.NewLine}", $"{GFSBS}下料呼叫");
                            continue;
                        }
                        if (GYC_RFX1.Content)
                        {
                            //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"读取 设备:{GFSB}下料一口 DB偏移值:D5693.0,读取值:{GYC_RFX1.Content} 时间记录:{DateTime.Now}", $"{GFSBS}下料呼叫");
                            //查看当前辊分机设备是否有AGV任务
                            var SBtask = agvRepository.FindFirst(f => f.agv_fromaddress == plc.PLCDescroption && (f.agv_taskstate == AGVTaskStateEnum.Create.ToString() || f.agv_taskstate == AGVTaskStateEnum.SendOut.ToString() || f.agv_taskstate == AGVTaskStateEnum.Executing.ToString() || f.agv_taskstate == AGVTaskStateEnum.Complete.ToString()));
                            //有结束本次循环
                            if (SBtask != null) {
                                //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"读取 设备:{GFSB}下料一口,AGV任务列表中存在任务,无法继续下发任务,时间记录:{DateTime.Now}", $"{GFSBS}下料呼叫");
                            }
                            else
                            //string SBID = GFSB.Replace("辊分机正极", "");//设备号
                            PLCClient plc = WCSService.Clients.Find(v => v.PLCName == GFSB);
                            if (plc == null)
                            {
                                List<base_routing_table> Routing_Table = routingRepository.Find(d => d.route_began == plc.PLCDescroption);
                                //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"设备:{GFSB} 内容:未连接PLC 时间记录:{DateTime.Now}", $"{GFSBS}下料呼叫");
                                //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"--------------结束----------- 时间记录:{DateTime.Now}{Environment.NewLine}", $"{GFSBS}下料呼叫");
                                continue;
                            }
                            //bool GYC_RFX1 = Convert.ToBoolean(plc.ReadValue("R_Feedingrequest1".ToString(), plc.PLCDescroption));//下料口一下料信号
                            //bool GYC_RFX2 = Convert.ToBoolean(plc.ReadValue("R_Feedingrequest2".ToString(), plc.PLCDownLoc));//下料口二下料信号
                            OperateResult<bool> GYC_RFX1 = plc.MelsecPLCClient.MelsecMcNetClient.ReadBool("D5693.0");
                            if (!GYC_RFX1.IsSuccess)
                            {
                                //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"{GFSBS}下料一口断开连接  时间:{DateTime.Now}  -------------- {Environment.NewLine}", $"{GFSBS}下料呼叫");
                                continue;
                            }
                                base_ware_location Location = null; //绑定设备的货架
                                foreach (var item in Routing_Table)
                            if (GYC_RFX1.Content)
                            {
                                //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"读取 设备:{GFSB}下料一口 DB偏移值:D5693.0,读取值:{GYC_RFX1.Content} 时间记录:{DateTime.Now}", $"{GFSBS}下料呼叫");
                                //查看当前辊分机设备是否有AGV任务
                                var SBtask = agvRepository.FindFirst(f => f.agv_fromaddress == plc.PLCDescroption && (f.agv_taskstate == AGVTaskStateEnum.Create.ToString() || f.agv_taskstate == AGVTaskStateEnum.SendOut.ToString() || f.agv_taskstate == AGVTaskStateEnum.Executing.ToString() || f.agv_taskstate == AGVTaskStateEnum.Complete.ToString()));
                                //有结束本次循环
                                if (SBtask != null)
                                {
                                    //查找绑定设备的货架
                                    base_ware_location ware_Locations = locRepository.FindFirst(d => d.down_code == item.route_end && d.location_state == LoctionStateEnum.LocationState_Stored.ToString() && d.tpgd == 1 && d.status == 1 && d.light_color == plc.PLCName.ToString());
                                    if (ware_Locations != null)
                                    {
                                        Location = ware_Locations;
                                        break;
                                    }
                                    //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"读取 设备:{GFSB}下料一口,AGV任务列表中存在任务,无法继续下发任务,时间记录:{DateTime.Now}", $"{GFSBS}下料呼叫");
                                }
                                if (Location != null)
                                else
                                {
                                    if (Location.gd1 == 1 && Location.gd4 == 1)//代表下料1,2口下的料无法在这个货架装料了,货架就取消设备绑定
                                    {
                                        var upper_code = Location.upper_code.Split('-');
                                        string tasknum = upper_code[0] + "-" + upper_code[1];
                                        var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress.Contains(tasknum));
                                        if (loctionNUM == null)
                                        {
                                            Location.light_color = "无";
                                            locRepository.Update(Location,d=>d.light_color, true);
                                        }
                                    #region 记录下料请求信号
                                    WriteLog.GetLog().Write($"下料口1请求:{GYC_RFX1.Content}---{DateTime.Now}", $"{plc.PLCName}下料请求");
                                    #endregion
                                    List<base_routing_table> Routing_Table = routingRepository.Find(d => d.route_began == plc.PLCDescroption);
                                    }
                                    else if (Location.gd1 == 0)//代表这个货架还能给下料1口装料
                                    base_ware_location Location = null; //绑定设备的货架
                                    foreach (var item in Routing_Table)
                                    {
                                        var a = "";
                                        var upper_code = Location.upper_code.Split('-');
                                        if (Location.gd1 == 0 && Location.gd2 == 0 && a == "")//内侧外侧都没有料优先放内侧
                                        //查找绑定设备的货架
                                        base_ware_location ware_Locations = locRepository.FindFirst(d => d.down_code == item.route_end && d.location_state == LoctionStateEnum.LocationState_Stored.ToString() && d.tpgd == 1 && d.status == 1 && d.light_color == plc.PLCName.ToString());
                                        if (ware_Locations != null)
                                        {
                                            //string tasknumwc = upper_code[0] + "-" + upper_code[1] + "-2";//外侧 1-1 防止异常情况(AGV执行中异常,把光电挡了或手动送料在这个工位上,导致外侧任务未完成,就下发内侧任务)
                                            //var loctionwc = agvRepository.FindFirst(f => f.agv_toaddress == tasknumwc);
                                            //if (loctionwc == null)
                                            //{
                                            string WCtasknum = upper_code[0] + "-" + upper_code[1] + "-2";//外侧 1-2
                                            var WCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == WCtasknum);
                                            if (WCloctionNUM == null)
                                            {
                                                string tasknum = upper_code[0] + "-" + upper_code[1] + "-1";//内侧 1-1
                                                var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == tasknum);
                                                if (loctionNUM == null)
                                                {
                                                    a = tasknum;
                                                }
                                            }
                                            //}
                                        }
                                      else  if (Location.gd2 == 1 && Location.gd1 == 0 && a == "")//内侧有料时放外侧
                                        {
                                            string NCtasknum = upper_code[0] + "-" + upper_code[1] + "-1";//内侧 1-1
                                            var NCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == NCtasknum);
                                            if (NCloctionNUM == null)
                                            {
                                                string tasknum = upper_code[0] + "-" + upper_code[1] + "-2";//外侧 1-2
                                                var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == tasknum);
                                                if (loctionNUM == null)
                                                {
                                                    a = tasknum;
                                                }
                                            }
                                        }
                                        if (a != "")
                                        {
                                            dt_agvtask_hty agvtask_Hty = agvhtyRepository.Find(d => d.agv_toaddress == a && d.agv_taskstate == AGVTaskStateEnum.TaskState_Finished.ToString()).OrderByDescending(d => d.agv_finishedtime ).FirstOrDefault();
                                            if (agvtask_Hty != null)
                                            {
                                                bool interval = (DateTime.Now - agvtask_Hty.agv_finishedtime).Value.TotalSeconds < 100;
                                                if (interval)
                                                {
                                                    continue;
                                                }
                                            }
                                            //生成辊分机下料任务
                                            dt_agvtask agvtask = new dt_agvtask()
                                            {
                                                agv_id = Guid.NewGuid(),
                                                agv_tasknum = "KH-" + IdenxManager.GetTaskNo(),
                                                agv_fromaddress = plc.PLCDescroption,
                                                agv_toaddress = a,
                                                agv_code = "组装AGV调度",
                                                agv_remark = "辊分下料任务",
                                                agv_taskstate = AGVTaskStateEnum.Create.ToString(),
                                                agv_tasktype = AGVTaskTypeEnum.TaskType_Outbound.ToString(),
                                                agv_worktype = 1,//工作类型
                                                agv_materielid = "",
                                                agv_qty = 1,
                                                agv_createtime = DateTime.Now,
                                                agv_grade = 0,//任务优先级
                                                agv_userid = "WCS",
                                                agv_barcode = "",
                                            };
                                            //Location.update_time = DateTime.Now;
                                            Location.task = 1;
                                            Location.logic_col = 0;
                                            var entry = locRepository.DbContext.ChangeTracker.Entries<base_ware_location>().FirstOrDefault();
                                            if (entry != null)
                                            {
                                                entry.State = EntityState.Detached;
                                            }
                                           int zone= locRepository.Update(Location, d => new { d.task, d.logic_col }, true);
                                            if (zone==1)
                                            {
                                                agvRepository.Add(agvtask, true);
                                                WriteDBLog.Info($"【{GFSB}】下料一口任务生成").Write($"生成任务:{agvtask.agv_tasknum},终点货位【{a}】状态:托盘光电检测:{Location.tpgd},-1光电:{Location.gd2},-2光电:{Location.gd1},-3光电:{Location.gd4},-4光电:{Location.gd3},状态:{Location.location_state},设备绑定:{Location.light_color},更新时间:{Location.wireless_time}", $"【{GFSB}】下料一口任务生成");
                                                WriteDBLog.Info($"【{GFSB}】下料一口任务生成").Write($"----------------任务生成成功  {DateTime.Now} -------------- {Environment.NewLine}", $"【{GFSB}】下料一口任务生成");
                                            }
                                            Location = ware_Locations;
                                            break;
                                        }
                                    }
                                    else
                                    if (Location != null)
                                    {
                                        //代表这个货架无法装下料1口的料了,但是下料2口还可以装料在这个货架上,货架不能取消设备绑定
                                    }
                                }//代表有这个设备绑定的货架
                                else //代表没有这个设备绑定的货架,进行找一个没有设备绑定的货架进行绑定,来给这台设备装料
                                {
                                    List<base_ware_location> loctionList = new List<base_ware_location>();
                                    foreach (var item in Routing_Table)
                                    {
                                        base_ware_location ware_Locations = locRepository.FindFirst(d => d.down_code == item.route_end && d.location_state == LoctionStateEnum.LocationState_Stored.ToString() && d.tpgd == 1 && d.status == 1 && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.light_color == "无");
                                        if (ware_Locations == null)
                                        if (Location.gd1 == 1 && Location.gd4 == 1)//代表下料1,2口下的料无法在这个货架装料了,货架就取消设备绑定
                                        {
                                            continue;
                                        }
                                        loctionList.Add(ware_Locations);
                                    }
                                            var upper_code = Location.upper_code.Split('-');
                                            string tasknum = upper_code[0] + "-" + upper_code[1];
                                            var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress.Contains(tasknum));
                                            if (loctionNUM == null)
                                            {
                                                Location.light_color = "无";
                                                locRepository.Update(Location, d => d.light_color, true);
                                            }
                                    if (loctionList.Count != 0)
                                    {
                                        List<base_ware_location> Locationlist = loctionList.OrderBy(d => d.update_time).ToList();
                                        foreach (var xLocation in Locationlist)
                                        }
                                        else if (Location.gd1 == 0)//代表这个货架还能给下料1口装料
                                        {
                                            var a = "";
                                            var upper_code = xLocation.upper_code.Split('-');
                                            if (xLocation.gd1 == 0 && xLocation.gd2 == 0 && a == "")//内侧外侧都没有料优先放内侧
                                            var upper_code = Location.upper_code.Split('-');
                                            if (Location.gd1 == 0 && Location.gd2 == 0 && a == "")//内侧外侧都没有料优先放内侧
                                            {
                                                //string tasknumwc = upper_code[0] + "-" + upper_code[1] + "-2";//外侧 1-1 防止异常情况(AGV执行中异常,把光电挡了或手动送料在这个工位上,导致外侧任务未完成,就下发内侧任务)
                                                //var loctionwc = agvRepository.FindFirst(f => f.agv_toaddress == tasknumwc);
                                                //if (loctionwc == null)
                                                //{
                                                string WCtasknum = upper_code[0] + "-" + upper_code[1] + "-2";//外侧 1-2
                                                var WCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == WCtasknum);
                                                if (WCloctionNUM == null)
                                                {
                                                    string tasknum = upper_code[0] + "-" + upper_code[1] + "-1";//内侧 1-1
                                                    var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == tasknum);
                                                    if (loctionNUM == null)
                                                    {
                                                        a = tasknum;
                                                    }
                                                }
                                                //}
                                            }
                                            if (xLocation.gd2 == 1 && xLocation.gd1 == 0 && a == "")//内侧有料时放外侧
                                            else if (Location.gd2 == 1 && Location.gd1 == 0 && a == "")//内侧有料时放外侧
                                            {
                                                string NCtasknum = upper_code[0] + "-" + upper_code[1] + "-1";//内侧 1-1
                                                var NCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == NCtasknum);
                                                if (NCloctionNUM == null)
                                                {
@@ -241,11 +141,10 @@
                                                    }
                                                }
                                            }
                                            if (a != "")
                                            {
                                                dt_agvtask_hty agvtask_Hty= agvhtyRepository.Find(d => d.agv_toaddress== a && d.agv_taskstate == AGVTaskStateEnum.TaskState_Finished.ToString()).OrderByDescending(d=>d.agv_finishedtime).FirstOrDefault();
                                                if (agvtask_Hty!=null)
                                                dt_agvtask_hty agvtask_Hty = agvhtyRepository.Find(d => d.agv_toaddress == a && d.agv_taskstate == AGVTaskStateEnum.TaskState_Finished.ToString()).OrderByDescending(d => d.agv_finishedtime).FirstOrDefault();
                                                if (agvtask_Hty != null)
                                                {
                                                    bool interval = (DateTime.Now - agvtask_Hty.agv_finishedtime).Value.TotalSeconds < 100;
                                                    if (interval)
@@ -253,8 +152,8 @@
                                                        continue;
                                                    }
                                                }
                                               //生成辊分机下料任务
                                               dt_agvtask agvtask = new dt_agvtask()
                                                //生成辊分机下料任务
                                                dt_agvtask agvtask = new dt_agvtask()
                                                {
                                                    agv_id = Guid.NewGuid(),
                                                    agv_tasknum = "KH-" + IdenxManager.GetTaskNo(),
@@ -272,185 +171,196 @@
                                                    agv_userid = "WCS",
                                                    agv_barcode = "",
                                                };
                                                //Location.update_time = DateTime.Now;
                                                xLocation.task = 1;
                                                xLocation.logic_col = 0;
                                                xLocation.light_color = plc.PLCName;
                                                Location.task = 1;
                                                Location.logic_col = 0;
                                                var entry = locRepository.DbContext.ChangeTracker.Entries<base_ware_location>().FirstOrDefault();
                                                if (entry != null)
                                                {
                                                    entry.State = EntityState.Detached;
                                                }
                                              int zone=  locRepository.Update(xLocation, d => new { d.task, d.light_color, d.logic_col }, true);
                                                if (zone==1)
                                                int zone = locRepository.Update(Location, d => new { d.task, d.logic_col }, true);
                                                if (zone == 1)
                                                {
                                                    agvRepository.Add(agvtask, true);
                                                    WriteDBLog.Info($"【{GFSB}】下料一口任务生成").Write($"生成任务:{agvtask.agv_tasknum},终点货位【{a}】状态:托盘光电检测:{xLocation.tpgd},-1光电:{xLocation.gd2},-2光电:{xLocation.gd1},-3光电:{xLocation.gd4},-4光电:{xLocation.gd3},状态:{xLocation.location_state},设备绑定:{xLocation.light_color},更新时间:{Location.wireless_time}", $"【{GFSB}】下料一口任务生成");
                                                    WriteDBLog.Info($"【{GFSB}】下料一口任务生成").Write($"----------------任务生成成功  {DateTime.Now} -------------- {Environment.NewLine}", $"【{GFSB}】下料一口任务生成");
                                                    //WriteDBLog.Info($"【{GFSB}】下料一口任务生成").Write($"生成任务:{agvtask.agv_tasknum},终点货位【{a}】状态:托盘光电检测:{Location.tpgd},-1光电:{Location.gd2},-2光电:{Location.gd1},-3光电:{Location.gd4},-4光电:{Location.gd3},状态:{Location.location_state},设备绑定:{Location.light_color},更新时间:{Location.wireless_time}", $"【{GFSB}】下料一口任务生成");
                                                    //WriteDBLog.Info($"【{GFSB}】下料一口任务生成").Write($"----------------任务生成成功  {DateTime.Now} -------------- {Environment.NewLine}", $"【{GFSB}】下料一口任务生成");
                                                }
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            //代表这个货架无法装下料1口的料了,但是下料2口还可以装料在这个货架上,货架不能取消设备绑定
                                        }
                                    }//代表有这个设备绑定的货架
                                    else //代表没有这个设备绑定的货架,进行找一个没有设备绑定的货架进行绑定,来给这台设备装料
                                    {
                                        List<base_ware_location> loctionList = new List<base_ware_location>();
                                        foreach (var item in Routing_Table)
                                        {
                                            base_ware_location ware_Locations = locRepository.FindFirst(d => d.down_code == item.route_end && d.location_state == LoctionStateEnum.LocationState_Stored.ToString() && d.tpgd == 1 && d.status == 1 && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.light_color == "无");
                                            if (ware_Locations == null)
                                            {
                                                continue;
                                            }
                                            loctionList.Add(ware_Locations);
                                        }
                                        if (loctionList.Count != 0)
                                        {
                                            List<base_ware_location> Locationlist = loctionList.OrderBy(d => d.update_time).ToList();
                                            foreach (var xLocation in Locationlist)
                                            {
                                                var a = "";
                                                var upper_code = xLocation.upper_code.Split('-');
                                                if (xLocation.gd1 == 0 && xLocation.gd2 == 0 && a == "")//内侧外侧都没有料优先放内侧
                                                {
                                                    string WCtasknum = upper_code[0] + "-" + upper_code[1] + "-2";//外侧 1-2
                                                    var WCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == WCtasknum);
                                                    if (WCloctionNUM == null)
                                                    {
                                                        string tasknum = upper_code[0] + "-" + upper_code[1] + "-1";//内侧 1-1
                                                        var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == tasknum);
                                                        if (loctionNUM == null)
                                                        {
                                                            a = tasknum;
                                                        }
                                                    }
                                                }
                                                if (xLocation.gd2 == 1 && xLocation.gd1 == 0 && a == "")//内侧有料时放外侧
                                                {
                                                    string NCtasknum = upper_code[0] + "-" + upper_code[1] + "-1";//内侧 1-1
                                                    var NCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == NCtasknum);
                                                    if (NCloctionNUM == null)
                                                    {
                                                        string tasknum = upper_code[0] + "-" + upper_code[1] + "-2";//外侧 1-2
                                                        var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == tasknum);
                                                        if (loctionNUM == null)
                                                        {
                                                            a = tasknum;
                                                        }
                                                    }
                                                }
                                                if (a != "")
                                                {
                                                    dt_agvtask_hty agvtask_Hty = agvhtyRepository.Find(d => d.agv_toaddress == a && d.agv_taskstate == AGVTaskStateEnum.TaskState_Finished.ToString()).OrderByDescending(d => d.agv_finishedtime).FirstOrDefault();
                                                    if (agvtask_Hty != null)
                                                    {
                                                        bool interval = (DateTime.Now - agvtask_Hty.agv_finishedtime).Value.TotalSeconds < 100;
                                                        if (interval)
                                                        {
                                                            continue;
                                                        }
                                                    }
                                                    //生成辊分机下料任务
                                                    dt_agvtask agvtask = new dt_agvtask()
                                                    {
                                                        agv_id = Guid.NewGuid(),
                                                        agv_tasknum = "KH-" + IdenxManager.GetTaskNo(),
                                                        agv_fromaddress = plc.PLCDescroption,
                                                        agv_toaddress = a,
                                                        agv_code = "组装AGV调度",
                                                        agv_remark = "辊分下料任务",
                                                        agv_taskstate = AGVTaskStateEnum.Create.ToString(),
                                                        agv_tasktype = AGVTaskTypeEnum.TaskType_Outbound.ToString(),
                                                        agv_worktype = 1,//工作类型
                                                        agv_materielid = "",
                                                        agv_qty = 1,
                                                        agv_createtime = DateTime.Now,
                                                        agv_grade = 0,//任务优先级
                                                        agv_userid = "WCS",
                                                        agv_barcode = "",
                                                    };
                                                    //Location.update_time = DateTime.Now;
                                                    xLocation.task = 1;
                                                    xLocation.logic_col = 0;
                                                    xLocation.light_color = plc.PLCName;
                                                    var entry = locRepository.DbContext.ChangeTracker.Entries<base_ware_location>().FirstOrDefault();
                                                    if (entry != null)
                                                    {
                                                        entry.State = EntityState.Detached;
                                                    }
                                                    int zone = locRepository.Update(xLocation, d => new { d.task, d.light_color, d.logic_col }, true);
                                                    if (zone == 1)
                                                    {
                                                        agvRepository.Add(agvtask, true);
                                                        ////WriteDBLog.Info($"【{GFSB}】下料一口任务生成").Write($"生成任务:{agvtask.agv_tasknum},终点货位【{a}】状态:托盘光电检测:{xLocation.tpgd},-1光电:{xLocation.gd2},-2光电:{xLocation.gd1},-3光电:{xLocation.gd4},-4光电:{xLocation.gd3},状态:{xLocation.location_state},设备绑定:{xLocation.light_color},更新时间:{Location.wireless_time}", $"【{GFSB}】下料一口任务生成");
                                                        //WriteDBLog.Info($"【{GFSB}】下料一口任务生成").Write($"----------------任务生成成功  {DateTime.Now} -------------- {Environment.NewLine}", $"【{GFSB}】下料一口任务生成");
                                                    }
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        OperateResult<bool> GYC_RFX2 = plc.MelsecPLCClient.MelsecMcNetClient.ReadBool("D5893.0");
                        if (!GYC_RFX2.IsSuccess)
                        {
                            //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"{GFSBS}二口断开连接  时间:{DateTime.Now}  -------------- {Environment.NewLine}", $"{GFSBS}下料呼叫");
                            continue;
                        }
                        if (GYC_RFX2.Content)
                        {
                            //查看当前辊分机设备是否有AGV任务
                            var SBtask = agvRepository.FindFirst(f => f.agv_fromaddress == plc.PLCDownLoc && (f.agv_taskstate == AGVTaskStateEnum.Create.ToString() || f.agv_taskstate == AGVTaskStateEnum.SendOut.ToString() || f.agv_taskstate == AGVTaskStateEnum.Executing.ToString() || f.agv_taskstate == AGVTaskStateEnum.Complete.ToString()));
                            //有结束本次循环
                            if (SBtask != null) { }
                            else
                            OperateResult<bool> GYC_RFX2 = plc.MelsecPLCClient.MelsecMcNetClient.ReadBool("D5893.0");
                            if (!GYC_RFX2.IsSuccess)
                            {
                                List<base_routing_table> Routing_Table = routingRepository.Find(d => d.route_began == plc.PLCDownLoc);
                                //WriteLog.GetLog($"{GFSBS}下料呼叫").Write($"{GFSBS}二口断开连接  时间:{DateTime.Now}  -------------- {Environment.NewLine}", $"{GFSBS}下料呼叫");
                                continue;
                                base_ware_location Location = null; //找绑定设备的货架
                                foreach (var item in Routing_Table)
                            }
                            if (GYC_RFX2.Content)
                            {
                                //查看当前辊分机设备是否有AGV任务
                                var SBtask = agvRepository.FindFirst(f => f.agv_fromaddress == plc.PLCDownLoc && (f.agv_taskstate == AGVTaskStateEnum.Create.ToString() || f.agv_taskstate == AGVTaskStateEnum.SendOut.ToString() || f.agv_taskstate == AGVTaskStateEnum.Executing.ToString() || f.agv_taskstate == AGVTaskStateEnum.Complete.ToString()));
                                //有结束本次循环
                                if (SBtask != null) { }
                                else
                                {
                                    //绑定设备的货架
                                    base_ware_location ware_Locations = locRepository.FindFirst(d => d.upper_code == item.route_end && d.location_state == LoctionStateEnum.LocationState_Stored.ToString() && d.tpgd == 1 && d.status == 1 && d.light_color == plc.PLCName.ToString());
                                    if (ware_Locations != null)
                                    {
                                        Location = ware_Locations;
                                        break;
                                    }
                                }
                                if (Location != null)
                                {
                                    if (Location.gd1 == 1 && Location.gd4 == 1)//代表下料1,2口下的料无法在这个货架装料了,货架就取消设备绑定
                                    {
                                        var upper_code = Location.upper_code.Split('-');
                                        string tasknum = upper_code[0] + "-" + upper_code[1];
                                        var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress.Contains(tasknum));
                                        if (loctionNUM == null)
                                        {
                                            Location.light_color = "无";
                                            locRepository.Update(Location,d=>d.light_color, true);
                                        }
                                    }
                                    else if (Location.gd4 == 0)//代表这个货架还能给下料1口装料
                                    {
                                        var a = "";
                                        var upper_code = Location.upper_code.Split('-');
                                    #region 记录下料请求信号
                                    WriteLog.GetLog().Write($"下料口2请求:{GYC_RFX2.Content}---{DateTime.Now}", $"{plc.PLCName}下料请求");
                                    #endregion
                                    List<base_routing_table> Routing_Table = routingRepository.Find(d => d.route_began == plc.PLCDownLoc);
                                        if (Location.gd4 == 0 && Location.gd3 == 0 && a == "")
                                    base_ware_location Location = null; //找绑定设备的货架
                                    foreach (var item in Routing_Table)
                                    {
                                        //绑定设备的货架
                                        base_ware_location ware_Locations = locRepository.FindFirst(d => d.upper_code == item.route_end && d.location_state == LoctionStateEnum.LocationState_Stored.ToString() && d.tpgd == 1 && d.status == 1 && d.light_color == plc.PLCName.ToString());
                                        if (ware_Locations != null)
                                        {
                                            string WCtasknum = upper_code[0] + "-" + upper_code[1] + "-3";//外侧
                                            var WCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == WCtasknum);
                                            if (WCloctionNUM == null)
                                            {
                                                string tasknum = upper_code[0] + "-" + upper_code[1] + "-4";//内侧
                                                var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == tasknum);
                                                if (loctionNUM == null)
                                                {
                                                    a = tasknum;
                                                }
                                            }
                                            //}
                                        }
                                        if (Location.gd3 == 1 && Location.gd4 == 0 && a == "")
                                        {
                                            string NCtasknum = upper_code[0] + "-" + upper_code[1] + "-4";//内侧
                                            var NCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == NCtasknum);
                                            if (NCloctionNUM == null)
                                            {
                                                string tasknum = upper_code[0] + "-" + upper_code[1] + "-3";//外侧
                                                var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == tasknum);
                                                if (loctionNUM == null)
                                                {
                                                    a = tasknum;
                                                }
                                            }
                                        }
                                        if (a != "")
                                        {
                                            dt_agvtask_hty agvtask_Hty = agvhtyRepository.Find(d => d.agv_toaddress == a && d.agv_taskstate == AGVTaskStateEnum.TaskState_Finished.ToString()).OrderByDescending(d => d.agv_finishedtime).FirstOrDefault();
                                            if (agvtask_Hty != null)
                                            {
                                                bool interval = (DateTime.Now - agvtask_Hty.agv_finishedtime).Value.TotalSeconds < 100;
                                                if (interval)
                                                {
                                                    continue;
                                                }
                                            }
                                            //生成辊分机下料任务
                                            dt_agvtask agvtask = new dt_agvtask()
                                            {
                                                agv_id = Guid.NewGuid(),
                                                agv_tasknum = "KH-" + IdenxManager.GetTaskNo(),
                                                agv_fromaddress = plc.PLCDownLoc,
                                                agv_toaddress = a,
                                                agv_code = "组装AGV调度",
                                                agv_remark = "辊分下料任务",
                                                agv_taskstate = AGVTaskStateEnum.Create.ToString(),
                                                agv_tasktype = AGVTaskTypeEnum.TaskType_Outbound.ToString(),
                                                agv_worktype = 1,//工作类型
                                                agv_materielid = "",
                                                agv_qty = 1,
                                                agv_createtime = DateTime.Now,
                                                agv_grade = 0,//任务优先级
                                                agv_userid = "WCS",
                                                agv_barcode = "",
                                            };
                                            //Location.update_time = DateTime.Now;
                                            Location.task = 1;
                                            Location.logic_col = 0;
                                            var entry = locRepository.DbContext.ChangeTracker.Entries<base_ware_location>().FirstOrDefault();
                                            if (entry != null)
                                            {
                                                entry.State = EntityState.Detached;
                                            }
                                          int ztwo=  locRepository.Update(Location, d => new { d.task, d.logic_col }, true);
                                            if (ztwo==1)
                                            {
                                                    agvRepository.Add(agvtask, true);
                                                    WriteDBLog.Info($"【{GFSB}】下料二口任务生成").Write($"生成任务:{agvtask.agv_tasknum},终点货位【{a}】状态:托盘光电检测:{Location.tpgd},-1光电:{Location.gd2},-2光电:{Location.gd1},-3光电:{Location.gd4},-4光电:{Location.gd3},状态:{Location.location_state},设备绑定:{Location.light_color},更新时间:{Location.wireless_time}", $"【{GFSB}】下料二口任务生成");
                                                    WriteDBLog.Info($"【{GFSB}】下料二口任务生成").Write($"----------------任务生成成功  {DateTime.Now} -------------- {Environment.NewLine}", $"【{GFSB}】下料二口任务生成");
                                            }
                                            Location = ware_Locations;
                                            break;
                                        }
                                    }
                                }//代表有这个设备绑定的货架
                                else //代表没有这个设备绑定的货架,进行找一个没有设备绑定的货架进行绑定,来给这台设备装料
                                {
                                    List<base_ware_location> loctionList = new List<base_ware_location>();
                                    foreach (var item in Routing_Table)
                                    if (Location != null)
                                    {
                                        base_ware_location ware_Locations = locRepository.FindFirst(d => d.down_code == item.route_end && d.location_state == LoctionStateEnum.LocationState_Stored.ToString() && d.tpgd == 1 && d.status == 1 && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.light_color == "无");
                                        if (ware_Locations == null)
                                        if (Location.gd1 == 1 && Location.gd4 == 1)//代表下料1,2口下的料无法在这个货架装料了,货架就取消设备绑定
                                        {
                                            continue;
                                            var upper_code = Location.upper_code.Split('-');
                                            string tasknum = upper_code[0] + "-" + upper_code[1];
                                            var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress.Contains(tasknum));
                                            if (loctionNUM == null)
                                            {
                                                Location.light_color = "无";
                                                locRepository.Update(Location, d => d.light_color, true);
                                            }
                                        }
                                        loctionList.Add(ware_Locations);
                                    }
                                    if (loctionList.Count != 0)
                                    {
                                        List<base_ware_location> Locationlist = loctionList.OrderBy(d => d.update_time).ToList();
                                        foreach (var xLocation in Locationlist)
                                        else if (Location.gd4 == 0)//代表这个货架还能给下料1口装料
                                        {
                                            var a = "";
                                            var upper_code = xLocation.upper_code.Split('-');
                                            if (xLocation.gd4 == 0 && xLocation.gd3 == 0 && a == "")
                                            var upper_code = Location.upper_code.Split('-');
                                            if (Location.gd4 == 0 && Location.gd3 == 0 && a == "")
                                            {
                                                string NCtasknum = upper_code[0] + "-" + upper_code[1] + "-3";//外侧
                                                var NCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == NCtasknum);
                                                if (NCloctionNUM == null)
                                                string WCtasknum = upper_code[0] + "-" + upper_code[1] + "-3";//外侧
                                                var WCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == WCtasknum);
                                                if (WCloctionNUM == null)
                                                {
                                                    string tasknum = upper_code[0] + "-" + upper_code[1] + "-4";//内侧
                                                    var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == tasknum);
@@ -461,11 +371,11 @@
                                                }
                                                //}
                                            }
                                            if (xLocation.gd3 == 1 && xLocation.gd4 == 0 && a == "")
                                            if (Location.gd3 == 1 && Location.gd4 == 0 && a == "")
                                            {
                                                string WCtasknum = upper_code[0] + "-" + upper_code[1] + "-4";//内侧
                                                var WCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == WCtasknum);
                                                if (WCloctionNUM == null)
                                                string NCtasknum = upper_code[0] + "-" + upper_code[1] + "-4";//内侧
                                                var NCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == NCtasknum);
                                                if (NCloctionNUM == null)
                                                {
                                                    string tasknum = upper_code[0] + "-" + upper_code[1] + "-3";//外侧
                                                    var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == tasknum);
@@ -473,9 +383,9 @@
                                                    {
                                                        a = tasknum;
                                                    }
                                                }
                                            }
                                            if (a != "")
                                            {
                                                dt_agvtask_hty agvtask_Hty = agvhtyRepository.Find(d => d.agv_toaddress == a && d.agv_taskstate == AGVTaskStateEnum.TaskState_Finished.ToString()).OrderByDescending(d => d.agv_finishedtime).FirstOrDefault();
@@ -506,51 +416,152 @@
                                                    agv_userid = "WCS",
                                                    agv_barcode = "",
                                                };
                                                //Location.update_time = DateTime.Now;
                                                xLocation.task = 1;
                                                xLocation.logic_col = 0;
                                                xLocation.light_color = plc.PLCName;
                                                Location.task = 1;
                                                Location.logic_col = 0;
                                                var entry = locRepository.DbContext.ChangeTracker.Entries<base_ware_location>().FirstOrDefault();
                                                if (entry != null)
                                                {
                                                    entry.State = EntityState.Detached;
                                                }
                                               int ztwo= locRepository.Update(xLocation, d => new { d.task, d.light_color, d.logic_col }, true);
                                                int ztwo = locRepository.Update(Location, d => new { d.task, d.logic_col }, true);
                                                if (ztwo == 1)
                                                {
                                                    agvRepository.Add(agvtask, true);
                                                    WriteDBLog.Info($"【{GFSB}】下料二口任务生成").Write($"生成任务:{agvtask.agv_tasknum},终点货位【{a}】状态:托盘光电检测:{xLocation.tpgd},-1光电:{xLocation.gd2},-2光电:{xLocation.gd1},-3光电:{xLocation.gd4},-4光电:{xLocation.gd3},状态:{xLocation.location_state},设备绑定:{xLocation.light_color},更新时间:{xLocation.wireless_time}", $"【{GFSB}】下料二口任务生成");
                                                    //base_ware_location ware_Locations = locRepository.FindFirst(d => d.down_code == xLocation.upper_code );
                                                    //if (ware_Locations!=null)
                                                    //{
                                                    //    WriteDBLog.Info($"【{GFSB}】下料任务生成").Write($"货位【{ware_Locations.upper_code}】:货位任务状态:{ware_Locations.task}", $"【{GFSB}】下料任务生成");
                                                    //}
                                                    WriteDBLog.Info($"【{GFSB}】下料二口任务生成").Write($"----------------任务生成成功  {DateTime.Now} -------------- {Environment.NewLine}", $"【{GFSB}】下料二口任务生成");
                                                    //WriteDBLog.Info($"【{GFSB}】下料二口任务生成").Write($"生成任务:{agvtask.agv_tasknum},终点货位【{a}】状态:托盘光电检测:{Location.tpgd},-1光电:{Location.gd2},-2光电:{Location.gd1},-3光电:{Location.gd4},-4光电:{Location.gd3},状态:{Location.location_state},设备绑定:{Location.light_color},更新时间:{Location.wireless_time}", $"【{GFSB}】下料二口任务生成");
                                                    //WriteDBLog.Info($"【{GFSB}】下料二口任务生成").Write($"----------------任务生成成功  {DateTime.Now} -------------- {Environment.NewLine}", $"【{GFSB}】下料二口任务生成");
                                                }
                                                break;
                                            }
                                        }
                                    }//代表有这个设备绑定的货架
                                    else //代表没有这个设备绑定的货架,进行找一个没有设备绑定的货架进行绑定,来给这台设备装料
                                    {
                                        List<base_ware_location> loctionList = new List<base_ware_location>();
                                        foreach (var item in Routing_Table)
                                        {
                                            base_ware_location ware_Locations = locRepository.FindFirst(d => d.down_code == item.route_end && d.location_state == LoctionStateEnum.LocationState_Stored.ToString() && d.tpgd == 1 && d.status == 1 && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.light_color == "无");
                                            if (ware_Locations == null)
                                            {
                                                continue;
                                            }
                                            loctionList.Add(ware_Locations);
                                        }
                                        if (loctionList.Count != 0)
                                        {
                                            List<base_ware_location> Locationlist = loctionList.OrderBy(d => d.update_time).ToList();
                                            foreach (var xLocation in Locationlist)
                                            {
                                                var a = "";
                                                var upper_code = xLocation.upper_code.Split('-');
                                                if (xLocation.gd4 == 0 && xLocation.gd3 == 0 && a == "")
                                                {
                                                    string NCtasknum = upper_code[0] + "-" + upper_code[1] + "-3";//外侧
                                                    var NCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == NCtasknum);
                                                    if (NCloctionNUM == null)
                                                    {
                                                        string tasknum = upper_code[0] + "-" + upper_code[1] + "-4";//内侧
                                                        var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == tasknum);
                                                        if (loctionNUM == null)
                                                        {
                                                            a = tasknum;
                                                        }
                                                    }
                                                    //}
                                                }
                                                if (xLocation.gd3 == 1 && xLocation.gd4 == 0 && a == "")
                                                {
                                                    string WCtasknum = upper_code[0] + "-" + upper_code[1] + "-4";//内侧
                                                    var WCloctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == WCtasknum);
                                                    if (WCloctionNUM == null)
                                                    {
                                                        string tasknum = upper_code[0] + "-" + upper_code[1] + "-3";//外侧
                                                        var loctionNUM = agvRepository.FindFirst(f => f.agv_toaddress == tasknum);
                                                        if (loctionNUM == null)
                                                        {
                                                            a = tasknum;
                                                        }
                                                    }
                                                }
                                                if (a != "")
                                                {
                                                    dt_agvtask_hty agvtask_Hty = agvhtyRepository.Find(d => d.agv_toaddress == a && d.agv_taskstate == AGVTaskStateEnum.TaskState_Finished.ToString()).OrderByDescending(d => d.agv_finishedtime).FirstOrDefault();
                                                    if (agvtask_Hty != null)
                                                    {
                                                        bool interval = (DateTime.Now - agvtask_Hty.agv_finishedtime).Value.TotalSeconds < 100;
                                                        if (interval)
                                                        {
                                                            continue;
                                                        }
                                                    }
                                                    //生成辊分机下料任务
                                                    dt_agvtask agvtask = new dt_agvtask()
                                                    {
                                                        agv_id = Guid.NewGuid(),
                                                        agv_tasknum = "KH-" + IdenxManager.GetTaskNo(),
                                                        agv_fromaddress = plc.PLCDownLoc,
                                                        agv_toaddress = a,
                                                        agv_code = "组装AGV调度",
                                                        agv_remark = "辊分下料任务",
                                                        agv_taskstate = AGVTaskStateEnum.Create.ToString(),
                                                        agv_tasktype = AGVTaskTypeEnum.TaskType_Outbound.ToString(),
                                                        agv_worktype = 1,//工作类型
                                                        agv_materielid = "",
                                                        agv_qty = 1,
                                                        agv_createtime = DateTime.Now,
                                                        agv_grade = 0,//任务优先级
                                                        agv_userid = "WCS",
                                                        agv_barcode = "",
                                                    };
                                                    //Location.update_time = DateTime.Now;
                                                    xLocation.task = 1;
                                                    xLocation.logic_col = 0;
                                                    xLocation.light_color = plc.PLCName;
                                                    var entry = locRepository.DbContext.ChangeTracker.Entries<base_ware_location>().FirstOrDefault();
                                                    if (entry != null)
                                                    {
                                                        entry.State = EntityState.Detached;
                                                    }
                                                    int ztwo = locRepository.Update(xLocation, d => new { d.task, d.light_color, d.logic_col }, true);
                                                    if (ztwo == 1)
                                                    {
                                                        agvRepository.Add(agvtask, true);
                                                        //WriteDBLog.Info($"【{GFSB}】下料二口任务生成").Write($"生成任务:{agvtask.agv_tasknum},终点货位【{a}】状态:托盘光电检测:{xLocation.tpgd},-1光电:{xLocation.gd2},-2光电:{xLocation.gd1},-3光电:{xLocation.gd4},-4光电:{xLocation.gd3},状态:{xLocation.location_state},设备绑定:{xLocation.light_color},更新时间:{xLocation.wireless_time}", $"【{GFSB}】下料二口任务生成");
                                                        //base_ware_location ware_Locations = locRepository.FindFirst(d => d.down_code == xLocation.upper_code );
                                                        //if (ware_Locations!=null)
                                                        //{
                                                        //    //WriteDBLog.Info($"【{GFSB}】下料任务生成").Write($"货位【{ware_Locations.upper_code}】:货位任务状态:{ware_Locations.task}", $"【{GFSB}】下料任务生成");
                                                        //}
                                                        //WriteDBLog.Info($"【{GFSB}】下料二口任务生成").Write($"----------------任务生成成功  {DateTime.Now} -------------- {Environment.NewLine}", $"【{GFSB}】下料二口任务生成");
                                                    }
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    Interlocked.Exchange(ref _readGFBUPSignalso, 0);
                }
                        }
                    }
                    catch (Exception ex)
                    {
                        WriteLog.GetLog().Write($"正极棍分下料:{DateTime.Now} --------------{ex}", $"正极棍分下料");
                    }
                    finally
                    {
                        Interlocked.Exchange(ref _readGFBUPSignalso, 0);
                    }
                });
            }