| | |
| | | /// </summary> |
| | | public class AgvTaskState |
| | | { |
| | | public int State { get; set; } |
| | | public string No { get; set; } |
| | | public string ForkliftNo { get; set; } |
| | | public string ErrCode { get; set; } |
| | | public string LockNo { get; set; } |
| | | public string Ext1 { get; set; } |
| | | public string Ext2 { get; set; } |
| | | public string N_CNTR_COUNT { get; set; } |
| | | public string ExtData { get; set; } |
| | | public int state { get; set; } |
| | | public string task_no { get; set; } |
| | | public string forklift_no { get; set; } |
| | | public string lock_no { get; set; } |
| | | public string ext_data { get; set; } |
| | | } |
| | | /// <summary> |
| | | /// hosttoagv上报车辆状态(参数在hosttoagv服务配置,可修改) |
| | |
| | | public SimpleResult Putaway_Order_In(Putaway_Order_In model) { |
| | | return ApiHelper.Putaway_Order_In(model); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| | |
| | | |
| | | public const string AlterControlSwitch01 = "1";//任务上报MES变更开发 1-开启 0-关闭 |
| | | public static void OperateAgvTaskStatus(AgvTaskState model) { |
| | | if (string.IsNullOrEmpty(model.No)) { |
| | | if (string.IsNullOrEmpty(model.task_no)) { |
| | | //无任务号请求(交管) |
| | | //DeviceProcess.Traffic(model.ForkliftNo, model.LockNo, model.State==1023); |
| | | } |
| | | else { |
| | | var TN_Task = WCSHelper.GetTask(model.No); |
| | | var TN_Task = WCSHelper.GetTask(model.task_no); |
| | | if (TN_Task != null) { |
| | | if (model.State <= 7) |
| | | if (model.state <= 7) |
| | | { |
| | | if (!WCSHelper.CheckActionRecordExist(model.No, model.State)) |
| | | if (!WCSHelper.CheckActionRecordExist(model.task_no, model.state)) |
| | | { |
| | | //有任务号请求 |
| | | switch (model.State) |
| | | switch (model.state) |
| | | { |
| | | case 1: |
| | | WCSHelper.Begin(TN_Task); |
| | | break; |
| | | #region MyRegion |
| | | case 3: |
| | | WCSHelper.UpdateStatus(TN_Task, "开始取货", model.ForkliftNo); |
| | | WCSHelper.UpdateStatus(TN_Task, "开始取货", model.forklift_no); |
| | | //if (TN_Task.S_TYPE == "注塑库存满托下线(瓶坯)" || TN_Task.S_TYPE == "注塑即产满托下线(瓶坯)") |
| | | //{ |
| | | // TaskProcess.writeSignal(TN_Task); |
| | |
| | | break; |
| | | case 4: |
| | | WCSHelper.UpdateStatus(TN_Task, "取货完成"); |
| | | if (TN_Task.S_TYPE.Contains("满托下线")) |
| | | { |
| | | TaskProcess.writeSignal(TN_Task,4); |
| | | } |
| | | TaskProcess.OperateStatus(TN_Task, 4); |
| | | break; |
| | | case 5: |
| | |
| | | break; |
| | | case 6: |
| | | WCSHelper.UpdateStatus(TN_Task, "卸货完成"); |
| | | if (TN_Task.S_TYPE.Contains("空托上线")) |
| | | { |
| | | TaskProcess.writeSignal(TN_Task,6); |
| | | } |
| | | TaskProcess.OperateStatus(TN_Task, 6); |
| | | break; |
| | | #endregion |
| | |
| | | //WMSHelper.End(TN_Task); |
| | | break; |
| | | } |
| | | WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData); |
| | | WCSHelper.AddActionRecord(model.task_no, model.state, model.forklift_no, model.ext_data); |
| | | //调用第三方接口(如果有)TaskProcess.ReportStatus |
| | | TaskProcess.ThirdReportStatus(TN_Task, model.State, model.ForkliftNo); |
| | | TaskProcess.UpdateAgvNo(TN_Task, model.ForkliftNo); |
| | | if (AlterControlSwitch01 == "1") TaskProcess.GeneralInterFaceFunc(TN_Task, model.State.ToString(), model.ForkliftNo); |
| | | TaskProcess.ThirdReportStatus(TN_Task, model.state, model.forklift_no); |
| | | TaskProcess.UpdateAgvNo(TN_Task, model.forklift_no); |
| | | if (AlterControlSwitch01 == "1") TaskProcess.GeneralInterFaceFunc(TN_Task, model.state.ToString(), model.forklift_no); |
| | | } |
| | | } |
| | | else { |
| | | LogHelper.Info("安全请求交互"); |
| | | //安全请求等 |
| | | TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData); |
| | | WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData); |
| | | TaskProcess.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data); |
| | | WCSHelper.AddActionRecord(model.task_no, model.state, model.forklift_no, model.ext_data); |
| | | } |
| | | } |
| | | } |
| | |
| | | N_CNTR_COUNT = 1, |
| | | S_CNTR_CODE = a.S_CNTR_CODE, |
| | | N_START_LAYER = startinfo.N_CURRENT_NUM, |
| | | N_END_LAYER = endinfo.N_CURRENT_NUM + 1 |
| | | N_END_LAYER = endinfo.N_CURRENT_NUM + 1, |
| | | S_TRAY_TYPE = a.S_TRAY_TYPE, |
| | | S_WORK_NO = a.S_WORK_NO, |
| | | S_ITEM_CODE = a.S_ITEM_CODE, |
| | | S_NOTE = a.S_NOTE |
| | | }; |
| | | if (WCSHelper.CreateTask(wcsTask)) |
| | | { |
| | |
| | | |
| | | namespace HH.WCS.Mobox3.NFLZ |
| | | { |
| | | [SugarTable("TN_LinZhiorkOrder")] |
| | | [SugarTable("TN_LinZhiWorkOrder")] |
| | | public class LinZhiWorkOrder : BaseModel |
| | | { |
| | | /// <summary> |
| | |
| | | { |
| | | LogHelper.Info("即产即用工单"); |
| | | //即产即用在起点为线边 |
| | | var bcpInfo = Settings.areaInfos.Where(a => a.areaName == "瓶胚即产即用满框" && a.enable == 1).FirstOrDefault(); |
| | | var bcpInfo = Settings.areaInfos.Where(a => a.areaName == "瓶胚即产满框" && a.enable == 1).FirstOrDefault(); |
| | | if (bcpInfo != null) |
| | | { |
| | | startArea = bcpInfo.areaCode; |
| | |
| | | //初始状态,无托盘,直接上满托(非即产即用需要校验 套袋完成,即产即用直接使用) |
| | | if (workInfo.S_UsingNow == "Y") |
| | | { |
| | | LogHelper.Info($"瓶胚即产即用满框 查找"); |
| | | LogHelper.Info($"瓶胚即产满框 查找"); |
| | | startLoca = getFDSXArea(db, workInfo, startArea); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"瓶胚非即产库区 查找"); |
| | | LogHelper.Info($"瓶胚翻斗机非即产满框 查找"); |
| | | startLoca = getFDSXArea(db, workInfo, startArea); |
| | | } |
| | | |
| | | if (startLoca != null) |
| | | { |
| | | //创建作业 |
| | | WMSHelper.CreateOpTask(startLoca.S_CODE, locCode, "出库", fullTaskType, startLoca.LocCntrRel.S_CNTR_CODE); |
| | | WMSHelper.CreateOpTask(startLoca.S_CODE, locCode, "出库", fullTaskType, startLoca.LocCntrRel.S_CNTR_CODE, "", "", workInfo.S_WorkNo); |
| | | } |
| | | } |
| | | else |
| | |
| | | LogHelper.Info($"瓶坯翻斗机上有空托盘,生成空托下线任务,瓶坯翻斗机点位:{plc.TN_Location[0]}"); |
| | | |
| | | //创建作业 |
| | | WMSHelper.CreateOpTask(locCode, "", "入库", emptyTaskType, plcLoca.S_CNTR_CODE); |
| | | WMSHelper.CreateOpTask(locCode, "", "入库", emptyTaskType, plcLoca.S_CNTR_CODE, "", "", workInfo.S_WorkNo); |
| | | } |
| | | } |
| | | } |
| | |
| | | if (startLoca != null) |
| | | { |
| | | //创建作业 |
| | | WMSHelper.CreateOpTask(startLoca.S_CODE, locCode, "出库", fullTaskType, startLoca.LocCntrRel.S_CNTR_CODE); |
| | | WMSHelper.CreateOpTask(startLoca.S_CODE, locCode, "出库", fullTaskType, startLoca.LocCntrRel.S_CNTR_CODE,"","",workInfo.S_WorkNo); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"瓶盖翻斗机上有空托盘,生成空托下线任务,瓶盖翻斗机点位:{locCode}"); |
| | | //创建作业 |
| | | WMSHelper.CreateOpTask(locCode, "", "入库", emptyTaskType, plcLoca.S_CNTR_CODE); |
| | | WMSHelper.CreateOpTask(locCode, "", "入库", emptyTaskType, plcLoca.S_CNTR_CODE,"","",workInfo.S_WorkNo); |
| | | } |
| | | } |
| | | } |
| | |
| | | if (startLoca != null) |
| | | { |
| | | //创建作业 |
| | | WMSHelper.CreateOpTask(startLoca.S_CODE, deviceBit, "出库", taskType, startLoca.LocCntrRel.S_CNTR_CODE); |
| | | WMSHelper.CreateOpTask(startLoca.S_CODE, deviceBit, "出库", taskType, startLoca.LocCntrRel.S_CNTR_CODE, "", "", workInfo.S_WorkNo); |
| | | } |
| | | else |
| | | { |
| | |
| | | else |
| | | { |
| | | cntrCode = cntrInfo.S_CNTR_CODE; |
| | | TaskProcess.BindCntrItem(deviceBit, cntrCode, workInfo.S_ItemCode, ""); |
| | | TaskProcess.BindCntrItem(cntrCode, workInfo.S_ItemCode, "", ""); |
| | | } |
| | | //创建作业 |
| | | WMSHelper.CreateOpTask(deviceBit, "", "入库", taskType, cntrCode); |
| | | WMSHelper.CreateOpTask(deviceBit, "", "入库", taskType, cntrCode,"","",workInfo.S_WorkNo); |
| | | } |
| | | } |
| | | } |
| | |
| | | if ((LineState[mst.S_START_LOC.Trim()].status == "112100" || LineState[mst.S_START_LOC.Trim()].status == "112200") && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) |
| | | { |
| | | //NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1101, 18); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 1101, "18"); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 18, "1101"); |
| | | TaskProcess.sendSing(mst, 1101); |
| | | } |
| | | } |
| | |
| | | LogHelper.Info($"查询输送线允许取满信号 允许取满信号={LineState[mst.S_START_LOC.Trim()].status} 时间间隔={DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds}", "安全交互"); |
| | | if (mst.S_TYPE.Contains("满托下线")) |
| | | { |
| | | if ((LineState[mst.S_START_LOC.Trim()].status == "1122" || LineState[mst.S_START_LOC.Trim()].status == "1221") && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) |
| | | if ((LineState[mst.S_START_LOC.Trim()].status.Substring(4,2) == "01" || LineState[mst.S_START_LOC.Trim()].status.Substring(6,2) == "02") && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) |
| | | { |
| | | //NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1101, 18); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 1101, "18"); |
| | | TaskProcess.sendSing(mst, 1101); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 18, "1101"); |
| | | } |
| | | } |
| | | else |
| | |
| | | if (LineState[mst.S_START_LOC.Trim()].status == "1220" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) |
| | | { |
| | | //NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1101, 18); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 1101, "18"); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 18, "1101"); |
| | | TaskProcess.sendSing(mst, 1101); |
| | | } |
| | | } |
| | |
| | | if ((LineState[mst.S_END_LOC.Trim()].status == "112100" || LineState[mst.S_END_LOC.Trim()].status == "112200") && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10) |
| | | { |
| | | //NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1103, 18); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 1103, "18"); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 18, "1103"); |
| | | TaskProcess.sendSing(mst, 1103); |
| | | } |
| | | } |
| | |
| | | LogHelper.Info($"查询输送线允许补空信号 允许补空信号={LineState[mst.S_END_LOC.Trim()].status} 时间间隔={DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds}", "安全交互"); |
| | | if (mst.S_TYPE.Contains("空托上线")) |
| | | { |
| | | if ((LineState[mst.S_END_LOC.Trim()].status == "1122" || LineState[mst.S_END_LOC.Trim()].status == "1221") && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10) |
| | | if ((LineState[mst.S_END_LOC.Trim()].status.Substring(4,2) == "01" || LineState[mst.S_END_LOC.Trim()].status.Substring(6,2) == "02") && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10) |
| | | { |
| | | //NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1103, 18); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 1103, "18"); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 18, "1103"); |
| | | TaskProcess.sendSing(mst, 1103); |
| | | } |
| | | } |
| | |
| | | if (LineState[mst.S_END_LOC.Trim()].status == "1021" && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10) |
| | | { |
| | | //NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1103, 18); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 1103, "18"); |
| | | NDCApi.ChangeOrderParam(mst.S_CODE.Trim(), 18, "1103"); |
| | | TaskProcess.sendSing(mst, 1103); |
| | | } |
| | | } |
| | |
| | | if (mst.S_TYPE.Contains("空托上线")) |
| | | { |
| | | LogHelper.Info($"{mst.S_TYPE}卸货完成,写入信号"); |
| | | if(state == 6) |
| | | { |
| | | //根据起点判断是A口还是B口 |
| | | var locCode = mst.S_END_LOC; |
| | | var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault(); |
| | |
| | | if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务卸货完成,写入信号:{signal},ip:{devInfo.address}"); |
| | | } |
| | | else LogHelper.Info($"设备未找到,货位号:{mst.S_END_LOC}"); |
| | | } |
| | | } |
| | | if (mst.S_TYPE.Contains("满托上线")) |
| | | { |
| | |
| | | var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault(); |
| | | if (devInfo != null) |
| | | { |
| | | var signal = "3F 00 12 22 00 0D 0A"; |
| | | var signal = "3F 00 12 21 0D 0A"; |
| | | if (state == 1102) signal = "3F 00 10 20 0D 0A"; |
| | | if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务取货完成,写入信号:{signal},ip:{devInfo.address}"); |
| | | } |
| | |
| | | if (mst.S_TYPE.Contains("满托下线")) |
| | | { |
| | | LogHelper.Info($"{mst.S_TYPE}取货完成,写入信号"); |
| | | if(state == 4) |
| | | { |
| | | //根据起点判断是A口还是B口 |
| | | var locCode = mst.S_START_LOC; |
| | | var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault(); |
| | |
| | | if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务取货完成,写入信号:{signal},ip:{devInfo.address}"); |
| | | } |
| | | else LogHelper.Info($"设备未找到,货位号:{mst.S_START_LOC}"); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | if (state == 6)//卸货完成 |
| | | { |
| | | claimGoodsTime(mst, state); |
| | | writeSignal(mst); |
| | | CacheBitUpdate(mst, false); |
| | | } |
| | | if (state == 7) |
| | |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"瓶胚翻斗机非即产满框 查找"); |
| | | string areaName = bcpW.S_PLineNo.Split('-')[1].Substring(0, 1) + "号瓶胚翻斗机非即产满框"; |
| | | startArea = Settings.areaInfos.Where(a => a.areaName == areaName && a.enable == 1).FirstOrDefault().areaCode; |
| | | startLoca = DeviceProcess.getFDSXArea(db, bcpW, startArea); |
| | |
| | | var cntrInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoca.S_CODE).First(); |
| | | if (cntrInfo != null) |
| | | { |
| | | WMSHelper.CreateOpTask(startLoca.S_CODE, mst.S_START_LOC, "出库", taskType, cntrInfo.S_CNTR_CODE); |
| | | WMSHelper.CreateOpTask(startLoca.S_CODE, mst.S_START_LOC, "出库", taskType, cntrInfo.S_CNTR_CODE,"","",bcpW.S_WorkNo); |
| | | } |
| | | else LogHelper.Info($"未绑定托盘,货位号:{startLoca.S_CODE}"); |
| | | } |
| | |
| | | //修改作业状态 重新启动 |
| | | wmsTask.N_B_STATE = 2; |
| | | WMSHelper.UpdateTaskState(wmsTask); |
| | | WCSHelper.UpdateStorStatus(task.S_CNTR_CODE, 4); |
| | | //WCSHelper.UpdateStorStatus(task.S_CNTR_CODE, 4); |
| | | } |
| | | |
| | | |