Auswertung des Anlagenstatus anpassen
Um den Status eines Ausrüstungsgegenstands zu ermitteln, wertet das System die Statusausdrücke aus, die auf der Seite Status für die Anlage unter Konfiguration und Setup > Anlage definiert wurden. Die Ausdrücke werden in der Reihenfolge ausgewertet, in der sie in der Tabelle Status definieren angezeigt werden. Der erste Ausdruck, dessen Auswertung true liefert, bestimmt den Status der Anlage.
Die Statusausdrücke, die für jeden Ausrüstungsgegenstand definiert wurden, sind die einzige Informationsquelle für die Auswertung des Anlagenstatus. Die Dingvorlage für jeden Anlagetyp mit Status implementiert die Dingform PTC.SCA.SCO.StatusThingShape. Diese Dingform ruft wiederum die Statusauswertungslogik auf, die vom Dienst CalculateStatus im Ding PTC.Factory.StatusExpressionUtils implementiert wird. Jede Anlagentyp-Dingvorlage und jedes Anlagending erbt den Dienst CalculateStatus. Dieser Dienst wertet die Statusausdrücke aus, die auf der Seite Status der Anlage unter Konfiguration und Setup > Anlage definiert wurden. Weitere Informationen finden Sie unter Statusausdrücke angeben.
Sie können den Dienst CalculateStatus in einer benutzerdefinierten Dingvorlage oder einem einzelnen Ding aufheben, um eine eigene Statusauswertungslogik zu implementieren. Beachten Sie Folgendes, wenn Sie den Dienst CalculateStatus überschreiben:
Das Ergebnis jeder Anpassung für CalculateStatus muss auf die Variable result festgelegt werden und muss eine Ganzzahl sein.
Wenn die Anpassung die Eingabeparameter thingId und item nicht beinhaltet, können Sie diese mithilfe des folgenden Codes rekonstruieren:
var thingId = thingId;
var item = Things["PTC.Factory.StatusExpressionResourceProvider"].GetById({id:thingId});
Anpassungen an einer benutzerdefinierten Dingvorlage sind unabhängig von Anpassungen an jeder anderen Dingvorlage.
Anpassungen für einzelne Ausrüstungsgegenstände sind voneinander unabhängig. Eine Anpassung an einem einzelnen Ausrüstungsgegenstand (Ding) hat Vorrang vor jeder Anpassung der Dingvorlage für den betreffenden Anlagentyp.
Wenn der benutzerdefinierte Code, der zum Überschreiben des Dienstes CalculateStatus verwendet wurde, explizit Eigenschafts-Tags verwendet und Sie möchten, dass die Datenqualität geprüft wird, muss dies durch benutzerdefinierten Code geschehen.
Daten schlechter Qualität in benutzerdefiniertem Code erkennen
Wenn der benutzerdefinierte Code, der zum Überschreiben des Dienstes CalculateStatus verwendet wurde, explizit Eigenschafts-Tags verwendet und Sie möchten, dass die Datenqualität geprüft wird, muss dies durch benutzerdefinierten Code geschehen.
Die Funktion IS_DATA_OK, die in Statusausdrücken verwendet wird, kann auch zum Erkennen von Daten schlechter Qualität in benutzerdefiniertem Code verwendet werden. Die Funktion ruft den Dienst GetPropertyQuality auf, der die Qualität der Daten prüft. Dieser Dienst ist für jede Ding-Entität verfügbar, geerbt aus der Dingvorlage GenericThing. Dieser Dienst übernimmt eine propertyName-Zeichenfolge als einzigen Parameter und gibt einen der folgenden Zeichenfolgenwerte zurück:
UNKNOWN
GOOD
BAD
OUT_OF_RANGE
UNVERIFIED_SOURCE
Für eine Verwendung im Dienst GetPropertyQuality muss propertyName zwei Bedingungen erfüllen:
Die Eigenschaft muss entweder für das zum Ausführen des Dienstes verwendete Ding vorhanden sein oder eine Remote-Eigenschaft sein, die remote an das zum Ausführen des Dienstes verwendete Ding gebunden ist.
Der Eigenschaftsname darf keine Punkte enthalten, nur doppelte Bindestriche, z.B. Channel1--DryingMachine--Status. Wenn der Eigenschaftsname Punkte enthält, muss Ihr benutzerdefinierter Code dieses Problem beheben, wie im folgenden Beispiel gezeigt.
In den meisten Fällen besteht ein Eigenschafts-Tag aus zwei Teilen, einem für das Quellding und einem für die Eigenschaft, getrennt durch einen Doppelpunkt (:).
Der Teil für die Eigenschaft muss aus der Zeichenfolge des Eigenschafts-Tags extrahiert und anschließend bei der Ausführung des Dienstes GetPropertyQuality verwendet werden. Beide Teile sind erforderlich, um bei der Anpassung des Dienstes CalculateStatus die Erkennung von Daten schlechter Qualität zu implementieren.
Implementierungsbeispiel
Der folgende Code ist ein Beispiel von benutzerdefiniertem JavaScript-Code, der den Dienst GetPropertyQuality verwendet, um Daten schlechter Qualität für ein bestimmtes Tag zu erkennen.
* 
Das Codebeispiel konvertiert den Eigenschaftsnamen, der Punkte verwendet, sodass er doppelte Bindestriche verwendet, wie vom Dienst GetPropertyQuality erfordert.
// The property tag to be tested for bad quality data. This tag hypothetically
// points to some value on some server
var propertyTag = "PTC.SCA.SCO.Demo.KepServer:CheeseCake.Fryer.Status";
// Split the property tag into 2 portions:
// 1. The source thing portion
// 2. The property portion
var splitResult = propertyTag.split(":");
var sourceThingName = splitResult[0]; // The source thing portion
var propertyName = splitResult[1]; // The property portion
var sourceThing = Things[sourceThingName]; // Get the source thing that has the property
// Convert the property name to a Thingworx friendly name
var propertyName_friendly = propertyName.replace(/\./g, "--");
var statusEvaluationResult;
if (sourceThing !== null) {
params = {
propertyName: propertyName_friendlyc f /* STRING */
};
var quality = sourceThing.GetPropertyQuality(params); // Calling the service (API) to check the quality
// Here do some processing according to the result of the quality check
if (quality === "GOOD") {
// Set a certain status when the quality is GOOD
statusEvaluationResult = 2; // Status "2" = "Running"
} else if (quality === "BAD") {
// Set a certain status when the quality is BAD
statusEvaluationResult = 4; // Status "4" = "Unplanned Downtime"
} else {
// Set a certain status when the quality is anything other that GOOD or BAD (i.e. UNKNOWN, OUT_OF_RANGE, UNVERIFIED_SOURCE)
statusEvaluationResult = 5; // Status "5" = "Unavailable"
}
}
result = statusEvaluationResult;