|
|
|
@ -185,8 +185,12 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
VisionSetting record = _visionSettingService.GetList(x => x.VisionID == id).ToList().First();
|
|
|
|
|
//大端字节序
|
|
|
|
|
Array.Reverse(entity.SN);
|
|
|
|
|
AirportTask airportTask = _airportTaskService.GetTaskInfos(x => x.amragvno == record.AMRGUID &&
|
|
|
|
|
x.visiontaskno == (BitConverter.ToUInt16(entity.SN, 0) - 1).ToString() && x.taskstate == "抓取中").First();
|
|
|
|
|
AirportTask airportTask = _airportTaskService.GetTaskInfos(
|
|
|
|
|
x =>
|
|
|
|
|
x.amragvno == record.AMRGUID &&
|
|
|
|
|
x.visiontaskno == (BitConverter.ToUInt16(entity.SN, 0) - 1).ToString() &&
|
|
|
|
|
x.taskstate == "抓取中"
|
|
|
|
|
).First();
|
|
|
|
|
//成功码垛先码垛计数
|
|
|
|
|
StackCount(airportTask, entity.DataBytes[1]);
|
|
|
|
|
//取出两辆小车的计数
|
|
|
|
@ -196,12 +200,12 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
{
|
|
|
|
|
DeliverCount = _aGVStateService.GetSingleAGVState(airportTask.deliveragvno).stackcount;
|
|
|
|
|
}
|
|
|
|
|
//////////////下面是下一次码垛的综合判断条件//////////////
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////下面是下一次码垛的综合判断条件////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
//先判断总数是否需要继续工作
|
|
|
|
|
if (airportTask.totalcount > airportTask.loadcount)
|
|
|
|
|
{
|
|
|
|
|
//如上一次是AMR 如有Deliver 判断是否到达 到达向deliver发送开始工作,没就判断amr是否装满 继续向amr
|
|
|
|
|
//上一次是AMR
|
|
|
|
|
//////////////////////////////////////////////////////上一次是AMR////////////////////////////////////////////////////
|
|
|
|
|
if (entity.DataBytes[1] == 0x00)
|
|
|
|
|
{
|
|
|
|
|
//妹有Deliver的任务(小车号和是否已到达都没有)amr肯定能抓完 继续amr抓取
|
|
|
|
@ -209,6 +213,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
{
|
|
|
|
|
//一直向amr抓,直到抓满
|
|
|
|
|
RequestVisionStartWork(StackState.NXAMRNoPositioning, AMRCount, id);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] 继续向AMR [{airportTask.amragvno}] 抓取");
|
|
|
|
|
}
|
|
|
|
|
//有Delievr任务(有任务号且状态为未到达)继续amr抓取
|
|
|
|
|
else if (!string.IsNullOrEmpty(airportTask.deliveragvno) && airportTask.deliveragvisarrive == "未到达")
|
|
|
|
@ -218,6 +223,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
if (_aGVStateService.GetSingleAGVState(airportTask.amragvno).stackcount < BaseTaskInfoBusiness.AMRStackNumber)
|
|
|
|
|
{
|
|
|
|
|
RequestVisionStartWork(StackState.NXAMRNoPositioning, AMRCount, id);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] 继续向AMR [{airportTask.amragvno}] 抓取");
|
|
|
|
|
}
|
|
|
|
|
//AMR满了
|
|
|
|
|
else
|
|
|
|
@ -228,6 +234,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
{
|
|
|
|
|
//请求复位
|
|
|
|
|
RequestVisionReplace(id);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] AMR已满,停止抓取");
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
//循环判断该任务的deliver是否到达
|
|
|
|
@ -236,6 +243,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
if (task.deliveragvisarrive == "已到达")
|
|
|
|
|
{
|
|
|
|
|
RequestVisionStartWork(StackState.NXAGVNeedPositioning, DeliverCount, id);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] 向Deliver [{airportTask.deliveragvno}] 抓取");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -246,6 +254,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
else if (!string.IsNullOrEmpty(airportTask.deliveragvno) && airportTask.deliveragvisarrive == "已到达")
|
|
|
|
|
{
|
|
|
|
|
RequestVisionStartWork(StackState.NXAGVNeedPositioning, DeliverCount, id);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] 向Deliver [{airportTask.deliveragvno}] 抓取");
|
|
|
|
|
}
|
|
|
|
|
//异常情况
|
|
|
|
|
else
|
|
|
|
@ -254,7 +263,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//如上一次是deliver-->则判断deliver是否装满-->装满则deliver入库-->判断剩下的数量用不用调新的deliver-->用就调新的deliver然后发向amr抓取(还得判断AMR是否抓满)-->不用就直接向amr抓取
|
|
|
|
|
//上一次是Deliver
|
|
|
|
|
//////////////////////////////////////////////////////上一次是Deliver////////////////////////////////////////////////////
|
|
|
|
|
else if (entity.DataBytes[1] == 0x01)
|
|
|
|
|
{
|
|
|
|
|
//判断Deliver是否装满,装满就直接入库,未装满继续装
|
|
|
|
@ -262,6 +271,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
if (_aGVStateService.GetSingleAGVState(airportTask.deliveragvno).stackcount < BaseTaskInfoBusiness.DeliverStackNumber)
|
|
|
|
|
{
|
|
|
|
|
RequestVisionStartWork(StackState.NXAGVNoPositioning, DeliverCount, id);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] 继续向Deliver [{airportTask.deliveragvno}] 抓取");
|
|
|
|
|
}
|
|
|
|
|
//deliver满了,入库然后判断
|
|
|
|
|
else
|
|
|
|
@ -269,6 +279,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
//入库代码
|
|
|
|
|
_baseAGVBusiness.EndTaskAndClearErrorAndDownloadTask(airportTask.deliveragvno,
|
|
|
|
|
_AGVJobService.GetAGVJobListByTypeAndConveyorNo("800入库", airportTask.conveyorno).JobName);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] Deliver [{airportTask.deliveragvno}] 入库");
|
|
|
|
|
airportTask.deliveragvno = null;
|
|
|
|
|
airportTask.deliveragvisarrive = null;
|
|
|
|
|
_airportTaskService.UpdateTaskAsync(airportTask);
|
|
|
|
@ -278,6 +289,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
if (airportTask.totalcount - airportTask.loadcount < amrleft)
|
|
|
|
|
{
|
|
|
|
|
RequestVisionStartWork(StackState.NXAMRNeedPositioning, AMRCount, id);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] 向AMR [{airportTask.amragvno}] 抓取");
|
|
|
|
|
}
|
|
|
|
|
//剩下的数量需要调用,并判断向AMR抓取
|
|
|
|
|
else
|
|
|
|
@ -288,9 +300,10 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
_AGVJobService.GetAGVJobListByTypeAndConveyorNo("800入位", airportTask.conveyorno).JobName);
|
|
|
|
|
airportTask.deliveragvno = newagv.agvno;
|
|
|
|
|
airportTask.deliveragvisarrive = "未到达";
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] 调用Deliver [{airportTask.deliveragvno}] 入位");
|
|
|
|
|
_airportTaskService.UpdateTaskAsync(airportTask);
|
|
|
|
|
//amr无容量,结束抓取,等待Deliver到达
|
|
|
|
|
if (amrleft == 0)
|
|
|
|
|
if (amrleft <= 0)
|
|
|
|
|
{
|
|
|
|
|
AirportTask task;
|
|
|
|
|
//结束抓取、循环判断deliver是否到达,到了就向新的Deliver开始抓取
|
|
|
|
@ -298,6 +311,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
{
|
|
|
|
|
//请求复位
|
|
|
|
|
RequestVisionReplace(id);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] AMR已满,停止抓取");
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
//循环判断该任务的deliver是否到达
|
|
|
|
@ -306,6 +320,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
if (task.deliveragvisarrive == "已到达")
|
|
|
|
|
{
|
|
|
|
|
RequestVisionStartWork(StackState.NXAGVNeedPositioning, DeliverCount, id);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] 向Deliver [{airportTask.deliveragvno}] 抓取");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -315,6 +330,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
RequestVisionStartWork(StackState.NXAMRNeedPositioning, AMRCount, id);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] 向AMR [{airportTask.amragvno}] 抓取");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -325,27 +341,32 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
throw new Exception($"任务 {airportTask.taskno} 未知上次码垛代码!请检查视觉系统状态!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//总数达标,结束任务,复位机械臂,调回小车,任务状态调整
|
|
|
|
|
////////////////////////////////////////////////////总数达标,结束任务,复位机械臂,复位小车,任务状态调整////////////////////////////////////////////////////
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_baseAGVBusiness.EndTaskAndClearErrorAndDownloadTask(airportTask.amragvno,
|
|
|
|
|
_AGVJobService.GetAGVJobListByTypeAndConveyorNo("1000入库", airportTask.conveyorno).JobName);
|
|
|
|
|
//复位机械臂
|
|
|
|
|
RequestVisionReplace(id);
|
|
|
|
|
//结束AMR任务
|
|
|
|
|
_baseAGVBusiness.EndTaskAndClearError(airportTask.amragvno);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] AMR [{airportTask.amragvno}] 结束任务");
|
|
|
|
|
airportTask.amragvno = null;
|
|
|
|
|
airportTask.amragvisarrive = null;
|
|
|
|
|
airportTask.visiontaskno = null;
|
|
|
|
|
//有Deliver的话结束Deliver任务
|
|
|
|
|
if (!string.IsNullOrEmpty(airportTask.deliveragvno))
|
|
|
|
|
{
|
|
|
|
|
_baseAGVBusiness.EndTaskAndClearErrorAndDownloadTask(airportTask.deliveragvno,
|
|
|
|
|
_AGVJobService.GetAGVJobListByTypeAndConveyorNo("800入库", airportTask.conveyorno).JobName);
|
|
|
|
|
_baseAGVBusiness.EndTaskAndClearError(airportTask.deliveragvno);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] Deliver [{airportTask.deliveragvno}] 结束任务");
|
|
|
|
|
airportTask.deliveragvno = null;
|
|
|
|
|
airportTask.deliveragvisarrive = null;
|
|
|
|
|
}
|
|
|
|
|
airportTask.finishtime = DateTime.Now;
|
|
|
|
|
airportTask.taskstate = "已完成";
|
|
|
|
|
_airportTaskService.UpdateTaskAsync(airportTask);
|
|
|
|
|
_logger.LogInformation($"任务 [{airportTask.taskno}] 已完成");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//码垛过程失败
|
|
|
|
|
//////////////////////////////////////////////////////码垛过程失败////////////////////////////////////////////////////
|
|
|
|
|
else if (entity.DataBytes[0] == 0x01)
|
|
|
|
|
{
|
|
|
|
|
VisionSetting record = _visionSettingService.GetList(x => x.VisionID == id).ToList().First();
|
|
|
|
@ -365,20 +386,20 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
{
|
|
|
|
|
//发送向复合机器人(AMR)码垛的信号
|
|
|
|
|
RequestVisionStartWork(StackState.NXAMRNoPositioning, AMRCount, id);
|
|
|
|
|
_logger.LogInformation("下一次码垛开始,方向:复合机器人");
|
|
|
|
|
_logger.LogInformation($"下一次码垛开始,方向:复合机器人 [{airportTask.amragvno}]");
|
|
|
|
|
}
|
|
|
|
|
else if (entity.DataBytes[1] == 0x01)
|
|
|
|
|
{
|
|
|
|
|
//发送向搬运机器人(AGVDeliver)码垛的信号
|
|
|
|
|
RequestVisionStartWork(StackState.NXAGVNoPositioning, DeliverCount, id);
|
|
|
|
|
_logger.LogInformation("下一次码垛开始,方向:搬运机器人");
|
|
|
|
|
_logger.LogInformation($"下一次码垛开始,方向:搬运机器人 [{airportTask.deliveragvno}]");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_logger.LogError($"码垛失败返回未知码垛结果代码,请手动重新发送码垛信号");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//码垛检查失败
|
|
|
|
|
//////////////////////////////////////////////////////码垛检查失败////////////////////////////////////////////////////
|
|
|
|
|
else if (entity.DataBytes[0] == 0x02)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogError($"视觉系统一次码垛结束,码垛检查失败,请手动矫正并手动开始下一次码垛");
|
|
|
|
@ -388,7 +409,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
x.visiontaskno == (BitConverter.ToInt16(entity.SN, 0) - 1).ToString() && x.taskstate == "抓取中").First();
|
|
|
|
|
StackCount(airportTask, entity.DataBytes[1]);
|
|
|
|
|
}
|
|
|
|
|
//未知代码
|
|
|
|
|
//////////////////////////////////////////////////////未知代码////////////////////////////////////////////////////
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_logger.LogError($"视觉系统一次码垛结束,未知返回代码!请检查视觉系统状态!");
|
|
|
|
@ -404,7 +425,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
catch(Exception ex)
|
|
|
|
|
{
|
|
|
|
|
RequestVisionReplace(id);
|
|
|
|
|
_logger.LogError($"接受工作结束再分配状态发生错误 {ex.Message}");
|
|
|
|
|
_logger.LogError($"上位机接受工作信号结束再分配状态发生错误 {ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -419,7 +440,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
//判断返回结果
|
|
|
|
|
if (_aGVStateService.UpdateAsync(aGVState).Result || _airportTaskService.UpdateTaskAsync(airportTask).Result)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation($"计数更新成功 {airportTask.amragvno} AMR: {aGVState.stackcount} Total: {airportTask.loadcount}");
|
|
|
|
|
_logger.LogInformation($"计数更新成功 [{airportTask.amragvno}] AMR: [{aGVState.stackcount}] Task: [{airportTask.taskno}] Total: [{airportTask.loadcount}]");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -436,7 +457,7 @@ namespace SlnMesnac.Business.@base
|
|
|
|
|
//判断返回结果
|
|
|
|
|
if (_aGVStateService.UpdateAsync(aGVState).Result || _airportTaskService.UpdateTaskAsync(airportTask).Result)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation($"计数更新成功 {airportTask.amragvno} AMR: {aGVState.stackcount} Total: {airportTask.loadcount}");
|
|
|
|
|
_logger.LogInformation($"计数更新成功 [{airportTask.amragvno}] Deliver: [{aGVState.stackcount}] Task: [{airportTask.taskno}] Total: [{airportTask.loadcount}]");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|