| | |
| | | PlcTaskInfo taskInfo = new PlcTaskInfo(); |
| | | if (modTask.TaskType == TaskTypeEnum.Move) |
| | | { |
| | | taskInfo = PLCCommon.GetEndPai(modTask.EndLocate.Substring(1, 2), modTask.EndLocate.Substring(2, 2), |
| | | taskInfo = PLCCommon.GetEndPai(modTask.EndRoadway.Substring(1, 2), modTask.EndLocate.Substring(2, 2), |
| | | modTask.EndLocate.Substring(0, 2), modTask.EndLocate.Substring(4, 2), |
| | | modTask.EndLocate.Substring(6, 2)); |
| | | |
| | |
| | | modcTaskMonitor.InteractiveMsg = string.Format("工位:{0},写入取货完成:640", startStationVal); |
| | | // 插入交互日志 |
| | | _db.Insertable(modcTaskMonitor).ExecuteCommand(); |
| | | } |
| | | |
| | | var retc = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "640"); |
| | | var retc = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "640"); |
| | | |
| | | if (!retc.IsSucceed) |
| | | { |
| | | modcTaskMonitor.InteractiveMsg = string.Format("工位:{0},写入取货完成640失败", startStationVal); |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | if (!retc.IsSucceed) |
| | | { |
| | | modcTaskMonitor.InteractiveMsg = string.Format("工位:{0},写入取货完成640失败", startStationVal); |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | break; |
| | | } |
| | | |
| | | //下发任务日志 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | break; |
| | | } |
| | | |
| | | //下发任务日志 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | |
| | | // 读取wcs控制字 |
| | |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令450:{modDevice.StationNum}拣选完成,托盘离开工位", |
| | | InteractiveMsg = $"写入指令450:{modDevice.StationNum}出库完成", |
| | | PalletNo = palletVal, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = starVal.ToString(), |
| | |
| | | // led显示内容 |
| | | var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId == modDevice.PlcId); |
| | | |
| | | ledText += $"拣选完成,托盘离开工位\n\n"; |
| | | ledText += $"出库完成\n\n"; |
| | | ledText += $"任务号:{modTask.TaskNo}\n"; |
| | | ledText += $"托盘号:{modTask.PalletNo}\n\n"; |
| | | ledText += $"起始位:{modTask.StartRoadway + " " + modTask.StartLocate}\n"; |
| | |
| | | else |
| | | { |
| | | // 与plc交互写入分道号和流程控制字 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, checkTaskInfo.RoboatNo); |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, checkTaskInfo.LineNo); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | |
| | | string boxNo = boxVal.ToString(); |
| | | if (string.IsNullOrEmpty(boxNo)) |
| | | { |
| | | Log.Error(string.Format("码垛工位{0},箱码为null插码失败!请人工强制结批。"), modDevice.StationNum); |
| | | Log.Error($"码垛工位{modDevice.StationNum},箱码为null插码失败!请人工强制结批。" ); |
| | | // 写入插入结果 2:插码失败 |
| | | var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2"); |
| | | |
| | | break; |
| | | } |
| | | // 验证箱码表是否存在此箱码 |
| | | var boxInfo = _db.Queryable<WcsBoxInfo>().First(w => w.IsDelete == false && w.BoxNo == boxNo); |
| | | if (boxInfo == null) |
| | | var boxInfo = _db.Queryable<WcsBoxInfo>().Where(w => w.IsDelete == false && w.BoxNo == boxNo).ToList(); |
| | | if (boxInfo.Count == 0) |
| | | { |
| | | Log.Error(string.Format("码垛工位{0},箱码{1}不存在!请人工强制结批。"), modDevice.StationNum,boxNo); |
| | | Log.Error($"码垛工位{modDevice.StationNum},箱码{boxNo}不存在!请人工强制结批。"); |
| | | // 写入插入结果 2:插码失败 |
| | | var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2"); |
| | | break; |
| | |
| | | break; |
| | | } |
| | | // 修改插码表 |
| | | boxInfo.PalletNo = palletNo; |
| | | boxInfo.UpdateTime = DateTime.Now; |
| | | foreach (WcsBoxInfo item in boxInfo) |
| | | { |
| | | item.PalletNo = palletNo; |
| | | item.UpdateTime = DateTime.Now; |
| | | } |
| | | |
| | | var rowCount = _db.Updateable(boxInfo).ExecuteCommand(); |
| | | if (rowCount > 0) |
| | | { |
| | | // 插码成功 |
| | | var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "1"); |
| | | |
| | | //是否结批箱 |
| | | if (boxInfo[0].EndLotFlag == "1" && retVal.IsSucceed) |
| | | { |
| | | // 触发结批 解绑分道 |
| | | AutoEndLot(boxInfo[0].LotNo, plcConn, "0"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 插码失败 |
| | | Log.Error(string.Format("箱码{0};码垛工位{1},插码失败,请强制结批"),boxNo,modDevice.StationNum); |
| | | Log.Error($"箱码{boxNo};码垛工位{modDevice.StationNum},插码失败,请强制结批"); |
| | | var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | // 触发结批 不解绑分道 |
| | | AutoEndLot(boxInfo[0].LotNo, plcConn, "1"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case "40": |
| | | // 请求组托,申请入库 |
| | | { |
| | | { |
| | | // 根据工位号,获取托盘号 |
| | | var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false); |
| | | // 根据工位号获取 托盘线该工位号的配置信息 |
| | |
| | | int insertCount = _db.Ado.ExecuteCommand(sqlStr); |
| | | if (insertCount > 0) |
| | | { |
| | | string sqlStr2 = $"delete from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'"; |
| | | // 组托成功后将信息存到log表 |
| | | string sqlStr2 = $"delete from WCSBoxInfoLog where IsDelete=0 and PalletNo='{palletNo}'"; |
| | | _db.Ado.ExecuteCommand(sqlStr2); |
| | | } |
| | | // 向WMS申请巷道 |
| | |
| | | string TaskNo = "", EndLocate = ""; |
| | | string strMsg = http.BindRequestRoadWay(checkTaskMedel.OrderNo,palletNo, checkTaskMedel.BoxCount.ToDecimal(),"0", checkTaskMedel.SkuNo, checkTaskMedel.LotNo, "","", boxInfoList, |
| | | modDevice.StationNum, "1", "2", ref EndLocate, ref TaskNo); |
| | | if (!strMsg.Contains("-1")) |
| | | if (strMsg.Contains("-1")) |
| | | { |
| | | Log.Error(string.Format("申请巷道失败,码垛工位{0};原因{1}", modDevice.StationNum, strMsg)); |
| | | break; |
| | |
| | | Log.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// LED信息展示 |
| | | /// </summary> |
| | | /// <param name="ip"></param> |
| | | /// <param name="text"></param> |
| | | private static void LedDisplay(string ip,string text) |
| | | { |
| | | try |
| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 自动结批 |
| | | /// </summary> |
| | | /// <param name="lotNo">批次号</param> |
| | | /// <param name="plcConn">Plc连接</param> |
| | | /// <param name="status">是否解绑分道 0:解绑 1:绑定</param> |
| | | private static void AutoEndLot(string lotNo,PLCUtil plcConn,string status) |
| | | { |
| | | try |
| | | { |
| | | if (string.IsNullOrWhiteSpace(lotNo)) |
| | | { |
| | | Console.WriteLine("批次号为nul"); |
| | | } |
| | | var checkTaskList = _db.Queryable<WcsCheckTask>().Where(w => w.LotNo == lotNo && w.Status == "1").ToList(); |
| | | if (checkTaskList.Count <= 0) |
| | | { |
| | | Console.WriteLine("未找到分道绑定信息"); |
| | | } |
| | | foreach (var item in checkTaskList) |
| | | { |
| | | #region#给PLC写入结批批次号 |
| | | var ret = plcConn.SetPlcDBValue(item.PosTypeLot, item.DbNumber, item.PosLot, "1"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | //写入流程字成功后更新分拣任务 liudl 最后一托盘申请完入库才可清空 |
| | | //item.OrderNo = ""; |
| | | //item.TaskNo = ""; |
| | | //item.LotNo = ""; |
| | | //item.SkuNo = ""; |
| | | //item.SkuName = ""; |
| | | //item.BoxType = ""; |
| | | //item.Qty = 0; |
| | | //item.PZNo = ""; |
| | | item.Status = status; // 绑定分道 0:解绑 1:绑定 |
| | | |
| | | //更新分拣任务 |
| | | _db.Updateable(item).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); |
| | | } |
| | | #endregion |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Log.Error(ex.Message); |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | private static void Test(WcsDeviceDto modDevice) |
| | | { |
| | | //写死测试读string |