| | |
| | | using System; |
| | | using System.Data; |
| | | using System.Reflection.Emit; |
| | | using WCS.Application.Entity; |
| | | using WCS.Application.Util; |
| | | |
| | | namespace WCS.Application; |
| | |
| | | switch (mod.Type) |
| | | { |
| | | case PLCTypeEnum.StackingMachine: |
| | | StackingMachine(mod); |
| | | StackingMachine(mod); // 跺机 |
| | | break; |
| | | case PLCTypeEnum.ConveyorLine: |
| | | ConveyorLine(mod); |
| | | ConveyorLine(mod); // 托盘输送线 |
| | | break; |
| | | case PLCTypeEnum.AGV: |
| | | AGV(mod); |
| | | AGV(mod); // AGV调度 |
| | | break; |
| | | case PLCTypeEnum.PalletMachine: |
| | | PalletMachine(mod); |
| | | case PLCTypeEnum.RobotPalletizer: |
| | | RobotPalletizer(mod); // 码垛机器人 |
| | | break; |
| | | case PLCTypeEnum.StackingRobot: |
| | | PalletMachine(mod); |
| | |
| | | //下发任务日志 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | |
| | | |
| | | //修改led屏信息 |
| | | //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo); |
| | | } |
| | |
| | | { |
| | | modTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成"; |
| | | } |
| | | else |
| | | else |
| | | { |
| | | Log.Error(string.Format("任务反馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); |
| | | } |
| | |
| | | /// </summary> |
| | | /// <param name="modTask">操作完成的任务</param> |
| | | /// <param name="plcConn">plc连接</param> |
| | | private static void ContinuousOperation(WcsTask modTask, PLCUtil plcConn) |
| | | /// <param name="modDevice">设备信息</param> |
| | | private static void ContinuousOperation(WcsTask modTask, PLCUtil plcConn, WcsDeviceDto modDevice) |
| | | { |
| | | //列 todo:上面代码拿来的,这里不理解为啥是1,2 不是2,2? |
| | | int col = modTask.EndLocate.Substring(1, 2).ToInt(); |
| | | int row = modTask.EndLocate.Substring(0, 2).ToInt(); |
| | | int storey = modTask.EndLocate.Substring(4, 2).ToInt(); |
| | | int deep = modTask.EndLocate.Substring(6, 2).ToInt(); |
| | | // 查询所有待执行的任务 |
| | | var listTask = _db.Queryable<WcsTask>().Where(s => s.Status == TaskStatusEnum.Wait).ToList(); |
| | | WcsTask modNextTask = null; |
| | | switch (modTask.TaskType) |
| | | { |
| | | case TaskTypeEnum.In: |
| | |
| | | |
| | | // todo: 写入modNext任务信息给plc |
| | | Console.WriteLine($"入库任务{modTask.TaskNo}执行完成后,不空跑逻辑检测下一任务为{modNext.TaskNo}"); |
| | | modNextTask = modNext; |
| | | break; |
| | | } |
| | | } |
| | |
| | | |
| | | // todo: 写入modNext任务信息给plc |
| | | Console.WriteLine($"出库任务{modTask.TaskNo}执行完成后,不空跑逻辑检测下一任务为{modNext.TaskNo}"); |
| | | modNextTask = modNext; |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | case TaskTypeEnum.Move: |
| | | { |
| | | var modDevice = _db.Queryable<WcsDevice>().Where(s => s.PlcId == plcConn.PlcId && s.DeviceType == DeviceTypeEnum.Show).First(); |
| | | var (result, value) = plcConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos); |
| | | var modDevicePos = _db.Queryable<WcsDevice>().Where(s => s.PlcId == plcConn.PlcId && s.DeviceType == DeviceTypeEnum.Show).First(); |
| | | var (result, value) = plcConn.GetPlcDBValue(modDevicePos.PosType, modDevicePos.DbNumber, modDevicePos.PlcPos); |
| | | //当前堆垛机所在位置 |
| | | var height = Math.Round(value / 790000d * 200).ToInt(); |
| | | //todo:这里看能不能找到堆垛机所在位置在哪个排列层,优先寻找附近的任务? |
| | | } |
| | | break; |
| | | } |
| | | if (modNextTask != null) |
| | | { |
| | | // 获取转换后的起始排列层 06010101 |
| | | PlcTaskInfo startTaskInfo = PLCCommon.GetEndPai(modTask.StartRoadway.Substring(1, 2), modTask.StartLocate.Substring(2, 2), |
| | | modTask.StartLocate.Substring(0, 2), modTask.StartLocate.Substring(4, 2), |
| | | modTask.StartLocate.Substring(6, 2)); |
| | | |
| | | // 给PLC写入任务数据 |
| | | var listResult = new List<Result>(); |
| | | // 任务号托盘号 |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); |
| | | var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘码"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); |
| | | // 起始排列层 |
| | | var modPosRow = modDevice.listStation.FirstOrDefault(s => s.Text == "取货排"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosRow.PosType, modDevice.DbNumber, modPosRow.PlcPos, startTaskInfo.EndPai)); |
| | | var modPosColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "取货列"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosColumn.PosType, modDevice.DbNumber, modPosColumn.PlcPos, startTaskInfo.EndLie)); |
| | | var modPosStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "取货层"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosStorey.PosType, modDevice.DbNumber, modPosStorey.PlcPos, startTaskInfo.EndCeng)); |
| | | // 目标放货工位(固定排列层) |
| | | PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, ((int)modTask.TaskType).ToString(), |
| | | modTask.StartRoadway, modTask.EndRoadway); |
| | | var modPosEndRow = modDevice.listStation.FirstOrDefault(s => s.Text == "放货排"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosEndRow.PosType, modDevice.DbNumber, modPosEndRow.PlcPos, taskInfo.EndPai)); |
| | | var modPosEndColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "放货列"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosEndColumn.PosType, modDevice.DbNumber, modPosEndColumn.PlcPos, taskInfo.EndLie)); |
| | | var 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)) |
| | | { |
| | | // 写入跺机任务下发完成 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "830"); |
| | | |
| | | // 将移库任务待执行改为正在执行 |
| | | _db.Updateable<WcsTask>() |
| | | .SetColumns(s => s.Status == TaskStatusEnum.Doing) |
| | | .Where(s => s.Id == modTask.Id) |
| | | .ExecuteCommand(); |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | WcsTaskMonitor modInsertTaskMonitor; |
| | | if (string.IsNullOrEmpty(taskInfo.EndStation)) |
| | | { |
| | | // 同巷道移库 |
| | | modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令:{modTask.StartLocate}储位====》{modTask.EndLocate}储位。", |
| | | PalletNo = modTask.PalletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modTask.StartLocate, |
| | | EndLocat = modTask.EndLocate, |
| | | }; |
| | | } |
| | | else |
| | | { |
| | | // 出库任务 跨巷道移库 |
| | | modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令:{modTask.StartLocate}储位====》{taskInfo.EndStation}工位。", |
| | | PalletNo = modTask.PalletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modTask.StartLocate, |
| | | EndLocat = modTask.EndLocate, |
| | | }; |
| | | } |
| | | |
| | | // 插入交互日志 |
| | | _db.Insertable(modInsertTaskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | //修改led屏信息 |
| | | //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | break; |
| | | case "330": |
| | | { |
| | | |
| | | |
| | | // 写入任务 托盘移动 340 |
| | | |
| | | // 获取工位托盘码信息 |
| | |
| | | /// <param name="modDevice"></param> |
| | | private static void PalletMachine(WcsDeviceDto modDevice) |
| | | { |
| | | var plcConn = modDevice.PLCUtil; |
| | | switch (modDevice.Value.ToString()) |
| | | { |
| | | case "220": |
| | | // 注释1 |
| | | { |
| | | |
| | | } |
| | | break; |
| | | case "230": |
| | | // 注释2 |
| | | { |
| | | |
| | | } |
| | | break; |
| | | case "240": |
| | | { |
| | | |
| | | } |
| | | break; |
| | | default: break; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 码垛机器人业务处理 |
| | | /// </summary> |
| | | /// <param name="modDevice"></param> |
| | | private static void RobotPalletizer(WcsDeviceDto modDevice) |
| | | { |
| | | var plcConn = modDevice.PLCUtil; |
| | | switch (modDevice.Value.ToString()) |
| | | { |
| | | case "1": |
| | | // 主扫申请分道 wcs写入2 |
| | | { |
| | | |
| | | var taskModel = ""; |
| | | // 判断是否演示模式 |
| | | if (PLCTaskAction.boDemo) |
| | | { |
| | | // 演示模式 |
| | | taskModel = "1"; |
| | | |
| | | // 直接 |
| | | } |
| | | else |
| | | { |
| | | // 通道号 |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "通道号"); |
| | | |
| | | // 读取plc箱码 |
| | | var modBoxNo = modDevice.listStation.FirstOrDefault(m => m.Text == "箱码"); |
| | | var (res, boxNo) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modBoxNo.PlcPos); |
| | | if (string.IsNullOrWhiteSpace(boxNo.ToString())) |
| | | { |
| | | // 箱码为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("箱码为null进行剔除"); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 根据箱码获取箱内信息 |
| | | string boxNoVal = boxNo.ToString(); |
| | | var boxInfo = _db.Queryable<WcsBoxInfo>().First(w => w.IsDelete == false && w.BoxNo == boxNoVal && string.IsNullOrEmpty(w.PalletNo)); |
| | | if (boxInfo == null) |
| | | { |
| | | // 箱信息为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("箱码为null或已绑定托盘,进行剔除。"); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | // 根据箱内品种号获取码躲绑定工位及对应的分道号 |
| | | var checkTaskInfo = _db.Queryable<WcsCheckTask>().First(w => w.SkuNo == boxInfo.SkuNo && w.SkuName == boxInfo.SkuName && w.LotNo == boxInfo.LotNo); |
| | | if (checkTaskInfo == null) |
| | | { |
| | | // 绑定信息为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; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 与plc交互写入分道号和流程控制字 |
| | | var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, checkTaskInfo.RoboatNo); |
| | | if (ret.IsSucceed) |
| | | { |
| | | // 写入流程控制字 2 |
| | | var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2"); |
| | | if (retVal.IsSucceed) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case "230": |
| | | // 注释2 |
| | | { |
| | | |
| | | } |
| | | break; |
| | | case "240": |
| | | { |
| | | |
| | | } |
| | | break; |
| | | default: break; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |