| | |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 堆垛机不空跑 |
| | | /// </summary> |
| | | /// <param name="modTask">操作完成的任务</param> |
| | | /// <param name="plcConn">plc连接</param> |
| | | private static void ContinuousOperation(WcsTask modTask, PLCUtil plcConn) |
| | | { |
| | | //列 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(); |
| | | switch (modTask.TaskType) |
| | | { |
| | | case TaskTypeEnum.In: |
| | | { |
| | | // 先找出对应排列层的入库任务 |
| | | var listInTask = listTask.Where(s => s.TaskType == TaskTypeEnum.In) |
| | | .Select(s => s.EndLocate.Substring(0, 6)) |
| | | .ToHashSet(); |
| | | |
| | | // 找出库任务,对应巷道的任务 |
| | | var listNextTask = listTask.Where(s => s.TaskType == TaskTypeEnum.Out && s.StartRoadway == modTask.EndRoadway).ToList(); |
| | | |
| | | foreach (var modNext in listNextTask) |
| | | { |
| | | // 如果有对应排列层的入库任务,那就不能优先执行 |
| | | if (listInTask.Contains(modNext.EndLocate.Substring(0, 6))) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | // todo: 写入modNext任务信息给plc |
| | | Console.WriteLine($"入库任务{modTask.TaskNo}执行完成后,不空跑逻辑检测下一任务为{modNext.TaskNo}"); |
| | | break; |
| | | } |
| | | } |
| | | break; |
| | | case TaskTypeEnum.Out: |
| | | { |
| | | // 先找出对应排列层的出库任务 |
| | | var listInTask = listTask.Where(s => s.TaskType == TaskTypeEnum.Out) |
| | | .Select(s => s.EndLocate.Substring(0, 6)) |
| | | .ToHashSet(); |
| | | |
| | | // 找入库任务,对应巷道的任务 |
| | | var listNextTask = listTask.Where(s => s.TaskType == TaskTypeEnum.In && s.StartRoadway == modTask.EndRoadway).ToList(); |
| | | |
| | | foreach (var modNext in listNextTask) |
| | | { |
| | | // 如果有对应排列层的出库任务,那就不能优先执行 |
| | | if (listInTask.Contains(modNext.EndLocate.Substring(0, 6))) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | // todo: 写入modNext任务信息给plc |
| | | Console.WriteLine($"出库任务{modTask.TaskNo}执行完成后,不空跑逻辑检测下一任务为{modNext.TaskNo}"); |
| | | 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 height = Math.Round(value / 790000d * 200).ToInt(); |
| | | //todo:这里看能不能找到堆垛机所在位置在哪个排列层,优先寻找附近的任务? |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 输送线业务处理 |
| | | /// </summary> |
| | | /// <param name="modDevice"></param> |