using System; using System.Threading; using WIDESEA_Common; using WIDESEA_Common.DBHelper; using WIDESEA_Common.Tools; using WIDESEA_Entity.DomainModels; using WIDESEA_WCS.WCSClient; namespace WIDESEA_WCS.JobsPart.AGV { public partial class AGVServer { public FreeDB freeDB = new FreeDB(); /// /// 下发agv任务 /// public void SendAgvTask(PLCClient client) { int TaskInteractive = Convert.ToInt32(client.ReadValue(TaskDBName.taskInteractiveR.ToString()));//0初始/1收到 int TaskInteractiveW = Convert.ToInt32(client.ReadValue(TaskDBName.taskInteractiveW.ToString()));//0初始/1下发/2取消/3更改 //int TaskInteractive = Convert.ToInt32(client.SiemensPLCClient.Read("DB1000.114"));//0初始/1收到 //int TaskInteractiveW = Convert.ToInt32(client.SiemensPLCClient.Read("DB1000.112"));//0初始/1下发/2取消/3更改 //初始状态 if (TaskInteractiveW == 0 && TaskInteractive == 0) { var AGVTaskState = AGVTaskStateEnum.Create.ToString(); var AGVTaskType = AGVTaskTypeEnum.TaskType_Outbound.ToString(); var agv_task = freeDB.Select() .Where(t => t.agv_taskstate == "WaitCancel" && t.agv_code == client.PLCName) .OrderByDescending(t => t.agv_grade) .OrderBy(t => t.agv_createtime) .First(); if (agv_task != null) { CanselAgvTask(agv_task, client); return; } agv_task = freeDB.Select() .Where(t => t.agv_taskstate == AGVTaskState && t.agv_tasktype == AGVTaskType && t.agv_code == client.PLCName) .OrderByDescending(t => t.agv_grade) .OrderBy(t => t.agv_createtime) .First(); if (agv_task != null) { Send(agv_task, client); //等待处理 Thread.Sleep(1000); int taskSendRespone = Convert.ToInt32(client.ReadValue(TaskDBName.taskInteractiveR.ToString())); if (taskSendRespone == 1) { //启动命令复原 client.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); //下发成功 agv_task.agv_taskstate = AGVTaskStateEnum.SendOut.ToString(); agv_task.agv_realesstime = DateTime.Now; freeDB.Update(agv_task).UpdateColumns(t => new { t.agv_realesstime, t.agv_taskstate }).ExecuteAffrows(); } else { if (taskSendRespone == 11) { //任务下发,agv无法执行(任务ID重复,起点终点不存在,任务类型错误等异常) WriteLog.GetLog().Write($"【异常】任务{agv_task.agv_tasknum},下发后反馈异常,反馈值11(任务不存在或任务类型错误)。" + "\n", client.PLCName); } else { //任务下发其它错误 WriteLog.GetLog().Write($"【异常】任务{agv_task.agv_tasknum},下发后反馈异常,反馈值{taskSendRespone}。" + "\n", client.PLCName); } agv_task.agv_taskstate = AGVTaskStateEnum.Abnormal.ToString(); freeDB.Update(agv_task).UpdateColumns(t => new { t.agv_taskstate }).ExecuteAffrows(); //启动命令复原 client.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); } } } if (TaskInteractive == 0 && TaskInteractiveW != 0) { client.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0); } } private void Send(dt_agvtask agvTask, PLCClient client) { byte[] sendData = new byte[164]; OperateDB.WriteData(sendData, 0, agvTask.agv_tasknum); OperateDB.WriteData(sendData, 32, agvTask.agv_fromaddress); OperateDB.WriteData(sendData, 54, agvTask.agv_toaddress); //工作类型,满料和空料 OperateDB.WriteData(sendData, 76 + 1, (byte)agvTask.agv_worktype); //任务等级 OperateDB.WriteData(sendData, 110 + 1, (byte)agvTask.agv_grade); //下发确认命令 if (agvTask.agv_taskstate == "WaitCancel") { OperateDB.WriteData(sendData, 112 + 1, 2); } else { OperateDB.WriteData(sendData, 112 + 1, 1); } //物料类型条码 OperateDB.WriteData(sendData, 122, agvTask.agv_tasknum);//暂时下发任务号 client.WriteDBValue("DB1000.0", sendData); } } }