| | |
| | | using HH.WCS.JiaTong.api; |
| | | using HH.WCS.JiaTong.core; |
| | | using HH.WCS.JiaTong.device; |
| | | using HH.WCS.JiaTong.dispatch; |
| | | using HH.WCS.JiaTong.LISTA.process; |
| | | using HH.WCS.JiaTong.util; |
| | |
| | | using System.IdentityModel.Protocols.WSTrust; |
| | | using System.Linq; |
| | | using System.Security.Cryptography; |
| | | using System.Threading; |
| | | using static HH.WCS.JiaTong.api.ApiModel; |
| | | using static HH.WCS.JiaTong.LISTA.process.HttpModel; |
| | | |
| | | namespace HH.WCS.JiaTong.process |
| | |
| | | var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1; |
| | | if (load) |
| | | { |
| | | Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | | LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | | LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList()); |
| | | //Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | | |
| | | if (!string.IsNullOrEmpty(mst.S_CNTR_CODE)) |
| | | { |
| | | LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}"); |
| | | LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList()); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位"); |
| | | LocationHelper.UnlockLoc(mst.S_START_LOC); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | Console.WriteLine($"任务{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()); |
| | | // Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); |
| | | |
| | | if (!string.IsNullOrEmpty(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 |
| | | { |
| | | LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位"); |
| | | LocationHelper.UnlockLoc(mst.S_END_LOC); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | /// <summary> |
| | | /// 安全请求 |
| | | /// </summary> |
| | | /// <param name="no"></param> |
| | | /// <param name="state"></param> |
| | | /// <param name="forkliftNo"></param> |
| | | /// <param name="extData"></param> |
| | | internal static void OperateReq(string no, int state, string url, string forkliftNo, string extData, int Z_type) |
| | | /// <param name="model">请求参数</param> |
| | | /// <param name="url">地址</param> |
| | | /// <param name="TN_Task">任务</param> |
| | | internal static void OperateReq(AgvTaskState model, string url, WCSTask TN_Task) |
| | | { |
| | | try |
| | | { |
| | | LogHelper.Info($"-------开始安全请求------"); |
| | | var TN_Task = WCSHelper.GetTask(no); |
| | | |
| | | if (TN_Task != null) |
| | | { |
| | | int type = 0; |
| | | string loc = ""; |
| | | if (state == 1101) |
| | | if (model.state == 1101) |
| | | { |
| | | |
| | | //请求取货, |
| | | type = 1; |
| | | loc = TN_Task.S_START_LOC; |
| | | if (Z_type == 4) |
| | | if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 |
| | | { |
| | | if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) |
| | | { |
| | |
| | | } |
| | | else |
| | | { |
| | | if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, state)) |
| | | //井松叠盘机安全交互 |
| | | if (TN_Task.S_NOTE == "空托回库") |
| | | { |
| | | // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18); |
| | | NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); |
| | | var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault(); |
| | | if (Device != null) |
| | | { |
| | | if (S7Helper.WriteDpj(Device.address, 1002, 1)) |
| | | { |
| | | int value = S7Helper.ReadDpj(Device.address, 2004, S7.Net.VarType.Byte); |
| | | if (value == 1) |
| | | { |
| | | NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("叠盘机安全交互失败,读取VB2004的值为{2004}"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("叠盘机安全交互失败,写入VB1002值1失败"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"叠盘机安全交互失败,根据任务起点{TN_Task.S_START_LOC},未找到叠盘机配置文件"); |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state)) |
| | | { |
| | | // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18); |
| | | NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | if (state == 1102) |
| | | if (model.state == 1102) |
| | | { |
| | | type = 3; |
| | | if (Z_type == 4) |
| | | if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 |
| | | { |
| | | loc = TN_Task.S_START_LOC; |
| | | if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) |
| | |
| | | //NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18); |
| | | } |
| | | } |
| | | if (TN_Task.S_NOTE == "空托回库") |
| | | { |
| | | var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault(); |
| | | if (Device != null) |
| | | { |
| | | //写入失败重新写入 |
| | | while (!S7Helper.WriteDpj(Device.address, 1001, 1)) |
| | | { |
| | | Thread.Sleep(1000); |
| | | } |
| | | while (!S7Helper.WriteDpj(Device.address, 1002, 0)) |
| | | { |
| | | Thread.Sleep(1000); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"叠盘机安全交互失败,根据任务起点{TN_Task.S_START_LOC},未找到叠盘机配置文件"); |
| | | } |
| | | } |
| | | } |
| | | if (state == 1103) |
| | | if (model.state == 1103) |
| | | { |
| | | //请求卸货 |
| | | type = 2; |
| | | loc = TN_Task.S_END_LOC; |
| | | if (Z_type == 4) |
| | | if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 |
| | | { |
| | | loc = TN_Task.S_END_LOC; |
| | | if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) |
| | |
| | | } |
| | | else |
| | | { |
| | | if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, state)) |
| | | if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state)) |
| | | { |
| | | NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1"); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | if (state == 1104) |
| | | if (model.state == 1104) |
| | | { |
| | | type = 4; |
| | | if (Z_type == 4) |
| | | if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互 |
| | | { |
| | | loc = TN_Task.S_END_LOC; |
| | | if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type)) |
| | |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"安全请求==》根据任务号{no}未找到对应任务"); |
| | | } |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | else |
| | | { |
| | | LogHelper.Info($"安全请求失败=>msg:{result.msg}"); |
| | | ApiHelper.AddErrorInfo("安全交互失败", result.msg, "", tasknum); |
| | | } |
| | | return permit; |
| | | } |
| | |
| | | else |
| | | { |
| | | LogHelper.Info($"安全请求失败=>msg:{result.err_msg}"); |
| | | ApiHelper.AddErrorInfo("安全交互失败", result.err_msg, "", no); |
| | | } |
| | | return permit; |
| | | } |
| | |
| | | /// <summary> |
| | | /// mes物料到位同步 |
| | | /// </summary> |
| | | /// <param name="taskNum"></param> |
| | | /// <param name="orderNum"></param> |
| | | /// <param name="taskStatus"></param> |
| | | /// <param name="mst">任务</param> |
| | | /// <param name="url">地址</param> |
| | | public static void MESIteminfoback(WCSTask mst, string url) |
| | | { |
| | | LogHelper.Info($"------------开始物料信息回报-----------"); |
| | |
| | | { |
| | | var cntritem = ContainerHelper.GetCntrItemRel(mst.S_CNTR_CODE).FirstOrDefault(); |
| | | //回报数据 |
| | | Request<iteminfoArrive> statusarrive = new Request<iteminfoArrive>(); |
| | | List<LotListh> lotLists = new List<LotListh>(); |
| | | string TaskNumber = mst.S_EQ_NO; |
| | | if (!string.IsNullOrEmpty(mst.S_WMS_NO)) |
| | | Request<MesItemBackModel> request = new Request<MesItemBackModel>(); |
| | | List<MesItemBackInfoModel> list = new List<MesItemBackInfoModel>(); |
| | | string MesNo = mst.S_EQ_NO; |
| | | if (!string.IsNullOrEmpty(mst.S_MES_NO)) |
| | | { |
| | | TaskNumber = mst.S_WMS_NO; |
| | | MesNo = mst.S_MES_NO; |
| | | } |
| | | //粉料回库不需要回报 |
| | | if (cntritem != null && mst.S_TYPE == "余料返回" && cntritem.S_ITEM_CODE.StartsWith("4X")) |
| | | { |
| | | return; |
| | | } |
| | | //获取时间戳 |
| | | var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); |
| | | //物料到位接口和状态反馈同时调IIOT,为了区分id,物料到位长度加一区分 |
| | | statusarrive.RequestId = "杭叉AGV" + time + "1"; |
| | | statusarrive.UseToken = "iFQ5fExGrLYLXliHYWzs"; |
| | | request.RequestId = "杭叉AGV" + time + "1"; |
| | | request.UseToken = "iFQ5fExGrLYLXliHYWzs"; |
| | | |
| | | iteminfoArrive iteminfoArrive = new iteminfoArrive(); |
| | | iteminfoArrive.TaskNumber = TaskNumber; |
| | | iteminfoArrive.LocationNum = mst.S_END_LOC; |
| | | iteminfoArrive.Rfid = mst.S_CNTR_CODE; |
| | | iteminfoArrive.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd"); |
| | | MesItemBackModel mesItemBackModel = new MesItemBackModel(); |
| | | |
| | | mesItemBackModel.TaskNumber = MesNo; |
| | | mesItemBackModel.WmsTaskNumber = mst.S_WMS_NO; |
| | | mesItemBackModel.Rfid = mst.S_CNTR_CODE; |
| | | mesItemBackModel.LocationNum = mst.S_END_LOC; |
| | | mesItemBackModel.Result = "1"; |
| | | mesItemBackModel.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd"); |
| | | if (cntritem != null) |
| | | { |
| | | lotLists.Add(new LotListh() { LotNumber = cntritem.S_BATCH_NO, Weight = double.Parse(cntritem.F_WEIGHT) }); |
| | | iteminfoArrive.PartDesc = cntritem.S_ITEM_NAME; |
| | | iteminfoArrive.PartNumber = cntritem.S_ITEM_CODE; |
| | | list.Add(new MesItemBackInfoModel() |
| | | { |
| | | LotNumber = cntritem.S_BATCH_NO, |
| | | PartNumber = cntritem.S_ITEM_CODE, |
| | | Subpool = cntritem.Subpool, |
| | | ReceiveLot = cntritem.ReceiveLot, |
| | | Supplier = cntritem.S_SUPPLIER_NO, |
| | | TyreType = cntritem.TyreType, |
| | | ProduceTime = cntritem.D_PRD_DATE, |
| | | Rfid = cntritem.S_CNTR_CODE, |
| | | Qty = cntritem.F_WEIGHT, |
| | | PartLevel = cntritem.LEV, |
| | | WmsLot = cntritem.WmsLot |
| | | }); |
| | | |
| | | |
| | | } |
| | | iteminfoArrive.LotList = lotLists; |
| | | statusarrive.data = iteminfoArrive; |
| | | |
| | | mesItemBackModel.List = list; |
| | | request.data = mesItemBackModel; |
| | | |
| | | //任务上报 |
| | | HttpHelper httpHelper = new HttpHelper(); |
| | | MesResult result = new MesResult(); |
| | | string date = JsonConvert.SerializeObject(statusarrive); |
| | | string date = JsonConvert.SerializeObject(request); |
| | | |
| | | LogHelper.Info($"物料到位回报:地址:{url},内容:{date}"); |
| | | var r = httpHelper.MesWebPost(url, date); |
| | |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 创建搬运任务 |
| | | /// </summary> |
| | |
| | | return result; |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | |
| | | } |
| | | } |