Пример #1
0
        public List <BlackMaple.MachineFramework.MaterialToSendToExternalQueue> HandleEvent(LogEntry e)
        {
            var cycle          = new List <MWI.LogEntry>();
            var sendToExternal = new List <BlackMaple.MachineFramework.MaterialToSendToExternalQueue>();

            if (e.Pallet >= 1)
            {
                cycle = _log.CurrentPalletLog(e.Pallet.ToString());
            }

            var jobs = new Dictionary <string, JobPlan>();

            Log.Debug("Handling mazak event {@event}", e);

            switch (e.Code)
            {
            case LogCode.LoadBegin:

                _log.RecordLoadStart(
                    mats: CreateMaterialWithoutIDs(e),
                    pallet: e.Pallet.ToString(),
                    lulNum: e.StationNumber,
                    timeUTC: e.TimeUTC,
                    foreignId: e.ForeignID);

                break;

            case LogCode.LoadEnd:

                _log.AddPendingLoad(e.Pallet.ToString(), PendingLoadKey(e), e.StationNumber,
                                    CalculateElapsed(e, cycle, LogType.LoadUnloadCycle, e.StationNumber),
                                    CalculateActiveLoadTime(e),
                                    e.ForeignID);
                break;

            case LogCode.MachineCycleStart:

                // There should never be any pending loads since the pallet movement event should have fired.
                // Just in case, we check for pending loads here
                cycle = CheckPendingLoads(e.Pallet, e.TimeUTC.AddSeconds(-1), "", false, cycle);

                _log.RecordMachineStart(
                    mats: GetMaterialOnPallet(e, cycle).Select(m => m.Mat),
                    pallet: e.Pallet.ToString(),
                    statName: _machGroupName.MachineGroupName,
                    statNum: e.StationNumber,
                    program: e.Program,
                    timeUTC: e.TimeUTC,
                    pockets: ToolsToSnapshot(e.StationNumber, _mazakSchedules.Tools),
                    foreignId: e.ForeignID);

                break;

            case LogCode.MachineCycleEnd:

                var      machStart = FindMachineStart(e, cycle, e.StationNumber);
                TimeSpan elapsed;
                IEnumerable <JobLogDB.ToolPocketSnapshot> toolsAtStart;
                if (machStart != null)
                {
                    elapsed      = e.TimeUTC.Subtract(machStart.EndTimeUTC);
                    toolsAtStart = _log.ToolPocketSnapshotForCycle(machStart.Counter);
                }
                else
                {
                    Log.Debug("Calculating elapsed time for {@entry} did not find a previous cycle event", e);
                    elapsed      = TimeSpan.Zero;
                    toolsAtStart = Enumerable.Empty <JobLogDB.ToolPocketSnapshot>();
                }
                var toolsAtEnd = ToolsToSnapshot(e.StationNumber, _mazakSchedules.Tools);

                if (elapsed > TimeSpan.FromSeconds(30))
                {
                    var machineMats = GetMaterialOnPallet(e, cycle);
                    var s           = _log.RecordMachineEnd(
                        mats: machineMats.Select(m => m.Mat),
                        pallet: e.Pallet.ToString(),
                        statName: _machGroupName.MachineGroupName,
                        statNum: e.StationNumber,
                        program: e.Program,
                        timeUTC: e.TimeUTC,
                        result: "",
                        elapsed: elapsed,
                        active: CalculateActiveMachining(machineMats),
                        tools: JobLogDB.ToolPocketSnapshot.DiffSnapshots(toolsAtStart, toolsAtEnd),
                        pockets: toolsAtEnd,
                        foreignId: e.ForeignID);
                    HandleMachiningCompleted(s);
                }
                else
                {
                    //TODO: add this with a FAIL result and skip the event in Update Log?
                    Log.Warning("Ignoring machine cycle at {time} on pallet {pallet} because it is less than 30 seconds",
                                e.TimeUTC, e.Pallet);
                }

                break;

            case LogCode.UnloadBegin:

                _log.RecordUnloadStart(
                    mats: GetMaterialOnPallet(e, cycle).Select(m => m.Mat),
                    pallet: e.Pallet.ToString(),
                    lulNum: e.StationNumber,
                    timeUTC: e.TimeUTC,
                    foreignId: e.ForeignID);

                break;

            case LogCode.UnloadEnd:

                //TODO: test for rework
                var loadElapsed = CalculateElapsed(e, cycle, LogType.LoadUnloadCycle, e.StationNumber);

                var mats   = GetMaterialOnPallet(e, cycle);
                var queues = FindUnloadQueues(mats);
                sendToExternal.AddRange(FindSendToExternalQueue(mats));

                _log.RecordUnloadEnd(
                    mats: mats.Select(m => m.Mat),
                    pallet: e.Pallet.ToString(),
                    lulNum: e.StationNumber,
                    timeUTC: e.TimeUTC,
                    elapsed: loadElapsed,
                    active: CalculateActiveUnloadTime(mats),
                    foreignId: e.ForeignID,
                    unloadIntoQueues: queues);

                break;

            case LogCode.PalletMoving:

                if (e.FromPosition != null && e.FromPosition.StartsWith("LS"))
                {
                    CheckPendingLoads(e.Pallet, e.TimeUTC, e.ForeignID, true, cycle);
                }

                break;
            }

            _onMazakLog(e);

            return(sendToExternal);
        }
