Commit 3296b7e2 LN

紧急料分盘料料架送出逻辑修改。

1 个父辈 8c01bce9
 20200411
紧急出料料串逻辑修改:
//如果虚拟料架号为空,或者虚拟料架号与当前一致才可以出库
//料架号不一致时,直接送出料架
第一次启动时,需要查询下当前料架是否有虚拟料架号,没有虚拟料架号,可以直接用
有虚拟料架号,判断是否还有任务,没有任务就结束处理。
分盘料/紧急料放上料串或料架时调用

/rest/api/qisda/device/afterPutCut

参数:
cid: 料仓cid,流水线可传入空
barcode : 条码
rfid : RFID
rfidLoc: 料架位置,流水线可传-1

> 返回: 
>>` {"code": 0, "msg":"ok", "data":{"cutPackageTask":"0","urgentPackageTask":"20","cutTask":"21","urgentTask":"22"}} `
>>
>> - code: 0为正常,其他为异常, 
>> - msg:消息, 
>> - data:为包装料仓的空闲仓位数(key为与客户端一致的料仓标识,value为空闲仓位)
>> - cutPackageTask: 表示当前包装仓的分盘任务数
>> - urgentPackageTask: 表示当前包装仓的紧急料任务数
>> - cutTask: 表示流水线分盘任务数
>> - urgentTask: 表示流水线紧急料任务数
分盘料/紧急料启动时获取料架的虚拟RFID调用
地址:
/rest/api/qisda/device/findTempRfid
参数:
rfid : RFID
返回:
{"code": 0, "msg":"ok", "data":{"tempRfid":""}}
code: 0为正常,其他为异常,
msg:消息,
data:
tempRfid: 表示当前料架(料串)对应的虚拟RFID
20200410 20200410
上料模块,RFID读取改为扫描模式,如果没有读到料架号,直接送出料架。 上料模块,RFID读取改为扫描模式,如果没有读到料架号,直接送出料架。
大盘>30mm的料入库时,托盘先不顶升,等待横移机构到达托盘上方后,升降下降,顶升上升。 大盘>30mm的料入库时,托盘先不顶升,等待横移机构到达托盘上方后,升降下降,顶升上升。
......
...@@ -718,7 +718,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -718,7 +718,7 @@ namespace OnlineStore.DeviceLibrary
AgvClient.SetStatus(Config.AgvOutName, "", ClientAction.None, ClientLevel.High, true); AgvClient.SetStatus(Config.AgvOutName, "", ClientAction.None, ClientLevel.High, true);
}); });
ProcessShelfOut = false; ProcessShelfOut = false;
LogUtil.info(logName + ",停止转动, 结束"); LogUtil.info(logName + ",停止转动,清空料架["+ LastOutShelfId + "], 结束");
} }
else else
{ {
......
...@@ -13,7 +13,9 @@ namespace OnlineStore.DeviceLibrary ...@@ -13,7 +13,9 @@ namespace OnlineStore.DeviceLibrary
#region 出料流程 #region 出料流程
private int OutStoreHeight = -1; private int OutStoreHeight = -1;
private int OutStoreCount = -1; private int OutStoreCount = -1;
private ShelfData serverShelfData = null; private TaskData taskData = null;
private InOutParam LastOutParam = new InOutParam();
internal bool CanStartCheckOut(int trayNum) internal bool CanStartCheckOut(int trayNum)
{ {
preTrayNum = currTrayNum; preTrayNum = currTrayNum;
...@@ -48,7 +50,39 @@ namespace OnlineStore.DeviceLibrary ...@@ -48,7 +50,39 @@ namespace OnlineStore.DeviceLibrary
} }
runStatus = LineRunStatus.Busy; runStatus = LineRunStatus.Busy;
lineStatus = LineStatus.OutStoreExecute; lineStatus = LineStatus.OutStoreExecute;
string lastXuniRfid = LastOutParam.rfid;
if (lastXuniRfid.Equals("") || lastXuniRfid.Equals(outParam.rfid))
{
//如果虚拟料架号为空,或者虚拟料架号与当前一致才可以出库
}
else
{
//料架号不一致时,直接送出料架
//如果流水线还有次料架的任务,暂不送出
int count = TrayManager.GetOutTaskByRfid(lastXuniRfid);
if (count < 0)
{
LogUtil.info(Name + "出库" + outParam.ToStr() + "失败,料架号不一致[" + lastXuniRfid + "][" + outParam.rfid + "],当前料架暂时无任务,送出料架,托盘先离开");
TrayMoveOk();
MoveInfo.NewMove(LineMoveType.OutStore, LastOutParam);
SendOutShelfOut("料架号[" + lastXuniRfid + "][" + outParam.rfid + "]不一致");
return false;
}
else
{
LogUtil.info(Name + "出库" + outParam.ToStr() + "失败,料架号不一致[" + lastXuniRfid + "][" + outParam.rfid + "],当前料架还有【"+count+"】个任务,托盘先离开");
TrayMoveOk();
return false;
}
}
MoveInfo.NewMove(LineMoveType.OutStore, outParam); MoveInfo.NewMove(LineMoveType.OutStore, outParam);
LastOutParam = outParam;
//可以开始出库啦 //可以开始出库啦
MoveInfo.NextMoveStep(LineMoveStep.FO_211_AxisDownMove); MoveInfo.NextMoveStep(LineMoveStep.FO_211_AxisDownMove);
int height = outParam.PlateH + 4; int height = outParam.PlateH + 4;
...@@ -116,7 +150,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -116,7 +150,7 @@ namespace OnlineStore.DeviceLibrary
lineStatus = LineStatus.OutStoreExecute; lineStatus = LineStatus.OutStoreExecute;
MoveInfo.NewMove(LineMoveType.OutStore); MoveInfo.NewMove(LineMoveType.OutStore);
MoveInfo.MoveParam = new InOutParam(); MoveInfo.MoveParam = new InOutParam();
serverShelfData = null; taskData = null;
if (IOValue(IO_Type.SL_Location_Check).Equals(IO_VALUE.HIGH)) if (IOValue(IO_Type.SL_Location_Check).Equals(IO_VALUE.HIGH))
{ {
FO_04_WaitTime(); FO_04_WaitTime();
...@@ -230,15 +264,33 @@ namespace OnlineStore.DeviceLibrary ...@@ -230,15 +264,33 @@ namespace OnlineStore.DeviceLibrary
if (CurrShelfId.EndsWith("00")) if (CurrShelfId.EndsWith("00"))
{ {
SendOutShelfOut("料架号【" + CurrShelfId + "】无效"); SendOutShelfOut("料架号【" + CurrShelfId + "】无效");
return;
} }
else
//判断是否是第一次获取料架,需要从服务器获取此料架的虚拟料架号,若无虚拟料架号,料架可以用
//有虚拟料架号,从服务器获取此料架剩余任务,若无任务,需要送出料架
if (LastOutParam.rfid.Equals(""))
{ {
//定位工位有料架,直接开始入料 string tempRfid = "";
MoveInfo.NextMoveStep(LineMoveStep.FO_05_LocationUp); string msg = SServerManager.findTempRfid(Name, CurrShelfId, out tempRfid);
OutLog("定位工位检测到料架: " + MoveInfo.SLog + " 缓冲阻挡下降, 定位气缸上升,读取料架号"); if (!String.IsNullOrEmpty(msg))
IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW);//缓冲阻挡下降 {
CylinderMove(MoveInfo, IO_Type.SL_LocationCylinder_Down, IO_Type.SW4_LocationCylinder_Up); LogUtil.error(Name + "findTempRfid 【" + CurrShelfId + "】【" + tempRfid + "】结果:" + msg);
}
if (!String.IsNullOrEmpty(tempRfid))
{
//如果虚拟料架号存在,直接送出料架
SendOutShelfOut("料架【" + CurrShelfId + "】【" + tempRfid + "】已绑定,不再使用");
return;
}
} }
//定位工位有料架,直接开始入料
MoveInfo.NextMoveStep(LineMoveStep.FO_05_LocationUp);
OutLog("定位工位检测到料架: " + MoveInfo.SLog + " 缓冲阻挡下降, 定位气缸上升,读取料架号");
IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW);//缓冲阻挡下降
CylinderMove(MoveInfo, IO_Type.SL_LocationCylinder_Down, IO_Type.SW4_LocationCylinder_Up);
} }
else else
{ {
...@@ -326,7 +378,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -326,7 +378,7 @@ namespace OnlineStore.DeviceLibrary
else if (MoveInfo.MoveStep.Equals(LineMoveStep.FO_32_BatchAxisToP1)) else if (MoveInfo.MoveStep.Equals(LineMoveStep.FO_32_BatchAxisToP1))
{ {
MoveInfo.NextMoveStep(LineMoveStep.FO_34_OutCheck); MoveInfo.NextMoveStep(LineMoveStep.FO_34_OutCheck);
OutLog("送出料串: " + MoveInfo.SLog + ",等待出料线体无料架"); OutLog("送出料串: " + MoveInfo.SLog + ",等待出料线体无料架");
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SL_Out_Check, IO_VALUE.LOW)); MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SL_Out_Check, IO_VALUE.LOW));
} }
else if (MoveInfo.MoveStep.Equals(LineMoveStep.FO_34_OutCheck)) else if (MoveInfo.MoveStep.Equals(LineMoveStep.FO_34_OutCheck))
...@@ -367,9 +419,10 @@ namespace OnlineStore.DeviceLibrary ...@@ -367,9 +419,10 @@ namespace OnlineStore.DeviceLibrary
else if (MoveInfo.MoveStep.Equals(LineMoveStep.FO_37_LineStop)) else if (MoveInfo.MoveStep.Equals(LineMoveStep.FO_37_LineStop))
{ {
MoveInfo.NextMoveStep(LineMoveStep.FO_38_TopDown); MoveInfo.NextMoveStep(LineMoveStep.FO_38_TopDown);
OutLog("送出料串: " + MoveInfo.SLog + ", 料架到达出口,出口顶升下降 , "); OutLog("送出料串: " + MoveInfo.SLog + ", 料架到达出口,出口顶升下降 ,清空LastOutParam ");
CylinderMove(MoveInfo, IO_Type.SL_OutTopCylinder_Up, IO_Type.SL_OutTopCylinder_Down); CylinderMove(MoveInfo, IO_Type.SL_OutTopCylinder_Up, IO_Type.SL_OutTopCylinder_Down);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(300)); MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(300));
LastOutParam = new InOutParam();
} }
else if (MoveInfo.MoveStep.Equals(LineMoveStep.FO_38_TopDown)) else if (MoveInfo.MoveStep.Equals(LineMoveStep.FO_38_TopDown))
{ {
...@@ -553,11 +606,11 @@ namespace OnlineStore.DeviceLibrary ...@@ -553,11 +606,11 @@ namespace OnlineStore.DeviceLibrary
UpdownAxis.AbsMove(MoveInfo, Config.UpDownAxisP1, Config.UpdownAxis_P1Speed); UpdownAxis.AbsMove(MoveInfo, Config.UpDownAxisP1, Config.UpdownAxis_P1Speed);
Task.Factory.StartNew(delegate Task.Factory.StartNew(delegate
{ {
string msg = SServerManager.PutShelfFinished(Name, MoveInfo.MoveParam.WareCode, CurrShelfId, OutStoreCount.ToString(), out serverShelfData); string msg = SServerManager.afterPutCut(Name, CurrShelfId, MoveInfo.MoveParam.WareCode, "", OutStoreCount, out taskData);
if (String.IsNullOrEmpty(msg).Equals(false)) if (String.IsNullOrEmpty(msg).Equals(false))
{ {
LogUtil.error(Name + "【" + MoveInfo.MoveParam.WareCode + "】【" + CurrShelfId + "】【" + OutStoreCount.ToString() + "】PutShelfFinished 结果:" + msg); LogUtil.error(Name + "【" + MoveInfo.MoveParam.WareCode + "】【" + CurrShelfId + "】【" + OutStoreCount.ToString() + "】afterPutCut 结果:" + msg);
serverShelfData = null; taskData = null;
} }
}); });
} }
...@@ -603,14 +656,22 @@ namespace OnlineStore.DeviceLibrary ...@@ -603,14 +656,22 @@ namespace OnlineStore.DeviceLibrary
} }
else else
{ {
//判断是否需要送出料架 //判断是否需要送出料架'
if (serverShelfData != null && serverShelfData.cutTask <= 0) if (taskData == null)
{
SendOutShelfOut("出料结束,taskData=null,需要送出料架");
}
else if (MoveInfo.MoveParam.cutReel && taskData.cutTask <= 0)
{
SendOutShelfOut("分盘料,cutTask=" + taskData.cutTask + ",需要送出料架");
}
else if (MoveInfo.MoveParam.urgentReel && taskData.urgentTask <= 0)
{ {
SendOutShelfOut("服务器返回cutTask=" + serverShelfData.cutTask + ",需要送出料架"); SendOutShelfOut("紧急料,urgentTask=" + taskData.urgentTask + ",需要送出料架");
} }
else else
{ {
OutLog("紧急出料完成,出料结束"); OutLog("出料完成,出料结束");
MoveEndS(); MoveEndS();
} }
} }
......
...@@ -77,7 +77,17 @@ namespace OnlineStore.DeviceLibrary ...@@ -77,7 +77,17 @@ namespace OnlineStore.DeviceLibrary
return tray; return tray;
} }
/// <summary>
/// 获取已在托盘的,指定虚拟料架号剩余任务
/// </summary>
/// <param name="lastXuniRfid"></param>
/// <returns></returns>
internal static int GetOutTaskByRfid(string lastXuniRfid)
{
List<TrayInfo> alltray = new List<TrayInfo>(TrayInfoMap.Values);
int count = (from m in alltray where m.IsFull && m.InOrOutStore.Equals(2) && m.InoutPar.rfid.Equals(lastXuniRfid) select m).Count();
return count;
}
public static void UpdateTrayInfo(int trayNum, bool isFull = false, int inOrOut = 0, InOutParam param = null, string ngMsg = "") public static void UpdateTrayInfo(int trayNum, bool isFull = false, int inOrOut = 0, InOutParam param = null, string ngMsg = "")
{ {
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!