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();
|
|
/// <summary>
|
/// 下发agv任务
|
/// </summary>
|
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<bool>("DB1000.114"));//0初始/1收到
|
//int TaskInteractiveW = Convert.ToInt32(client.SiemensPLCClient.Read<bool>("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<dt_agvtask>()
|
.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<dt_agvtask>()
|
.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);
|
}
|
}
|
}
|