| | |
| | | /// </summary> |
| | | public string? CarIp { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 是否完成分段任务 用于小车到达成品入库口 0/""/null 未完成 1完成 |
| | | /// </summary> |
| | | public string? IsComple { get; set; } |
| | | |
| | | } |
| | |
| | | /// 极限电量 低于此电量不执行任务 |
| | | /// </summary> |
| | | [Description("极限电量")] |
| | | Dl = 30, |
| | | Dl = 10, |
| | | /// <summary> |
| | | /// 健康电量 低于此电量 且无任务时去充电 |
| | | /// </summary> |
| | | [Description("健康电量")] |
| | | Dl2 = 80, |
| | | Dl2 = 15, |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | public class carConverModel |
| | | { |
| | | |
| | | public Dictionary<string, string> conveyorNan = new Dictionary<string, string>(); |
| | | public Dictionary<string, string> conveyorBei = new Dictionary<string, string>(); |
| | | public Dictionary<string, string> conveyorRuKu = new Dictionary<string, string>(); |
| | | public carConverModel(){ |
| | | conveyorNan = new Dictionary<string, string>() |
| | | { |
| | | {"190601","13"}, |
| | | {"190602","15"}, |
| | | {"191201","14"}, |
| | | {"191202","16"} |
| | | }; |
| | | conveyorBei = new Dictionary<string, string>() |
| | | { |
| | | {"030401","2"}, |
| | | {"030402","6"}, |
| | | {"030601","3"}, |
| | | {"030602","7"}, |
| | | {"031201","5"}, |
| | | {"031202","8"}, |
| | | }; |
| | | conveyorRuKu = new Dictionary<string, string>() |
| | | { |
| | | {"190601","9"}, |
| | | {"190602","9"}, |
| | | {"191201","9"}, |
| | | {"191202","9"}, |
| | | |
| | | {"030401","17"}, |
| | | {"030402","17"}, |
| | | {"030601","18"}, |
| | | {"030602","18"}, |
| | | {"031201","18"}, |
| | | {"031202","18"}, |
| | | }; |
| | | } |
| | | } |
| | |
| | | /// </summary> |
| | | /// <param name="context"></param> |
| | | /// <returns></returns> |
| | | public static async Task PublicPlcDevice(WcsDeviceOutput context) |
| | | { |
| | | if (PLCTaskAction.boRefresh) |
| | | await _plcDeviceHubContext.Clients.All.PublicPlcDevice(context); |
| | | } |
| | | //public static async Task PublicPlcDevice(WcsDeviceOutput context) |
| | | //{ |
| | | // if (PLCTaskAction.boRefresh) |
| | | // await _plcDeviceHubContext.Clients.All.PublicPlcDevice(context); |
| | | //} |
| | | |
| | | /// <summary> |
| | | /// 下发分拣任务信息 |
| | |
| | | //开启读取服务线程 |
| | | boRunningState = true; |
| | | cts = new CancellationTokenSource();//取消线程标识 |
| | | StartRead(); |
| | | //StartRead(); |
| | | } |
| | | await base.OnConnectedAsync(); |
| | | } |
| | |
| | | modDevice.PickStorey != initialState.PickStorey))) |
| | | { |
| | | // 通知用户变更 |
| | | HubUtil.PublicPlcDevice(modDevice); |
| | | //HubUtil.PublicPlcDevice(modDevice); |
| | | } |
| | | } |
| | | initialStates[modDevice.Id] = modDevice.Adapt<WcsDeviceOutput>(); |
| | |
| | | |
| | | namespace WCS.Application |
| | | { |
| | | |
| | | |
| | | #region JC34 |
| | | |
| | | /// <summary> |
| | | /// agv任务下发model |
| | | /// </summary> |
| | | public class AgvTaskSend |
| | | { |
| | | /// <summary> |
| | | /// 外部任务唯一编号,如果为空,系统生成任务号并返回。 |
| | | /// </summary> |
| | | public string robotTaskCode { get; set; } |
| | | /// <summary> |
| | | /// 任务类型 |
| | | /// </summary> |
| | | public string taskType { get; set; } |
| | | /// <summary> |
| | | /// 执行步骤集合。本次任务机器人需要执行的关键路径,如货架起点 A 至出库工作台 B |
| | | /// </summary> |
| | | public List<targetRoute> targetRoute { get; set; } |
| | | /// <summary> |
| | | /// 任务执行的初始优先顺序,数值越大,优先级越高。但机器人调度系统会根据任务繁忙程度,机器人的工作状态,以及其他优先级修正条件,进行综合判定后,实时动态调整任务实际的优先级数值。范围:1~120 |
| | | /// </summary> |
| | | public int? initPriority { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 自定义扩展字段,可随业务的差异而传入不同的扩展内容,在业务流程的执行中使用 |
| | | /// </summary> |
| | | public extra extra { get; set; } |
| | | } |
| | | /// <summary> |
| | | /// 执行步骤集合。本次任务机器人需要执行的关键路径,如货架起点 A 至出库工作台 B |
| | | /// </summary> |
| | | public class targetRoute |
| | | { |
| | | /// <summary> |
| | | /// 目标路径序列。从 0 开始。 |
| | | /// </summary> |
| | | public int seq { get; set; } |
| | | /// <summary> |
| | | /// 目标类型。可扩展枚举值。 |
| | | /// 预制枚举值: |
| | | /// ZONE目标所处区域编号 |
| | | /// SITE站点别名 |
| | | /// STORAGE仓位别名 |
| | | /// MAT_LABEL物料标签 |
| | | /// CARRIER载具编号 |
| | | /// STACK巷道编号 |
| | | /// STACK_LABEL巷道特征值 |
| | | /// CHANNEL通道编号 |
| | | /// EQPT 外部设备 |
| | | /// PTL_WALL |
| | | /// CTU 缓存架 |
| | | /// CARRIER_TYPE载具类型 |
| | | /// BIN_TYPE仓位类型 |
| | | /// AREA_STATION区域工作台 |
| | | /// PILE_COUNT一次搬几个 |
| | | /// MIX_CONDITION条件组合 |
| | | /// DEGREE 热度 |
| | | /// MULTI_BIN_GROUP多深位组号 |
| | | /// </summary> |
| | | public string type { get; set; } |
| | | /// <summary> |
| | | /// 机器人到达目标位置后的操作。国标要求, |
| | | /// 非必要。对 AMR 动作无影响。可扩展的枚举值。 |
| | | /// 预制枚举值: |
| | | /// COLLECT取货 |
| | | /// DELIVERY送货 |
| | | /// ROTATE旋转 |
| | | /// </summary> |
| | | public string code { get; set; } |
| | | } |
| | | public class extra |
| | | { |
| | | /// <summary> |
| | | /// 载具的信息,包含载具编号、层号。 |
| | | /// 使用场景: |
| | | /// 1.装卸机或输送线专用 |
| | | /// 2.载具与站点没有绑定,但需要传入载具的场景。 |
| | | /// </summary> |
| | | public List<carrierInfo> carrierInfo { get; set; } |
| | | } |
| | | |
| | | public class carrierInfo |
| | | { |
| | | /// <summary> |
| | | /// 载具类型 |
| | | /// </summary> |
| | | public string carrierType { get; set; } |
| | | /// <summary> |
| | | /// 载具编号 |
| | | /// </summary> |
| | | public string carrierCode { get; set; } |
| | | /// <summary> |
| | | /// 层号: 从 0 开始、从下往上编号 |
| | | /// </summary> |
| | | public int layer { get; set; } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 返回实体 |
| | | /// </summary> |
| | | public class ResponseAgvDto |
| | | { |
| | | /// <summary> |
| | | /// true 成功 false 失败 |
| | | /// </summary> |
| | | public bool success { get; set; } |
| | | /// <summary> |
| | | /// 返回码 |
| | | /// SUCCESS:成功 |
| | | /// FAIL:失败 |
| | | /// 是否必填:是 |
| | | /// </summary> |
| | | public string code { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 返回消息 |
| | | /// 是否必填:是 |
| | | /// </summary> |
| | | public string message { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 返回的数据结构 |
| | | /// 是否必填:否 |
| | | /// </summary> |
| | | public data data { get; set; } |
| | | } |
| | | public class data |
| | | { |
| | | public string robotTaskCode { get; set; } |
| | | } |
| | | |
| | | |
| | | |
| | | #endregion |
| | | |
| | | public class AGVApplyLockInput |
| | | { |
| | | /// <summary> |
| | |
| | | /// <param name="models">任务信息</param> |
| | | /// <returns>反馈信息</returns> |
| | | [AllowAnonymous] |
| | | public async Task AddAssignTasks(ResponseTasksModel models) |
| | | public async Task<ResponseAgvDto> AddAssignTasks(AgvTaskSend models) |
| | | { |
| | | // 验证任务是否已存在 |
| | | var taskInfo = await _db.Queryable<WcsTask>().FirstAsync(w => w.TaskNo == models.TaskNo); |
| | | if (taskInfo == null) |
| | | { |
| | | throw Oops.Bah("任务:" + models.TaskNo + ";不存在!"); |
| | | } |
| | | var data1 = FourWayCarUtil.GetCarPath("091501", "091601","0"); |
| | | if (data1 == null) //|| data1.Count == 0 |
| | | { |
| | | throw Oops.Bah("分配路径不存在!"); |
| | | } |
| | | |
| | | // 根据任务状态 补充起始结束节点状态 |
| | | var data2 = FourWayCarUtil.GetCarPathUp(data1, 0); |
| | | var path = ""; |
| | | var executionPath1 = ""; |
| | | var response = await new HttpService().GenAgvSendTask(models); |
| | | //var response2 = await new HttpService().GenAgvContinueTask("Tk20250503000001"); |
| | | //var response3 = await new HttpService().GenAgvUnbind("models", "B010101"); |
| | | return response; |
| | | // 验证任务是否已存在 |
| | | //var taskInfo = await _db.Queryable<WcsTask>().FirstAsync(w => w.TaskNo == models.TaskNo); |
| | | //if (taskInfo == null) |
| | | //{ |
| | | // throw Oops.Bah("任务:" + models.TaskNo + ";不存在!"); |
| | | //} |
| | | //var data1 = FourWayCarUtil.GetCarPath("091501", "091601","0"); |
| | | //if (data1 == null) //|| data1.Count == 0 |
| | | //{ |
| | | // throw Oops.Bah("分配路径不存在!"); |
| | | //} |
| | | |
| | | //// 根据任务状态 补充起始结束节点状态 |
| | | //var data2 = FourWayCarUtil.GetCarPathUp(data1, 0); |
| | | //var path = ""; |
| | | //var executionPath1 = ""; |
| | | //foreach (var item in data1) |
| | | //{ |
| | | // //路径节点 |
| | |
| | | { |
| | | case "end"://任务完成 |
| | | { |
| | | |
| | | //货品拉到密集库入库口需要向输送线写入值 |
| | | if (modTask.EndLocate == AGVStaionEnum.A1.ToString()) |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == "输送线"); |
| | | var modConn = new PLCUtil(modPlc); |
| | | var modDevice = PLCTaskAction.plcDevices.First(s => s.Text == "C口"); |
| | | var modStation = PLCTaskAction.plcPositions.First(s => s.Text == "C口申请入库"); |
| | | var plcResult = modConn.SetPlcDBValue(modStation.PosType, modDevice.DbNumber, modStation.PlcPos, "100"); |
| | | if (plcResult.IsSucceed) |
| | | { |
| | | WcsTaskMonitor modTaskMonitorPLC = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.PlcId, |
| | | PlcName = modStation.PlcPos, |
| | | StartLocat = modTask.StartLocate, |
| | | EndLocat = modTask.EndLocate, |
| | | Status = TaskStatusEnum.Doing, |
| | | InteractiveMsg = $"向{modStation.Text}写入指令100,结果{plcResult.IsSucceed}", |
| | | }; |
| | | _db.Insertable(modTaskMonitorPLC).ExecuteCommand(); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitorPLC.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | else |
| | | { |
| | | Log.Error("C口申请入库写入值100失败"); |
| | | } |
| | | } |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.FinishDate = DateTime.Now; |
| | | await _db.Updateable(modTask).ExecuteCommandAsync(); |
| | |
| | | var inputs = new TaskRequestWMS(); |
| | | inputs.TaskNo = modTask.TaskNo; |
| | | inputs.PalletNo = modTask.PalletNo; |
| | | inputs.TaskType = "2"; |
| | | inputs.TaskType = modTask.TaskType.ToString(); |
| | | inputs.TaskStatus = "2"; |
| | | var modResponseTask = httpService.RequestTask(inputs).Result; |
| | | } |
| | | |
| | | } |
| | | break; |
| | | case "outbin"://走出储位 |
| | | case "admin"://走出储位 |
| | | { |
| | | //反馈WMS任务取货完成、WMS判断是平库储位就更新储位状态 |
| | | if (modTask.Origin == "WMS") |
| | |
| | | |
| | | } |
| | | break; |
| | | case "apply"://放货申请 |
| | | case "continue"://放货申请 |
| | | { |
| | | //todo:去码垛工位取货,需要写PLC信号关闭光幕 |
| | | if ((modTask.StartLocate == AGVStaionEnum.B1.ToString() || modTask.StartLocate == AGVStaionEnum.B2.ToString()) |
| | | && (modTask.EndLocate == AGVStaionEnum.C1.ToString() || modTask.EndLocate == AGVStaionEnum.C2.ToString())) |
| | | if (modTask.EndLocate != "B010101")//9号工位地址 |
| | | { |
| | | var no = modTask.StartLocate.Substring(1, 1); |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.RobotPalletizer && s.WareHouseNo == no); |
| | | var modConn = new PLCUtil(modPlc); |
| | | var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.DB); |
| | | var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "关闭光幕"); |
| | | var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "1"); |
| | | var modTaskMonitor = new WcsTaskMonitor() |
| | | result.Code = "1"; |
| | | result.Message = "找不到该任务"; |
| | | return result; |
| | | } |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.IsComple = "1"; |
| | | await _db.Updateable(modTask).ExecuteCommandAsync(); |
| | | WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.PlcId, |
| | | PlcName = modPos.PlcPos, |
| | | Status = TaskStatusEnum.Doing, |
| | | InteractiveMsg = $"向{modDevice.Text}写入关闭光幕1,结果{res.IsSucceed}", |
| | | //PlcId = modDevice.PlcId, |
| | | PlcName = "AGV", |
| | | StartLocat = modTask.StartLocate, |
| | | EndLocat = modTask.EndLocate, |
| | | Status = TaskStatusEnum.Complete, |
| | | InteractiveMsg = $"AGV小车反馈任务到达9工位", |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | await _db.Insertable(modTaskMonitor).ExecuteCommandAsync(); |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | Task.Run(() => |
| | | { |
| | | Thread.Sleep(1000); |
| | | modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "0"); |
| | | var modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.PlcId, |
| | | PlcName = modPos.PlcPos, |
| | | Status = TaskStatusEnum.Doing, |
| | | InteractiveMsg = $"向{modDevice.Text}写入开启光幕0,结果{res.IsSucceed}", |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | }); |
| | | modConn.Close(); |
| | | } |
| | | } |
| | | break; |
| | | case "start"://任务开始 |
| | | { |
| | | //开始向拆托机放入托盘任务 |
| | | if (modTask.EndLocate == AGVStaionEnum.D1.ToString()) |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.PalletMachine); |
| | | var modConn = new PLCUtil(modPlc); |
| | | var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.Text == "拆托机"); |
| | | var res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "1"); |
| | | modConn.Close(); |
| | | } |
| | | |
| | | var taskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcName = input.Method, |
| | | InteractiveMsg = $"AGV小车反馈任务开始" |
| | | }; |
| | | await _db.Insertable(taskMonitor).ExecuteCommandAsync(); |
| | | HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | break; |
| | | case "cancel"://任务取消 |
| | |
| | | |
| | | return result; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取原材料仓状态 |
| | |
| | | /// </summary> |
| | | /// <param name="input"></param> |
| | | /// <returns></returns> |
| | | [HttpPost] |
| | | [UnitOfWork] |
| | | public async Task ProductStorage(RequestStorage input) |
| | | { |
| | | var intProduct = AGVStorageUtil.ProductCount(); |
| | | var intTask = await _db.Queryable<WcsTask>().Where(s => s.TaskType == TaskTypeEnum.Move |
| | | && s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing |
| | | && s.StartLocate.StartsWith("Z") && s.EndLocate == AGVStaionEnum.A1.ToString()).CountAsync(); |
| | | if (input.Qty > intProduct) |
| | | throw Oops.Bah($"输入数量大于可出数量{intProduct}"); |
| | | var listTask = new List<WcsTask>(); |
| | | var TaskNo = GetTaskCode("WCS"); |
| | | for (int i = 0; i < input.Qty; i++) |
| | | { |
| | | listTask.Add(new WcsTask() |
| | | { |
| | | TaskNo = "WCS" + DateTime.Now.ToString("yyyyMMdd") + (TaskNo++).ToString().PadLeft(4, '0'), |
| | | TaskType = TaskTypeEnum.Move, |
| | | Type = PLCTypeEnum.AGV, |
| | | StartLocate = AGVStaionEnum.Z11.ToString(), |
| | | EndLocate = AGVStaionEnum.A1.ToString(), |
| | | PalletNo = "", |
| | | Status = TaskStatusEnum.Wait, |
| | | Levels = 10, |
| | | Origin = "PDA" |
| | | }); |
| | | } |
| | | await _db.Insertable(listTask).ExecuteCommandAsync(); |
| | | } |
| | | //[HttpPost] |
| | | //[UnitOfWork] |
| | | //public async Task ProductStorage(RequestStorage input) |
| | | //{ |
| | | // var intProduct = AGVStorageUtil.ProductCount(); |
| | | // var intTask = await _db.Queryable<WcsTask>().Where(s => s.TaskType == TaskTypeEnum.Move |
| | | // && s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing |
| | | // && s.StartLocate.StartsWith("Z") && s.EndLocate == AGVStaionEnum.A1.ToString()).CountAsync(); |
| | | // if (input.Qty > intProduct) |
| | | // throw Oops.Bah($"输入数量大于可出数量{intProduct}"); |
| | | // var listTask = new List<WcsTask>(); |
| | | // var TaskNo = GetTaskCode("WCS"); |
| | | // for (int i = 0; i < input.Qty; i++) |
| | | // { |
| | | // listTask.Add(new WcsTask() |
| | | // { |
| | | // TaskNo = "WCS" + DateTime.Now.ToString("yyyyMMdd") + (TaskNo++).ToString().PadLeft(4, '0'), |
| | | // TaskType = TaskTypeEnum.Move, |
| | | // Type = PLCTypeEnum.AGV, |
| | | // StartLocate = AGVStaionEnum.Z11.ToString(), |
| | | // EndLocate = AGVStaionEnum.A1.ToString(), |
| | | // PalletNo = "", |
| | | // Status = TaskStatusEnum.Wait, |
| | | // Levels = 10, |
| | | // Origin = "PDA" |
| | | // }); |
| | | // } |
| | | // await _db.Insertable(listTask).ExecuteCommandAsync(); |
| | | //} |
| | | /// <summary> |
| | | /// 自动生成任务号 |
| | | /// </summary> |
| | |
| | | { |
| | | string stationNum = ""; |
| | | |
| | | string[] lists = endRoadway.Split("R"); |
| | | string[] lists = endRoadway.Split("MR"); |
| | | var model = _db.Queryable<WcsStorageLocat>().First(m => m.RoadwayNo == endRoadway && m.IsDelete == false); |
| | | string stat = model.AisleOne; |
| | | |
| | |
| | | using Admin.NET.Core.Service; |
| | | using AngleSharp.Io; |
| | | using COSXML.Network; |
| | | using DocumentFormat.OpenXml.Bibliography; |
| | | using DocumentFormat.OpenXml.Drawing; |
| | | using DocumentFormat.OpenXml.Spreadsheet; |
| | | using DocumentFormat.OpenXml.Wordprocessing; |
| | | using Elastic.Clients.Elasticsearch.Snapshot; |
| | | using Furion.Logging; |
| | | using IoTClient; |
| | | using NewLife.Reflection; |
| | |
| | | try |
| | | { |
| | | var mod = sender as WcsDeviceDto; |
| | | |
| | | //Console.WriteLine($"{mod.Text}值为" + mod.Value); |
| | | switch (mod.Type) |
| | | { |
| | |
| | | TaskNo = _taskService.GetTaskCode(), |
| | | TaskType = TaskTypeEnum.Move, |
| | | Type = PLCTypeEnum.AGV, |
| | | StartLocate = AGVStorageUtil.GetPalletOutStorage(), |
| | | StartLocate = "", |
| | | EndLocate = AGVStaionEnum.D1.ToString(), |
| | | PalletNo = "", |
| | | Status = TaskStatusEnum.Wait, |
| | |
| | | { |
| | | TaskNo = carTask.TaskNo, |
| | | PlcName = modDevice.Text, |
| | | Status = TaskStatusEnum.Complete, |
| | | InteractiveMsg = $"穿梭车反馈任务完成" |
| | | }; |
| | | _db.Insertable(taskMonitor).ExecuteCommand(); |
| | |
| | | //总任务下没有其他未执行小车的任务 变更总任务信息 |
| | | if (carTaskNext == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete) |
| | | { |
| | | if (modFinshTask.TaskType == TaskTypeEnum.Out) |
| | | { |
| | | //#region 任务变更成输送线任务 |
| | | //modFinshTask.Status = TaskStatusEnum.Wait; |
| | | //modFinshTask.Type = PLCTypeEnum.ConveyorLine; |
| | | //_db.Updateable(modFinshTask).ExecuteCommand(); |
| | | |
| | | //#endregion |
| | | |
| | | #region 输送线 写入PLC 740 |
| | | |
| | | var text = ""; |
| | | var devStation = ""; //工位 |
| | | var endLocate = modFinshTask.EndRoadway; |
| | | var carcon = new carConverModel(); |
| | | if ( carcon.conveyorBei.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线北"; |
| | | devStation = carcon.conveyorBei[endLocate]; |
| | | } |
| | | else if (carcon.conveyorNan.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线南"; |
| | | devStation = carcon.conveyorNan[endLocate]; |
| | | } |
| | | if (text != "") |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text); |
| | | var modConn = new PLCUtil(modPlc); |
| | | |
| | | var modDeviceConver = PLCTaskAction.plcDevices.First(s => s.StationNum == devStation); |
| | | var (plcResult, palletVal) = modConn.GetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.PlcPos); |
| | | if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 730) |
| | | { |
| | | modConn.Close(); |
| | | return;//放货工位没有读取成功或不是空闲 |
| | | } |
| | | |
| | | var plcResult2 = modConn.SetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.WcsPos, "740"); |
| | | if (!plcResult.IsSucceed) |
| | | { |
| | | modConn.Close(); |
| | | return; |
| | | } |
| | | //添加任务明细 |
| | | var taskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modFinshTask.TaskNo, |
| | | PlcName = modDevice.Text, |
| | | Status = TaskStatusEnum.Complete, |
| | | InteractiveMsg = $"写入指令740:托盘到达{modFinshTask.EndRoadway}" |
| | | }; |
| | | _db.Insertable(taskMonitor).ExecuteCommand(); |
| | | modConn.Close(); |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | } |
| | | else |
| | | { |
| | | modFinshTask.Status = TaskStatusEnum.Complete; |
| | | modFinshTask.FinishDate = DateTime.Now; |
| | | _db.Updateable(modFinshTask).ExecuteCommand(); |
| | | } |
| | | |
| | | //判断任务是否充电任务,下发开始充电命令 |
| | | if (modFinshTask.Levels == 888) |
| | |
| | | var getCdTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Levels == 888 && m.EndLocate == endLocateCar && m.Type == PLCTypeEnum.ShuttleCar && m.Status <= TaskStatusEnum.Doing); |
| | | if (getCdTask == null) |
| | | { |
| | | var (resultDlLock, valueDlLock) = plcConn.GetDBValue(modDevice.PosType, modDevice.PlcPos); |
| | | if (resultDlLock.IsSucceed && valueDlLock!=3) |
| | | { |
| | | //添加小车充电位置 |
| | | WcsTask modCarTask = new WcsTask() |
| | | { |
| | |
| | | }; |
| | | _db.Insertable(modCarTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>()); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | var getCdTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Levels == 888 && m.EndLocate == endLocateCar && m.Type == PLCTypeEnum.ShuttleCar && m.Status <= TaskStatusEnum.Doing); |
| | | if (getCdTask == null) |
| | | { |
| | | var (resultDlLock, valueDlLock) = plcConn.GetDBValue(modDevice.PosType, modDevice.PlcPos); |
| | | if (resultDlLock.IsSucceed && valueDlLock != 3) |
| | | { |
| | | //添加小车充电位置 |
| | | WcsTask modCarTask = new WcsTask() |
| | | { |
| | |
| | | }; |
| | | _db.Insertable(modCarTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>()); |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | carTaskNext.Status = TaskStatusEnum.Doing; |
| | | carTaskNext.CarTaskNo = carTaskNo; |
| | | _db.Updateable(carTaskNext).ExecuteCommand(); |
| | | |
| | | if (modTask.TaskType == TaskTypeEnum.Out) |
| | | { |
| | | #region 输送线 写入PLC 730 |
| | | |
| | | var text = ""; |
| | | var devStation = ""; |
| | | var endLocate = modTask.EndRoadway; |
| | | var carcon = new carConverModel(); |
| | | if (carcon.conveyorBei.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线北"; |
| | | devStation = carcon.conveyorBei[endLocate]; |
| | | } |
| | | else if (carcon.conveyorNan.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线南"; |
| | | devStation = carcon.conveyorNan[endLocate]; |
| | | } |
| | | if (text != "") |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text); |
| | | var modConn = new PLCUtil(modPlc); |
| | | |
| | | var modDeviceConver = PLCTaskAction.plcDevices.First(s => s.StationNum == devStation); |
| | | var (plcResult, palletVal) = modConn.GetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.PlcPos); |
| | | if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 720) |
| | | { |
| | | modConn.Close(); |
| | | return;//放货工位没有读取成功或不是空闲 |
| | | } |
| | | var listResultcon = new List<Result>(); |
| | | |
| | | //任务号与托盘条码 |
| | | var modPosConverTask = PLCTaskAction.plcPositions.First(s => s.DeviceId == modDeviceConver.Id && s.Text == "任务号"); |
| | | listResultcon.Add(modConn.SetPlcDBValue(modPosConverTask.PosType, modDeviceConver.DbNumber, modPosConverTask.PlcPos, modTask.TaskId.ToString())); |
| | | var modPosConverPallet = PLCTaskAction.plcPositions.First(s => s.DeviceId == modDeviceConver.Id && s.Text == "托盘条码"); |
| | | listResultcon.Add(modConn.SetPlcDBValue(modPosConverPallet.PosType, modDeviceConver.DbNumber, modPosConverPallet.PlcPos, modTask.PalletNo.ToString())); |
| | | |
| | | // 起始工位、目的工位 |
| | | var modPosConverStrLocat = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDeviceConver.Id && s.Text == "起始工位"); |
| | | listResultcon.Add(modConn.SetPlcDBValue(modPosConverStrLocat.PosType, modDeviceConver.DbNumber, modPosConverStrLocat.PlcPos, modDeviceConver.StationNum)); |
| | | var modPosConverEndLocat = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDeviceConver.Id && s.Text == "目的工位"); |
| | | listResultcon.Add(modConn.SetPlcDBValue(modPosConverEndLocat.PosType, modDeviceConver.DbNumber, modPosConverEndLocat.PlcPos, modTask.EndLocate)); |
| | | |
| | | if (listResultcon.All(s => s.IsSucceed)) |
| | | { |
| | | var plcResult2 = modConn.SetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.WcsPos, "730"); |
| | | if (!plcResult.IsSucceed) |
| | | { |
| | | modConn.Close(); |
| | | return; |
| | | } |
| | | //添加任务明细 |
| | | var taskMonitor2 = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = carTaskNext.TaskNo, |
| | | PlcName = modDevice.Text, |
| | | Status = TaskStatusEnum.Complete, |
| | | InteractiveMsg = $"写入指令730:工位是{modDeviceConver.StationNum}" |
| | | }; |
| | | _db.Insertable(taskMonitor2).ExecuteCommand(); |
| | | } |
| | | |
| | | modConn.Close(); |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | } |
| | | |
| | | //清除小车空闲时间 |
| | | var carTimeClear = _db.Queryable<WcsCarTime>().First(m=>m.IsDelete == false && m.CarIp == modDevice.PlcIdIP); |
| | | if (carTimeClear!= null) |
| | |
| | | { |
| | | TaskNo = carTaskNext.TaskNo, |
| | | PlcName = modDevice.Text, |
| | | Status = TaskStatusEnum.Complete, |
| | | InteractiveMsg = $"向穿梭车下发任务{carTaskNext.TaskNo}" |
| | | }; |
| | | _db.Insertable(taskMonitor).ExecuteCommand(); |
| | |
| | | var ledText = ""; |
| | | switch (modDevice.Value.ToString()) |
| | | { |
| | | case "120": //空闲,AGV可放货 |
| | | { |
| | | var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Status == TaskStatusEnum.Doing && m.IsComple == "1"); |
| | | if (task != null) |
| | | { |
| | | //没有出库业务 |
| | | var res = new HttpService().GenAgvContinueTask(task.TaskNo).Result; |
| | | if (res.code == "0") |
| | | { |
| | | var modTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = task.TaskNo, |
| | | PlcId = modDevice.modPlc.Id, |
| | | PlcName = modDevice.modPlc.IP, |
| | | InteractiveMsg = "向AGV小车下发继续执行任务" |
| | | }; |
| | | _db.Insertable(modTaskMonitor).ExecuteCommand(); |
| | | |
| | | //下发任务日志 |
| | | HubUtil.PublicTask(task.Adapt<WcsTaskOutput>()); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | } |
| | | } |
| | | break; |
| | | case "320": |
| | | { |
| | | // 申请密集库组 |
| | | string strMsg = ""; |
| | | string taskModel = ""; |
| | | |
| | | // 获取工位托盘码信息 |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码"); |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码"); |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (!res.IsSucceed) |
| | | { |
| | |
| | | |
| | | var http = new HttpService(); |
| | | string TaskNo = "", EndLocate = ""; |
| | | strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, taskModel, "1", ref EndLocate, ref TaskNo); |
| | | strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, ref EndLocate, ref TaskNo); |
| | | if (!strMsg.Contains("-1")) |
| | | { |
| | | // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。 |
| | |
| | | case "330": |
| | | { |
| | | // 获取工位托盘码信息 |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码"); |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码"); |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (!res.IsSucceed) |
| | | { |
| | |
| | | } |
| | | |
| | | // 获取四项车取货工位 |
| | | string endLocatVlue = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, modDevice.StationNum); |
| | | string endLocatVlue = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, modDevice.StationNum.PadLeft(3,'0')); |
| | | |
| | | |
| | | |
| | |
| | | var modPosTaskType = modDevice.listStation.FirstOrDefault(s => s.Text == "任务类型"); |
| | | var taskTypeStr = (int)modTask.TaskType; |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, modDevice.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString())); |
| | | var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘码"); |
| | | var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘条码"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); |
| | | // 起始工位、目的工位 |
| | | var modPosStrLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "起始工位"); |
| | |
| | | { |
| | | // 申请储位 更新入库任务(储位地址) 630 |
| | | var strMsg = ""; |
| | | var taskModel = ""; |
| | | |
| | | //// 根据工位号获取巷道号 |
| | | //var roadway = PLCCommon.GetRoadwayByStation(modDevice.StationNum); |
| | | //if (roadway == "") |
| | | //{ |
| | | // break; |
| | | //} |
| | | // 获取工位任务号信息 |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号"); |
| | | var (resTask, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); |
| | | if (!resTask.IsSucceed) |
| | | { |
| | | break; |
| | | } |
| | | // 获取工位托盘码信息 |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码"); |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码"); |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (!res.IsSucceed) |
| | | { |
| | | break; |
| | | } |
| | | var http = new HttpService(); |
| | | |
| | | string TaskNo = ""; |
| | | // 向WMS申请储位信息 |
| | | strMsg = http.RequestLocate(palletVal, modDevice.StationNum, taskModel, "roadway", ref TaskNo); |
| | | strMsg = new HttpService().RequestLocate(palletVal, taskVal,ref TaskNo); |
| | | |
| | | if (!strMsg.Contains("-1")) |
| | | { |
| | |
| | | { |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号"); |
| | | var (res, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码"); |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码"); |
| | | 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); |
| | | |
| | | int taskNoVal = Convert.ToInt32(taskVal); |
| | | var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskId == taskNoVal); |
| | | if (taskInfo == null) |
| | | { |
| | | Log.Error(string.Format("输送线430:未找到对应的任务。")); |
| | | break; |
| | | } |
| | | // 插入任务明细 |
| | | var modInsertTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = taskVal, |
| | | TaskNo = taskInfo.TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | InteractiveMsg = $"写入指令430:托盘到达{modDevice.StationNum}工位", |
| | | PalletNo = palletVal, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = starVal, |
| | | StartLocat = Convert.ToString(starVal), |
| | | EndLocat = modDevice.StationNum, |
| | | }; |
| | | |
| | |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。 |
| | | var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == modInsertTaskMonitor.TaskNo); |
| | | modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.EndLocate).Select(s => s.LedIP).First(); |
| | | |
| | | // led显示内容 |
| | |
| | | case "440": |
| | | { |
| | | #region 拣选完成,托盘离开工位 |
| | | // 写入450 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "450"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号"); |
| | | var (res, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos); |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码"); |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码"); |
| | | 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); |
| | | // 写入450 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "450"); |
| | | if (ret.IsSucceed) |
| | | { |
| | | |
| | | |
| | | int tasknoVal = Convert.ToInt32(taskVal); |
| | | var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.IsDelete == false && m.TaskId == tasknoVal); |
| | | if (modTask == null) |
| | | { |
| | | Log.Error(string.Format("输送线440:未找到对应的任务。")); |
| | |
| | | // 改变任务状态 |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.FinishDate = DateTime.Now; |
| | | modTask.Levels = 999; |
| | | //modTask.Levels = 999; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | // 插入任务明细 |
| | |
| | | }; |
| | | if (modTask.Origin == "WMS") |
| | | { |
| | | // 反馈WMS |
| | | var requestMode = new TaskRequestWMS() |
| | | { |
| | | TaskNo = modTask.TaskNo + modTask.EndLocate, |
| | | PalletNo = modTask.PalletNo, |
| | | TaskType = ((int)TaskTypeEnum.Out).ToString(), |
| | | TaskStatus = ((int)TaskStatusEnum.Complete).ToString() |
| | | }; |
| | | HttpService httpService = new HttpService(); |
| | | var modResponseTask = httpService.RequestTask(requestMode).Result; |
| | | if (modResponseTask.StatusCode == 0) |
| | | { |
| | | modInsertTaskMonitor.InteractiveMsg += ",返回给WMS任务完成"; |
| | | } |
| | | else |
| | | { |
| | | Log.Error(string.Format("任务反馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); |
| | | } |
| | | //// 反馈WMS |
| | | //var requestMode = new TaskRequestWMS() |
| | | //{ |
| | | // TaskNo = modTask.TaskNo + modTask.EndLocate, |
| | | // PalletNo = modTask.PalletNo, |
| | | // TaskType = ((int)TaskTypeEnum.Out).ToString(), |
| | | // TaskStatus = ((int)TaskStatusEnum.Complete).ToString() |
| | | //}; |
| | | //HttpService httpService = new HttpService(); |
| | | //var modResponseTask = httpService.RequestTask(requestMode).Result; |
| | | //if (modResponseTask.StatusCode == 0) |
| | | //{ |
| | | // modInsertTaskMonitor.InteractiveMsg += ",返回给WMS任务完成"; |
| | | //} |
| | | //else |
| | | //{ |
| | | // Log.Error(string.Format("任务反馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); |
| | | //} |
| | | } |
| | | |
| | | // 插入交互日志 |
| | |
| | | private static void AGV(WcsDeviceDto modDevice) |
| | | { |
| | | |
| | | //这里找出来AGV待执行的任务、按照优先级下发一个任务给AGV |
| | | var listTask = _db.Queryable<WcsTask>().Where(s => (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.Type == PLCTypeEnum.AGV).OrderBy(s => s.Levels).ToList(); |
| | | if (listTask.Count == 0) |
| | | //这里找出来AGV待执行的任务、按照优先级、创建时间下发一个任务给AGV |
| | | var modTask = _db.Queryable<WcsTask>().Where(s => s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.AGV).OrderBy(s => new { s.Levels ,s.CreateTime}).First(); |
| | | if (modTask == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | foreach (var modTask in listTask) |
| | | { |
| | | |
| | | if (_db.Queryable<WcsTask>().Any(s => s.EndLocate == modTask.EndLocate && s.IsDelete == false && s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.AGV )) |
| | | { |
| | | continue; // 有目的位置一致且正在执行的任务 |
| | | return; // 有目的位置一致且正在执行的任务 |
| | | } |
| | | |
| | | //下发AGV任务 |
| | | AgvTaskInput input = new AgvTaskInput() |
| | | var taskTypeModel = AGVStorageUtil.GetTaskModle(modTask.StartLocate, modTask.EndLocate,out string type1,out string type2, out string jiebo); |
| | | if (string.IsNullOrWhiteSpace(taskTypeModel)) |
| | | { |
| | | ReqCode = modTask.Id.ToString(), |
| | | TaskCode = modTask.TaskNo, |
| | | CtnrCode = modTask.PalletNo, |
| | | PositionCodePath = new List<PositionCodePathItem>() |
| | | Console.WriteLine("获取AGV任务模板失败:请核实任务起始目标储位是否正确"); |
| | | return; |
| | | } |
| | | AgvTaskSend taskModel = new AgvTaskSend(); |
| | | taskModel.robotTaskCode = modTask.TaskNo; |
| | | taskModel.taskType = taskTypeModel; |
| | | if (jiebo == "") |
| | | { |
| | | new PositionCodePathItem(){ PositionCode = modTask.StartLocate }, |
| | | new PositionCodePathItem(){ PositionCode = modTask.EndLocate } |
| | | taskModel.targetRoute = new List<targetRoute>() |
| | | { |
| | | new targetRoute(){seq = 0,type = type1,code = modTask.StartLocate}, |
| | | new targetRoute(){seq = 1,type = type2,code = modTask.EndLocate} |
| | | }; |
| | | } |
| | | else |
| | | { |
| | | taskModel.targetRoute = new List<targetRoute>() |
| | | { |
| | | new targetRoute(){seq = 0,type = type1,code = modTask.StartLocate}, |
| | | new targetRoute(){seq = 1,type = "ZONE",code = jiebo}, |
| | | new targetRoute(){seq = 2,type = type2,code = modTask.EndLocate} |
| | | }; |
| | | } |
| | | |
| | | taskModel.extra = new extra() |
| | | { |
| | | carrierInfo = new List<carrierInfo>() |
| | | { |
| | | new carrierInfo(){ carrierType = "TP",carrierCode = modTask.PalletNo} |
| | | } |
| | | }; |
| | | input.TaskTyp = "1" + modTask.StartLocate.Substring(0, 1) + modTask.EndLocate.Substring(0, 1); |
| | | var response = new HttpService().GenAgvSchedulingTask(input).Result; |
| | | var response = new HttpService().GenAgvSendTask(taskModel).Result; |
| | | if (response.code == "0") |
| | | { |
| | | AGVStatus = true; |
| | | modTask.Status = TaskStatusEnum.Doing; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | var modTaskMonitor = new WcsTaskMonitor() |
| | |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | Console.WriteLine(response.ToJson()); |
| | | return; |
| | | } |
| | | //Console.WriteLine(response.ToJson()); |
| | | Thread.Sleep(3000); |
| | | return; |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | |
| | | private static void Test(WcsDeviceDto modDevice) |
| | | { |
| | | |
| | | var ledText = $"申请入库失败\n\n"; |
| | | ledText += $"托盘号:T2300001\n"; |
| | | ledText += $"入库任务已锁定,请解锁后重试!\n"; |
| | | LedDisplay("10.26.254.31", ledText); |
| | | //卷帘门2申请打开 |
| | | //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1152", "10"); |
| | | //卷帘门2申请关闭 |
| | |
| | | //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1154", "30"); |
| | | |
| | | //C口AGV放托盘完成申请入库 |
| | | var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1156", "100"); |
| | | //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1156", "100"); |
| | | |
| | | ////写死测试读string |
| | | //var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64"); |
| | |
| | | |
| | | private static List<ModbusUtil> listModbusUtil = new List<ModbusUtil>(); |
| | | |
| | | |
| | | public static List<ModbusUtil> modbusUtilConn |
| | | { |
| | | get { return listModbusUtil; } |
| | |
| | | boDrumReversal = _sysConfigService.GetConfigValue<bool>("sys_DrumReversal").Result; |
| | | boOutLock = _sysConfigService.GetConfigValue<bool>("sys_BoOutLock").Result; |
| | | boEnterLock = _sysConfigService.GetConfigValue<bool>("sys_BoEnterLock").Result; |
| | | |
| | | } |
| | | /// <summary> |
| | | /// 初始化PLC连接 |
| | |
| | | var (result, value) = modPlcUtil.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos); |
| | | if (result.IsSucceed) |
| | | { |
| | | ////如果是穿梭车,这里发送心跳 |
| | | //if (modPlc.Type == PLCTypeEnum.ShuttleCar) |
| | | //{ |
| | | // var modHeart = listPlcPosition.Where(s => s.DeviceId == modDevice.Id && s.Text == "心跳").FirstOrDefault(); |
| | | // if (modHeart != null) |
| | | // { |
| | | // modPlcUtil.SetPlcDBValue(modHeart.PosType, modHeart.PlcPos, "1"); |
| | | // } |
| | | //} |
| | | //无流程跳出 |
| | | if (Convert.ToInt32(value) == 0) |
| | | continue; |
| | |
| | | } |
| | | try |
| | | { |
| | | |
| | | |
| | | // 获取密集库未执行任务 根据创建时间排序 |
| | | var waitTask = _db.Queryable<WcsTask>().Where(s => s.IsDelete == false && s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.ShuttleCar && string.IsNullOrWhiteSpace(s.StartLocate) && string.IsNullOrWhiteSpace(s.EndLocate)).OrderBy(s => new {s.Levels, s.CreateTime}).First(); |
| | | var waitTask = _db.Queryable<WcsTask>().Where(s => s.IsDelete == false && s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(s => new {s.Levels, s.CreateTime}).First(); |
| | | if (waitTask == null) |
| | | { |
| | | continue; |
| | | } |
| | | var starLocate = ""; |
| | | var endLocate = ""; |
| | | var taskceng = 0; |
| | | //01010101: 01排 01列 01层 01深度-此项目不做判断 |
| | | var taskpai = int.Parse(waitTask.StartLocate.Substring(0, 2)); |
| | | var tasklie = int.Parse(waitTask.StartLocate.Substring(2, 2)); |
| | | var taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2)); |
| | | |
| | | if (waitTask.TaskType == TaskTypeEnum.In ) |
| | | { |
| | | //入库任务起始巷道就是起始工位 |
| | | if (string.IsNullOrWhiteSpace(waitTask.StartRoadway) || string.IsNullOrWhiteSpace(waitTask.EndLocate)) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | taskceng = int.Parse(waitTask.StartRoadway.Substring(4, 2)); |
| | | starLocate = waitTask.StartRoadway; |
| | | endLocate = waitTask.EndLocate; |
| | | } |
| | | else if (waitTask.TaskType == TaskTypeEnum.Out) |
| | | { |
| | | taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2)); |
| | | starLocate = waitTask.StartLocate; |
| | | endLocate = waitTask.EndRoadway; |
| | | |
| | | #region 添加输送线与任务验证 |
| | | |
| | | |
| | | |
| | | var text = ""; |
| | | var devStation = ""; |
| | | var carcon = new carConverModel(); |
| | | if (carcon.conveyorBei.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线北"; |
| | | devStation = carcon.conveyorBei[endLocate]; |
| | | } |
| | | else if (carcon.conveyorNan.Keys.Contains(endLocate)) |
| | | { |
| | | text = "输送线南"; |
| | | devStation = carcon.conveyorNan[endLocate]; |
| | | } |
| | | if (text != "") |
| | | { |
| | | var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text); |
| | | var modConn = new PLCUtil(modPlc); |
| | | |
| | | var modDevice = PLCTaskAction.plcDevices.First(s => s.StationNum == devStation); |
| | | var (plcResult, palletVal) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos); |
| | | if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 720) |
| | | { |
| | | continue;//放货工位没有读取成功或不是空闲 |
| | | } |
| | | modConn.Close(); |
| | | |
| | | var gongwei = carcon.conveyorRuKu[endLocate]; |
| | | //判断任务 |
| | | var convarTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.StartLocate == gongwei && m.Type == PLCTypeEnum.ConveyorLine); |
| | | if (convarTask != null) |
| | | { |
| | | continue;//放货工位有任务 |
| | | } |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | } |
| | | else if (waitTask.TaskType == TaskTypeEnum.Move) |
| | | { |
| | | taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2)); |
| | | starLocate = waitTask.StartLocate; |
| | | endLocate = waitTask.EndLocate; |
| | | } |
| | | else |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | #region 获取当前任务所在层所有空闲小车 |
| | | |
| | |
| | | { |
| | | var carVal = ((int)valuex).ToString().PadLeft(2, '0') + ((int)valuey).ToString().PadLeft(2, '0') + ((int)valuez).ToString().PadLeft(2, '0'); |
| | | //小车到取货储位路径 |
| | | var d = FourWayCarUtil.GetCarPath(carVal, waitTask.StartLocate); |
| | | var d = FourWayCarUtil.GetCarPath(carVal, starLocate); |
| | | kXCarList.Add(new CarInfo() |
| | | { |
| | | CarPlcIp = modbusUtil.PlcIP, |
| | |
| | | //判断小车位置是否与任务的起始储位相同,不相同:获取小车到取货储位路径 |
| | | var carLocate = assignCar.X.ToString().PadLeft(2, '0')+assignCar.Y.ToString().PadLeft(2, '0')+ assignCar.Z.ToString().PadLeft(2, '0'); |
| | | //获取小车去取货储位任务路径 |
| | | var data1 = FourWayCarUtil.GetCarPath(carLocate, waitTask.StartLocate); |
| | | var data1 = FourWayCarUtil.GetCarPath(carLocate, starLocate); |
| | | var datas1 = FourWayCarUtil.GetCarPathUp(data1, 0); |
| | | if (datas1 == null) |
| | | { |
| | |
| | | typeStr2 = 0; |
| | | } |
| | | //获取小车去放货储位任务路径 |
| | | var data2 = FourWayCarUtil.GetCarPath(waitTask.StartLocate, waitTask.EndLocate, typeStr); |
| | | var data2 = FourWayCarUtil.GetCarPath(starLocate, endLocate, typeStr); |
| | | var datas2 = FourWayCarUtil.GetCarPathUp(data2, typeStr2); |
| | | |
| | | if (datas2 == null) |
| | |
| | | modTask.IsSuccess = TaskSuccessEnum.Fail; |
| | | modTask.CancelDate = DateTime.Now;//取消时间 |
| | | } |
| | | //如果是四向车任务 |
| | | if (modTask.Type == PLCTypeEnum.ShuttleCar) |
| | | { |
| | | var carTaskList = _db.Queryable<WcsCarTasks>().Where(m => m.Status <= TaskStatusEnum.Doing && m.IsDelete == false).ToList(); |
| | | foreach (var carTask in carTaskList) |
| | | { |
| | | carTask.Status = input.Status; |
| | | } |
| | | await _wcsTaskRep.Context.Updateable(carTaskList).ExecuteCommandAsync(); |
| | | } |
| | | modTask.Status = input.Status; |
| | | modTask.Levels = 999; |
| | | await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Status, s.IsSuccess, s.FinishDate, s.CancelDate, s.UpdateTime, s.UpdateUserId, s.UpdateUserName }).ExecuteCommandAsync(); |
| | |
| | | private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId); |
| | | private static readonly SysCacheService sysCacheService = App.GetRequiredService<SysCacheService>(); |
| | | private static readonly SysConfigService _sysConfigService = App.GetRequiredService<SysConfigService>(); |
| | | private static List<string[]> listStorage = new List<string[]>(); |
| | | private static string[] listPallet = new[] { "cache_Z53", "cache_Z52", "cache_Z51" }; |
| | | |
| | | static AGVStorageUtil() |
| | | { |
| | | listStorage.Add(new[] { "cache_Z11", "cache_Z12", "cache_Z13" }); |
| | | listStorage.Add(new[] { "cache_Z21", "cache_Z22", "cache_Z23" }); |
| | | listStorage.Add(new[] { "cache_Z31", "cache_Z32", "cache_Z33" }); |
| | | listStorage.Add(new[] { "cache_Z41", "cache_Z42", "cache_Z43" }); |
| | | } |
| | | /// <summary> |
| | | /// 获取成品数量 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static int ProductCount() |
| | | { |
| | | int i = 0; |
| | | foreach (var item in listStorage) |
| | | { |
| | | foreach (var mod in item.Reverse()) |
| | | { |
| | | var value = _sysConfigService.GetConfigValue<bool>(mod).Result; |
| | | if (value) |
| | | i++; |
| | | } |
| | | } |
| | | return i; |
| | | } |
| | | /// <summary> |
| | | /// 获取成品要入的储位 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static string GetProductInStorage(string TaskNo = "") |
| | | { |
| | | List<string> listResult = new List<string>(); |
| | | foreach (var item in listStorage) |
| | | { |
| | | List<string> listItem = new List<string>(); |
| | | foreach (var mod in item.Reverse()) |
| | | { |
| | | var value = _sysConfigService.GetConfigValue<bool>(mod).Result; |
| | | if (!value) |
| | | listItem.Add(mod.Split('_')[1]); |
| | | else |
| | | break; |
| | | } |
| | | listResult.AddRange(listItem.AsEnumerable().Reverse()); |
| | | } |
| | | //检查是否有正在入的任务 |
| | | foreach (var result in listResult) |
| | | { |
| | | if (!_db.Queryable<WcsTask>().Where(s => s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing && s.EndLocate == result && s.TaskNo != TaskNo).Any()) |
| | | return result; |
| | | } |
| | | return ""; |
| | | //Log.Error("无可入的储位"); |
| | | //throw Oops.Bah("无可入的储位"); |
| | | } |
| | | /// <summary> |
| | | /// 获取成品要出的储位 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static string GetProductOutStorage() |
| | | { |
| | | foreach (var item in listStorage.AsEnumerable().Reverse()) |
| | | { |
| | | foreach (var mod in item.Reverse()) |
| | | { |
| | | var value = _sysConfigService.GetConfigValue<bool>(mod).Result; |
| | | if (value) |
| | | return mod.Split('_')[1]; |
| | | } |
| | | } |
| | | return ""; |
| | | //Log.Error("无可出的储位"); |
| | | //throw Oops.Bah("无可出的储位"); |
| | | } |
| | | /// <summary> |
| | | /// 获取托盘要入的储位 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static string GetPalletInStorage(string TaskNo = "") |
| | | { |
| | | List<string> listResult = new List<string>(); |
| | | foreach (var item in listPallet) |
| | | { |
| | | var value = _sysConfigService.GetConfigValue<bool>(item).Result; |
| | | if (!value) |
| | | listResult.Add(item.Split('_')[1]); |
| | | else |
| | | break; |
| | | } |
| | | //检查是否有正在入的任务 |
| | | foreach (var result in listResult.AsEnumerable().Reverse()) |
| | | { |
| | | if (!_db.Queryable<WcsTask>().Where(s => s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing && s.EndLocate == result && s.TaskNo != TaskNo).Any()) |
| | | return result; |
| | | } |
| | | return ""; |
| | | //Log.Error("无可入的储位"); |
| | | //throw Oops.Bah("无可入的储位"); |
| | | } |
| | | /// <summary> |
| | | /// 获取托盘要出的储位 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static string GetPalletOutStorage() |
| | | { |
| | | foreach (var item in listPallet) |
| | | { |
| | | var value = _sysConfigService.GetConfigValue<bool>(item).Result; |
| | | if (value) |
| | | return item.Split('_')[1]; |
| | | } |
| | | return ""; |
| | | //Log.Error("无可出的储位"); |
| | | //throw Oops.Bah("无可出的储位"); |
| | | } |
| | | |
| | | #region 属性 |
| | | public static string GetTaskModle(string straLocate,string endLocate,out string type1,out string type2,out string jiebo) |
| | | { |
| | | type1 = ""; |
| | | type2 = ""; |
| | | jiebo = ""; |
| | | var locate1 = _db.Queryable<WcsStorageLocat>().First(m => m.IsDelete == false && m.LocatNo == straLocate); |
| | | var locate2 = _db.Queryable<WcsStorageLocat>().First(m => m.IsDelete == false && m.LocatNo == endLocate); |
| | | if (locate1 == null || locate2 == null) |
| | | { |
| | | return ""; |
| | | } |
| | | switch (locate1.WareHouseNo) |
| | | { |
| | | case "W02": |
| | | type1 = "SITE"; |
| | | break; |
| | | case "W04": |
| | | type1 = "STORAGE"; |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | public static bool Z11 |
| | | switch (locate2.WareHouseNo) |
| | | { |
| | | get |
| | | case "W02": |
| | | type2 = "SITE"; |
| | | break; |
| | | case "W04": |
| | | type2 = "STORAGE"; |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | var Area1002 = new List<string>() { "",""};//1002车间区域 |
| | | var Area1003 = new List<string>() { "",""};//1003车间区域 |
| | | if (Area1002.Contains(locate2.AreaNo)) |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z11").Result; |
| | | jiebo = "1JB";//接驳位 |
| | | } |
| | | set |
| | | if (Area1003.Contains(locate2.AreaNo)) |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z11", value); |
| | | jiebo = "2JB"; |
| | | } |
| | | } |
| | | public static bool Z12 |
| | | if (type1 == "" || type2 == "") |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z12").Result; |
| | | return ""; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z12", value); |
| | | return "CJ1"; |
| | | } |
| | | } |
| | | public static bool Z13 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z13").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z13", value); |
| | | } |
| | | } |
| | | public static bool Z21 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z21").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z21", value); |
| | | } |
| | | } |
| | | public static bool Z22 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z22").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z22", value); |
| | | } |
| | | } |
| | | public static bool Z23 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z23").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z23", value); |
| | | } |
| | | } |
| | | public static bool Z31 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z31").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z31", value); |
| | | } |
| | | } |
| | | public static bool Z32 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z32").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z32", value); |
| | | } |
| | | } |
| | | public static bool Z33 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z33").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z33", value); |
| | | } |
| | | } |
| | | public static bool Z41 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z41").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z41", value); |
| | | } |
| | | } |
| | | public static bool Z42 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z42").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z42", value); |
| | | } |
| | | } |
| | | public static bool Z43 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z43").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z43", value); |
| | | } |
| | | } |
| | | public static bool Z51 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z51").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z51", value); |
| | | } |
| | | } |
| | | public static bool Z52 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z52").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z52", value); |
| | | } |
| | | } |
| | | public static bool Z53 |
| | | { |
| | | get |
| | | { |
| | | return _sysConfigService.GetConfigValue<bool>("cache_Z53").Result; |
| | | } |
| | | set |
| | | { |
| | | _sysConfigService.UpdateConfigValue("cache_Z53", value); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | } |
| | |
| | | using Furion.Logging; |
| | | using Furion.RemoteRequest.Extensions; |
| | | using Newtonsoft.Json; |
| | | using System.Net.Http.Headers; |
| | | using System.Reflection.PortableExecutable; |
| | | using System.Text; |
| | | using WCS.Application.Entity; |
| | | using WCS.Application.Util; |
| | | using static SKIT.FlurlHttpClient.Wechat.Api.Models.ComponentTCBBatchCreateContainerServiceVersionResponse.Types; |
| | | |
| | | namespace WCS.Application; |
| | |
| | | private dynamic Urls; |
| | | |
| | | private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId); |
| | | private static Dictionary<string, string> dicConverCar = new Dictionary<string, string>(); |
| | | public HttpService() |
| | | { |
| | | var _sysConfigService = App.GetService<SysConfigService>(); |
| | | Urls = _sysConfigService.GetSystemInfo().Result; |
| | | dicConverCar = new Dictionary<string, string> |
| | | { |
| | | {"013","190601"}, |
| | | {"014","191201"}, |
| | | {"015","190602"}, |
| | | {"016","191202"}, |
| | | |
| | | {"002","030401"}, |
| | | {"006","030402"}, |
| | | {"003","030601"}, |
| | | {"007","030602"}, |
| | | {"005","031201"}, |
| | | {"008","031202"}, |
| | | }; |
| | | } |
| | | |
| | | |
| | |
| | | /// </summary> |
| | | /// <param name="palletNo"></param> |
| | | /// <param name="startLocat"></param> |
| | | /// <param name="taskModel"></param> |
| | | /// <param name="ceng"></param> |
| | | /// <param name="endLocat"></param> |
| | | /// <param name="taskNo"></param> |
| | | /// <returns></returns> |
| | | public string RequestRoadWay(string palletNo, string startLocat, string taskModel, string ceng, ref string endLocat, ref string taskNo) |
| | | public string RequestRoadWay(string palletNo, string startLocat, ref string endLocat, ref string taskNo) |
| | | { |
| | | string returnStr = ""; |
| | | |
| | | var stationNum = startLocat.PadLeft(3, '0'); |
| | | |
| | | var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo); |
| | | |
| | |
| | | var model = new RequestAsnTask() |
| | | { |
| | | PalletNo = palletNo, |
| | | HouseNo = "W01", |
| | | TaskModel = taskModel |
| | | HouseNo = "W01" |
| | | }; |
| | | |
| | | string url = Urls.WMSAddress + ":" + Urls.WMSPort; |
| | | var result = (url + "/api/DownAPi/RequestRoadWay").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result; |
| | | var result = (url + "/api/DownAPi/RequestMiJiRoadWay").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result; |
| | | Log.Information("调用WMS接口反馈任务接口" + result.ToJson()); |
| | | if (result.Success == 0) |
| | | { |
| | |
| | | { |
| | | TaskType = TaskTypeEnum.In, |
| | | Status = TaskStatusEnum.Wait, |
| | | Type = PLCTypeEnum.ConveyorLine, |
| | | Origin = "WMS", |
| | | StartLocate = startLocat, |
| | | PalletNo = palletNo, |
| | |
| | | EndRoadway = result.TaskList.EndRoadway |
| | | }; |
| | | |
| | | var endLocat2 = PLCCommon.RoadwayToStationNum(taskAdd.EndRoadway, stationNum); |
| | | taskAdd.StartRoadway = dicConverCar[endLocat2]; |
| | | _db.Insertable(taskAdd).ExecuteCommand(); |
| | | endLocat = result.TaskList.EndRoadway; |
| | | taskNo = result.TaskList.TaskNo; |
| | |
| | | taskNo = task.TaskNo; |
| | | } |
| | | |
| | | endLocat = PLCCommon.RoadwayToStationNum(endLocat, ceng); |
| | | endLocat = PLCCommon.RoadwayToStationNum(endLocat, stationNum); |
| | | |
| | | return returnStr; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 调用WMS接口自动码垛绑定信息返回巷道口 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public string BindRequestRoadWay(string orderNo, string palletNo, decimal qty, string type, string skuNo, string lotNo, string lotText, string supplierLot, List<WcsBoxInfo> detail, |
| | | string startLocat, string taskModel, string ceng, ref string endLocat, ref string taskNo) |
| | | { |
| | | string returnStr = ""; |
| | | |
| | | var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo); |
| | | if (task == null) |
| | | { |
| | | var model = new BoxPalletBindVm() |
| | | { |
| | | OrderCode = "",//暂无上游系统编号 |
| | | AsnNo = orderNo, |
| | | AsnDetailNo = 0,//暂无入库单明细编号,WMS根据物料批次查找 |
| | | PalletNo = palletNo, |
| | | Qty = qty, |
| | | Type = type, |
| | | SkuNo = skuNo, |
| | | LotNo = lotNo, |
| | | LotText = lotText, |
| | | SupplierLot = supplierLot, |
| | | Detail = detail |
| | | }; |
| | | string url = Urls.WMSAddress + ":" + Urls.WMSPort; |
| | | var result = (url + "/api/DownAPi/BindRequestRoadWay").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result; |
| | | Log.Information("调用WMS接口反馈任务接口" + result.ToJson()); |
| | | if (result.Success == 0) |
| | | { |
| | | var taskAdd = new WcsTask() |
| | | { |
| | | TaskType = TaskTypeEnum.In, |
| | | Status = TaskStatusEnum.Wait, |
| | | Origin = "WMS", |
| | | StartLocate = startLocat, |
| | | PalletNo = palletNo, |
| | | TaskNo = result.TaskList.TaskNo, |
| | | EndLocate = result.TaskList.EndLocate, |
| | | EndRoadway = result.TaskList.EndRoadway |
| | | }; |
| | | |
| | | _db.Insertable(taskAdd).ExecuteCommand(); |
| | | endLocat = result.TaskList.EndRoadway; |
| | | returnStr = result.TaskList.EndLocate; |
| | | } |
| | | else |
| | | { |
| | | returnStr = "-1:" + result.Message; |
| | | return returnStr; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | returnStr = task.EndLocate; |
| | | endLocat = task.EndRoadway; |
| | | taskNo = task.TaskNo; |
| | | } |
| | | |
| | | endLocat = PLCCommon.RoadwayToStationNum(endLocat, ceng); |
| | | |
| | | return returnStr; |
| | | } |
| | | /// <summary> |
| | | /// 调用WMS接口申请储位接口 |
| | | /// </summary> |
| | | /// <param name="palletNo"></param> |
| | | /// <param name="startLocat"></param> |
| | | /// <param name="taskModel"></param> |
| | | /// <param name="starRoadWay"></param> |
| | | /// <param name="taskId"></param> |
| | | /// <param name="taskNo"></param> |
| | | /// <returns></returns> |
| | | public string RequestLocate(string palletNo, string startLocat, string taskModel, string starRoadWay, ref string taskNo) |
| | | public string RequestLocate(string palletNo, int taskId,ref string taskNo) |
| | | { |
| | | string returnStr = ""; |
| | | |
| | | |
| | | var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false |
| | | && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) |
| | | && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo && !string.IsNullOrWhiteSpace(m.EndLocate)); |
| | | && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo && m.TaskId == taskId); |
| | | |
| | | if (task == null) |
| | | if (task != null) |
| | | { |
| | | var model = new RequestAsnTask() |
| | | { |
| | | PalletNo = palletNo, |
| | | HouseNo = "W01", |
| | | RoadWayNo = starRoadWay, |
| | | TaskModel = taskModel |
| | | RoadWayNo = task.EndRoadway, |
| | | }; |
| | | |
| | | string url = Urls.WMSAddress + ":" + Urls.WMSPort; |
| | | var result = (url + "/api/DownAPi/RequestLocation").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result; |
| | | var result = (url + "/api/DownAPi/RequestMiJiLocation").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result; |
| | | Log.Information("调用WMS申请储位接口反馈任务接口" + result.ToJson()); |
| | | if (result.Success == 0) |
| | | { |
| | | var taskUp = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.TaskNo == result.TaskList.TaskNo); |
| | | if (taskUp == null) |
| | | { |
| | | var taskAdd = new WcsTask() |
| | | { |
| | | TaskNo = result.TaskList.TaskNo, |
| | | TaskType = TaskTypeEnum.In, |
| | | Status = TaskStatusEnum.Wait, |
| | | //IsSuccess =TaskSuccessEnum.Success, |
| | | Origin = "WMS", |
| | | StartLocate = startLocat, |
| | | PalletNo = palletNo, |
| | | EndLocate = result.TaskList.EndLocate, |
| | | EndRoadway = result.TaskList.EndRoadway |
| | | }; |
| | | _db.Insertable(taskAdd).ExecuteCommand(); |
| | | HubUtil.PublicTask(taskAdd.Adapt<WcsTaskOutput>()); |
| | | } |
| | | else |
| | | { |
| | | taskUp.EndRoadway = result.TaskList.EndRoadway; |
| | | taskUp.EndLocate = result.TaskList.EndLocate; |
| | | _db.Updateable(taskUp).ExecuteCommand(); |
| | | HubUtil.PublicTask(taskUp.Adapt<WcsTaskOutput>()); |
| | | } |
| | | |
| | | task.Status = TaskStatusEnum.Wait; |
| | | task.Type = PLCTypeEnum.ShuttleCar; |
| | | task.EndLocate = result.TaskList.EndLocate; |
| | | _db.Updateable(task).ExecuteCommand(); |
| | | HubUtil.PublicTask(task.Adapt<WcsTaskOutput>()); |
| | | |
| | | returnStr = result.TaskList.EndLocate; |
| | | taskNo = result.TaskList.TaskNo; |
| | |
| | | } |
| | | else |
| | | { |
| | | returnStr = task.EndLocate; |
| | | taskNo = task.TaskNo; |
| | | returnStr = "-1:没有找到任务"; |
| | | } |
| | | |
| | | return returnStr; |
| | |
| | | /// </summary> |
| | | /// <param name="mod"></param> |
| | | /// <returns></returns> |
| | | public async Task<AgvResponse> GenAgvSchedulingTask(AgvTaskInput mod) |
| | | public async Task<ResponseAgvDto> GenAgvSendTask(AgvTaskSend mod) |
| | | { |
| | | string url = Urls.RCSAddress + ":" + Urls.RCSPort; |
| | | var result = await (url + "/rcms/services/rest/hikRpcService/genAgvSchedulingTask").SetBody(mod, "application/json", Encoding.UTF8).PostAsAsync<AgvResponse>(); |
| | | string url = Urls.RCSAddress + "/rcs/rtas/api/robot/controller/task/submit"; |
| | | var requestId = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString(); |
| | | var dic = new Dictionary<string, string>() |
| | | { |
| | | {"X-lr-request-id",requestId }, |
| | | {"X-lr-version","4.2" }, |
| | | }; |
| | | |
| | | var result = await url.SetHeaders(dic).SetBody(mod, "application/json", Encoding.UTF8).PostAsAsync<ResponseAgvDto>(); |
| | | Log.Information("调用AGV小车接口下发任务" + result.ToJson()); |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 调用AGV小车接口继续执行任务 |
| | | /// </summary> |
| | | /// <param name="taskNo">任务号</param> |
| | | /// <returns></returns> |
| | | public async Task<ResponseAgvDto> GenAgvContinueTask(string taskNo) |
| | | { |
| | | |
| | | |
| | | string url = Urls.RCSAddress + "/rcs/rtas/api/robot/controller/task/continue"; |
| | | var requestId = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString(); |
| | | var dic = new Dictionary<string, object>() |
| | | { |
| | | {"X-lr-request-id","123456879" }, |
| | | {"X-lr-version","4.2" }, |
| | | }; |
| | | var mod = new |
| | | { |
| | | robotTaskCode = taskNo |
| | | }; |
| | | |
| | | var result = await url.SetHeaders(dic).SetBody(mod, "application/json", Encoding.UTF8).PostAsAsync<ResponseAgvDto>(); |
| | | Log.Information("调用AGV小车接口继续执行任务" + result.ToJson()); |
| | | return null; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 调用AGV小车接口 载具(托盘)与站点(储位)解绑定接口 |
| | | /// </summary> |
| | | /// <param name="palletNo">托盘号</param> |
| | | /// <param name="locateNo">储位号</param> |
| | | /// <returns></returns> |
| | | public async Task<ResponseAgvDto> GenAgvUnbind(string palletNo,string locateNo) |
| | | { |
| | | |
| | | |
| | | string url = Urls.RCSAddress + "/rcs/rtas/api/robot/controller/carrier/unbind"; |
| | | var requestId = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString(); |
| | | var dic = new Dictionary<string, string>() |
| | | { |
| | | {"X-lr-request-id",requestId }, |
| | | {"X-lr-version","4.2" }, |
| | | }; |
| | | var mod = new |
| | | { |
| | | carrierCode = palletNo, |
| | | siteCode = locateNo |
| | | }; |
| | | |
| | | var result = await url.SetHeaders(dic).SetBody(mod, "application/json", Encoding.UTF8).PostAsAsync<ResponseAgvDto>(); |
| | | Log.Information("调用AGV小车接口继续执行任务" + result.ToJson()); |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 调用AGV小车接口反馈开门成功 |
| | | /// </summary> |
| | | /// <param name="mod"></param> |