/// <summary> /// Update all relevance parameters after a node value update. /// </summary> public void UpdateRelevance(ContosoAggregatedOeeKpiTimeSpan topologyNode) { if (Relevance != null) { foreach (ContosoPerformanceRelevance relevance in Relevance) { UpdateRelevanceItem(topologyNode, relevance, Last); } } }
/// <summary> /// Update the alerts for the specified node. /// </summary> void UpdateKPIAndOeeAlerts(ContosoTopologyNode node) { ContosoAggregatedOeeKpiTimeSpan oeeKpi = node.Last; node.Status |= UpdateAlert(node, oeeKpi.Kpi1.Kpi, oeeKpi.Kpi1.Time, node.Kpi1PerformanceSetting, ContosoAlertCause.AlertCauseKpi1BelowMinimum, ContosoAlertCause.AlertCauseKpi1AboveMaximum); node.Status |= UpdateAlert(node, oeeKpi.Kpi2.Kpi, oeeKpi.Kpi2.Time, node.Kpi2PerformanceSetting, ContosoAlertCause.AlertCauseKpi2BelowMinimum, ContosoAlertCause.AlertCauseKpi2AboveMaximum); node.Status |= UpdateAlert(node, node.OeeAvailabilityLast.OeeAvailability, node.OeeAvailabilityLast.Time, node.OeeAvailabilityPerformanceSetting, ContosoAlertCause.AlertCauseOeeAvailabilityBelowMinimum, ContosoAlertCause.AlertCauseOeeAvailabilityAboveMaximum); node.Status |= UpdateAlert(node, node.OeePerformanceLast.OeePerformance, node.OeePerformanceLast.Time, node.OeePerformancePerformanceSetting, ContosoAlertCause.AlertCauseOeePerformanceBelowMinimum, ContosoAlertCause.AlertCauseOeePerformanceAboveMaximum); node.Status |= UpdateAlert(node, node.OeeQualityLast.OeeQuality, node.OeeQualityLast.Time, node.OeeQualityPerformanceSetting, ContosoAlertCause.AlertCauseOeeQualityBelowMinimum, ContosoAlertCause.AlertCauseOeeQualityAboveMaximum); }
/// <summary> /// Callback for a query to update the relevance data of a topology node. /// </summary> public void UpdateRelevanceItem(ContosoAggregatedOeeKpiTimeSpan topologyNode, ContosoPerformanceRelevance relevance, ContosoDataItem data) { switch (relevance) { case ContosoPerformanceRelevance.Kpi2: case ContosoPerformanceRelevance.Kpi2_Station: topologyNode.Kpi2.Kpi = data.Value; topologyNode.Kpi2.Time = data.Time; break; case ContosoPerformanceRelevance.Kpi1: case ContosoPerformanceRelevance.Kpi1_Station: topologyNode.Kpi1.Kpi = data.Value; topologyNode.Kpi1.Time = data.Time; break; case ContosoPerformanceRelevance.OeeQuality_Bad: topologyNode.OeeQuality.Bad = data.Value; topologyNode.OeeQuality.Time = new DateTime(Math.Max(topologyNode.OeeQuality.Time.Ticks, data.Time.Ticks), DateTimeKind.Utc); topologyNode.OeeOverall.Quality = topologyNode.OeeQuality.OeeQuality; break; case ContosoPerformanceRelevance.OeeQuality_Station_Good: case ContosoPerformanceRelevance.OeeQuality_Good: topologyNode.OeeQuality.Good = data.Value; topologyNode.OeeQuality.Time = new DateTime(Math.Max(topologyNode.OeeQuality.Time.Ticks, data.Time.Ticks), DateTimeKind.Utc); topologyNode.OeeOverall.Quality = topologyNode.OeeQuality.OeeQuality; break; case ContosoPerformanceRelevance.OeePerformance_Ideal: topologyNode.OeePerformance.IdealCycleTime = data.Value; topologyNode.OeePerformance.Time = new DateTime(Math.Max(topologyNode.OeePerformance.Time.Ticks, data.Time.Ticks), DateTimeKind.Utc); topologyNode.OeeOverall.Performance = topologyNode.OeePerformance.OeePerformance; break; case ContosoPerformanceRelevance.OeePerformance_Actual: topologyNode.OeePerformance.ActualCycleTime = data.Value; topologyNode.OeePerformance.Time = new DateTime(Math.Max(topologyNode.OeePerformance.Time.Ticks, data.Time.Ticks), DateTimeKind.Utc); topologyNode.OeeOverall.Performance = topologyNode.OeePerformance.OeePerformance; break; case ContosoPerformanceRelevance.OeeAvailability_Running: topologyNode.OeeAvailability.OverallRunningTime = data.Value; topologyNode.OeeAvailability.Time = new DateTime(Math.Max(topologyNode.OeeAvailability.Time.Ticks, data.Time.Ticks), DateTimeKind.Utc); topologyNode.OeeOverall.Availability = topologyNode.OeeAvailability.OeeAvailability; break; case ContosoPerformanceRelevance.OeeAvailability_Fault: topologyNode.OeeAvailability.OverallFaultTime = data.Value; topologyNode.OeeAvailability.Time = new DateTime(Math.Max(topologyNode.OeeAvailability.Time.Ticks, data.Time.Ticks), DateTimeKind.Utc); topologyNode.OeeOverall.Availability = topologyNode.OeeAvailability.OeeAvailability; break; } }
public void AddStation(ContosoAggregatedOeeKpiTimeSpan x) { Kpi1.AddStation(x.Kpi1); Kpi2.AddStation(x.Kpi2); OeeAvailability.AddStation(x.OeeAvailability); OeePerformance.AddStation(x.OeePerformance); OeeQuality.AddStation(x.OeeQuality); OeeOverall.Update(OeeAvailability, OeePerformance, OeeQuality); if (x.EndTime > EndTime) { EndTime = x.EndTime; } }
/// <summary> /// Get the relevant Oee Kpi data item. /// </summary> private ContosoDataItem GetData(ContosoAggregatedOeeKpiTimeSpan oeeKpi, ContosoPerformanceRelevance relevance) { switch (relevance) { case ContosoPerformanceRelevance.Kpi1: return(oeeKpi.Kpi1); case ContosoPerformanceRelevance.Kpi2: return(oeeKpi.Kpi2); case ContosoPerformanceRelevance.OeeQuality: return(oeeKpi.OeeQuality); case ContosoPerformanceRelevance.OeePerformance: return(oeeKpi.OeePerformance); case ContosoPerformanceRelevance.OeeAvailability: return(oeeKpi.OeeAvailability); case ContosoPerformanceRelevance.OeeOverall: return(oeeKpi.OeeOverall); } throw new Exception("Invalid Performance Relevance"); }
/// <summary> /// Update the OEE and KPI values /// </summary> public void UpdateAllKPIAndOEEValues(int histogram = 0) { // topology is updated from bottom to top nodes, add Production Line view List <string> orderedlist = GetAllChildren(TopologyRoot.Key, typeof(ProductionLine)); // add factory view orderedlist.AddRange(GetAllChildren(TopologyRoot.Key, typeof(Factory))); // add top view orderedlist.Add(TopologyRoot.Key); bool updateStatus = false; // update all, list is already in the right order to process sequentially foreach (string item in orderedlist) { ContosoTopologyNode actualNode = this[item] as ContosoTopologyNode; if (actualNode != null) { ContosoAggregatedOeeKpiHistogram oeeKpiHistogram = actualNode[histogram]; for (int i = 0; i < oeeKpiHistogram.Intervals.Count; i++) { ContosoAggregatedOeeKpiTimeSpan oeeKpiNode = oeeKpiHistogram[i]; oeeKpiNode.Reset(); List <string> children = actualNode.GetChildren(); foreach (string child in children) { // special case for child as OPC UA server Station childStation = this[child] as Station; if (childStation != null) { ContosoAggregatedOeeKpiTimeSpan oeeKpiChild = childStation[histogram, i]; // add all Oee and KPI using the metric for stations oeeKpiNode.AddStation(oeeKpiChild); // update alerts for the station ContosoAggregatedOeeKpiHistogram childOeeKpiHistogram = childStation[histogram]; if (childOeeKpiHistogram.CheckAlerts) { UpdateKPIAndOeeAlerts(childStation); } } else { ContosoTopologyNode childNode = this[child] as ContosoTopologyNode; if (childNode != null) { ContosoAggregatedOeeKpiTimeSpan oeeKpiChild = childNode[histogram, i]; // add all Oee and KPI using the default metric oeeKpiNode.Add(oeeKpiChild); } else { continue; } } } if (oeeKpiNode.EndTime > oeeKpiHistogram.EndTime) { oeeKpiHistogram.EndTime = oeeKpiNode.EndTime; } } if (oeeKpiHistogram.CheckAlerts) { // check for alerts UpdateKPIAndOeeAlerts(actualNode); updateStatus = true; } } } if (updateStatus) { UpdateAllStatusTopology(); } }
public ContosoOeeKpiOpCodeQueryInfo(string appUri, ContosoAggregatedOeeKpiTimeSpan topologyNode) { AppUri = appUri; TopologyNode = topologyNode; }