コード例 #1
0
ファイル: DispatcherControl.cs プロジェクト: yichunbong/CSOT
        /// <summary>
        /// </summary>
        /// <param name="da"/>
        /// <param name="info"/>
        /// <param name="handled"/>
        public void WRITE_DISPATCH_LOG0(Mozart.SeePlan.Simulation.DispatchingAgent da, Mozart.SeePlan.Simulation.EqpDispatchInfo info, ref bool handled)
        {
            var    targetEqp = info.TargetEqp as FabEqp;
            string eqpID     = targetEqp.EqpID;

            if (eqpID == "THCVD200")
            {
                Console.WriteLine();
            }

            var eqp = da.GetEquipment(eqpID) as FabAoEquipment;

            //ParallelChamber는 SubEqp별로 별도로 기록 (더미Lot선택은 기록)
            if (eqp.IsParallelChamber && info.DispatchWipLog.StartsWith("DUMMY"))
            {
                foreach (var subEqp in targetEqp.SubEqps.Values)
                {
                    if (subEqp.Current != null)
                    {
                        continue;
                    }

                    DispatchLogHelper.WriteDispatchLog(eqp, info, subEqp);
                }
            }

            //ParallelChamber도 ParentEqpID 기준으로 추가 기록함(2019.11.08)
            ////ParallelChamber는 SubEqp별로 별도로 기록
            //if (eqp.IsParallelChamber)
            //    return;

            DispatchLogHelper.WriteDispatchLog(eqp, info);
        }
コード例 #2
0
ファイル: DispatcherControl.cs プロジェクト: yichunbong/CSOT
        /// <summary>
        /// </summary>
        /// <param name="db"/>
        /// <param name="aeqp"/>
        /// <param name="wips"/>
        /// <param name="ctx"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public IHandlingBatch[] DO_SELECT0(Mozart.SeePlan.Simulation.DispatcherBase db, Mozart.SeePlan.Simulation.AoEquipment aeqp, IList <Mozart.SeePlan.Simulation.IHandlingBatch> wips, Mozart.SeePlan.Simulation.IDispatchContext ctx, ref bool handled, Mozart.SeePlan.Simulation.IHandlingBatch[] prevReturnValue)
        {
            WeightPreset   preset = aeqp.Target.Preset;
            FabAoEquipment eqp    = aeqp as FabAoEquipment;

            //InPort Wip 처리
            if (eqp.HasInPortWip)
            {
                //여러 Lot을 넘길 경우 첫번째 투입, 나머지는 설비의 Buffer에 넣음.
                IHandlingBatch[] list = eqp.InitInPortWips.ToArray();

                eqp.InitInPortWips.Clear();

                return(list);
            }

            IHandlingBatch[] selected = null;

            if (wips.Count > 0)
            {
                List <IHandlingBatch> newlist = new List <IHandlingBatch>(wips);
                var control = DispatchControl.Instance;

                //if (eqp.EqpID == "FHRPH100" && eqp.NowDT >= LcdHelper.StringToDateTime("20200113 073000"))
                //	Console.WriteLine("B");

                var dummy = WeightHelper.NeedAllowRunDown_Dummy(eqp, wips);
                if (dummy != null)
                {
                    newlist.Add(dummy);
                    dummy.DispatchFilterInfo = eqp.LastPlanFilterInfo;
                }

                var dummyList = FilterMaster.WaitForPrevStepWip_Dummy(ctx, eqp);
                if (dummyList != null && dummyList.Count > 0)
                {
                    newlist.AddRange(dummyList);
                }

                var lotList = control.Evaluate(db, newlist, ctx);
                selected = control.Select(db, eqp, lotList);

                if (control.IsWriteDispatchLog(eqp))
                {
                    DispatchLogHelper.AddDispatchInfo(eqp, lotList, selected, preset);
                    //eqp.EqpDispatchInfo.AddDispatchInfo(lotList, selected, preset);
                }
            }

            if (selected == null)
            {
                eqp.CheckAvailableSubEqps();
            }

            return(selected);
        }
コード例 #3
0
ファイル: DispatcherControl.cs プロジェクト: yichunbong/CSOT
        /// <summary>
        /// </summary>
        /// <param name="eqp"/>
        /// <param name="info"/>
        /// <param name="lot"/>
        /// <param name="wp"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public string ADD_DISPATCH_WIP_LOG0(Mozart.SeePlan.DataModel.Resource eqp, Mozart.SeePlan.Simulation.EntityDispatchInfo info, Mozart.SeePlan.Simulation.ILot lot, Mozart.SeePlan.DataModel.WeightPreset wp, ref bool handled, string prevReturnValue)
        {
            string log = string.Empty;

            var flot      = lot as FabLot;
            var targetEqp = eqp as FabEqp;

            log = DispatchLogHelper.GetDispatchWipLog(targetEqp, info, flot, wp);


            return(log);
        }
