File was renamed from Services/AgvService.cs |
| | |
| | | using HH.WCS.Mobox3.AnGang.Helpers; |
| | | using HH.WCS.Mobox3.AnGang.Models; |
| | | using HH.WCS.Mobox3.AnGang.device; |
| | | using HH.WCS.Mobox3.AnGang.dispatch; |
| | | using HH.WCS.Mobox3.AnGang.models; |
| | | using HH.WCS.Mobox3.AnGang.process; |
| | | using HH.WCS.Mobox3.AnGang.config; |
| | | using HH.WCS.Mobox3.AnGang.Helper; |
| | | using Newtonsoft.Json; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using static HH.WCS.Mobox3.AnGang.api.ApiModel; |
| | | using HH.WCS.Mobox3.AnGang.wms; |
| | | using HH.WCS.Mobox3.AnGang.util; |
| | | |
| | | using static HH.WCS.Mobox3.AnGang.Dtos.Request.AgvRequest; |
| | | using static HH.WCS.Mobox3.AnGang.Dtos.Response.AgvResponse; |
| | | using HH.WCS.Mobox3.AnGang.Consts; |
| | | using HH.WCS.Mobox3.AnGang.Dispatch; |
| | | using HH.WCS.Mobox3.AnGang.Devices; |
| | | |
| | | namespace HH.WCS.Mobox3.AnGang.Services { |
| | | public class AgvService { |
| | | namespace HH.WCS.Mobox3.AnGang.core |
| | | { |
| | | internal class WCSCore |
| | | { |
| | | public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) { |
| | | var result = new ReturnResult(); |
| | | try { |
| | | switch (model.state) { |
| | | case 1023: |
| | | break; |
| | | case 1025: |
| | | break; |
| | | case 1012: |
| | | break; |
| | | case 1004: |
| | | break; |
| | | case 1103: |
| | | break; |
| | | default: |
| | | // AGV 执行任务的逻辑处理 |
| | | if (!AgvTaskProcessOk(model)) { |
| | | // 执行不OK,说明没有找到任务 |
| | | result.ResultCode = 1; |
| | | result.ResultMsg = $"根据Model.No未找到对应的任务,{model.task_no}"; |
| | | LogHelper.Info(result.ResultMsg, "API"); |
| | | return result; |
| | | } |
| | | break; |
| | | if (model.state > 0 && model.state < 1000) { |
| | | // AGV 执行任务的逻辑处理 |
| | | if (!AgvTaskProcessOk(model)) { |
| | | // 执行不OK,说明没有找到任务 |
| | | result.ResultCode = 1; |
| | | result.ResultMsg = $"根据Model.No未找到对应的任务,{model.task_no}"; |
| | | LogHelper.Info(result.ResultMsg, "API"); |
| | | return result; |
| | | } |
| | | } |
| | | |
| | | result.ResultCode = 0; |
| | |
| | | |
| | | if (model.state > 7) { |
| | | //安全请求等 |
| | | TaskHelper.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data); |
| | | TaskProcess.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data); |
| | | return true; |
| | | } |
| | | |
| | | // AGV 任务 134562(7) 状态处理 |
| | | switch (model.state) { |
| | | case AgvStateCode.执行: |
| | | case 1: // 执行 |
| | | WCSHelper.Begin(TN_Task, model.forklift_no); // 已推送的任务的状态改成执行 |
| | | break; |
| | | case AgvStateCode.开始取货: |
| | | case 3: // 开始取货 |
| | | WCSHelper.UpdateStatus(TN_Task, "开始取货"); // 任务状态改成开始取货 |
| | | break; |
| | | case AgvStateCode.取货完成: |
| | | case 4: // 取货完成 |
| | | WCSHelper.UpdateStatus(TN_Task, "取货完成"); // 任务状态改成取货完成 |
| | | |
| | | var captureTask = Task.Run(() => { |
| | | if (TN_Task.S_TYPE == TaskName.产品入库 || TN_Task.S_TYPE == TaskName.产品部分回库) { |
| | | if (TN_Task.S_TYPE == TaskName.产品入库 || TN_Task.S_TYPE == TaskName.产品部分回库) { |
| | | var captureTask = Task.Run(() => { |
| | | CapturePic(TN_Task); |
| | | } |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | var setEndLocTask = Task.Run(() => { |
| | | // 只要任务为产品入库(PDA),就需要重新指定终点(默认endLoc为"") |
| | | if (TN_Task.S_TYPE == TaskName.产品入库) { |
| | | if (TN_Task.S_TYPE == TaskName.产品入库) { |
| | | var setEndLocTask = Task.Run(() => { |
| | | // 只要任务为产品入库(PDA),就需要重新指定终点(默认endLoc为"") |
| | | SetEndLoc(TN_Task); |
| | | } |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | TaskHelper.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点 |
| | | TaskProcess.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点 |
| | | break; |
| | | case AgvStateCode.开始卸货: |
| | | case 5: // 开始卸货 |
| | | WCSHelper.UpdateStatus(TN_Task, "开始卸货"); // 任务状态改成开始卸货 |
| | | break; |
| | | case AgvStateCode.卸货完成: |
| | | case 6: // 卸货完成 |
| | | WCSHelper.UpdateStatus(TN_Task, "卸货完成"); // 任务状态改成卸货完成 |
| | | TaskHelper.OperateStatus(TN_Task, 6); // 终点容器货位绑定,解锁终点 |
| | | TaskProcess.OperateStatus(TN_Task, 6); // 终点容器货位绑定,解锁终点 |
| | | break; |
| | | case AgvStateCode.完成: |
| | | case 2: // 完成 |
| | | WCSHelper.End(TN_Task); // 任务状态改成结束 |
| | | break; |
| | | case AgvStateCode.异常: |
| | | TaskHelper.OperateStatus(TN_Task, 7); // 异常处理 |
| | | case 7: // 异常 |
| | | TaskProcess.OperateStatus(TN_Task, 7); // 异常处理 |
| | | WCSHelper.Fail(TN_Task); // 任务状态改成错误 |
| | | break; |
| | | } |
| | |
| | | } |
| | | |
| | | public static void CapturePic(TN_Task model) { |
| | | var db = DbHelper.GetDbClient(); |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | |
| | | var filepath = SnapManager.GetCapturePicturePath(); |
| | | if (string.IsNullOrEmpty(filepath)) { |
| | |
| | | } |
| | | |
| | | public static void SetEndLoc(TN_Task tn_task) { |
| | | var db = DbHelper.GetDbClient(); |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var endLoc = db.Queryable<TN_Location>() |
| | | .First(a => a.S_CODE == tn_task.S_END_LOC); |
| | | |
| | |
| | | //}; |
| | | |
| | | //GZRobot.UpdateInteractInfo(request); |
| | | |
| | | using (var trans = db.Ado.UseTran()) { |
| | | if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new { it.S_END_LOC }) |
| | | if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new { it.S_END_LOC }) |
| | | .ExecuteCommand() > 0) { |
| | | //LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁 |
| | | |
| | | trans.CommitTran(); |
| | | LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改成功,修改终点货位为 0空"); |
| | | } |
| | | else { |
| | | trans.RollbackTran(); |
| | | LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改失败,修改终点货位为 0空"); |
| | | } |
| | | //LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁 |
| | | LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改成功,修改终点货位为 0空"); |
| | | } |
| | | else { |
| | | LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改失败,修改终点货位为 0空"); |
| | | } |
| | | } |
| | | else { |
| | | // 找到合适的货位,推送 |
| | | tn_task.S_END_LOC = endLoc.S_CODE; |
| | | |
| | | using (var trans = db.Ado.UseTran()) { |
| | | if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new { it.S_END_LOC }) |
| | | if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new { it.S_END_LOC }) |
| | | .ExecuteCommand() > 0) { |
| | | LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁 |
| | | |
| | | trans.CommitTran(); |
| | | LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改成功,终点货架为 {endLoc.N_ROW},修改终点位置为 {endLoc.S_CODE}"); |
| | | } |
| | | else { |
| | | trans.RollbackTran(); |
| | | |
| | | LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改失败,终点货架为 {endLoc.N_ROW},修改终点位置为 {endLoc.S_CODE}"); |
| | | } |
| | | LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁 |
| | | LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改成功,终点货架为 {endLoc.N_ROW},修改终点位置为 {endLoc.S_CODE}"); |
| | | } |
| | | else { |
| | | LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改失败,终点货架为 {endLoc.N_ROW},修改终点位置为 {endLoc.S_CODE}"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 任务分发,根据调度类型发给不同的调度系统 |
| | | /// </summary> |
| | | internal static void Dispatch() |
| | | { |
| | | //查询任务 |
| | | //获取所有等待的任务 |
| | | var list = WCSHelper.GetWaitingTaskList(); |
| | | LogHelper.Info("等待任务信息" + JsonConvert.SerializeObject(list), "API"); |
| | | if (list.Count > 0) |
| | | { |
| | | list.ForEach(task => |
| | | { |
| | | //使用自定义任务推送 |
| | | TaskProcess.SendTask(task);//调度NDC或杭奥或国自设备 |
| | | //TaskProcess.SendGZTask(task);///调度国自设备 |
| | | |
| | | }); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("暂无任务"); |
| | | } |
| | | } |
| | | |
| | | public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) { |
| | | var gzResult = new ReturnResult(); |
| | | //var db = DbHelper.GetDbClient(); |
| | | //var db = new SqlHelper<object>().GetInstance(); |
| | | //ModbusHelper.Relink(); |
| | | |
| | | //var productionLineInfo = Settings.ProductionLines[0]; |