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);
|
//}
|
|
// }
|
}
|
}
|
}
|