Пример #2
0
        public List <BlackMaple.MachineFramework.MaterialToSendToExternalQueue> HandleEvent(LogEntry e)
        {
            var cycle          = new List <MWI.LogEntry>();
            var sendToExternal = new List <BlackMaple.MachineFramework.MaterialToSendToExternalQueue>();

            if (e.Pallet >= 1)
            {
                cycle = _log.CurrentPalletLog(e.Pallet.ToString());
            }

            var jobs = new Dictionary <string, JobPlan>();

            Log.Debug("Handling mazak event {@event}", e);

            switch (e.Code)
            {
            case LogCode.LoadBegin:

                _log.RecordLoadStart(
                    mats: CreateMaterialWithoutIDs(e),
                    pallet: e.Pallet.ToString(),
                    lulNum: e.StationNumber,
                    timeUTC: e.TimeUTC,
                    foreignId: e.ForeignID);

                break;

            case LogCode.LoadEnd:

                _log.AddPendingLoad(e.Pallet.ToString(), PendingLoadKey(e), e.StationNumber,
                                    CalculateElapsed(e, cycle, LogType.LoadUnloadCycle, e.StationNumber),
                                    CalculateActiveLoadTime(e),
                                    e.ForeignID);
                break;

            case LogCode.MachineCycleStart:

                // There should never be any pending loads since the pallet movement event should have fired.
                // Just in case, we check for pending loads here
                cycle = CheckPendingLoads(e.Pallet, e.TimeUTC.AddSeconds(-1), "", false, cycle);

                _log.RecordMachineStart(
                    mats: GetMaterialOnPallet(e, cycle).Select(m => m.Mat),
                    pallet: e.Pallet.ToString(),
                    statName: "MC",
                    statNum: e.StationNumber,
                    program: e.Program,
                    timeUTC: e.TimeUTC,
                    foreignId: e.ForeignID);

                Log.Debug("Tools at machine cycle start for machine {machine}: {@tools}", e.StationNumber, _mazakSchedules.Tools.ToList());

                break;

            case LogCode.MachineCycleEnd:

                var elapsed = CalculateElapsed(e, cycle, LogType.MachineCycle, e.StationNumber);

                if (elapsed > TimeSpan.FromSeconds(30))
                {
                    var machineMats = GetMaterialOnPallet(e, cycle);
                    var s           = _log.RecordMachineEnd(
                        mats: machineMats.Select(m => m.Mat),
                        pallet: e.Pallet.ToString(),
                        statName: "MC",
                        statNum: e.StationNumber,
                        program: e.Program,
                        timeUTC: e.TimeUTC,
                        result: "",
                        elapsed: elapsed,
                        active: CalculateActiveMachining(machineMats),
                        foreignId: e.ForeignID);
                    HandleMachiningCompleted(s);
                }
                else
                {
                    //TODO: add this with a FAIL result and skip the event in Update Log?
                    Log.Warning("Ignoring machine cycle at {time} on pallet {pallet} because it is less than 30 seconds",
                                e.TimeUTC, e.Pallet);
                }

                Log.Debug("Tools at machine cycle end on machine {machine}: {@tools}", e.StationNumber, _mazakSchedules.Tools.ToList());

                break;

            case LogCode.UnloadBegin:

                _log.RecordUnloadStart(
                    mats: GetMaterialOnPallet(e, cycle).Select(m => m.Mat),
                    pallet: e.Pallet.ToString(),
                    lulNum: e.StationNumber,
                    timeUTC: e.TimeUTC,
                    foreignId: e.ForeignID);

                break;

            case LogCode.UnloadEnd:

                //TODO: test for rework
                var loadElapsed = CalculateElapsed(e, cycle, LogType.LoadUnloadCycle, e.StationNumber);

                var mats   = GetMaterialOnPallet(e, cycle);
                var queues = FindUnloadQueues(mats);
                sendToExternal.AddRange(FindSendToExternalQueue(mats));

                _log.RecordUnloadEnd(
                    mats: mats.Select(m => m.Mat),
                    pallet: e.Pallet.ToString(),
                    lulNum: e.StationNumber,
                    timeUTC: e.TimeUTC,
                    elapsed: loadElapsed,
                    active: CalculateActiveUnloadTime(mats),
                    foreignId: e.ForeignID,
                    unloadIntoQueues: queues);

                break;

            case LogCode.PalletMoving:

                if (e.FromPosition != null && e.FromPosition.StartsWith("LS"))
                {
                    CheckPendingLoads(e.Pallet, e.TimeUTC, e.ForeignID, true, cycle);
                }

                break;
            }

            _onMazakLog(e);

            return(sendToExternal);
        }