| | |
| | | using HH.WCS.JiaTong.core; |
| | | using HH.WCS.JiaTong.device; |
| | | using HH.WCS.JiaTong.dispatch; |
| | | using HH.WCS.JiaTong.LISTA.models; |
| | | using HH.WCS.JiaTong.LISTA.process; |
| | | using HH.WCS.JiaTong.util; |
| | | using HH.WCS.JiaTong.wms; |
| | | using Microsoft.Owin.BuilderProperties; |
| | | using Newtonsoft.Json; |
| | | using Newtonsoft.Json.Linq; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Diagnostics.Eventing.Reader; |
| | | using System.IdentityModel.Protocols.WSTrust; |
| | | using System.Linq; |
| | | using System.Net.NetworkInformation; |
| | | using System.Security.Cryptography; |
| | | using System.Threading; |
| | | using System.Threading.Tasks; |
| | |
| | | else |
| | | { |
| | | LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位"); |
| | | LocationHelper.UnlockLoc(mst.S_START_LOC); |
| | | LocationHelper.UnlockLocDeleteCntrs(mst.S_START_LOC); |
| | | } |
| | | } |
| | | else |
| | |
| | | |
| | | if (!string.IsNullOrEmpty(mst.S_CNTR_CODE)) |
| | | { |
| | | LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | | LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); |
| | | LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList()); |
| | | } |
| | | else |
| | |
| | | { |
| | | //根据客户现场要求,如果取货完成任务失败人工拉到终点,我们就当卸货完成处理;如果是人工拉走到其它区域,我们就解锁终点,删除托盘。 |
| | | //终点绑定 |
| | | //物料到位通知 |
| | | if (mst.S_TYPE == "出平库" || mst.S_TYPE == "余料返回") |
| | | { |
| | | string urlitem = Settings.tableUrls.Find(a => a.id == 5).url; |
| | | TaskProcess.MESIteminfoback(mst, urlitem); |
| | | } |
| | | if ((mst.S_NOTE == "出库" || mst.S_NOTE == "异常库区入库") && !string.IsNullOrEmpty(mst.S_MES_NO)) |
| | | { |
| | | string urlitem = Settings.tableUrls.Find(a => a.id == 5).url; |
| | | TaskProcess.MESIteminfoback(mst, urlitem); |
| | | } |
| | | CacheBitUpdate(mst, false); |
| | | LocationHelper.UnLockLoc(mst.S_END_LOC); |
| | | } |
| | | else |
| | | { |
| | | |
| | | //起点终点解锁 |
| | | LocationHelper.UnLockLoc(mst.S_START_LOC); |
| | | LocationHelper.UnLockLoc(mst.S_END_LOC); |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// <param name="model">请求参数</param> |
| | | /// <param name="url">地址</param> |
| | | /// <param name="TN_Task">任务</param> |
| | | internal static void OperateReq(AgvTaskState model, string url, WCSTask TN_Task) |
| | | internal static void OperateReq(AgvTaskState model, string url, WCSTask TN_Task, string name) |
| | | { |
| | | try |
| | | { |
| | |
| | | } |
| | | else |
| | | { |
| | | ModbusHelper.WriteSingleRegister(40089, EndLoc.N_LAYER, device.address, 1024); |
| | | int layerValue = 0; |
| | | if (EndLoc.N_LAYER == 1) layerValue = 1; |
| | | else if (EndLoc.N_LAYER == 2) layerValue = 3; |
| | | else if (EndLoc.N_LAYER == 3) layerValue = 5; |
| | | ModbusHelper.WriteSingleRegister(40089, layerValue, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40101, 2, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40003, 2, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024); |
| | |
| | | } |
| | | else |
| | | { |
| | | if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state)) |
| | | if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name)) |
| | | { |
| | | // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18); |
| | | NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); |
| | |
| | | if (Device != null) |
| | | { |
| | | //写入失败重新写入 |
| | | while (!S7Helper.WriteDpj(Device.address, 1001, 1)) |
| | | if (!S7Helper.WriteDpj(Device.address, 1001, 1)) |
| | | { |
| | | Thread.Sleep(1000); |
| | | Task.Run(() => |
| | | { |
| | | while (!S7Helper.WriteDpj(Device.address, 1001, 1)) |
| | | { |
| | | Thread.Sleep(1000); |
| | | } |
| | | }); |
| | | } |
| | | while (!S7Helper.WriteDpj(Device.address, 1002, 0)) |
| | | if (!S7Helper.WriteDpj(Device.address, 1002, 0)) |
| | | { |
| | | Thread.Sleep(1000); |
| | | Task.Run(() => |
| | | { |
| | | while (!S7Helper.WriteDpj(Device.address, 1002, 0)) |
| | | { |
| | | Thread.Sleep(1000); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | else |
| | |
| | | } |
| | | else |
| | | { |
| | | int layerValue = 0; |
| | | if (startloc.N_LAYER == 1) layerValue = 1; |
| | | else if (startloc.N_LAYER == 2) layerValue = 3; |
| | | else if (startloc.N_LAYER == 3) layerValue = 5; |
| | | ModbusHelper.WriteSingleRegister(40101, 2, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40003, 2, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40089, startloc.N_LAYER, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40089, layerValue, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024); |
| | | } |
| | | |
| | |
| | | } |
| | | else |
| | | { |
| | | if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state)) |
| | | if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name)) |
| | | { |
| | | NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); |
| | | } |
| | |
| | | { |
| | | LogHelper.Info($"根据任务终点:{mstbyEqno.S_END_LOC},未找到对应货位"); |
| | | } |
| | | ModbusHelper.WriteSingleRegister(40089, Endloc.N_LAYER, device.address, 1024); |
| | | int value = 0; |
| | | if (Endloc.N_LAYER == 1) value = 1; |
| | | else if (Endloc.N_LAYER == 2) value = 3; |
| | | else if (Endloc.N_LAYER == 3) value = 5; |
| | | ModbusHelper.WriteSingleRegister(40089, value, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024); |
| | | |
| | | } |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | LogHelper.Info($"OperateReq Error ==》{ex.ToString()}"); |
| | | } |
| | | |
| | |
| | | /// <param name="type"></param> |
| | | /// <param name="taskStatus"></param> |
| | | /// <returns></returns> |
| | | internal static bool OperateReqByPost(string url, string tasknum, string ordernum, string station, int type, int taskStatus) |
| | | internal static bool OperateReqByPost(string url, string tasknum, string ordernum, string station, int type, int taskStatus, string name) |
| | | { |
| | | bool permit = false; |
| | | try |
| | |
| | | LogHelper.Info($"安全请求失败=>msg:{result.msg}"); |
| | | ApiHelper.AddErrorInfo("安全交互失败", result.msg, "", tasknum); |
| | | } |
| | | ApiHelper.AddInfo(name, "安全请求", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | return permit; |
| | | } |
| | | catch (Exception) |
| | |
| | | LogHelper.Info($"安全请求失败=>msg:{result.err_msg}"); |
| | | ApiHelper.AddErrorInfo("安全交互失败", result.err_msg, "", no); |
| | | } |
| | | ApiHelper.AddInfo("YCL", "安全请求", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | return permit; |
| | | } |
| | | catch (Exception) |
| | |
| | | { |
| | | var result = true; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | //根据起点仓库编码判断是否可以推送 |
| | | var taskLimit = db.Queryable<TASK_LIMIT>().Where(a => a.S_WH_CODE == mst.S_START_WH && a.OPEN == "1").First(); |
| | | if (taskLimit != null) |
| | | { |
| | | Console.WriteLine($"任务:{mst.S_CODE},起点仓库:{mst.S_START_WH}已经禁用推送"); |
| | | return false; |
| | | } |
| | | |
| | | var mstbyEqno = db.Queryable<WCSTask>().Where(a => a.S_EQ_NO == mst.S_EQ_NO).ToList(); |
| | | if (mstbyEqno.Count() == 1) |
| | | { |
| | |
| | | else if (mst.S_TYPE == "电梯2") |
| | | { |
| | | var mst2 = mstbyEqno.Where(a => a.S_TYPE == "电梯1").First(); |
| | | if (mst2.S_B_STATE == "卸货完成" || mst2.S_B_STATE == "完成") |
| | | if (mst2 == null) |
| | | { |
| | | return result; |
| | | } |
| | | else |
| | | { |
| | | if (mst2.S_B_STATE == "卸货完成" || mst2.S_B_STATE == "完成") |
| | | { |
| | | return result; |
| | | } |
| | | result = false; |
| | | } |
| | | } |
| | |
| | | internal static bool SendTask(WCSTask mst) |
| | | { |
| | | |
| | | |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var result = false; |
| | | var start = "0"; var end = "0"; |
| | | var taskType = mst.S_TYPE.Trim(); |
| | | var list = db.Queryable<Location>().ToList().Count; |
| | | |
| | | // if (mst.N_B_STATE == 0) { |
| | | if (mst.N_SCHEDULE_TYPE == 1) |
| | | { |
| | | LogHelper.Info($"任务推送数据:{JsonConvert.SerializeObject(mst)}"); |
| | | if (string.IsNullOrEmpty(mst.S_START_LOC) || string.IsNullOrEmpty(mst.S_END_LOC)) |
| | | { |
| | | LogHelper.Info($"任务{mst.S_CODE},起点终点有空参数,不推送任务"); |
| | | } |
| | | |
| | | |
| | | start = LocationHelper.GetAgvSite(mst.S_START_LOC); |
| | | end = LocationHelper.GetAgvSite(mst.S_END_LOC); |
| | | //if (mst.N_START_LAYER > 1) |
| | |
| | | { |
| | | LogHelper.Info($"根据任务起点:{mst.S_START_LOC},未找到对应货位"); |
| | | } |
| | | ModbusHelper.WriteSingleRegister(40089, loc.N_LAYER, device.address, 1024); |
| | | int value = 0; |
| | | if (loc.N_LAYER == 1) value = 1; |
| | | else if (loc.N_LAYER == 2) value = 3; |
| | | else if (loc.N_LAYER == 3) value = 5; |
| | | |
| | | ModbusHelper.WriteSingleRegister(40089, value, device.address, 1024); |
| | | ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024); |
| | | |
| | | |
| | |
| | | // } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 空托等待任务 超时5分组直接推送 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <returns></returns> |
| | | internal static void WaitSend(WCSTask mst) |
| | | { |
| | | // 计算与当前时间的差值 |
| | | TimeSpan timeDifference = DateTime.Now - mst.T_CREATE; |
| | | if (timeDifference.TotalMinutes > 5) |
| | | { |
| | | var db = new SqlHelper<WCSTask>().GetInstance(); |
| | | mst.S_B_STATE = "等待"; |
| | | db.Updateable(mst).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand(); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 任务状态回报 |
| | | /// </summary> |
| | |
| | | /// <param name="orderNum">单号</param> |
| | | /// <param name="taskStatus">任务状态</param> |
| | | /// <param name="url">上报接口</param> |
| | | public static void Reportback(string taskNum, string orderNum, int taskStatus, string url) |
| | | public static void Reportback(string taskNum, string orderNum, int taskStatus, string url, string ly) |
| | | { |
| | | LogHelper.Info($"------------开始任务回报-----------"); |
| | | try |
| | |
| | | { |
| | | LogHelper.Info($"任务回报失败=>msg:{result.msg}"); |
| | | } |
| | | ApiHelper.AddInfo(ly, "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | { |
| | | LogHelper.Info($"任务回报失败="); |
| | | } |
| | | ApiHelper.AddInfo("Wms", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | { |
| | | LogHelper.Info($"任务回报失败=>msg:{result.err_msg}"); |
| | | } |
| | | ApiHelper.AddInfo("YCL", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | //获取时间戳 |
| | | var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); |
| | | statusarrive.RequestId = "杭叉AGV" + time; |
| | | |
| | | string info = ""; |
| | | switch (status) |
| | | { |
| | | case 1: |
| | | info = "agv已接受原料库下发的任务"; |
| | | break; |
| | | case 4: |
| | | info = "agv已取货完成"; |
| | | break; |
| | | case 6: |
| | | info = "agv已卸货到指定位置"; |
| | | break; |
| | | case 2: |
| | | info = "agv已完成送料任务"; |
| | | break; |
| | | } |
| | | string message = "1"; |
| | | if (status == 7) { message = "agv任务已取消"; } |
| | | int flag = 0; |
| | | if (mst.S_NOTE == "粉料") |
| | | { |
| | | flag = 1; |
| | | } |
| | | //List<StatusArrive> statusArrives = new List<StatusArrive>(); |
| | | StatusArrive statusArrive = new StatusArrive(); |
| | | statusarrive.UseToken = "iFQ5fExGrLYLXliHYWzs"; |
| | |
| | | statusArrive.LocationNum = mst.S_END_LOC; |
| | | statusArrive.Time = DateTime.Now.ToString(); |
| | | statusArrive.Status = status.ToString(); |
| | | |
| | | statusArrive.Rfid = mst.S_CNTR_CODE; |
| | | statusArrive.Flag = flag; |
| | | statusArrive.Info = info; |
| | | statusArrive.Message = message; |
| | | |
| | | //statusArrives.Add(statusArrive); |
| | | statusarrive.data = statusArrive; |
| | | //开始回报 |
| | |
| | | { |
| | | LogHelper.Info($"任务回报失败=>msg:{result.imsg}"); |
| | | } |
| | | ApiHelper.AddInfo("Mes", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | //粉料回库不需要回报 |
| | | if (cntritem != null && mst.S_TYPE == "余料返回" && cntritem.S_ITEM_CODE.StartsWith("4X")) |
| | | { |
| | | LogHelper.Info("粉料回库不需要到位发送物料到位"); |
| | | return; |
| | | } |
| | | //获取时间戳 |
| | |
| | | mesItemBackModel.Rfid = mst.S_CNTR_CODE; |
| | | mesItemBackModel.LocationNum = mst.S_END_LOC; |
| | | mesItemBackModel.Result = "1"; |
| | | mesItemBackModel.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd"); |
| | | mesItemBackModel.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); |
| | | |
| | | if (cntritem != null) |
| | | { |
| | | string curBagNum = null; |
| | | string weightBag = null; |
| | | string initBagNum = null; |
| | | if ((int)cntritem.F_QTY > 0) |
| | | { |
| | | curBagNum = cntritem.F_QTY.ToString(); |
| | | } |
| | | if (!string.IsNullOrEmpty(cntritem.F_WEIGHT1) && int.Parse(cntritem.F_WEIGHT1) > 0) |
| | | { |
| | | weightBag = cntritem.F_WEIGHT1; |
| | | } |
| | | if (!string.IsNullOrEmpty(cntritem.F_QTY1) && int.Parse(cntritem.F_QTY1) > 0) |
| | | { |
| | | initBagNum = cntritem.F_QTY1; |
| | | } |
| | | list.Add(new MesItemBackInfoModel() |
| | | { |
| | | |
| | | LotNumber = cntritem.S_BATCH_NO, |
| | | PartNumber = cntritem.S_ITEM_CODE, |
| | | Subpool = cntritem.Subpool, |
| | |
| | | Rfid = cntritem.S_CNTR_CODE, |
| | | Qty = cntritem.F_WEIGHT, |
| | | PartLevel = cntritem.LEV, |
| | | WmsLot = cntritem.WmsLot |
| | | WmsLot = cntritem.WmsLot, |
| | | WeightBag = weightBag, |
| | | CurBagNum = curBagNum, |
| | | InitBagNum = initBagNum |
| | | }); |
| | | |
| | | |
| | |
| | | { |
| | | LogHelper.Info($"物料到位回报失败=>msg:{result.imsg}"); |
| | | } |
| | | ApiHelper.AddInfo("Mes", "物料到位回报", date, JsonConvert.SerializeObject(result), "Post", url); |
| | | } |
| | | catch (Exception ex) |
| | | { |