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