コード例 #4
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="hb"/>
        /// <param name="state">WaitSetup/StartSetup/EndSetup/FirstLoading/LastLoading/FirstUnloading/LastUnloading</param>
        /// <param name="handled"/>
        public void PROCESS_STATE_CHANGED0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, Mozart.SeePlan.Simulation.ProcessStates state, ref bool handled)
        {
            FabAoEquipment eqp = aeqp.ToFabAoEquipment();
            FabLot         lot = hb.ToFabLot();
            var            now = aeqp.NowDT;

            if (eqp.EqpID == "THCVD300")
            {
                Console.WriteLine();
            }

            //Setup이 있을 경우 FirstLoading이 없음.
            if (state == ProcessStates.FirstLoading)
            {
                DispatchLogHelper.WriteDispatchLog_ParallelChamber(eqp, lot);

                eqp.LastLoadingTime = now;
                //if (eqp.LastLoadingTime >= eqp.LastIdleStartTime)
                //    eqp.LastIdleStartTime = DateTime.MinValue;

                //eqp.LastIdleRunStartTime = DateTime.MinValue;

                eqp.LoadCount++;
            }
            //else if (state == ProcessStates.LastLoading)
            //{
            //    eqp.LastIdleRunStartTime = now;
            //}
            //else if (state == ProcessStates.LastUnloading)
            //{
            //    eqp.LastIdleStartTime = now;
            //}
            else if (state == ProcessStates.StartSetup)
            {
                DispatchLogHelper.WriteDispatchLog_ParallelChamber(eqp, lot);
            }
            else if (state == ProcessStates.EndSetup)
            {
                eqp.LoadCount = 1;
                eqp.SetupCount++;
                //eqp.LastIdleStartTime = DateTime.MinValue;
                //eqp.LastIdleRunStartTime = DateTime.MinValue;
            }
        }
コード例 #5
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="proc"/>
        /// <param name="handled"/>
        public void ON_BEGIN_SETUP0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.AoProcess proc, ref bool handled)
        {
            FabAoEquipment  eqp  = aeqp.ToFabAoEquipment();
            EqpDispatchInfo info = aeqp.EqpDispatchInfo;
            FabLot          lot  = proc.Entity as FabLot;

            bool isAheadSetup = eqp.AvailableSetupTime < aeqp.NowDT;

            if (isAheadSetup)
            {
                DispatchLogHelper.UpdateDispatchLogByAheadSetup(eqp, info);
            }


            if (eqp.IsAcidConst && eqp.AcidDensity.IsSetupMark)
            {
                DateTime inTime = isAheadSetup ? eqp.AvailableSetupTime : eqp.NowDT;

                AcidMaster.ResetAcidDensity(eqp, lot, inTime);
            }
        }
コード例 #6
0
ファイル: DispatcherControl.cs プロジェクト: yichunbong/CSOT
        /// <summary>
        /// </summary>
        /// <param name="dc"/>
        /// <param name="aeqp"/>
        /// <param name="wips"/>
        /// <param name="handled"/>
        public void UPDATE_CONTEXT0(IDispatchContext dc, AoEquipment aeqp, IList <IHandlingBatch> wips, ref bool handled)
        {
            //////20161122075408
            //if (aeqp.EqpID == "8APPH02" && aeqp.NowDT == new DateTime(2016, 12, 12, 8, 42, 14))
            //    Console.WriteLine("T");

            List <JobFilterInfo> joblist = dc.Get <List <JobFilterInfo> >(Constants.JobGroup, null);

            if (aeqp.Preset == null)
            {
                return;
            }

            double maxRequireEqp;

            if (WeightHelper.TryGetMaxRequiredEqp(aeqp, joblist, out maxRequireEqp))
            {
                dc.Set(Constants.WF_MAX_REQUIRED_EQP_COUNT, maxRequireEqp);
            }

            LayerStats sts = WeightHelper.CalcLayerBalance(aeqp);

            dc.Set(Constants.WF_LAYER_BALANCE_PRIORITY, sts);

            //투입을 위한 waiting wip infomation(unpack 설비 )
            Dictionary <string, WaitingWipInfo> waitingInfos = WeightHelper.SetWatingWipInfo(aeqp, joblist);

            dc.Set(Constants.WF_WAITING_WIP_INFO, waitingInfos);

            dc.Set(Constants.WF_MINMAX_VALUE_INFOS, WeightHelper.SetMinMaxVaule_WF(aeqp, joblist));

            if (wips.Count > 0)
            {
                dc.Set(Constants.WF_LOT_PRIORITY, wips.Max(x => x.ToFabLot().Priority));
            }

            DispatchLogHelper.InitLotLogDetail(wips);
        }
コード例 #7
0
ファイル: DispatcherControl.cs プロジェクト: yichunbong/CSOT
        /// <summary>
        /// </summary>
        /// <param name="eqp"/>
        /// <param name="sels"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public string GET_SELECTED_WIP_LOG0(Mozart.SeePlan.DataModel.Resource eqp, Mozart.SeePlan.Simulation.IHandlingBatch[] sels, ref bool handled, string prevReturnValue)
        {
            string log = DispatchLogHelper.GetSelectedWipLog(eqp as FabEqp, sels);

            return(log);
        }