using System; using System.Collections.Generic; using System.Linq; using System.Text; 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_Services.Services; using WIDESEA_WCS.EquipBaseInfo; using WIDESEA_WCS.WCSClient; namespace WIDESEA_WCS.SchedulerExecute.AGV { public partial class AGVSchedulerExecute { private static bool isTrue=false; private static string name = ""; public static void SendAGVTask(PLCClient plcClient) { //if (Interlocked.Exchange(ref _readSendAGVTaskSignalso, 1) == 0) //{ try { if (plcClient == null) { return; } VOLContext context = new VOLContext(); Idt_agvtaskRepository agvtaskRepository = new dt_agvtaskRepository(context); Idt_task_numberRepository tasknumberRep = new dt_task_numberRepository(context); dt_task_numberService tasknumber = new dt_task_numberService(tasknumberRep); var task = agvtaskRepository.FindFirst(e => e.agv_tasknum.Length <= 3); if (task != null) { task.agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep); agvtaskRepository.Update(task, true); } int TaskInteractive = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString()));//1收到 int TaskInteractiveW = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveW.ToString()));//0初始/1下发/2取消/3更改 int resetTaskInteractiveW= Convert.ToInt32(plcClient.ReadValue(TaskDBName.resetTaskInteractiveW.ToString())); if (isTrue&&name==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())); if (resetTaskInteractiveW == 1) { plcClient.WriteValue(TaskDBName.resetTaskInteractiveW.ToString(), 0); plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); Task.Delay(2000).Wait(); } return; } else { isTrue = false; name = ""; } } if (0 == TaskInteractive && TaskInteractiveW == 0) { #region 查询有没有下发未接收到任务 dt_agvtask agvTask = agvtaskRepository.Find(r => r.agv_taskstate == AGVTaskStateEnum.Wait.ToString() && r.agv_code == plcClient.PLCName && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).OrderBy(r => r.agv_createtime) .OrderByDescending(r => r.agv_grade).FirstOrDefault(); if (null != agvTask) { AGVBaseInfo.TaskWrite(plcClient, agvTask, AGVJobEnum.newTaskEnum); string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString(); if (taskId == agvTask.agv_tasknum) { plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 1); WriteLog.Info("SendAGVTask").Write("SendAGVTask" + agvTask.agv_tasknum + DateTime.Now, "SendAGVTask"); } return; } #endregion agvTask = agvtaskRepository.Find(r => r.agv_taskstate == AGVTaskStateEnum.Create.ToString() && r.agv_code == plcClient.PLCName && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).OrderBy(r => r.agv_createtime).OrderByDescending(r => r.agv_grade).FirstOrDefault(); if (null != agvTask) { string rel = AGVBaseInfo.TaskWrite(plcClient, agvTask, AGVJobEnum.newTaskEnum); if (string.IsNullOrEmpty(rel)) { string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString(); if (taskId.Contains("\b")) { taskId = taskId.Remove(0, 1); } if (taskId == agvTask.agv_tasknum) { agvTask.agv_taskstate = AGVTaskStateEnum.Wait.ToString(); agvTask.agv_realesstime = DateTime.Now; agvtaskRepository.Update(agvTask, true); plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 1); WriteLog.Info("SendAGVTask").Write("SendAGVTask" + agvTask.agv_tasknum + DateTime.Now, "SendAGVTask"); } } else { throw new Exception(rel); } } } #region 下发任务没收到重新下发 if (TaskInteractive == 0 && TaskInteractiveW == 1)//写入任务没收到重新写入 { string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString(); if (taskId.Contains("\b")) { taskId = taskId.Remove(0, 1); } if (null != taskId) { dt_agvtask agvTask = agvtaskRepository.Find(r => r.agv_tasknum == taskId && r.agv_taskstate == AGVTaskStateEnum.Wait.ToString() && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).OrderBy(r => r.agv_createtime) .OrderByDescending(r => r.agv_grade).FirstOrDefault(); if (null != agvTask) AGVBaseInfo.TaskWrite(plcClient, agvTask, AGVJobEnum.newTaskEnum); } else { dt_agvtask agvTask = agvtaskRepository.Find(r => r.agv_taskstate == AGVTaskStateEnum.Wait.ToString() && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).OrderBy(r => r.agv_createtime).OrderByDescending(r => r.agv_grade).FirstOrDefault(); if (null != agvTask) AGVBaseInfo.TaskWrite(plcClient, agvTask, AGVJobEnum.newTaskEnum); } } #endregion if (1 == TaskInteractive && TaskInteractiveW == 1) { string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString(); if (taskId.Contains("\b")) { taskId = taskId.Remove(0, 1); } if (taskId != null) { dt_agvtask agvTask = agvtaskRepository.Find(r => r.agv_tasknum == taskId && r.agv_taskstate == AGVTaskStateEnum.Wait.ToString() && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).FirstOrDefault(); if (agvTask != null) { agvTask.agv_taskstate = AGVTaskStateEnum.SendOut.ToString(); agvtaskRepository.Update(agvTask, true); ////UpdateLocationState.UpdateState(agvTask);//todo 修改货位状态 //string taskStart = plcClient.ReadValue(TaskDBName.taskStart.ToString()).ToString(); //string taskEnd = plcClient.ReadValue(TaskDBName.taskEnd.ToString()).ToString(); //string taskType = plcClient.ReadValue(TaskDBName.taskType.ToString()).ToString(); plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); } else { isTrue = true ; name = plcClient.PLCName; } //if (agvTask != null && agvTask.agv_toaddress.Contains("WLX")) //{ // plcClient.WriteValue(TaskDBName.materBarcode.ToString(), agvTask.agv_materbarcode); //} //else if (agvTask != null && 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.WriteValue(TaskDBName.materBarcode.ToString(), barcode); //} //else //{ // plcClient.WriteValue(TaskDBName.materBarcode.ToString(), ""); //} //plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); } } else if (11 == TaskInteractive && TaskInteractiveW == 1)//RCS已收到新下发的任务但无法执行 { string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString(); if (taskId.Contains("\b")) { taskId = taskId.Remove(0, 1); } dt_agvtask agvTask2 = agvtaskRepository.Find(r => r.agv_tasknum == taskId && r.agv_taskstate == AGVTaskStateEnum.Wait.ToString() && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).OrderBy(r => r.agv_createtime) .OrderByDescending(r => r.agv_grade).FirstOrDefault(); if (agvTask2 != null) { agvTask2.agv_taskstate = AGVTaskStateEnum.Abnormal.ToString(); agvtaskRepository.Update(agvTask2, true); } plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); } } catch (Exception ex) { //TODO 日志记录 } //finally //{ // Interlocked.Exchange(ref _readSendAGVTaskSignalso, 0); //} // } } } }