Beispiel: KPI "Nacharbeitsverhältnis"
In diesem Beispiel wird ein neuer KPI mit dem Namen "Nacharbeitsverhältnis (ISO_22400)" erstellt. Das Nacharbeitsverhältnis ist die Beziehung zwischen der Nacharbeitsmenge (RQ, Rework Quantity) und der produzierten Menge (PQ, Produced Quantity) für eine Arbeitseinheit, ein Produkt, einen Produktionsauftrag oder eine Fehlerart:
RQ/PQ
Das KPI-Element für die Nacharbeitsmenge (RQ) wird als Teil dieses Beispiels erstellt.
1. Erstellen Sie eine neue Dingform namens ACME_CORP.KPI.ReworkRatioThingShape mit den folgenden Eigenschaften:
ReworkRatio_currentValue, mit Basistyp=Number
ReworkRatio_lastCalculatedTime, mit Basistyp=DateTime
ReworkRatio_unitOfMeasure, mit Basistyp=String
Stellen Sie sicher, dass das Kontrollkästchen Persistent für jede Eigenschaft aktiviert ist.
2. Implementieren Sie die folgenden Dienste in der Dingform ACME_CORP.KPI.ReworkRatioThingShape:
Get_ReworkRatio_CurrentValue
Get_ReworkRatio_ThresholdValues
Get_ReworkRatio_Trend
ReworkRatio_Calculate
Set_ReworkRatio_CurrentValue
3. Überschreiben Sie in der Dingvorlage jedes Anlagentyps, für den dieser KPI berechnet werden soll, den Dienst GetKPINames. Fügen Sie die Dingform ACME_CORP.KPI.ReworkRatioThingShape wie im folgenden Beispielcode hinzu:
var kpiInfoJSON = new Object();
// JSON of KPI information we want to test if they are implemented on "me"
// For custom KPI, please add into this JSON and following given format
// Warning the order is important
kpiInfoJSON.kpiInfoArray = [
{kpiThingShapeName: 'PTC.SCA.SCO.AvailabilityThingShape', kpiName: 'Availability'},
{kpiThingShapeName: 'PTC.SCA.SCO.QualityRatioThingShape', kpiName: 'QualityRatio'},
{kpiThingShapeName: 'PTC.SCA.SCO.EffectivenessThingShape', kpiName: 'Effectiveness'},
{kpiThingShapeName: 'PTC.SCA.SCO.OEEThingShape', kpiName: 'OEE'},
{kpiThingShapeName: 'ACME_CORP.KPI.ReworkRatioThingShape', kpiName: 'ReworkRatio'}
];
var result = Things["PTC.SCA.SCO.DefaultKPIManager"].GetImplementedKPIsOnThing({
thingName: me.name,
kpiInfo: kpiInfoJSON
});
4. Deklarieren Sie die Schwellenwerte für den KPI "Nacharbeitsverhältnis". Fügen Sie auf der Seite Konfiguration des Dings PTC.SCA.SCO.DefaultKPIManager eine neue Konfigurationstabelle hinzu.
a. Fügen Sie im Ding PTC.SCA.SCO.DefaultKPIManager eine neue Konfigurationstabelle mit den folgenden Werten hinzu:
TabellennameReworkRatioThresholdValues
Data ShapePTC.SCA.SCO.KPIThresholdValues
Mehrere Zeilen zulassen – Stellen Sie sicher, dass dieses Kontrollkästchen ausgewählt ist.
b. Fügen Sie der Konfigurationstabelle ReworkRatioThresholdValues Zeilen für die gewünschten Wertebereiche hinzu, wie im folgenden Bild dargestellt:
5. Definieren Sie das KPI-Element für die Nacharbeitsmenge (RQ).
a. Erstellen Sie eine Eigenschaft in der Dingform ACME_CORP.KPI.ReworkRatioThingShape namens reworkQuantity_RQ mit dem Basistyp Number und ausgewähltem Kontrollkästchen Persistent.
b. Erstellen Sie einen neuen Dienst in der Dingform ACME_CORP.KPI.ReworkRatioThingShape namens reworkQuantity_RQ_Calculate mit dem folgenden Code:
function isUndefinedOrNull(value){
return (value === null || typeof(value) === "undefined" );
}
result = me.reworkQuantity_RQ;
//Register first value to cache
me.RegisterValueToKPICache({
key: "reworkQuantity_RQ_firstValue" /* STRING */,
value: result, /* NUMBER */
TimeInfo : TimeInfo
});
c. Überschreiben Sie in der Dingvorlage jedes Anlagentyps, für den dieser KPI berechnet werden soll, den Dienst GetKPIElementNames. Fügen Sie die neue Eigenschaft der Liste hinzu. Beispiel:
result = "actualProductionTime_APT,goodQuantity_GQ,plannedBusyTime_PBT,plannedRunTimePerItem_PRI,producedQuantity_PQ,reworkQuantity_RQ";
d. Aktualisieren Sie den in Schritt 2 erstellten Dienst ReworkRatio_Calculate, um das neue KPI-Element für die Nacharbeitsmenge (RQ) aufzunehmen. Beispiel:
var customLogger = logger.getLoggerContext().getLogger(logger.getName()+".com.ptc.sca.sco.KPICalculation.ReworkRatio");
var reworkRatio = me.reworkQuantity_RQ;
var producedQuantity = me.producedQuantity_PQ;
if (TimeInfo.getRowCount() > 0){
var row = TimeInfo.getRow(0);
var startTime = row.StartTimeDate;
var generatedID= row.GeneratedID;
// result from service GetKPIElementStartValue: INFOTABLE dataShape: "PTC.SCA.SCO.KPIElementValue"
var reworkQuantity_RQ_firstValue = me.GetKPICacheValue({
generatedID: generatedID/* STRING */,
name: "reworkQuantity_RQ_firstValue" /* STRING */
});
var producedQuantity_PQ_firstValue = me.GetKPICacheValue({
generatedID: generatedID/* STRING */,
name: "producedQuantity_PQ_firstValue" /* STRING */
});
var producedTotalQuantity = 0;
var producedReworkQuantity = 0;
if ( (typeof producedQuantity_PQ_firstValue !== 'undefined') && (typeof reworkQuantity_RQ_firstValue !== 'undefined') ){
producedTotalQuantity = (producedQuantity - producedQuantity_PQ_firstValue);
producedReworkQuantity = (reworkRatio - reworkQuantity_RQ_firstValue);
if ( producedTotalQuantity === 0 ){
// Until items are produced, rework ratio cannot be measured and will default to 1
// with producedReworkQuantity greater than 0, then the service will return 0.
reworkRatio = producedReworkQuantity > 0 ? 0: 1;
}
else{
reworkRatio = producedReworkQuantity / producedTotalQuantity;
}

customLogger.debug("ReworkRatio_Calculate: produced quantity value when time info started - last produced quantity :"+ producedQuantity_PQ_firstValue+"-"+producedQuantity);
customLogger.debug("ReworkRatio_Calculate: rework quantity value when time info started - last good quantity: "+ reworkQuantity_RQ_firstValue+"-"+reworkRatio);
customLogger.debug("ReworkRatio_Calculate: produced Rework Quantity / produced total quantity = quality ratio: " +producedReworkQuantity+ " / " + producedTotalQuantity + " = " + reworkRatio);
}
else{
customLogger.warn("ReworkRatio_Calculate for "+me.name+" could not retrieve the good quantity or produced quantity at the start of the time info.");
}
}
else{
customLogger.warn("ReworkRatio_Calculate for "+me.name+" could not retrieve the current time info. ReworkRatio = 0.");
}
var result = reworkRatio;
me.Set_ReworkRatio_CurrentValue({
value: result
});
var now = new Date();
me.ReworkRatio_lastCalculatedTime = now;