using Castle.Core.Internal; using Newtonsoft.Json; using System; using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; using WIDESEA_Common; using WIDESEA_Common.Tools; using WIDESEA_Core.EFDbContext; using WIDESEA_Entity.DomainModels; using WIDESEA_Services.IRepositories; using WIDESEA_Services.Repositories; using WIDESEA_WCS.EquipBaseInfo; using WIDESEA_WCS.WCSClient; namespace WIDESEA_WCS.SchedulerExecute.AGV { public partial class AGVSchedulerExecute { private static int _readSendAGVTaskSignalso = 0; private static bool isTrue1 = false; private static string name1 = ""; public static void SendAGVTask1(PLCClient plcClient) { if (Interlocked.Exchange(ref _readSendAGVTaskSignalso, 1) == 0) { try { VOLContext context = new VOLContext(); Idt_agvtaskRepository agvtaskRepository = new dt_agvtaskRepository(context); dt_agvtask agvTask = agvtaskRepository.Find(r => r.agv_taskstate == AGVTaskStateEnum.Create.ToString() && r.agv_code == plcClient.PLCName).OrderBy(r => r.agv_createtime).FirstOrDefault(); if (agvTask!=null) { int TaskInteractive = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString()));//1收到//DB1000.114.0 int TaskInteractiveW = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveW.ToString()));//0初始/1下发/2取消/3更改//DB1000.112.0 int resetTaskInteractiveW = Convert.ToInt32(plcClient.ReadValue(TaskDBName.resetTaskInteractiveW.ToString()));//DB1000.118.0 int resetTaskInteractiver = Convert.ToInt32(plcClient.ReadValue(TaskDBName.resetTaskInteractiveR.ToString()));//DB1000.120.0 WriteLog.Info("agvplc总").Write("连接成功:" + plcClient.PLCName + "TaskInteractive:" + TaskInteractive + ",TaskInteractiveW" + TaskInteractiveW + ",resetTaskInteractiveW" + resetTaskInteractiveW + ",resetTaskInteractiver:" + resetTaskInteractiver + "--" + DateTime.Now, "agvplc总"); #region //if (isTrue1 && name1 == plcClient.PLCName) //{ // if (TaskInteractiveW != 0 || resetTaskInteractiveW != 0 || TaskInteractive != 0) // { // plcClient.WriteValue(TaskDBName.resetTaskInteractiveW.ToString(), 1); // Task.Delay(2000).Wait(); // resetTaskInteractiveW = Convert.ToInt32(plcClient.ReadValue(TaskDBName.resetTaskInteractiveW.ToString())); // dt_agvtask a1 = agvtaskRepository.Find(r => r.agv_taskstate == AGVTaskStateEnum.Create.ToString() && r.agv_code == plcClient.PLCName && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).FirstOrDefault(); // dt_agvtask a2 = agvtaskRepository.Find(r => r.agv_taskstate != AGVTaskStateEnum.Create.ToString() && r.agv_code == plcClient.PLCName && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).FirstOrDefault(); // bool a3 = false; // if (a1 != null && a2 == null) // { // a3 = true; // } // bool s1 = (a1 == null ? true : false); // bool s2 = (a2 == null ? true : false); // DateTime swewa = DateTime.Now; // TimeSpan ts = a1.agv_createtime.Subtract(swewa).Duration(); // string diff = ts.TotalSeconds.ToString(); // double sumdiff = Double.Parse(diff); // int sum = (int)sumdiff; // bool s3 = sum > 180; // WriteLog.Info("agv测试").Write("创建未执行任务是否存在:" + s1 + "存在下发任务:" + s2 + "===a3:" + a3 + // "--时间差为:" + sum + "==s3" + s3 + // DateTime.Now, "agv测试"); // if (resetTaskInteractiveW == 1 || (a3 && s3)) // { // plcClient.WriteValue(TaskDBName.resetTaskInteractiveW.ToString(), 0); // plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); // Task.Delay(2000).Wait(); // a3 = false; // } // return; // } // else // { // isTrue1 = false; // name1 = ""; // } //} //if (resetTaskInteractiver == 1) //{ // plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); // for (int i = 0; i < 5; i++) // { // Thread.Sleep(300); // var agvnumber = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveW.ToString())); // if (agvnumber != 0) // { // plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); // } // else // { // break; // } // } //} #endregion if (0 == TaskInteractive && TaskInteractiveW == 0) { //写入任务信息 string rel = AGVBaseInfo.TaskWrite(plcClient, agvTask, AGVJobEnum.newTaskEnum); /*2023.8.2新增 给驰众写入卷绕长度*/ if (agvTask?.agv_toaddress.Contains("JR") ?? false) { plcClient.SiemensPLCClient.SiemensS7NetClient.Write("DB1000.122", agvTask.size); if (!string.IsNullOrEmpty(agvTask.JRunm)) { plcClient.SiemensPLCClient.SiemensS7NetClient.Write("DB1000.78.0", agvTask.JRunm); WriteLog.Info("SendAGVTask").Write("给AGV写入任务卷绕信息," + agvTask.size + agvTask.JRunm + DateTime.Now, "SendAGVTask"); } else { WriteLog.Info("SendAGVTask").Write("给AGV写入任务卷绕信息,值为空" + DateTime.Now, "SendAGVTask"); } } #region //if (agvTask.agv_fromaddress.Contains("JJK") && agvTask.agv_toaddress.Contains("TBHCJ")) //{ // string barcode = "TB-" + agvTask.agv_materbarcode.Split('*')[0].Substring(agvTask.agv_materbarcode.Split('*')[0].Length - 1, 1); // plcClient.WriteBarcodeValue(TaskDBName.materBarcode.ToString(), barcode); // WriteLog.Info("materBarcode1").Write(agvTask.agv_tasknum+barcode + DateTime.Now, "materBarcode1"); // for (int i = 0; i < 10; i++) // { // Thread.Sleep(1000); // string newbarcode = plcClient.ReadBarcodeValue(TaskDBName.materBarcode.ToString()).ToString(); // if (newbarcode != barcode) // { // plcClient.WriteBarcodeValue(TaskDBName.materBarcode.ToString(), barcode); // WriteLog.Info("materBarcode2").Write(agvTask.agv_tasknum + barcode +newbarcode+ DateTime.Now, "materBarcode2"); // } // else // { // break; // } // } //} //else //{ // plcClient.WriteBarcodeValue(TaskDBName.materBarcode.ToString(), "0"); // for (int i = 0; i < 10; i++) // { // Thread.Sleep(1000); // string newbarcode = plcClient.ReadBarcodeValue(TaskDBName.materBarcode.ToString()).ToString(); // WriteLog.Info("materBarcode3").Write(agvTask.agv_tasknum + newbarcode + DateTime.Now, "materBarcode3"); // if (newbarcode!="0") // { // string barcode3= plcClient.WriteBarcodeValue(TaskDBName.materBarcode.ToString(), "0").ToString(); // WriteLog.Info("materBarcode4").Write(agvTask.agv_tasknum + barcode3 + DateTime.Now, "materBarcode4"); // } // else // { // break; // } // } //} #endregion Thread.Sleep(1000); string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString(); if (taskId != agvTask.agv_tasknum) { //isTrue1 = true; //name1 = plcClient.PLCName; agvTask.ErrMsg = "AGV读取任务号不匹配"; agvTask.agv_realesstime = DateTime.Now; agvtaskRepository.Update(agvTask, true); }else if (string.IsNullOrEmpty(rel)) { //写入任务确认1 plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 1); Thread.Sleep(1000); //读取AGV信号 int ReadTask_1_OK = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString())); if (ReadTask_1_OK == 1) { //写入WCS确认信号0 plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); Thread.Sleep(2000); //读取AGV信号是否为0 int ReadTask_0_OK = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString())); if (ReadTask_0_OK == 0) { agvTask.agv_taskstate = AGVTaskStateEnum.SendOut.ToString(); agvTask.agv_realesstime = DateTime.Now; agvtaskRepository.Update(agvTask, true); // 上传AGV运行数据 by xiaoyang SendMESTask.SendMesTask(agvTask, 0); } else { agvTask.ErrMsg = "给AGV写入任务确认0失败"; agvTask.agv_realesstime = DateTime.Now; agvtaskRepository.Update(agvTask, true); } } else if (ReadTask_1_OK == 11) { plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); Thread.Sleep(2000); int ReadTask_0_Error = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString())); if (ReadTask_0_Error == 0) { agvTask.agv_taskstate = AGVTaskStateEnum.SendOut.ToString(); agvTask.agv_realesstime = DateTime.Now; agvtaskRepository.Update(agvTask, true); } else { agvTask.ErrMsg = "给AGV写入任务异常确认0失败"; agvTask.agv_realesstime = DateTime.Now; agvtaskRepository.Update(agvTask, true); } } else { agvTask.ErrMsg = "给AGV写入任务确认1失败"; agvTask.agv_realesstime = DateTime.Now; agvtaskRepository.Update(agvTask, true); } } else { agvTask.ErrMsg = "给AGV写入任务失败"; agvTask.agv_realesstime = DateTime.Now; agvtaskRepository.Update(agvTask, true); } } else if (TaskInteractive == 11 && TaskInteractiveW == 1) { plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); //Thread.Sleep(2000); //int ReadTask_0_Error = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString())); //if (ReadTask_0_Error == 0) //{ // agvTask.agv_taskstate = AGVTaskStateEnum.SendOut.ToString(); // agvTask.agv_realesstime = DateTime.Now; // agvtaskRepository.Update(agvTask, true); //} //else //{ // isTrue1 = true; // name1 = plcClient.PLCName; // throw new Exception(string.Format("给AGV写入任务重复确认0失败11,任务号{0}", agvTask.agv_tasknum)); //} } else if (0 == TaskInteractive && TaskInteractiveW == 1) { plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); } else if (1 == TaskInteractive && TaskInteractiveW == 1) { plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); } } } catch (Exception ex) { WriteLog.Info("SendAGVTask").Write(plcClient.PLCName+ ex.Message.ToString()+ DateTime.Now, "SendAGVTask"); } finally { Interlocked.Exchange(ref _readSendAGVTaskSignalso, 0); } } } } }