using HH.WCS.Mobox3.TSSG.api; using HH.WCS.Mobox3.TSSG.device; using HH.WCS.Mobox3.TSSG.models; using HH.WCS.Mobox3.TSSG.process; using HH.WCS.Mobox3.TSSG.util; using HH.WCS.Mobox3.TSSG.wms; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; namespace HH.WCS.Mobox3.TSSG.core { /// /// 定时轮询任务 /// internal class Monitor { internal static void CheckThirdOutWork() { //第三方读中间表 //var db= new SqlHelper().GetInstance("中间表的sql连接字符串"); // db.Queryable //读到了出库单,插入到我们的表 } internal static void CheckOutWork() { //读自己的中间表,我们自己的表有表有个字段计数,计数小于最大值,继续出库,一次生成一条任务 } /// /// 待定,此项目plc怎么对接还不确定 /// 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做处理,自动创建任务或者更新任务状态(创建一个设备动作或任务动作,如果是任务动作有个线程去读) } // 定时器(单位:分钟) private static System.Timers.Timer aTimer = new System.Timers.Timer(Settings.WaitTime * 60000); private static System.Timers.Timer bTimer = new System.Timers.Timer(Settings.WaitTime * 60000); private static string flag1 = null; private static string flag2 = null; internal static void CheckEndLoc() { foreach (var item in ApiHelper.cacheInstockInfos) { LogHelper.Info($"缓存信号处理,缓存IP:{item.Key}", "TSSG"); var instockInfo = item.Value; var end = WMSHelper.GetInstockEnd(instockInfo.item, instockInfo.endArea); LogHelper.Info($"(缓存信号,目标库区:{instockInfo.endArea},物料编码:{instockInfo.item})终点货位:" + JsonConvert.SerializeObject(end), "TSSG"); if (end != null) { ApiHelper.Instock(instockInfo); ApiHelper.cacheInstockInfos.Remove(item); LogHelper.Info("缓存信息生成入库任务,并删除缓存信息:" + JsonConvert.SerializeObject(item), "TSSG"); return; } if (item.Key == "192.168.1.160" && instockInfo.UDID != flag1) { flag1 = instockInfo.UDID; // 挂钩Elapsed事件以提供定时器信号 aTimer.Elapsed -= OnTimedEvent1; aTimer.Elapsed += OnTimedEvent1; // 设置自动重置为true(意味着定时器会重复触发) aTimer.AutoReset = false; aTimer.Stop(); // 确保定时器停止 aTimer.Enabled = true; // 启动定时器 } if (item.Key == "192.168.1.161" && instockInfo.UDID != flag2) { flag2 = instockInfo.UDID; // 挂钩Elapsed事件以提供定时器信号 aTimer.Elapsed -= OnTimedEvent2; aTimer.Elapsed += OnTimedEvent2; // 设置自动重置为true(意味着定时器会重复触发) aTimer.AutoReset = true; aTimer.Stop(); // 确保定时器停止 aTimer.Enabled = true; // 启动定时器 } } } private static void OnTimedEvent1(Object source, ElapsedEventArgs e) { foreach (var item in ApiHelper.cacheInstockInfos) { var instockInfo = item.Value; if (instockInfo.UDID == flag1) { if (Settings.BufferArea != null && Settings.BufferArea != "") { var end = WMSHelper.GetInstockEnd(instockInfo.item, Settings.BufferArea); if (end != null) { item.Value.endArea = Settings.BufferArea; LogHelper.Info("ip:" + item.Key + "信号等待时间超时,变更终点库区为缓存区", "TSSG"); } } } } } private static void OnTimedEvent2(Object source, ElapsedEventArgs e) { foreach (var item in ApiHelper.cacheInstockInfos) { var instockInfo = item.Value; if (instockInfo.UDID == flag2) { if (Settings.BufferArea != null && Settings.BufferArea != "") { var end = WMSHelper.GetInstockEnd(instockInfo.item, Settings.BufferArea); if (end != null) { item.Value.endArea = Settings.BufferArea; LogHelper.Info("ip:" + item.Key + "信号等待时间超时,变更终点库区为缓存区", "TSSG"); } } } } } // 自动移库 internal static void AutoShiftStock() { var startLoc = WMSHelper.GetShiftStockStart(Settings.BufferArea); if (startLoc != null) { var end = WMSHelper.GetInstockEnd(startLoc.LocCntrRel.CntrItemRel.S_ITEM_CODE); if (end != null) { var wcsTask = new WCSTask { S_OP_NAME = "入库", S_CODE = WCSHelper.GenerateTaskNo(), S_TYPE = "下线入库", S_START_LOC = startLoc.S_CODE, S_END_LOC = end.S_CODE, S_SCHEDULE_TYPE = "NDC", N_CNTR_COUNT = 1, S_CNTR_CODE = startLoc.LocCntrRel.S_CNTR_CODE, N_START_LAYER = startLoc.N_CURRENT_NUM, N_END_LAYER = end.N_CURRENT_NUM + 1 }; if (WCSHelper.CreateTask(wcsTask)) { LocationHelper.LockLoc(startLoc.S_CODE, 2); LocationHelper.LockLoc(end.S_CODE, 1); } } } } /// /// 移库单移库 /// public static void ShiftStockOrder() { List tN_YiKuDetails = WMSHelper.getShiftOrderDetail(); foreach (var item in tN_YiKuDetails) { if (item.N_QTY > item.N_COMPLETE_NUM) { Location startLoc = WMSHelper.GetShiftStockStart(item.S_START_AREA, item.S_START_ROW); Location endLoc = WMSHelper.GetShiftStockEnd(item.S_END_AREA, item.S_END_ROW); if (startLoc != null && endLoc != null && !WMSHelper.isRowLock(endLoc)) { var wcsTask = new WCSTask { S_OP_CODE = item.S_NO, S_OP_NAME = "移库单移库", S_CODE = WCSHelper.GenerateTaskNo(), S_TYPE = "移库", S_START_LOC = startLoc.S_CODE, S_END_LOC = endLoc.S_CODE, S_SCHEDULE_TYPE = "NDC", N_CNTR_COUNT = 1, S_CNTR_CODE = startLoc.LocCntrRel.S_CNTR_CODE, N_START_LAYER = startLoc.N_CURRENT_NUM, N_END_LAYER = endLoc.N_CURRENT_NUM + 1 }; if (WCSHelper.CreateTask(wcsTask)) { LocationHelper.LockLoc(startLoc.S_CODE, 2); LocationHelper.LockLoc(endLoc.S_CODE, 1); } } } } } } }