自訂設備狀態評估
欲確定設備工件狀態,系統會評估在「組態與設定」 > 「設備」「狀態」頁面上為設備定義的狀態運算式。運算式依據「定義狀態」表中的顯示順序予以評估。評估為 true 的第一個運算式決定設備狀態。
針對設備各個工件所定義的狀態運算式,是用於評估設備狀態之資訊的唯一來源。每個設備類型的項目範本 (包含狀態) 實行 PTC.SCA.SCO.StatusThingShape。此物形式反過來調用狀態評估邏輯,該邏輯將透過 PTC.Factory.StatusExpressionUtils 物件上的 CalculateStatus 服務實行。每個設備類型物範本與設備物件會繼承 CalculateStatus 服務。此服務會評估在「組態與設定」 > 「設備」中之設備「狀態」頁面上定義的狀態運算式。若需進一步資訊,可參閱 指定狀態運算式
您可取代自訂物範本或單個物件的 CalculateStatus 服務,以實行您自己的狀態評估邏輯。如果您計劃取代 CalculateStatus 服務,請注意以下幾點︰
CalculateStatus 任何自訂的結果必須設定為 result 變數,且必須是整數。
如果自訂不涉及 thingIditem 輸入參數,您可使用以下程式碼重新建構這些參數:
var thingId = thingId;
var item = Things["PTC.Factory.StatusExpressionResourceProvider"].GetById({id:thingId});
單個自訂項目範本的自訂,獨立於任何其他項目範本的自訂。
設備單個工件的自訂相互獨立。設備 (項目) 單個工件的自訂,優先於該設備類型項目範本的任何自訂。
如果用於取代 CalculateStatus 服務的自訂程式碼明確使用內容標籤,則自訂程式碼需解決 檢查資料品質這一問題 (若需要)。
偵測自訂程式碼中的不良品質資料
如果用於取代 CalculateStatus 服務的自訂程式碼明確使用內容標籤,而且您想檢查資料品質,則您的程式碼需解決這一問題。
狀態運算式中使用的 IS_DATA_OK 函數,還可用於偵測自訂程式碼中的不良品質資料。函數可調用用於檢查資料品質的 GetPropertyQuality 服務。此服務繼承自 GenericThing 項目範本,可用於所有項目實體之上。此服務採用 propertyName 字串作為其唯一參數,並回傳下列字串值之一:
UNKNOWN
GOOD
BAD
OUT_OF_RANGE
UNVERIFIED_SOURCE
若要用於 GetPropertyQuality 服務之中,則 propertyName 必須滿足兩種情況:
屬性必須存在於「用以執行服務的項目」之上;或可為遠端屬性,必須遠端繫結至「用以執行服務的項目」。
屬性名稱內不能有點 (.),僅能有雙破折號 (--),例如 Channel1--DryingMachine--Status。如果屬性名稱內有點 (.),則自訂程式碼必須解決此一問題,如下列範例所示。
在大多數情況下,屬性標籤可分為「來源項目」與「屬性」兩個部份,中間以冒號 (:) 區隔。
內容部分必須解壓縮自內容標籤字串,接著用以執行 GetPropertyQuality 服務。在自訂 CalculateStatus 服務時,必備此兩個部分才能實行不良品質資料偵測。
實作範例
下列程式碼是使用 GetPropertyQuality 服務偵測特定標籤上的不良品質資料的自訂 JavaScript 程式碼範例。
* 
針對原本使用點 (.) 的內容名稱,程式碼範例會根據 GetPropertyQuality 服務需要,將之轉為使用雙破折號 (--)。
// 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;