using HH.WCS.Mobox3.NFLZ.device; using HH.WCS.Mobox3.NFLZ.process; using HH.WCS.Mobox3.NFLZ.util; using HH.WCS.Mobox3.NFLZ.wms; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using static System.Runtime.CompilerServices.RuntimeHelpers; namespace HH.WCS.Mobox3.NFLZ.core { /// /// 定时轮询任务 /// internal class Monitor { internal static void CheckThirdOutWork() { //第三方读中间表 //var db= new SqlHelper().GetInstance("中间表的sql连接字符串"); // db.Queryable //读到了出库单,插入到我们的表 } internal static void CheckOutWork() { //读自己的中间表,我们自己的表有表有个字段计数,计数小于最大值,继续出库,一次生成一条任务 } internal static void CheckDevice() { //检测输送线状态 S7Helper.ReadStr("plc1", 100, 1, 8); S7Helper.ReadBit("plc1", 101, 1, 2); S7Helper.ReadInt("plc1", 102, 1, 6); //1 设备plc的ip deviceNo 自动建立连接 //2 设备对应的通讯项和线体类型(输送线入口、输送线出口、提升机的入口。。。。)起始读的偏移地址,写的偏移地址 //{ "deviceNo":"5","code":"9001","location":"F1CJ-SSX1-01","writeAddr900":0,"writeAddr905":-1,"writeAddr710":0,"readAddr901":2,"readAddr902":0,"lineType":1}, //3 通讯项自动读plc,读到的数据根据lineType做处理,自动创建任务或者更新任务状态(创建一个设备动作或任务动作,如果是任务动作有个线程去读) } /// /// 转运任务 /// internal static void BottleBlankTransportation() { var db = new SqlHelper().GetInstance(); #region 瓶盖满托入库 var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶盖入库接驳" && a.enable == 1).FirstOrDefault(); if (areaInfo != null) { var locInfo = db.Queryable().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "无").Includes(a => a.LocCntrRel).First(); if (locInfo != null) { LogHelper.Info($"【瓶盖满托转运】瓶坯接驳位查询到需入库的瓶坯,货位编码:{locInfo.S_CODE}"); if (locInfo.LocCntrRel != null) { //创建作业 WMSHelper.CreateOpTask(locInfo.S_CODE, "", "入库", "接驳位入库", locInfo.LocCntrRel.S_CNTR_CODE, "瓶盖"); } else { LogHelper.Info($"【瓶盖满托转运】当前货位未绑定托盘码,货位编码:{locInfo.S_CODE}"); } } } else { LogHelper.Info("【瓶盖满托转运】瓶盖入库接驳 未配置"); } #endregion #region 瓶坯空托入库 areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶盖非即产空框" && a.enable == 1).FirstOrDefault(); if(areaInfo != null) { var locInfo = db.Queryable().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM == a.N_CAPACITY && a.S_LOCK_STATE == "无").Includes(a => a.LocCntrRel).First(); if(locInfo != null && locInfo.LocCntrRel != null) { //创建作业 WMSHelper.CreateOpTask(locInfo.S_CODE, "", "入库", "瓶盖空托入库", locInfo.LocCntrRel.S_CNTR_CODE, "瓶盖"); } } else { LogHelper.Info("【瓶盖空托转运】瓶盖非即产空框 未配置"); } #endregion #region 瓶坯满托入库 areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶胚入库接驳" && a.enable == 1).FirstOrDefault(); if (areaInfo != null) { var locInfo = db.Queryable().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM == a.N_CAPACITY && a.S_LOCK_STATE == "无").First(); if (locInfo != null) { string cntr = ""; var cntrList = db.Queryable().Where(a => a.S_LOC_CODE == locInfo.S_CODE).ToList(); if (cntrList.Count > 0) { foreach (var a in cntrList) { cntr = cntr + a.S_CNTR_CODE + ","; } } cntr = cntr.TrimEnd(','); //创建作业 WMSHelper.CreateOpTask(locInfo.S_CODE, "", "入库", "接驳位入库", cntr, "瓶坯"); } } else { LogHelper.Info("【瓶坯满托转运】瓶胚入库接驳 未配置"); } #endregion } /// /// 半成品工单监控 /// /// internal static void BCPWorkSurveillance() { //瓶盖翻斗机工单 //开启,查询 瓶盖非急产急用 物料是否满,不满则补充物料 //关闭, 1、查询 瓶盖空托 是否还有托盘,有则入库 2、查询瓶盖非即产即用 是否有物料, 有则入库 //瓶坯翻斗机 //开启,查询是否为非即产即用,如果为非即产即用,则判断瓶坯非即产即用库区是否满, 不满则补空物料 //关闭,查询 瓶坯非即产即用 瓶坯即产即用A 瓶坯即产即用B 是否有物料,有则入库 //瓶坯注塑机 //开启,查询 瓶坯空托 是否空托数量大于3托,如果不大于,则补空托 //关闭,查询 瓶坯空托 是否有空托,有则入库 //判断当前半成品工单是否有执行中的任务 //工单类型: 1、农夫林芝-瓶坯机 2、农夫林芝-瓶盖翻斗机 3、农夫林芝-瓶坯翻斗机 bool PPZUUSE = false; //瓶坯机是否使用 bool PPFDUSE = false; //瓶坯翻斗机是否使用 bool PGFDUSE = false; //瓶盖翻斗机是否使用 var db = new SqlHelper().GetInstance(); var workList = db.Queryable().Where(a => a.S_WorkState == "执行中").ToList(); if (workList.Count > 0) { foreach (var a in workList) { if (a.S_PLineNo == "农夫林芝-瓶坯机") { PPZUUSE = true; } else if (a.S_PLineNo == "农夫林芝-瓶盖翻斗机") { PGFDUSE = true; } else { PPFDUSE = true; } } } //瓶坯机使用,则从 瓶坯库区 补充空托到 瓶坯空托 ,未使用,则将 瓶坯空托 的空托 移到 瓶坯库区 //瓶坯翻斗机使用,则从 瓶坯库区 补充空托到 瓶坯即产即用/瓶坯非即产即用 ,未使用,则将 瓶坯即产即用/瓶坯非即产即用 的空托 移到 瓶坯库区 //瓶盖翻斗机使用,则从 瓶盖库区 补充空托到 瓶坯非即产即用 ,未使用,则将 瓶坯非即产即用 的空托 移到 瓶盖库区 TaskProcess.BCPYiKu(PPZUUSE, "瓶坯注塑机"); TaskProcess.BCPYiKu(PPFDUSE, "瓶坯翻斗机"); TaskProcess.BCPYiKu(PGFDUSE, "瓶盖翻斗机"); } internal static void JBDEIN() { var db = new SqlHelper().GetInstance(); var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶胚入库接驳" && a.enable == 1).FirstOrDefault(); if(areaInfo != null) { var locInfo = db.Queryable().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM == a.N_CAPACITY && a.S_LOCK_STATE == "无").First(); if(locInfo != null) { string cntr = ""; var cntrList = db.Queryable().Where(a => a.S_LOC_CODE == locInfo.S_CODE).ToList(); if(cntrList.Count > 0) { foreach(var a in cntrList) { cntr = cntr + a.S_CNTR_CODE + ","; } } cntr = cntr.TrimEnd(','); //创建作业 WMSHelper.CreateOpTask(locInfo.S_CODE, "", "入库", "接驳位入库", cntr, "瓶坯"); } } else { LogHelper.Info("瓶胚入库接驳 未配置"); } } } }