using HslCommunication; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using WIDESEA_Comm; using WIDESEA_Comm.LogInfo; using WIDESEA_Core.BaseProvider; using WIDESEA_Core.EFDbContext; using WIDESEA_Core.Extensions; using WIDESEA_Core.FreeDB; using WIDESEA_WCS.IRepositories; using WIDESEA_WCS.Jobs; using WIDESEA_WCS.Repositories; using WIDESEA_WCS.WCSClient; using static System.Collections.Specialized.BitVector32; namespace WIDESEA_WCS { /// /// 链条机 /// [DisallowConcurrentExecution] public class PipelineJob : JobBase, IJob { public Task Execute(IJobExecutionContext context) { try { var client = context.JobDetail.JobDataMap.Get("JobParams") as PLCClient; if (client == null) { return Task.CompletedTask; } //自动重连 if (!client.IsConnected) { client.Connect(); return Task.CompletedTask; } //DoAction(client); ExecuteJob(context, DoAction); } catch { } return Task.CompletedTask; } private void DoAction(IJobExecutionContext context) { var client = context.JobDetail.JobDataMap.Get("JobParams") as PLCClient; //自动重连 if (!client.IsConnected) { client.Connect(); return; } Loadinglevel(client); } /// /// 上料区 /// /// private void Loadinglevel(PLCClient client, string number = "上料区") { try { VOLContext Context = new VOLContext(); Idt_plcinfoheadRepository repository = new dt_plcinfoheadRepository(Context); Idt_plcinfodetailRepository plcRepository = new dt_plcinfodetailRepository(Context); Idt_geometry_dataRepository dataRepository = new dt_geometry_dataRepository(Context); Idt_stationinfoRepository stationinfoRepository = new dt_stationinfoRepository(Context); var plc = repository.FindFirst(x => x.plcinfo_name == client.PLCName); var Gantry_client = PLCClient.Clients.FirstOrDefault(t => t.PLCName == "桁架"); if (Gantry_client == null) throw new Exception("桁架调度服务未开启!"); if (!Gantry_client.IsConnected) throw new Exception("与桁架连接超时!"); var Gantryplc = repository.FindFirst(x => x.plcinfo_name == Gantry_client.PLCName); ///查找上料区的货位 var Stations = stationinfoRepository.Find(x => x.area == "6"); //缓存架未启用禁止桁架进入 foreach (var station in Stations) { if (!station.enable) Gantry_client.WriteByOrder("W_RequestUnload", false, number);//信号为false桁架停止进入 } var Station = Stations?.Where(x => x.enable && x.location_state == LocationStateEnum.Stroge.ToString() && x.quantity > 0).OrderBy(x => x.quantity).First(); if (Station != null) { var SNS = Station.bindSN.Split(","); //缓存架上车轮数量与SN号数量不一致 if (SNS.Length != Station.quantity) { Station.location_state = LocationStateEnum.Abnormal.ToString(); stationinfoRepository.Update(Station, true); Gantry_client.WriteByOrder("W_RequestUnload", false, number);//信号为false桁架停止进入 throw new Exception("上料位车轮数量与SN号数量不一致,上料位编号:" + Station.stationCode); } var details = plcRepository.Find(x => x.plcdetail_iotype == plc.plcinfo_iotyep && x.plcdetail_number == Station.stationCode).ToList(); var PalletSignal = (Int16)DBExtension.Read(details.Where(x => x.plcdetail_name == "R_PalletSignal").First(), client);//读取托盘信号:1:有,2无 var MaterialSignal = (Int16)DBExtension.Read(details.Where(x => x.plcdetail_name == "R_MaterialSignal").First(), client);//读取货物信号:1:有,2无 if (PalletSignal == 1 && MaterialSignal == 1) { var area = Convert.ToInt16(Station.stationCode.Substring(Station.stationCode.Length - 1, 1)); Gantry_client.WriteByOrder("W_AreaNr", (Int16)area, number);//区域货位号 Gantry_client.WriteByOrder("W_IndexNr", (Int16)SNS.Length, number);//托盘上的第几个车轮 Gantry_client.WriteByOrder("W_Storage_Type", (Int16)1, number); //托盘类型1-横放;2-竖放 Gantry_client.WriteByOrder("W_Wheel_Type", (Int16)Convert.ToInt16(Station.stationType), number);//车轮类型 Gantry_client.WriteByOrder("W_Wheel_id", SNS[SNS.Length - 1], number);//车轮SN号 Gantry_client.WriteByOrder("W_RequestUnload", true, number); } else { Gantry_client.WriteByOrder("W_RequestUnload", false, number); } var Gantrydetails = plcRepository.Find(x => x.plcdetail_iotype == Gantryplc.plcinfo_iotyep && x.plcdetail_number == number).ToList(); var Gantry_Out_of_Area = (bool)DBExtension.Read(Gantrydetails.Where(x => x.plcdetail_name == "R_Gantry_Out_of_Area").First(), Gantry_client);//桁架是否在区域内 var QueryDate = (bool)DBExtension.Read(Gantrydetails.Where(x => x.plcdetail_name == "R_QueryDate").First(), Gantry_client);//信息查询 if (QueryDate) { var Date_Vaild = (bool)DBExtension.Read(Gantrydetails.Where(x => x.plcdetail_name == "R_Date_Vaild").First(), Gantry_client);//信息确认 if (!Date_Vaild)//信息有误,记录日志 { Station.location_state = LocationStateEnum.Abnormal.ToString(); stationinfoRepository.Update(Station, true); Gantry_client.WriteByOrder("W_RequestUnload", false, number);//信号为false桁架停止进入 throw new Exception($"未查询到SN号:{SNS[SNS.Length - 1]}的订单,上料位编号:{Station.stationCode}"); } } var finished = (bool)DBExtension.Read(Gantrydetails.Where(x => x.plcdetail_name == "R_Unlod_finished").First(), Gantry_client);//夹取完成 if (finished) { Station.quantity = Station.quantity - 1; Station.bindSN = OperStr(SNS); var count = stationinfoRepository.Update(Station, true); if (count < 1) throw new Exception($"上料位信息更新失败!上料位编号:{Station.stationCode}"); Gantry_client.WriteByOrder("W_Storage_update", true, number);//货位状态更新 Gantry_client.WriteByOrder("W_RequestUnload", false, number);//信号为false桁架停止进入 } } } catch (Exception ex) { //WritePCSLog.LogAdd(requestin.AreaNr.ToString(), respone.success == 1 ? "成功 " : "失败", "WMS", "AGV", json, JsonConvert.SerializeObject(respone), remark, "检测线上料区", ex.Message); } } private string OperStr(string[] strArrty) { string[] newstr = strArrty.RemoveLast(1); string Newsn = string.Join(",", newstr); return Newsn; } } }