| | |
| | | |
| | | using Dm.filter; |
| | | using DocumentFormat.OpenXml.Bibliography; |
| | | using DocumentFormat.OpenXml.Drawing.Charts; |
| | | using Elastic.Clients.Elasticsearch.Snapshot; |
| | | using Elastic.Clients.Elasticsearch.Tasks; |
| | | using Flurl.Util; |
| | | using Furion.Logging; |
| | | using IoTClient; |
| | | using Microsoft.AspNetCore.SignalR; |
| | | using NewLife.Reflection; |
| | | using Qiniu.Storage; |
| | | using RazorEngine.Compilation.ImpromptuInterface.Dynamic; |
| | | using SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global.Models; |
| | |
| | | using System.Data; |
| | | using System.Reflection.Emit; |
| | | using WCS.Application.Entity; |
| | | using WCS.Application.Service.WcsDevice.Dto; |
| | | using WCS.Application.Util; |
| | | using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinExpressIntracityUpdateStoreRequest.Types; |
| | | using static SKIT.FlurlHttpClient.Wechat.Api.Models.NontaxInsertBillRequest.Types.CardExtra.Types.BillCard.Types; |
| | | |
| | | namespace WCS.Application; |
| | | public static class PLCService |
| | | { |
| | | private static readonly object OLock = new object(); |
| | | |
| | | private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId); |
| | | |
| | | private static int fendao = 1; |
| | | |
| | | public static void OnChangeEvent(object sender, EventArgs e) |
| | | { |
| | |
| | | BoxConveyorLine(mod); // 码垛机器人 |
| | | break; |
| | | case PLCTypeEnum.StackingRobot: |
| | | PalletMachine(mod); |
| | | StackingRobot(mod); //拆垛机器人 |
| | | break; |
| | | default: |
| | | break; |
| | |
| | | private static void StackingMachine(WcsDeviceDto modDevice) |
| | | { |
| | | var plcConn = modDevice.PLCUtil; |
| | | string ledText = ""; |
| | | switch (modDevice.Value.ToString()) |
| | | { |
| | | case "820": |
| | | // 跺机空闲,获取出库任务、移库任务 |
| | | { |
| | | // 获取任务信息 |
| | | var modTask = _db.Queryable<WcsTask>().OrderBy(m => m.CreateTime).OrderBy(m => m.Levels, OrderByType.Asc) |
| | | var modTask = _db.Queryable<WcsTask>().OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime) |
| | | .First(s => s.Status == TaskStatusEnum.Wait && (s.TaskType == TaskTypeEnum.Out || s.TaskType == TaskTypeEnum.Move) |
| | | && s.StartRoadway == modDevice.StationNum); |
| | | if (modTask == null) |
| | |
| | | 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)); |
| | | |
| | |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | //修改led屏信息 |
| | | //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo); |
| | | var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == taskInfo.EndStation && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); |
| | | ledText += $"任务类型:{modTask.TaskType.GetDescription()}\n\n"; |
| | | ledText += $"任务号:{modTask.TaskNo}\n"; |
| | | ledText += $"托盘号:{modTask.PalletNo}\n\n"; |
| | | ledText += $"起始位:{modTask.StartRoadway + " " + modTask.StartLocate}\n"; |
| | | ledText += $"目标位:{modTask.EndRoadway + " " + modTask.EndLocate}"; |
| | | LedDisplay(ledDevice.LedIP, ledText); |
| | | } |
| | | } |
| | | break; |
| | |
| | | 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控制字 |
| | |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | |
| | | //修改led屏信息 |
| | | //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo); |
| | | } |
| | | } |
| | | break; |
| | |
| | | { |
| | | string tasknoVal = val.ToString(); |
| | | var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false); |
| | | if (modTask == null) |
| | | if (modTask == null) |
| | | { |
| | | Log.Error(string.Format("跺机控制字860:未找到对应的任务。")); |
| | | break; |
| | |
| | | } |
| | | else |
| | | { |
| | | Log.Error(string.Format("任务反馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); |
| | | Log.Error(string.Format("c:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); |
| | | } |
| | | } |
| | | // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。 |
| | |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | // led显示内容 |
| | | LedDisplay(modDevice.LedIP, "工位:" + modTask.StartLocate, "入库完成 " + $"任务完成:{modTask.TaskNo}", "托盘号:" + modTask.PalletNo); |
| | | var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modTask.StartLocate && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); |
| | | ledText += $"入库完成\n\n"; |
| | | |
| | | ledText += $"任务号:{modTask.TaskNo}\n"; |
| | | ledText += $"托盘号:{modTask.PalletNo}\n\n"; |
| | | |
| | | ledText += $"起始位:{modTask.StartRoadway + " " + modTask.StartLocate}\n"; |
| | | ledText += $"目标位:{modTask.EndRoadway + " " + modTask.EndLocate}"; |
| | | |
| | | LedDisplay(ledDevice.LedIP, ledText); |
| | | // 此处添加不空跑业务 |
| | | } |
| | | break; |
| | |
| | | _db.Insertable(modcTaskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | HubUtil.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。 |
| | | var taskModel = _db.Queryable<WcsTask>().First(w => w.TaskNo == modTask.TaskNo); |
| | | modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskModel.EndLocate).Select(s => s.LedIP).First(); |
| | | |
| | | // led显示内容 |
| | | LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "出库中 ", "托盘号:" + modTask.PalletNo); |
| | | |
| | | break; |
| | | } |
| | |
| | | var modTask = _db.Queryable<WcsTask>().First(s => s.TaskNo == taskNo && s.Status == TaskStatusEnum.Doing); |
| | | if (modTask == null) |
| | | { |
| | | Log.Error($"【堆垛机】当前任务号不存在对应的任务,任务号:{modTask.TaskNo}"); |
| | | Log.Error($"【堆垛机】当前任务号不存在对应的任务,任务号:{TaskNo}"); |
| | | break; |
| | | } |
| | | var res = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "844"); |
| | |
| | | { |
| | | //满放货异常 |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号"); |
| | | var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘号"); |
| | | var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘码"); |
| | | var (result, TaskNo) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); |
| | | if (!result.IsSucceed) |
| | | break; |
| | |
| | | var modTask = _db.Queryable<WcsTask>().First(s => s.TaskNo == taskNo && s.Status == TaskStatusEnum.Doing); |
| | | if (modTask == null) |
| | | { |
| | | Log.Error($"【堆垛机】当前任务号不存在对应的任务,任务号:{modTask.TaskNo}"); |
| | | Log.Error($"【堆垛机】当前任务号不存在对应的任务,任务号:{TaskNo}"); |
| | | break; |
| | | } |
| | | modTask.Status = TaskStatusEnum.Exception; |
| | |
| | | string storey = int.Parse(endLocat.Substring(4, 2)).ToString(); |
| | | |
| | | // 给PLC写入任务数据 |
| | | //var listResult = new List<Result>(); |
| | | //// 任务号托盘号 |
| | | //listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); |
| | | //listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); |
| | | //// 起始排列层 |
| | | //listResult.Add(plcConn.SetPlcDBValue(modPosRow.PosType, modDevice.DbNumber, modPosRow.PlcPos, "2")); |
| | | //listResult.Add(plcConn.SetPlcDBValue(modPosColumn.PosType, modDevice.DbNumber, modPosColumn.PlcPos, "100")); |
| | | //listResult.Add(plcConn.SetPlcDBValue(modPosStorey.PosType, modDevice.DbNumber, modPosStorey.PlcPos, "1")); |
| | | //listResult.Add(plcConn.SetPlcDBValue(modPosEndRow.PosType, modDevice.DbNumber, modPosEndRow.PlcPos, row)); |
| | | //listResult.Add(plcConn.SetPlcDBValue(modPosEndColumn.PosType, modDevice.DbNumber, modPosEndColumn.PlcPos, column)); |
| | | //listResult.Add(plcConn.SetPlcDBValue(modPosEndStorey.PosType, modDevice.DbNumber, modPosEndStorey.PlcPos, storey)); |
| | | |
| | | PlcTaskInfo taskInfo = new PlcTaskInfo(); |
| | | 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)); |
| | | |
| | | // 给PLC写入任务数据 |
| | | var listResult = new List<Result>(); |
| | | // 任务号托盘号 |
| | | modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); |
| | | modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘码"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); |
| | | // 起始排列层 |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosRow.PosType, modDevice.DbNumber, modPosRow.PlcPos, "2")); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosColumn.PosType, modDevice.DbNumber, modPosColumn.PlcPos, "100")); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosStorey.PosType, modDevice.DbNumber, modPosStorey.PlcPos, "1")); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosEndRow.PosType, modDevice.DbNumber, modPosEndRow.PlcPos, row)); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosEndColumn.PosType, modDevice.DbNumber, modPosEndColumn.PlcPos, column)); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosEndStorey.PosType, modDevice.DbNumber, modPosEndStorey.PlcPos, storey)); |
| | | // 目标放货工位(固定排列层) |
| | | modPosEndRow = modDevice.listStation.FirstOrDefault(s => s.Text == "放货排"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosEndRow.PosType, modDevice.DbNumber, modPosEndRow.PlcPos, taskInfo.EndPai)); |
| | | modPosEndColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "放货列"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosEndColumn.PosType, modDevice.DbNumber, modPosEndColumn.PlcPos, taskInfo.EndLie)); |
| | | modPosEndStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "放货层"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosEndStorey.PosType, modDevice.DbNumber, modPosEndStorey.PlcPos, taskInfo.EndCeng)); |
| | | |
| | | // 是否写入成功 |
| | | if (listResult.All(s => s.IsSucceed)) |
| | | { |
| | |
| | | { |
| | | return; |
| | | } |
| | | var ledText = ""; |
| | | switch (modDevice.Value.ToString()) |
| | | { |
| | | case "320": |
| | |
| | | // 申请巷道 |
| | | string strMsg = ""; |
| | | string taskModel = ""; |
| | | // 判断是否演示模式 |
| | | //if (PLCTaskAction.boDemo) |
| | | //{ |
| | | // taskModel = "1";// 演示模式 |
| | | //} |
| | | |
| | | // 获取工位托盘码信息 |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码"); |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | |
| | | { |
| | | break; |
| | | } |
| | | var modPosEndLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "目的工位"); |
| | | |
| | | |
| | | //判断入库锁定是否打开 |
| | | if (PLCTaskAction.boEnterLock) |
| | | { |
| | | var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (res350.IsSucceed && palletVal350 != "350") |
| | | { |
| | | ledText += $"申请入库失败\n\n"; |
| | | ledText += $"托盘号:{palletVal}\n"; |
| | | ledText += $"入库任务已锁定,请解锁后重试!\n"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | } |
| | | |
| | | // 写入输送线退回指令 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); |
| | | if (ret.IsSucceed) |
| | | { |
| | | plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); |
| | | } |
| | | |
| | | break; |
| | | } |
| | | |
| | | if (palletVal == null) |
| | | { |
| | | var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (res350.IsSucceed && palletVal350 != "350") |
| | | { |
| | | ledText += $"申请入库失败\n\n"; |
| | | ledText += $"托盘号:{palletVal}\n"; |
| | | ledText += $"扫描托盘号失败!\n"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | } |
| | | |
| | | // 写入输送线退回指令 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); |
| | | if (ret.IsSucceed) |
| | | { |
| | | plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); |
| | | } |
| | | |
| | | break; |
| | | } |
| | | |
| | | var http = new HttpService(); |
| | | string TaskNo = "", EndLocate = ""; |
| | | |
| | | //根据工位判断是否为叠托机工位申请空托盘跺入库,是:向WMS申请空托盘跺组托 |
| | | string groupMsg = ""; |
| | | if (modDevice.StationNum == "27") |
| | | { |
| | | var (res2,Qty) = plcConn.GetPlcDBValue(PLCDataTypeEnum.Short,"DB135","0");//获取叠托机叠托数量 |
| | | |
| | | groupMsg = http.BindPlnInHouseWcs(Qty.ToString(), palletVal); |
| | | |
| | | if (groupMsg.Contains("-1")) |
| | | { |
| | | var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (res350.IsSucceed && palletVal350 != "350") |
| | | { |
| | | ledText += $"申请入库失败\n\n"; |
| | | ledText += $"托盘号:{palletVal}\n"; |
| | | ledText += $"{strMsg}\n"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | } |
| | | |
| | | // 写入输送线退回指令 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); |
| | | if (ret.IsSucceed) |
| | | { |
| | | plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | string IsBale = "0"; |
| | | strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, taskModel, louCeng, ref EndLocate, ref TaskNo); |
| | | |
| | | if (!strMsg.Contains("-1")) |
| | |
| | | |
| | | // 写入330 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "330"); |
| | | |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 插入任务明细 |
| | |
| | | StartLocat = modDevice.StationNum, |
| | | EndLocat = EndLocate, |
| | | }; |
| | | |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | |
| | | //判断是否裹包 |
| | | var gbPos = modDevice.listStation.FirstOrDefault(s => s.Text == "Element_1"); |
| | | strMsg = new HttpService().RequestPackWcs(palletVal); |
| | | if (strMsg == "1") |
| | | { |
| | | //写入裹包指令 |
| | | ret = plcConn.SetPlcDBValue(gbPos.PosType, modDevice.DbNumber, gbPos.PlcPos, "2"); |
| | | } |
| | | else |
| | | { |
| | | ret = plcConn.SetPlcDBValue(gbPos.PosType, modDevice.DbNumber, gbPos.PlcPos, "1"); |
| | | } |
| | | |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | // led显示内容 |
| | | LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "申请入库 " + $"目标巷道:{EndLocate}", "托盘号:" + palletVal); |
| | | try |
| | | { |
| | | ledText += $"任务类型:{taskInfo.TaskType.GetDescription()}\n\n"; |
| | | |
| | | ledText += $"任务号:{taskInfo.TaskNo}\n"; |
| | | ledText += $"托盘号:{taskInfo.PalletNo}\n\n"; |
| | | |
| | | ledText += $"起始位:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n"; |
| | | ledText += $"目标位:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Log.Error(ex.Message); |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | // 申请巷道失败!LED显示 |
| | | Log.Error(string.Format($"申请巷道失败:{strMsg},读写plc错误")); |
| | | var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (res350.IsSucceed && palletVal350 != "350") |
| | | { |
| | | ledText += $"申请入库失败\n\n"; |
| | | ledText += $"托盘号:{palletVal}\n"; |
| | | ledText += $"{strMsg}\n"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | } |
| | | |
| | | // 写入输送线退回指令 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); |
| | | if (ret.IsSucceed) |
| | | { |
| | | plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); |
| | | } |
| | | } |
| | | } |
| | | break; |
| | |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | // led显示内容 |
| | | LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "入库中 " + $"目标巷道:{endLocatVlue}", "托盘号:" + palletVal); |
| | | } |
| | | } |
| | | |
| | |
| | | // 向WMS申请储位信息 |
| | | strMsg = http.RequestLocate(palletVal, modDevice.StationNum, taskModel, roadway, ref TaskNo); |
| | | |
| | | // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。 |
| | | var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == TaskNo); |
| | | modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First(); |
| | | |
| | | if (!strMsg.Contains("-1")) |
| | | { |
| | | // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。 |
| | | var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == TaskNo); |
| | | modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First(); |
| | | // 写入流程字 630 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "630"); |
| | | |
| | |
| | | |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | // led显示内容 |
| | | LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "入库中 " + $"申请储位地址:{strMsg}", "托盘号:" + palletVal); |
| | | |
| | | var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); |
| | | ledText += $"任务类型:{taskInfo.TaskType.GetDescription()}\n\n"; |
| | | ledText += $"任务号:{taskInfo.TaskNo}\n"; |
| | | ledText += $"托盘号:{taskInfo.PalletNo}\n\n"; |
| | | ledText += $"起始位:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n"; |
| | | ledText += $"目标位:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 申请储位失败!LED显示 |
| | | Log.Error(string.Format($"申请储位失败:{strMsg},读写plc错误")); |
| | | // led显示内容 |
| | | var ledDevice = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business); |
| | | ledText += $"申请入库失败\n\n"; |
| | | ledText += $"{strMsg}\n"; |
| | | LedDisplay(modDevice.LedIP, ledText); |
| | | } |
| | | |
| | | } |
| | |
| | | break; |
| | | } |
| | | |
| | | // 转换目标工位排列层 |
| | | // 转换目标工位排列层 03010301 |
| | | var paiVal = PLCCommon.GetDjAdress(modTask.EndRoadway.Substring(1, 2), endLocate.Substring(0, 2), endLocate.Substring(6, 2)); |
| | | string pai = paiVal.ToString(); |
| | | string lie = int.Parse(endLocate.Substring(2, 2)).ToString(); |
| | |
| | | var (res2, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | var modPosStarStationNum = modDevice.listStation.FirstOrDefault(m => m.Text == "起始工位"); |
| | | var (res3, starVal) = plcConn.GetPlcDBValue(modPosStarStationNum.PosType, modDevice.DbNumber, modPosStarStationNum.PlcPos); |
| | | string tasknoVal = taskVal.ToString(); |
| | | ////string b = taskVal.GetValue(); |
| | | //string a = palletVal.ToString(); |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | |
| | | InteractiveMsg = $"写入指令430:托盘到达{modDevice.StationNum}工位", |
| | | PalletNo = palletVal, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = starVal, |
| | | StartLocat = starVal.ToString(), |
| | | EndLocat = modDevice.StationNum, |
| | | }; |
| | | |
| | | |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | |
| | |
| | | modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.EndLocate).Select(s => s.LedIP).First(); |
| | | |
| | | // led显示内容 |
| | | LedDisplay(modDevice.LedIP, "到达工位:" + modDevice.StationNum, "出库完成 " + $"储位地址:{modInsertTaskMonitor.StartLocat}", "托盘号:" + palletVal); |
| | | // 根据目标工位号获取对应的LEDIP地址 |
| | | 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 += $"任务号:{taskInfo.TaskNo}\n"; |
| | | ledText += $"托盘号:{taskInfo.PalletNo}\n\n"; |
| | | ledText += $"起始位:{taskInfo.StartRoadway + " " + taskInfo.StartLocate}\n"; |
| | | ledText += $"目标位:{taskInfo.EndRoadway + " " + taskInfo.EndLocate}"; |
| | | LedDisplay(ledDevice.LedIP, ledText); |
| | | } |
| | | // 反馈WMS出库完成 |
| | | //TaskReques taskReques = new TaskReques(); |
| | |
| | | var (res2, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | var modPosStarStationNum = modDevice.listStation.FirstOrDefault(m => m.Text == "起始工位"); |
| | | var (res3, starVal) = plcConn.GetPlcDBValue(modPosStarStationNum.PosType, modDevice.DbNumber, modPosStarStationNum.PlcPos); |
| | | |
| | | |
| | | string tasknoVal = taskVal.ToString(); |
| | | var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false); |
| | | if (modTask == null) |
| | |
| | | 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(), |
| | |
| | | // 反馈WMS |
| | | var requestMode = new TaskRequestWMS() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | TaskNo = modTask.TaskNo + modTask.EndLocate , |
| | | PalletNo = modTask.PalletNo, |
| | | TaskType = ((int)TaskTypeEnum.Out).ToString(), |
| | | TaskStatus = ((int)TaskStatusEnum.Complete).ToString() |
| | |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | // led显示内容 |
| | | modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == modTask.EndLocate).Select(s => s.LedIP).First(); |
| | | LedDisplay(modDevice.LedIP, "工位:" + modTask.StartLocate, $"拣选完成,托盘离开工位", "托盘号:" + modTask.PalletNo); |
| | | 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 += $"任务号:{modTask.TaskNo}\n"; |
| | | ledText += $"托盘号:{modTask.PalletNo}\n\n"; |
| | | ledText += $"起始位:{modTask.StartRoadway + " " + modTask.StartLocate}\n"; |
| | | ledText += $"目标位:{modTask.EndRoadway + " " + modTask.EndLocate}"; |
| | | LedDisplay(ledDevice.LedIP, ledText); |
| | | } |
| | | #endregion |
| | | } |
| | |
| | | var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false); |
| | | if (modTask == null) |
| | | { |
| | | Log.Error(string.Format($"工位号:{modDevice.StationNum}空托盘到达,未找到对应的任务!任务号{tasknoVal};")); |
| | | //Log.Error(string.Format($"工位号:{modDevice.StationNum}空托盘到达,未找到对应的任务!任务号{tasknoVal};")); |
| | | break; |
| | | } |
| | | // 写入plc流程字90 |
| | |
| | | // 反馈WMS |
| | | var requestMode = new TaskRequestWMS() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | TaskNo = modTask.TaskNo + modTask.EndLocate , |
| | | PalletNo = modTask.PalletNo, |
| | | TaskType = ((int)TaskTypeEnum.Out).ToString(), |
| | | TaskStatus = ((int)TaskStatusEnum.Complete).ToString() |
| | |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | #endregion |
| | | case "10": |
| | | { |
| | | #region 缠膜完成 |
| | | // 获取工位托盘码信息 |
| | | var strMsg = ""; |
| | | var http = new HttpService(); |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码"); |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | |
| | | //向WMS反馈托盘缠膜完成 |
| | | strMsg = http.RequestPackedWcs(palletVal); |
| | | if (!strMsg.Contains("-1")) |
| | | { |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "11");//收到缠膜完成11 |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令11:{modDevice.StationNum}工位缠膜完成", |
| | | PalletNo = palletVal, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modDevice.StationNum |
| | | }; |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | |
| | | } |
| | | #endregion |
| | | } |
| | | break; |
| | | case "20": |
| | | { |
| | | #region 是否拆膜 21:否 22:是 |
| | | // 获取工位托盘码信息 |
| | | var strMsg = ""; |
| | | var http = new HttpService(); |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码"); |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | // 获取托盘任务号 |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号"); |
| | | var (res1, val) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); |
| | | // 根据任务号获取任务信息,目的工位是009的再向WMS发出拆膜申请 |
| | | if (res1.IsSucceed) |
| | | { |
| | | string tasknoVal = val.ToString(); |
| | | var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.EndLocate == "009" && m.IsDelete == false); |
| | | if (modTask == null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | strMsg = http.RequestUnPackWcs(palletVal); |
| | | if (!strMsg.Contains("-1")) |
| | | { |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "22"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令22:{modDevice.StationNum}工位需要拆膜", |
| | | PalletNo = palletVal, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modDevice.StationNum |
| | | }; |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "21"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令21:{modDevice.StationNum}工位不需要拆膜", |
| | | PalletNo = palletVal, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modDevice.StationNum |
| | | }; |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | } |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | |
| | | } |
| | | break; |
| | | #region 小车可放信号 |
| | | case "150": |
| | | { // 获取工位任务号信息 |
| | | var strMsg = ""; |
| | | var http = new HttpService(); |
| | | // 获取托盘任务号 |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号"); |
| | | var (res1, val) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); |
| | | if (res1.IsSucceed) |
| | | { |
| | | string tasknoVal = val.ToString(); |
| | | var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false); |
| | | if (modTask == null) |
| | | { |
| | | //读取成功后写入151 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "151");//收到可放信号后写入151 |
| | | if (ret.IsSucceed) |
| | | { |
| | | //回传WMS可放信号 |
| | | strMsg = http.RequesContinueAgv(val.ToString(), modDevice.StationNum); |
| | | if (!strMsg.Contains("-1")) |
| | | { |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = tasknoVal, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令151:{modDevice.StationNum}工位可接受AGV放货入库", |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modDevice.StationNum |
| | | }; |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | // |
| | | |
| | | } |
| | | break; |
| | | #endregion |
| | |
| | | private static async void BoxConveyorLine(WcsDeviceDto modDevice) |
| | | { |
| | | var plcConn = modDevice.PLCUtil; |
| | | |
| | | if (modDevice.DbNumber == "DB101") |
| | | //二楼主扫分道 |
| | | if (modDevice.DbNumber == "DB101")//&& modDevice.DbNumber == "DB102"&& (modDevice.DbNumber == "DB102"||modDevice.PlcIdIP == "10.18.51.110") |
| | | { |
| | | // 主扫交互流程 |
| | | switch (modDevice.Value.ToString()) |
| | |
| | | // 主扫申请分道 wcs写入2 |
| | | { |
| | | // 判断是否演示模式 true:演示模式 false:生产模式 |
| | | if (PLCTaskAction.boDemo) |
| | | if (PLCTaskAction.boDemo) |
| | | { |
| | | // 通道号 |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "通道号"); |
| | | |
| | | // 演示模式直接写入1分道 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "1"); |
| | | // 演示模式直接写入分道号 |
| | | //Random random = new Random(); |
| | | //int ranNumber = random.Next(2) == 0 ? 1 : 5; |
| | | if (fendao == 1) |
| | | { |
| | | fendao = 5; |
| | | } |
| | | else |
| | | { |
| | | fendao = 1; |
| | | } |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, fendao.ToString()); // |
| | | if (ret.IsSucceed) |
| | | { |
| | | Log.Information(string.Format("分道成功,道号是:" + fendao)); |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (!retVal.IsSucceed) |
| | |
| | | } |
| | | } |
| | | } |
| | | // 根据箱内品种号获取码躲绑定工位及对应的分道号 |
| | | var checkTaskInfo = _db.Queryable<WcsCheckTask>().First(w => w.SkuNo == boxInfo.SkuNo && w.SkuName == boxInfo.SkuName && w.LotNo == boxInfo.LotNo); |
| | | if (checkTaskInfo == null) |
| | | |
| | | |
| | | // 验证是否零箱 |
| | | if (boxInfo.BitBoxMark == "1") |
| | | { |
| | | // 绑定信息为null写入剔除通道号 |
| | | // 是零箱直接剔除,进行人工组托 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("箱码未绑定分拣任务,进行剔除。"); |
| | | Log.Error("零箱,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | |
| | | |
| | | // 根据箱内品种号获取码躲绑定工位及对应的分道号 |
| | | var checkTaskInfo = _db.Queryable<WcsCheckTask>().First(w => w.SkuNo == boxInfo.SkuNo && w.SkuName == boxInfo.SkuName && w.LotNo == boxInfo.LotNo && w.Status == "1"); |
| | | if (checkTaskInfo == null) |
| | | { |
| | | // 判断是否关联单据 wcsordertask |
| | | var orderModel = _db.Queryable<WcsOderTask>() |
| | | .First(m => m.SkuNo == boxInfo.SkuNo && m.Status == TaskStatusEnum.Wait && m.LotNo == boxInfo.LotNo && m.IsDelete == false); |
| | | if (orderModel != null) |
| | | { |
| | | // 根据boxinfo表产线字段自动绑定分道(1线产品只能绑定到8道) |
| | | if (boxInfo.LineNo != "一线") |
| | | {// 绑定到除8道外其他道 |
| | | |
| | | // 获取未绑定道 |
| | | var lineNoModels = _db.Queryable<WcsCheckTask>() |
| | | .Where(m => m.Status == "0" && m.LineNo != "8" && m.RoboatType == PLCTypeEnum.RobotPalletizer).ToList(); |
| | | if (lineNoModels.Count > 0) |
| | | { |
| | | // 获取当前物料品种号 |
| | | var skuInfo = await _db.Queryable<WcsMateialPzInfo>().Where(w => w.SkuNo == boxInfo.SkuNo).FirstAsync(); |
| | | if (skuInfo == null) |
| | | { |
| | | // 此产品若没设定品规,进行剔除处理。防止堵塞件箱线 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("没有空闲分道,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | |
| | | foreach (var lineNoModel in lineNoModels) |
| | | { |
| | | // 读取设备验证是否绑定分道 |
| | | var (respg, pzNo) = plcConn.GetPlcDBValue(lineNoModel.PosType, lineNoModel.DbNumber, lineNoModel.PlcPos); |
| | | if (respg.IsSucceed) |
| | | { |
| | | if (pzNo != 0) |
| | | { |
| | | // plc此分道未解绑 |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | // 自动绑定分道 |
| | | lineNoModel.OrderNo = orderModel.OrderNo; |
| | | lineNoModel.LotNo = boxInfo.LotNo; |
| | | lineNoModel.SkuNo = boxInfo.SkuNo; |
| | | lineNoModel.SkuName = boxInfo.SkuName; |
| | | lineNoModel.Qty = 0; |
| | | lineNoModel.Status = "1";//已绑定 |
| | | lineNoModel.PZNo = skuInfo.PZNo; |
| | | lineNoModel.FinishQty = 0; |
| | | |
| | | // 给PLC写入品规 |
| | | var ret = plcConn.SetPlcDBValue(lineNoModel.PosType, lineNoModel.DbNumber, lineNoModel.PlcPos, skuInfo.PZNo); |
| | | if (ret.IsSucceed) |
| | | { |
| | | //写入流程字成功后更新分拣任务 |
| | | _db.Updateable(lineNoModel).ExecuteCommand(); |
| | | //更新WcsOderTask表 |
| | | orderModel.Status = TaskStatusEnum.Doing; |
| | | _db.Updateable(orderModel).ExecuteCommand(); |
| | | // Liudl 通知前端更新分拣任务 |
| | | //下发分拣任务 |
| | | HubUtil.PublicCheckTask(lineNoModel.Adapt<WcsDeviceTaskOrderDto>()); |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | throw Oops.Bah("与PCL交互失败,绑定失败!"); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 读取plc失败 |
| | | break; |
| | | } |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | // 若没有空闲道,进行剔除处理。防止堵塞件箱线 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("没有空闲分道,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | else |
| | | {// 绑定到8道 |
| | | // 获取未绑定道 |
| | | var lineNo8Model = _db.Queryable<WcsCheckTask>() |
| | | .First(m => m.Status == "0" && m.LineNo == "8" && m.RoboatType == PLCTypeEnum.RobotPalletizer); |
| | | if (lineNo8Model != null) |
| | | { |
| | | // 获取当前物料品种号 |
| | | var skuInfo = await _db.Queryable<WcsMateialPzInfo>().Where(w => w.SkuNo == boxInfo.SkuNo).FirstAsync(); |
| | | if (skuInfo == null) |
| | | { |
| | | // 此产品若没设定品规,进行剔除处理。防止堵塞件箱线 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("没有空闲分道,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | |
| | | |
| | | // 读取设备验证是否绑定分道 |
| | | var (respg, pzNo) = plcConn.GetPlcDBValue(lineNo8Model.PosType, lineNo8Model.DbNumber, lineNo8Model.PlcPos); |
| | | if (respg.IsSucceed) |
| | | { |
| | | if (pzNo != 0) |
| | | { |
| | | // plc此分道未解绑 |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | // 自动绑定分道 |
| | | lineNo8Model.OrderNo = orderModel.OrderNo; |
| | | lineNo8Model.LotNo = boxInfo.LotNo; |
| | | lineNo8Model.SkuNo = boxInfo.SkuNo; |
| | | lineNo8Model.SkuName = boxInfo.SkuName; |
| | | lineNo8Model.Qty = 0; |
| | | lineNo8Model.Status = "1";//已绑定 |
| | | lineNo8Model.PZNo = skuInfo.PZNo; |
| | | lineNo8Model.FinishQty = 0; |
| | | |
| | | // 给PLC写入品规 |
| | | var ret = plcConn.SetPlcDBValue(lineNo8Model.PosType, lineNo8Model.DbNumber, lineNo8Model.PlcPos, skuInfo.PZNo); |
| | | if (ret.IsSucceed) |
| | | { |
| | | //写入流程字成功后更新分拣任务 |
| | | _db.Updateable(lineNo8Model).ExecuteCommand(); |
| | | //更新WcsOderTask表 |
| | | orderModel.Status = TaskStatusEnum.Doing; |
| | | _db.Updateable(orderModel).ExecuteCommand(); |
| | | |
| | | // Liudl 通知前端更新分拣任务 |
| | | //下发分拣任务 |
| | | HubUtil.PublicCheckTask(lineNo8Model.Adapt<WcsDeviceTaskOrderDto>()); |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | throw Oops.Bah("与PCL交互失败,绑定失败!"); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 读取plc失败 |
| | | break; |
| | | } |
| | | |
| | | |
| | | } |
| | | else |
| | | { |
| | | // 没有空闲道,进行剔除处理。防止堵塞件箱线 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("没有空闲分道,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 不关联单据直接进行剔除处理 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("箱码未绑定分拣任务,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | 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 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | { // liudl 此段程序不会执行 确认后直接删除 |
| | | if (modDevice.DbNumber == "DB102")//1L拆跺分拣后需要回传箱码 |
| | | { |
| | | var http = new HttpService(); |
| | | IsBaleModel2 ret1 = http.RequestBoxno(boxNoVal); |
| | | if (ret1.Success == -1) |
| | | { |
| | | Log.Error("箱码分拣回传失败,需要手动拣货。失败箱码:" + boxNoVal); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | } |
| | |
| | | break; |
| | | default: break; |
| | | } |
| | | } |
| | | else |
| | | } |
| | | //一楼主扫分道 |
| | | else if (modDevice.DbNumber == "DB102") |
| | | { |
| | | switch (modDevice.Value.ToString()) |
| | | { |
| | | case "1": |
| | | // 1楼件箱PLC请求WCS读码 |
| | | { |
| | | // 读取plc箱码 |
| | | var modBoxNo = modDevice.listStation.FirstOrDefault(m => m.Text == "主扫条码"); |
| | | var (res, boxNo) = plcConn.GetPlcDBValue(modBoxNo.PosType, modDevice.DbNumber, modBoxNo.PlcPos); |
| | | if (string.IsNullOrWhiteSpace(boxNo.ToString())) |
| | | { |
| | | |
| | | // 箱信息为null写入剔除通道号:0 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("箱码为null或已绑定托盘,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 箱码 |
| | | string boxNoVal = boxNo.ToString(); |
| | | // 通道号 |
| | | var modLineNo = modDevice.listStation.FirstOrDefault(m => m.Text == "通道号"); |
| | | |
| | | // 调用wms接口验证箱码是否可拣货并返回装车口 |
| | | var http = new HttpService(); |
| | | RequestloadingAddre requesModel = http.ResultBoxInfoExportWcs(boxNoVal); |
| | | if (requesModel.Success != "1") |
| | | { |
| | | // 箱信息为null写入剔除通道号:0 |
| | | var ret = plcConn.SetPlcDBValue(modLineNo.PosType, modDevice.DbNumber, modLineNo.PlcPos, "0"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | Log.Error("出库分拣根据箱码获取装车口失败,进行剔除。" + requesModel.Message); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 写入出库分道号 |
| | | // var ret = plcConn.SetPlcDBValue(modLineNo.PosType, modDevice.DbNumber, modLineNo.PlcPos, requesModel.loadingAddre); |
| | | var ret = plcConn.SetPlcDBValue(modLineNo.PosType, modDevice.DbNumber, modLineNo.PlcPos, requesModel.loadingAddre); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }; break; |
| | | case "10": |
| | | // 1楼件箱PLC读码失败,WCS不做处理直接剔除手持拣货。 |
| | | { |
| | | |
| | | }; break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 插码交互 |
| | | switch (modDevice.Value.ToString()) |
| | | switch (modDevice.Value.ToString()) |
| | | { |
| | | case "1": |
| | | // 托盘条码可读 |
| | |
| | | // 读取PLC托盘条码号 |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(modPalletNo.PosType, modDevice.DbNumber, modPalletNo.PlcPos); |
| | | string palletNo = palletVal.ToString(); |
| | | if (string.IsNullOrEmpty(palletNo)) |
| | | if (string.IsNullOrEmpty(palletNo)) |
| | | { |
| | | Log.Error(string.Format("{0},读取的托盘号为null", modDevice.Text)); |
| | | break; |
| | |
| | | |
| | | // 根据工位号将托盘号保存在分道表 |
| | | var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false); |
| | | if (checkTaskMedel == null) |
| | | if (checkTaskMedel == null) |
| | | { |
| | | Log.Error(string.Format("根据码垛工位{0},获取分道失败!", modDevice.StationNum)); |
| | | break; |
| | | } |
| | | checkTaskMedel.PalletNo = palletNo; |
| | | var rowCount = _db.Updateable(checkTaskMedel).ExecuteCommand(); |
| | | if (rowCount > 0 ) |
| | | if (rowCount > 0) |
| | | { |
| | | // plc写入读取成功表示 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | if (retVal.IsSucceed) |
| | | { |
| | | // liudl 此处需添加 |
| | | // 通知分拣码垛页更新 |
| | |
| | | var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "1"); |
| | | break; |
| | | } |
| | | else |
| | | else |
| | | { |
| | | // 获取箱条码 |
| | | // 获取箱条码配置 |
| | | var modBoxNo = modDevice.listStation.FirstOrDefault(m => m.Text == "箱条码"); |
| | | var (res, boxVal) = plcConn.GetPlcDBValue(modBoxNo.PosType, modDevice.DbNumber, modBoxNo.PlcPos); |
| | | string boxNo = boxVal.ToString(); |
| | | if (string.IsNullOrEmpty(boxNo)) |
| | | 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; |
| | | } |
| | | // 获取当前分道托盘号 |
| | | var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false); |
| | | string port = modDevice.StationNum.ToString(); |
| | | var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == port && m.Status == "1"); |
| | | if (checkTaskMedel == null) |
| | | { |
| | | Log.Error(string.Format("根据码垛工位{0},获取分道失败!", modDevice.StationNum)); |
| | | break; |
| | | } |
| | | string palletNo = checkTaskMedel.PalletNo; |
| | | if (string.IsNullOrEmpty(palletNo)) |
| | | if (string.IsNullOrEmpty(palletNo)) |
| | | { |
| | | Log.Error(string.Format("获取码垛工位{0}上的托盘号失败!",modDevice.StationNum)); |
| | | Log.Error(string.Format("获取码垛工位{0}上的托盘号失败!", modDevice.StationNum)); |
| | | break; |
| | | } |
| | | // 修改插码表 |
| | | boxInfo.PalletNo = palletNo; |
| | | boxInfo.UpdateTime = DateTime.Now; |
| | | foreach (WcsBoxInfo item in boxInfo) |
| | | { |
| | | item.PalletNo = palletNo; |
| | | item.UpdateTime = DateTime.Now; |
| | | item.OrderCode = checkTaskMedel.OrderNo; |
| | | } |
| | | |
| | | checkTaskMedel.Qty += boxInfo.First().QtyCount;//记录当前托盘上物料数量 |
| | | _db.Updateable(checkTaskMedel).ExecuteCommand(); |
| | | var rowCount = _db.Updateable(boxInfo).ExecuteCommand(); |
| | | Log.Information(string.Format("插码成功,箱码是:" + boxNo, modDevice.StationNum)); |
| | | 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, "2"); |
| | | //} |
| | | if (retVal.IsSucceed) |
| | | { |
| | | //判读是否接收完工数量 |
| | | var models = _db.Queryable<WcsCheckTask>().First(w => w.SkuNo == boxInfo.First().SkuNo && w.LotNo == boxInfo.First().LotNo); |
| | | if (models.FinishQty>0) |
| | | { |
| | | //检查已码垛箱数(不含零箱),码垛数量与完工数量相等后自动结批:写入PLC信号——结批中 |
| | | int Fqty = (int)models.FinishQty;//完工数量 |
| | | int Jpqty = 0;//已码垛数量 |
| | | |
| | | //获取已组盘数量 |
| | | var checkNum = _db.Queryable<WcsBoxInfoLog>().Where(m => m.SkuNo == models.SkuNo && m.LotNo == models.LotNo && m.OrderCode == checkTaskMedel.OrderNo).ToList();//组盘表箱码信息 |
| | | if (checkNum.Count > 0) |
| | | { |
| | | if (!string.IsNullOrEmpty(checkNum.First().BoxNo2) || !string.IsNullOrEmpty(checkNum.First().BoxNo3))//有支码 |
| | | { |
| | | foreach (var item in checkNum) |
| | | { |
| | | Jpqty = (int)(Jpqty + item.Qty); |
| | | } |
| | | } |
| | | else//无支码 |
| | | { |
| | | foreach (var item in checkNum) |
| | | { |
| | | Jpqty = (int)(Jpqty + item.QtyCount); |
| | | } |
| | | } |
| | | } |
| | | //获取已插码数量 |
| | | var checkNum2 = _db.Queryable<WcsBoxInfo>().Where(m => m.SkuNo == models.SkuNo && m.LotNo == models.LotNo &&(m.PalletNo != null || m.PalletNo != "") && m.OrderCode == checkTaskMedel.OrderNo).ToList();//箱码表已码垛箱码信息 |
| | | if (checkNum2.Count > 0) |
| | | { |
| | | if (!string.IsNullOrEmpty(checkNum2.First().BoxNo2) || !string.IsNullOrEmpty(checkNum2.First().BoxNo3))//有支码 |
| | | { |
| | | foreach (var item2 in checkNum2) |
| | | { |
| | | Jpqty = (int)(Jpqty + item2.Qty); |
| | | } |
| | | } |
| | | else//无支码 |
| | | { |
| | | foreach (var item2 in checkNum2) |
| | | { |
| | | Jpqty = (int)(Jpqty + item2.QtyCount); |
| | | } |
| | | } |
| | | } |
| | | //获取零箱数量 |
| | | var checkNum3 = _db.Queryable<WcsBoxInfo>().Where(m => m.BitBoxMark == "1" && m.SkuNo == models.SkuNo && m.LotNo == models.LotNo).ToList(); |
| | | if (checkNum3.Count > 0) |
| | | { |
| | | if (!string.IsNullOrEmpty(checkNum3.First().BoxNo2) || !string.IsNullOrEmpty(checkNum3.First().BoxNo3))//有支码 |
| | | { |
| | | foreach (var item3 in checkNum3) |
| | | { |
| | | Jpqty = (int)(Jpqty + item3.Qty); |
| | | } |
| | | } |
| | | else//无支码 |
| | | { |
| | | foreach (var item3 in checkNum3) |
| | | { |
| | | Jpqty = (int)(Jpqty + item3.QtyCount); |
| | | } |
| | | } |
| | | } |
| | | if (Jpqty == Fqty) |
| | | { |
| | | // 触发结批 分道变为结批中 |
| | | AutoEndLot(boxInfo[0].LotNo, plcConn, "2"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else |
| | | 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"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | case "40": |
| | | // 请求组托,申请入库 |
| | | { |
| | | // 根据工位号,获取托盘号 |
| | | var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false); |
| | | // 根据工位号获取 托盘线该工位号的配置信息 |
| | | var numModel = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId != modDevice.PlcId); |
| | | var posModel = PLCTaskAction.plcPositions.First(m => m.DeviceId == numModel.Id && m.Text == "目的工位" && m.IsDelete == false); |
| | | if (checkTaskMedel == null) |
| | | lock (OLock) |
| | | { |
| | | Log.Error(string.Format("组托失败根据码垛工位{0},获取托盘号失败!", modDevice.StationNum)); |
| | | |
| | | // 写入交互工位目标地址 |
| | | var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, "234"); |
| | | if (retVal.IsSucceed) |
| | | // 根据工位号,获取托盘号 |
| | | var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false); |
| | | // 根据工位号获取 托盘线该工位号的配置信息 |
| | | var numModel = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId != modDevice.PlcId); |
| | | var posModel = PLCTaskAction.plcPositions.First(m => m.DeviceId == numModel.Id && m.Text == "目的工位" && m.IsDelete == false); |
| | | if (checkTaskMedel == null) |
| | | { |
| | | // 写入组托回复流程字 |
| | | retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50"); |
| | | } |
| | | break; |
| | | } |
| | | |
| | | // 码垛工位托盘号 |
| | | string palletNo = checkTaskMedel.PalletNo; |
| | | |
| | | // 是否演示模式 |
| | | if (PLCTaskAction.boDemo) |
| | | { |
| | | // 直接箱wms申请巷道 |
| | | var http = new HttpService(); |
| | | string TaskNo = "", EndLocate = ""; |
| | | string strMsg = http.RequestRoadWay(palletNo, modDevice.StationNum, "1", "2", ref EndLocate, ref TaskNo); |
| | | if (strMsg.Contains("-1")) |
| | | { |
| | | Log.Error(string.Format("申请巷道失败,码垛工位{0};原因{1}", modDevice.StationNum, strMsg)); |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | // 获取入库任务信息 |
| | | var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)); |
| | | if (taskModel != null) |
| | | { |
| | | // 获取入库取货工位 |
| | | string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2"); |
| | | |
| | | var listResult = new List<Result>(); |
| | | |
| | | // 写入托盘输送线码垛工位 目的工位、任务号,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息} |
| | | listResult.Add(plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue)); // 目标工位 |
| | | var modPosTask = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务号" && s.IsDelete == false); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, numModel.DbNumber, modPosTask.PlcPos, TaskNo)); |
| | | var modPosTaskType = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务类型" && s.IsDelete == false); |
| | | var taskTypeStr = (int)taskModel.TaskType; |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, numModel.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); |
| | | |
| | | if (listResult.All(s => s.IsSucceed)) |
| | | { |
| | | // 写入组托回复流程字 |
| | | var retVal1 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50"); |
| | | if (retVal1.IsSucceed) |
| | | { |
| | | // 将入库任务由正在执行改为正在执行 |
| | | taskModel.Status = TaskStatusEnum.Doing; |
| | | _db.Updateable(taskModel).ExecuteCommand(); |
| | | |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令50:申请巷道成功", |
| | | PalletNo = palletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modDevice.StationNum, |
| | | EndLocat = strMsg, |
| | | }; |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | } |
| | | |
| | | //// 写入托盘输送线码垛工位 目的工位,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息} |
| | | //var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue); |
| | | //if (retVal.IsSucceed) |
| | | //{ |
| | | // // 写入码垛交互-组托回复流程字 |
| | | // retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50"); |
| | | |
| | | // // 将入库任务由正在执行改为正在执行 |
| | | // taskModel.Status = TaskStatusEnum.Doing; |
| | | // _db.Updateable(taskModel).ExecuteCommand(); |
| | | //} |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 根据托盘号,将组托信息插入boxinfolog表 并删除boxinfo表数据 |
| | | var boxInfoList = await _db.Queryable<WcsBoxInfo>().Where(w => w.IsDelete == false && w.PalletNo == palletNo).ToListAsync(); |
| | | if (boxInfoList.Count <= 0) |
| | | { |
| | | Log.Error(string.Format("申请巷道失败,码垛工位{0},箱码信息不存在", modDevice.StationNum)); |
| | | Log.Error(string.Format("组托失败根据码垛工位{0},获取托盘号失败!", modDevice.StationNum)); |
| | | |
| | | // 写入交互工位目标地址 |
| | | var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, "234"); |
| | |
| | | } |
| | | break; |
| | | } |
| | | string sqlStr = $"insert into WCSBoxInfoLog select * from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'"; |
| | | int insertCount = _db.Ado.ExecuteCommand(sqlStr); |
| | | if (insertCount > 0) |
| | | |
| | | // 码垛工位托盘号 |
| | | string palletNo = checkTaskMedel.PalletNo; |
| | | |
| | | // 是否演示模式 |
| | | if (PLCTaskAction.boDemo) |
| | | { |
| | | string sqlStr2 = $"delete from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'"; |
| | | _db.Ado.ExecuteCommand(sqlStr2); |
| | | } |
| | | // 向WMS申请巷道 |
| | | var http = new HttpService(); |
| | | 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")) |
| | | { |
| | | Log.Error(string.Format("申请巷道失败,码垛工位{0};原因{1}", modDevice.StationNum, strMsg)); |
| | | break; |
| | | // 直接箱wms申请巷道 |
| | | var http = new HttpService(); |
| | | string TaskNo = "", EndLocate = ""; |
| | | string strMsg = http.RequestRoadWay(palletNo, modDevice.StationNum, "1", "2", ref EndLocate, ref TaskNo); |
| | | if (strMsg.Contains("-1")) |
| | | { |
| | | Log.Error(string.Format("申请巷道失败,码垛工位{0};原因{1}", modDevice.StationNum, strMsg)); |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | // 获取入库任务信息 |
| | | var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)); |
| | | if (taskModel != null) |
| | | { |
| | | // 获取入库取货工位 |
| | | string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2"); |
| | | |
| | | var listResult = new List<Result>(); |
| | | |
| | | // 写入托盘输送线码垛工位 目的工位、任务号,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息} |
| | | listResult.Add(plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue)); // 目标工位 |
| | | var modPosTask = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务号" && s.IsDelete == false); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, numModel.DbNumber, modPosTask.PlcPos, TaskNo)); |
| | | var modPosTaskType = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务类型" && s.IsDelete == false); |
| | | var taskTypeStr = (int)taskModel.TaskType; |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, numModel.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); |
| | | |
| | | if (listResult.All(s => s.IsSucceed)) |
| | | { |
| | | // 写入组托回复流程字 |
| | | var retVal1 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50"); |
| | | if (retVal1.IsSucceed) |
| | | { |
| | | // 将入库任务由正在执行改为正在执行 |
| | | taskModel.Status = TaskStatusEnum.Doing; |
| | | _db.Updateable(taskModel).ExecuteCommand(); |
| | | |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令50:申请巷道成功", |
| | | PalletNo = palletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modDevice.StationNum, |
| | | EndLocat = strMsg, |
| | | }; |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | } |
| | | |
| | | //// 写入托盘输送线码垛工位 目的工位,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息} |
| | | //var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue); |
| | | //if (retVal.IsSucceed) |
| | | //{ |
| | | // // 写入码垛交互-组托回复流程字 |
| | | // retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50"); |
| | | |
| | | // // 将入库任务由正在执行改为正在执行 |
| | | // taskModel.Status = TaskStatusEnum.Doing; |
| | | // _db.Updateable(taskModel).ExecuteCommand(); |
| | | //} |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 获取入库任务信息 |
| | | var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && m.Status == TaskStatusEnum.Wait); |
| | | if (taskModel != null) |
| | | // 根据托盘号,将组托信息插入boxinfolog表 并删除boxinfo表数据 |
| | | var boxInfoList = _db.Queryable<WcsBoxInfo>().Where(w => w.IsDelete == false && w.PalletNo == palletNo).ToList(); |
| | | if (boxInfoList.Count <= 0) |
| | | { |
| | | // 获取入库取货工位 |
| | | string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2"); |
| | | Log.Error(string.Format("申请巷道失败,码垛工位{0},箱码信息不存在", modDevice.StationNum)); |
| | | |
| | | var listResult = new List<Result>(); |
| | | // 写入托盘输送线码垛工位 目的工位、任务号,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息} |
| | | listResult.Add(plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue)); // 目标工位 |
| | | var modPosTask = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务号" && s.IsDelete == false); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, numModel.DbNumber, modPosTask.PlcPos, TaskNo)); |
| | | var modPosTaskType = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务类型" && s.IsDelete == false); |
| | | var taskTypeStr = (int)taskModel.TaskType; |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, numModel.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); |
| | | |
| | | if (listResult.All(s => s.IsSucceed)) |
| | | // 写入交互工位目标地址 |
| | | var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, "234"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | // 写入组托回复流程字 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50"); |
| | | if (retVal.IsSucceed) |
| | | retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50"); |
| | | } |
| | | break; |
| | | } |
| | | //判断托盘上的箱码是否已组盘 |
| | | foreach (var item in boxInfoList) |
| | | { |
| | | var groupBoxno = _db.Queryable<WcsBoxInfoLog>().Where(w => w.BoxNo == item.BoxNo).ToList(); |
| | | if (groupBoxno.Count>0) |
| | | { |
| | | Log.Error(string.Format("申请巷道失败,码垛工位{0},箱码信息不存在", modDevice.StationNum)); |
| | | // 写入交互工位目标地址 |
| | | var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, "234"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | // 将入库任务由正在执行改为正在执行 |
| | | taskModel.Status = TaskStatusEnum.Doing; |
| | | _db.Updateable(taskModel).ExecuteCommand(); |
| | | // 写入组托回复流程字 |
| | | retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50"); |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // 组托成功后将信息存到log表 |
| | | string sqlStr = $"insert into WCSBoxInfoLog select * from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'"; |
| | | int insertCount = _db.Ado.ExecuteCommand(sqlStr); |
| | | if (insertCount > 0) |
| | | { |
| | | string sqlStr2 = $"delete from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'"; |
| | | _db.Ado.ExecuteCommand(sqlStr2); |
| | | } |
| | | //组盘成功后清空分拣表当前托盘上物料数量 |
| | | checkTaskMedel.Qty = 0; |
| | | _db.Updateable(checkTaskMedel).ExecuteCommand(); |
| | | |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | // 向WMS申请巷道 |
| | | var http = new HttpService(); |
| | | string TaskNo = "", EndLocate = ""; |
| | | string strMsg = http.BindRequestRoadWay(checkTaskMedel.OrderNo, palletNo, checkTaskMedel.Qty.ToDecimal(), "0", checkTaskMedel.SkuNo, checkTaskMedel.LotNo, "", "", boxInfoList, |
| | | modDevice.StationNum, "1", "2", ref EndLocate, ref TaskNo); |
| | | if (strMsg.Contains("-1")) |
| | | { |
| | | Log.Error(string.Format("申请巷道失败,码垛工位{0};原因{1}", modDevice.StationNum, strMsg)); |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | //判断是否结批中 |
| | | var (res, jiepi) = plcConn.GetPlcDBValue(checkTaskMedel.PosType, modDevice.DbNumber, checkTaskMedel.PosLot); |
| | | if (jiepi == 2)//结批中 |
| | | { |
| | | // 分道解绑,抓箱品种写入0 |
| | | var ret1 = plcConn.SetPlcDBValue(checkTaskMedel.PosTypeLot, modDevice.DbNumber, checkTaskMedel.PlcPos, "0"); |
| | | if (ret1.IsSucceed) |
| | | { |
| | | //更新入库订单 |
| | | var orderTask = _db.Queryable<WcsOderTask>().Where(w => w.SkuNo == checkTaskMedel.SkuNo && w.LotNo == checkTaskMedel.LotNo && w.IsDelete == false).ToList(); |
| | | if (orderTask.Count >0) |
| | | { |
| | | TaskNo = TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令50:申请巷道成功", |
| | | PalletNo = palletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modDevice.StationNum, |
| | | EndLocat = strMsg, |
| | | }; |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | foreach (var item in orderTask) |
| | | { |
| | | item.Status = TaskStatusEnum.Complete; |
| | | _db.Updateable(item).ExecuteCommand(); |
| | | } |
| | | } |
| | | |
| | | //写入流程字成功后更新分拣任务 liudl 最后一托盘申请完入库才可清空 |
| | | checkTaskMedel.OrderNo = ""; |
| | | checkTaskMedel.TaskNo = ""; |
| | | checkTaskMedel.LotNo = ""; |
| | | checkTaskMedel.SkuNo = ""; |
| | | checkTaskMedel.SkuName = ""; |
| | | checkTaskMedel.BoxType = ""; |
| | | checkTaskMedel.Qty = 0; |
| | | checkTaskMedel.PZNo = ""; |
| | | checkTaskMedel.Status = "0"; // 绑定分道 0:解绑 1:绑定 |
| | | checkTaskMedel.FinishQty = 0; |
| | | |
| | | //更新分拣任务 |
| | | _db.Updateable(checkTaskMedel).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); |
| | | |
| | | |
| | | } |
| | | } |
| | | // 获取入库任务信息 |
| | | var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && m.Status == TaskStatusEnum.Wait); |
| | | if (taskModel != null) |
| | | { |
| | | // 获取入库取货工位 |
| | | string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2"); |
| | | |
| | | var listResult = new List<Result>(); |
| | | // 写入托盘输送线码垛工位 目的工位、任务号,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息} |
| | | listResult.Add(plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue)); // 目标工位 |
| | | var modPosTask = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务号" && s.IsDelete == false); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, numModel.DbNumber, modPosTask.PlcPos, TaskNo)); |
| | | var modPosTaskType = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务类型" && s.IsDelete == false); |
| | | var taskTypeStr = (int)taskModel.TaskType; |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, numModel.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); |
| | | |
| | | if (listResult.All(s => s.IsSucceed)) |
| | | { |
| | | // 写入组托回复流程字 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | // 将入库任务由正在执行改为正在执行 |
| | | taskModel.Status = TaskStatusEnum.Doing; |
| | | _db.Updateable(taskModel).ExecuteCommand(); |
| | | |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令50:申请巷道成功", |
| | | PalletNo = palletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modDevice.StationNum, |
| | | EndLocat = strMsg, |
| | | }; |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | break; |
| | | default:break; |
| | | } |
| | | default: break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 拆垛机器人业务处理 |
| | | /// 出库件箱输送和拆垛机器人业务处理 |
| | | /// </summary> |
| | | /// <param name="modDevice"></param> |
| | | private static void StackingRobot(WcsDeviceDto modDevice) |
| | | { |
| | | var plcConn = modDevice.PLCUtil; |
| | | switch (modDevice.Value.ToString()) |
| | | if (modDevice.DbNumber == "DB131" || modDevice.DbNumber == "DB132" || modDevice.DbNumber == "DB133" || modDevice.DbNumber == "DB134") |
| | | { |
| | | case "0": |
| | | { |
| | | // 若拆垛工位为空闲,查询任务表是否有未绑定的出库任务,做绑定操作 |
| | | } |
| | | switch (modDevice.Value.ToString()) |
| | | { |
| | | case "10"://10 plc请求wcs读托盘码 20 wcs读取ok wcs 写入数量及规格 30 |
| | | |
| | | //wcs读取ok20 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "20"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | //获取托盘码 |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码"); |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | // 获取托盘任务号 |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号"); |
| | | var (res1, val) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); |
| | | string tasknoVal = val.ToString(); |
| | | |
| | | // 根据任务号获取任务信息 |
| | | if (res1.IsSucceed) |
| | | { |
| | | var modTask = _db.Queryable<WcsTask>().First(m => m.TaskNo == tasknoVal && m.EndLocate == "009" && m.IsDelete == false); |
| | | if (modTask == null) |
| | | { |
| | | Log.Error(string.Format($"出库任务未下发,请人工处理,无法拆垛!")); |
| | | break; |
| | | } |
| | | |
| | | //通过任务号和托盘号向WMS申请此托盘的拆垛信息 |
| | | var http = new HttpService(); |
| | | RequestBoxInfoCheckAll tasklist = http.RequestBoxCheckinfo(palletVal, tasknoVal); |
| | | if (tasklist.Success != -1) |
| | | { |
| | | //获取拆垛物料品种(需要增加物料判断,同一个物料号可能会出现不同的码垛规则) |
| | | var pz = _db.Queryable<WcsMateialPzInfo>().First(m => m.SkuNo == tasklist.data.SkuNo); |
| | | //下发拆托规格,拆箱数和托盘上总箱数(不绑定机器人,拆垛任务信息只下发一次) |
| | | // 给PLC写入任务数据 |
| | | var listResult = new List<Result>(); |
| | | // 获取托盘规则 |
| | | var Standard = modDevice.listStation.FirstOrDefault(m => m.Text == "规格"); |
| | | listResult.Add(plcConn.SetPlcDBValue(Standard.PosType, modDevice.DbNumber, Standard.PlcPos, pz.PZNo)); |
| | | //抓箱数 |
| | | var qty = modDevice.listStation.FirstOrDefault(m => m.Text == "拆箱数量"); |
| | | listResult.Add(plcConn.SetPlcDBValue(qty.PosType, modDevice.DbNumber, qty.PlcPos, tasklist.data.Qty.ToString())); |
| | | //总箱数 |
| | | var qtycount = modDevice.listStation.FirstOrDefault(m => m.Text == "总箱数"); |
| | | listResult.Add(plcConn.SetPlcDBValue(qtycount.PosType, modDevice.DbNumber, qtycount.PlcPos, tasklist.data.QtyCount.ToString())); |
| | | |
| | | |
| | | // 是否写入成功 |
| | | if (listResult.All(s => s.IsSucceed)) |
| | | { |
| | | //wcs 写入数量及规格 30 |
| | | var ret1 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "30"); |
| | | |
| | | } |
| | | else |
| | | { |
| | | Log.Error(string.Format($"码垛信息未写入!托盘号:" + palletVal + ",码垛位:" + modDevice.StationNum)); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | LedDll Led = new LedDll(); |
| | | Led.LEDstr(ip, top, content, foot); |
| | | } |
| | | catch { } |
| | | catch (Exception ex) |
| | | { |
| | | Log.Error(ex.Message); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// LED信息展示 |
| | | /// </summary> |
| | | /// <param name="ip"></param> |
| | | /// <param name="text"></param> |
| | | private static void LedDisplay(string ip,string text) |
| | | { |
| | | try |
| | | { |
| | | LedDll Led = new LedDll(); |
| | | Led.ConsoleLeds(ip, text); |
| | | // 设置实例 |
| | | //Led.ConsoleLeds("10.18.51.238", $"任务类型:{TaskTypeEnum.Move.GetDescription()}\n\n任务号:TK2024102100001\n托盘号:LN000145\n\n起始位:033\n目标位:R01-02010102"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Log.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | /// <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"); |
| | | // 分道解绑,抓箱品种写入0 |
| | | //var ret1 = plcConn.SetPlcDBValue(item.PosTypeLot, item.DbNumber, item.PlcPos, "0"); |
| | | 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:绑定 2:结批中 |
| | | |
| | | //更新分拣任务 |
| | | _db.Updateable(item).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); |
| | | } |
| | | #endregion |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Log.Error(ex.Message); |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | private static void Test(WcsDeviceDto modDevice) |
| | | { |
| | | //写死测试读string |
| | | var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64"); |
| | | Console.WriteLine("DB100.64----" + val); |
| | | //测试批量读取 |
| | | Dictionary<string, PLCDataTypeEnum> listaddress = new Dictionary<string, PLCDataTypeEnum>(); |
| | | foreach (var modStation in modDevice.listStation) |
| | | { |
| | | listaddress.Add(modStation.PlcPos, modStation.PosType); |
| | | } |
| | | var result = modDevice.PLCUtil.GetPlcBatchDBValue(listaddress); |
| | | if (result.Value.Count > 0) |
| | | { |
| | | foreach (var value in result.Value) |
| | | { |
| | | Console.WriteLine("地址" + value.Key + "----值" + value, value); |
| | | } |
| | | } |
| | | if (!result.IsSucceed) |
| | | { |
| | | foreach (var err in result.ErrList) |
| | | { |
| | | Console.WriteLine(err); |
| | | } |
| | | if (result.Value.Count > 0)//有错误的也有成功的 |
| | | { |
| | | //var strMsg = new HttpService().RequestPackWcs("LN000001"); |
| | | ////写死测试读string |
| | | //var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64"); |
| | | //Console.WriteLine("DB100.64----" + val); |
| | | ////测试批量读取 |
| | | //Dictionary<string, PLCDataTypeEnum> listaddress = new Dictionary<string, PLCDataTypeEnum>(); |
| | | //foreach (var modStation in modDevice.listStation) |
| | | //{ |
| | | // listaddress.Add(modStation.PlcPos, modStation.PosType); |
| | | //} |
| | | //var result = modDevice.PLCUtil.GetPlcBatchDBValue(listaddress); |
| | | //if (result.Value.Count > 0) |
| | | //{ |
| | | // foreach (var value in result.Value) |
| | | // { |
| | | // Console.WriteLine("地址" + value.Key + "----值" + value, value); |
| | | // } |
| | | //} |
| | | //if (!result.IsSucceed) |
| | | //{ |
| | | // foreach (var err in result.ErrList) |
| | | // { |
| | | // Console.WriteLine(err); |
| | | // } |
| | | // if (result.Value.Count > 0)//有错误的也有成功的 |
| | | // { |
| | | |
| | | } |
| | | } |
| | | if (modDevice.Value == 820) |
| | | { |
| | | //测试写入830 |
| | | //var result = mod.PLCUtil.SetPlcDBValue(mod.PosType.Value, mod.DbNumber, mod.PlcPos, "830"); |
| | | ////写入是否成功 |
| | | //if (result.IsSucceed) |
| | | //{ |
| | | // } |
| | | //} |
| | | //if (modDevice.Value == 820) |
| | | //{ |
| | | // //测试写入830 |
| | | // //var result = mod.PLCUtil.SetPlcDBValue(mod.PosType.Value, mod.DbNumber, mod.PlcPos, "830"); |
| | | // ////写入是否成功 |
| | | // //if (result.IsSucceed) |
| | | // //{ |
| | | |
| | | //} |
| | | } |
| | | else if (modDevice.Value == 840) |
| | | { |
| | | // //} |
| | | //} |
| | | //else if (modDevice.Value == 840) |
| | | //{ |
| | | |
| | | } |
| | | else if (modDevice.Value == 860) |
| | | { |
| | | //} |
| | | //else if (modDevice.Value == 860) |
| | | //{ |
| | | |
| | | } |
| | | //} |
| | | } |
| | | |
| | | |