自定义设备状态评估
要确定某个设备的状况,系统需要对在“配置和设置” > “设备”的设备“状况”页中定义的状况表达式求值。将按照表达式在“定义状况”表中显示的顺序进行求值。求值结果为 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
propertyName 必须满足两个条件才能用于 GetPropertyQuality 服务:
属性要么位于用来执行该服务的事物中,要么是远程属性,远程绑定到要用于执行该服务的事物。
属性名称不得包含句点,只能包含双短划线,例如 Channel1--DryingMachine--Status。如果属性名称包含句点,自定义代码必须解决此问题,如下例中所示。
在大多数情况下,属性标记包含两部分:源事物部分和属性部分,用冒号 (:) 隔开。
属性部分必须从属性标记字符串中提取,随后用于 GetPropertyQuality 服务的执行。在自定义 CalculateStatus 服务时,两个部分都必须实施不良数据检测。
实施示例
以下代码是自定义 JavaScript 代码的示例,可使用 GetPropertyQuality 服务检测特定标记的不良数据。
* 
代码示例将属性名称中所用的句点转换成 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;