杨前锦
2025-05-26 d0a265713fd18162f3a82bdcd22e267df7298c7b
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/core/Monitor.cs
@@ -31,177 +31,8 @@
        }
        internal static void CheckOutWork() {
            //读自己的中间表,我们自己的表有表有个字段计数,计数小于最大值,继续出库,一次生成一条任务
        }
        /// <summary>
        /// 待定,此项目plc怎么对接还不确定
        /// </summary>
        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)
            {
                var instockInfo = item.Value;
                var end = WMSHelper.GetInstockEnd(instockInfo.item, instockInfo.endArea);
                LogHelper.Info("终点货位:" + 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 != "") {
                        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 != "")
                    {
                        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);
                    }
                }
            }
        }
        /// <summary>
        /// 移库单移库
        /// </summary>
        public static void ShiftStockOrder() {
            List<TN_YiKuDetail> 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);
                        }
                    }
                }
            }
        }
    }
}