|
|
|
|
@ -82,7 +82,7 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
break;
|
|
|
|
|
//3#车间从下料点到1-16机台送料任务
|
|
|
|
|
case StaticTaskType.TransferMaterialBoxTask:
|
|
|
|
|
await TransferMaterialBoxTaskHandlerAsync(item);
|
|
|
|
|
TransferMaterialBoxTaskHandler(item);
|
|
|
|
|
break;
|
|
|
|
|
//1-12号机台之间空料箱移库任务
|
|
|
|
|
case StaticTaskType.MoveLocationTask:
|
|
|
|
|
@ -90,7 +90,10 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
break;
|
|
|
|
|
//3#接驳位到2#计量室接驳位的送料任务
|
|
|
|
|
case StaticTaskType.TransferMaterialMetrologyRoomBoxTask:
|
|
|
|
|
await TransferMaterialMetrologyRoomBoxTaskHandlerAsync(item);
|
|
|
|
|
lock (string.Empty)
|
|
|
|
|
{
|
|
|
|
|
TransferMaterialMetrologyRoomBoxTaskHandler(item);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
//3#车间从2#接驳位补充小托盘任务
|
|
|
|
|
case StaticTaskType.SupplySmallPalletTask:
|
|
|
|
|
@ -176,25 +179,8 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
//通知plc已经放下了料箱
|
|
|
|
|
workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#四宫格空托盘就绪信号"), true);
|
|
|
|
|
|
|
|
|
|
//解锁终点库位
|
|
|
|
|
WcsBaseEquip? baseEquip = sqlSugarClient.Queryable<WcsBaseEquip>().First(t => t.AgvPositionCode == task.EndPointNo);
|
|
|
|
|
if (baseEquip != null)
|
|
|
|
|
{
|
|
|
|
|
sqlSugarClient.AsTenant().BeginTran();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
baseEquip.EquipStatus = 0;
|
|
|
|
|
sqlSugarClient.Deleteable(task).ExecuteCommand();
|
|
|
|
|
sqlSugarClient.Updateable(baseEquip).ExecuteCommand();
|
|
|
|
|
sqlSugarClient.AsTenant().CommitTran();
|
|
|
|
|
_logger.Agv($"Agv:{task.NextPointNo};完成{task.TaskName},起点:{task.CurrPointNo},终点:{task.EndPointNo}");
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
sqlSugarClient.AsTenant().RollbackTran();
|
|
|
|
|
_logger.Error("SupplyEmptyPalletTaskHandlerAsync提交事务异常:" + ex.Message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sqlSugarClient.Deleteable(task).ExecuteCommand();
|
|
|
|
|
_logger.Agv($"Agv:{task.NextPointNo};完成{task.TaskName},起点:{task.CurrPointNo},终点:{task.EndPointNo}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
@ -208,11 +194,11 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="task"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
private async Task TransferMaterialBoxTaskHandlerAsync(WcsTask task)
|
|
|
|
|
private void TransferMaterialBoxTaskHandler(WcsTask task)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
WcsTaskLog wcsTaskLog = await sqlSugarClient.Queryable<WcsTaskLog>().FirstAsync(t => t.Id == task.Id);
|
|
|
|
|
WcsTaskLog wcsTaskLog = sqlSugarClient.Queryable<WcsTaskLog>().First(t => t.Id == task.Id);
|
|
|
|
|
if (task.TaskStatus == 0)
|
|
|
|
|
{
|
|
|
|
|
TaskStatus0Handle(task);
|
|
|
|
|
@ -251,13 +237,19 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
WmsBaseLocation? endLocation = sqlSugarClient.Queryable<WmsBaseLocation>().First(t => t.AgvPositionCode == task.EndPointNo);
|
|
|
|
|
if (endLocation != null)
|
|
|
|
|
{
|
|
|
|
|
//入库校验RFID --todo解开屏蔽
|
|
|
|
|
//string readEpc = await ReadEpcStrByRfidKeyAsync(endLocation.EquipKey);
|
|
|
|
|
//test使用
|
|
|
|
|
string? readEpc = task.PalletInfoCode;
|
|
|
|
|
//入库校验RFID
|
|
|
|
|
string readEpc = ReadEpcStrByRfidKey(endLocation.EquipKey);
|
|
|
|
|
_logger.Agv($"读到RFID:{readEpc}");
|
|
|
|
|
|
|
|
|
|
//todo:12号机台装上RFID以后删除--------------------------------
|
|
|
|
|
if (endLocation.MachineId == 12)
|
|
|
|
|
{
|
|
|
|
|
readEpc = task.PalletInfoCode;
|
|
|
|
|
}
|
|
|
|
|
//----------------------------------
|
|
|
|
|
if (string.IsNullOrEmpty(readEpc) || readEpc != task.PalletInfoCode)
|
|
|
|
|
{
|
|
|
|
|
workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#机台校验失败提示"), true);
|
|
|
|
|
// workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#机台校验失败提示"), true);
|
|
|
|
|
_logger.Error("入库校验RFID失败,当前库位RFID:" + readEpc + ",任务RFID:" + task.PalletInfoCode);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
@ -437,11 +429,11 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
/// 3#接驳位到2#计量室接驳位的送料任务
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="task"></param>
|
|
|
|
|
private async Task TransferMaterialMetrologyRoomBoxTaskHandlerAsync(WcsTask task)
|
|
|
|
|
private void TransferMaterialMetrologyRoomBoxTaskHandler(WcsTask task)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
WcsTaskLog wcsTaskLog = await sqlSugarClient.Queryable<WcsTaskLog>().FirstAsync(t => t.Id == task.Id);
|
|
|
|
|
WcsTaskLog wcsTaskLog = sqlSugarClient.Queryable<WcsTaskLog>().First(t => t.Id == task.Id);
|
|
|
|
|
if (task.TaskStatus == 0)
|
|
|
|
|
{
|
|
|
|
|
TaskStatus0Handle(task);
|
|
|
|
|
@ -461,15 +453,14 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
}
|
|
|
|
|
else if (outFlag == 1)
|
|
|
|
|
{ //已经出来就绪,wcs通知agv取走托盘
|
|
|
|
|
bool result = await ContinueTaskHandle(task);
|
|
|
|
|
bool result = ContinueTaskHandle(task).Result;
|
|
|
|
|
if (result)
|
|
|
|
|
{
|
|
|
|
|
//从下料点直接取,清空RFID及机台号,条码等信息--ok
|
|
|
|
|
//workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 0);
|
|
|
|
|
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#接驳位到位信号"), 0);
|
|
|
|
|
workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#出接驳位信号"), false);
|
|
|
|
|
workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#小料箱agv已取走反馈"), true);
|
|
|
|
|
_logger.Agv($"agv取走料{task.PalletInfoCode},3#忙碌状态清0");
|
|
|
|
|
_logger.Agv($"agv取走料{task.PalletInfoCode},3#已取走反馈");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -480,17 +471,9 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
_logger.Plc(DateTime.Now + "3#PLC未连接,请检查网络!");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//解锁起始库位忙碌状态
|
|
|
|
|
WcsBaseEquip? startEquip = sqlSugarClient.Queryable<WcsBaseEquip>().First(it => it.AgvPositionCode == task.CurrPointNo);
|
|
|
|
|
sqlSugarClient.AsTenant().BeginTran();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (startEquip != null)
|
|
|
|
|
{
|
|
|
|
|
startEquip.EquipStatus = 0;
|
|
|
|
|
sqlSugarClient.Updateable<WcsBaseEquip>(startEquip).ExecuteCommand();
|
|
|
|
|
}
|
|
|
|
|
task.TaskStatus = 5;
|
|
|
|
|
task.UpdatedTime = DateTime.Now;
|
|
|
|
|
if (wcsTaskLog != null)
|
|
|
|
|
@ -522,15 +505,25 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
}
|
|
|
|
|
if (busyFlag == 0)
|
|
|
|
|
{
|
|
|
|
|
Thread.Sleep(2500);
|
|
|
|
|
int amount = sqlSugarClient.Queryable<WcsTask>().Where(x => x.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask).Count();
|
|
|
|
|
if (amount < 2)
|
|
|
|
|
{
|
|
|
|
|
Thread.Sleep(3500);
|
|
|
|
|
}
|
|
|
|
|
else //优先级最高,释放掉一个agv
|
|
|
|
|
{
|
|
|
|
|
Thread.Sleep(300);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
busyFlag = workShop2Plc.readInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"));
|
|
|
|
|
if (busyFlag == 0)
|
|
|
|
|
{
|
|
|
|
|
bool result = await ContinueTaskHandle(task);
|
|
|
|
|
if (result)
|
|
|
|
|
//抢占线体状态,agv进入接驳位
|
|
|
|
|
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1);
|
|
|
|
|
bool result = ContinueTaskHandle(task).Result;
|
|
|
|
|
if (!result)
|
|
|
|
|
{
|
|
|
|
|
//抢占线体状态,agv进入接驳位
|
|
|
|
|
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 1);
|
|
|
|
|
workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -552,7 +545,7 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
}
|
|
|
|
|
else if (!outFlag)
|
|
|
|
|
{ //托盘已经离开,wcs通知agv离开
|
|
|
|
|
bool result = await ContinueTaskHandle(task);
|
|
|
|
|
bool result = ContinueTaskHandle(task).Result;
|
|
|
|
|
if (result) //已经离开
|
|
|
|
|
{
|
|
|
|
|
workShop2Plc.writeBoolByAddress(StaticData.GetPlcAddress("2#放完成反馈"), false);
|
|
|
|
|
@ -624,19 +617,9 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
_logger.Plc(DateTime.Now + "2#PLC未连接,请检查网络!");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//从下料点直接取,清空RFID及机台号,条码等信息--ok
|
|
|
|
|
|
|
|
|
|
//workShop2Plc.writeInt16ByAddress(StaticData.GetPlcAddress("2#线体忙碌状态"), 0);
|
|
|
|
|
//解锁起始库位忙碌状态
|
|
|
|
|
WcsBaseEquip? startEquip = sqlSugarClient.Queryable<WcsBaseEquip>().First(it => it.AgvPositionCode == task.CurrPointNo);
|
|
|
|
|
sqlSugarClient.AsTenant().BeginTran();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (startEquip != null)
|
|
|
|
|
{
|
|
|
|
|
startEquip.EquipStatus = 0;
|
|
|
|
|
sqlSugarClient.Updateable<WcsBaseEquip>(startEquip).ExecuteCommand();
|
|
|
|
|
}
|
|
|
|
|
task.TaskStatus = 5;
|
|
|
|
|
task.UpdatedTime = DateTime.Now;
|
|
|
|
|
if (wcsTaskLog != null)
|
|
|
|
|
@ -672,11 +655,12 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
busyFlag = workShop3Plc.readInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"));
|
|
|
|
|
if (busyFlag == 0)
|
|
|
|
|
{
|
|
|
|
|
//抢占线体状态,agv进入接驳位
|
|
|
|
|
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 1);
|
|
|
|
|
bool result = await ContinueTaskHandle(task);
|
|
|
|
|
if (result)
|
|
|
|
|
if (!result)
|
|
|
|
|
{
|
|
|
|
|
//抢占线体状态,agv进入接驳位
|
|
|
|
|
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 1);
|
|
|
|
|
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -700,7 +684,6 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
if (result)
|
|
|
|
|
{
|
|
|
|
|
//从下料点直接取,清空RFID及机台号,条码等信息--ok
|
|
|
|
|
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 0);
|
|
|
|
|
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#接驳位到位信号"), 0);
|
|
|
|
|
workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#出接驳位信号"), false);
|
|
|
|
|
workShop3Plc.writeBoolByAddress(StaticData.GetPlcAddress("3#小料箱agv已取走反馈"), true);
|
|
|
|
|
@ -784,19 +767,23 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
busyFlag = workShop3Plc.readInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"));
|
|
|
|
|
if (busyFlag == 0)
|
|
|
|
|
{
|
|
|
|
|
//解锁起始库位
|
|
|
|
|
WcsBaseEquip? baseEquip = sqlSugarClient.Queryable<WcsBaseEquip>().First(t => t.AgvPositionCode == task.CurrPointNo);
|
|
|
|
|
if (baseEquip != null)
|
|
|
|
|
{
|
|
|
|
|
baseEquip.EquipStatus = 0;
|
|
|
|
|
baseEquip.ContainerCode = null;
|
|
|
|
|
sqlSugarClient.Updateable(baseEquip).ExecuteCommand();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//抢占线体状态,agv进入接驳位
|
|
|
|
|
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 1);
|
|
|
|
|
bool result = await ContinueTaskHandle(task);
|
|
|
|
|
if (result)
|
|
|
|
|
{
|
|
|
|
|
//抢占线体状态,agv进入接驳位
|
|
|
|
|
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 1);
|
|
|
|
|
//解锁起始色粉库位
|
|
|
|
|
WcsBaseEquip? baseEquip = sqlSugarClient.Queryable<WcsBaseEquip>().First(t => t.AgvPositionCode == task.CurrPointNo);
|
|
|
|
|
if (baseEquip != null)
|
|
|
|
|
{
|
|
|
|
|
baseEquip.EquipStatus = 0;
|
|
|
|
|
baseEquip.ContainerCode = null;
|
|
|
|
|
sqlSugarClient.Updateable(baseEquip).ExecuteCommand();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else //下发任务继续失败
|
|
|
|
|
{
|
|
|
|
|
workShop3Plc.writeInt16ByAddress(StaticData.GetPlcAddress("3#线体忙碌状态"), 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -1207,30 +1194,61 @@ namespace SlnMesnac.WCS.WCS
|
|
|
|
|
taskCode = task.TaskCode
|
|
|
|
|
};
|
|
|
|
|
string message = JsonConvert.SerializeObject(agvTask);
|
|
|
|
|
string result = HttpHelper.SendPostMessage(baseEquip.ServerIp, baseEquip.ServerPort, "rcms/services/rest/hikRpcService/continueTask", message);
|
|
|
|
|
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
|
|
|
|
|
if (reponseMessage != null && reponseMessage.message == "成功")
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
sqlSugarClient.AsTenant().BeginTran();
|
|
|
|
|
_logger.Agv($"下发agv任务继续,任务名称:{task.TaskName},任务id:{task.Id},任务状态:{task.TaskStatus}");
|
|
|
|
|
task.TaskStatus += 1;
|
|
|
|
|
task.UpdatedTime = DateTime.Now;
|
|
|
|
|
sqlSugarClient.Updateable<WcsTask>(task).ExecuteCommand();
|
|
|
|
|
if (wcsTaskLog != null)
|
|
|
|
|
string result = HttpHelper.SendPostMessage(baseEquip.ServerIp, baseEquip.ServerPort, "rcms/services/rest/hikRpcService/continueTask", message);
|
|
|
|
|
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
|
|
|
|
|
if (reponseMessage != null && reponseMessage.message == "成功")
|
|
|
|
|
{
|
|
|
|
|
wcsTaskLog.UpdatedTime = DateTime.Now;
|
|
|
|
|
wcsTaskLog.TaskStatus = task.TaskStatus;
|
|
|
|
|
sqlSugarClient.Updateable<WcsTaskLog>(wcsTaskLog).ExecuteCommand();
|
|
|
|
|
sqlSugarClient.AsTenant().BeginTran();
|
|
|
|
|
_logger.Agv($"下发agv任务继续,任务名称:{task.TaskName},任务id:{task.Id},任务状态:{task.TaskStatus}");
|
|
|
|
|
task.TaskStatus += 1;
|
|
|
|
|
task.UpdatedTime = DateTime.Now;
|
|
|
|
|
sqlSugarClient.Updateable<WcsTask>(task).ExecuteCommand();
|
|
|
|
|
if (wcsTaskLog != null)
|
|
|
|
|
{
|
|
|
|
|
wcsTaskLog.UpdatedTime = DateTime.Now;
|
|
|
|
|
wcsTaskLog.TaskStatus = task.TaskStatus;
|
|
|
|
|
sqlSugarClient.Updateable<WcsTaskLog>(wcsTaskLog).ExecuteCommand();
|
|
|
|
|
}
|
|
|
|
|
sqlSugarClient.AsTenant().CommitTran();
|
|
|
|
|
continueResult = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_logger.Error($"第一次下发agv任务继续异常,任务名称:{task.TaskName},任务id:{task.Id},异常信息:{ex.StackTrace}");
|
|
|
|
|
_logger.Error("开始尝试第二次下发");
|
|
|
|
|
await Task.Delay(1000 * 2);
|
|
|
|
|
string result = HttpHelper.SendPostMessage(baseEquip.ServerIp, baseEquip.ServerPort, "rcms/services/rest/hikRpcService/continueTask", message);
|
|
|
|
|
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
|
|
|
|
|
if (reponseMessage != null && reponseMessage.message == "成功")
|
|
|
|
|
{
|
|
|
|
|
sqlSugarClient.AsTenant().BeginTran();
|
|
|
|
|
_logger.Agv($"下发agv任务继续,任务名称:{task.TaskName},任务id:{task.Id},任务状态:{task.TaskStatus}");
|
|
|
|
|
task.TaskStatus += 1;
|
|
|
|
|
task.UpdatedTime = DateTime.Now;
|
|
|
|
|
sqlSugarClient.Updateable<WcsTask>(task).ExecuteCommand();
|
|
|
|
|
if (wcsTaskLog != null)
|
|
|
|
|
{
|
|
|
|
|
wcsTaskLog.UpdatedTime = DateTime.Now;
|
|
|
|
|
wcsTaskLog.TaskStatus = task.TaskStatus;
|
|
|
|
|
sqlSugarClient.Updateable<WcsTaskLog>(wcsTaskLog).ExecuteCommand();
|
|
|
|
|
}
|
|
|
|
|
sqlSugarClient.AsTenant().CommitTran();
|
|
|
|
|
continueResult = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_logger.Error($"下发第二次agv任务继续失败,任务名称:{task.TaskName},任务id:{task.Id},异常信息:{ex.StackTrace}");
|
|
|
|
|
}
|
|
|
|
|
sqlSugarClient.AsTenant().CommitTran();
|
|
|
|
|
continueResult = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion 下发AGV信号放料箱
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_logger.Error($"下发agv任务继续异常,任务名称:{task.TaskName},任务id:{task.Id},异常信息:{ex.StackTrace}");
|
|
|
|
|
_logger.Error($"下发agv任务第二次继续异常,任务名称:{task.TaskName},任务id:{task.Id},异常信息:{ex.StackTrace}");
|
|
|
|
|
}
|
|
|
|
|
return continueResult;
|
|
|
|
|
}
|
|
|
|
|
|