自定义信息内容和访问 > 配置和自定义 KPI > 使用工作单而非班次来计算 KPI
使用工作单而非班次来计算 KPI
作为自定义项,您可使用工作单而非班次作为时间段来计算 KPI。这将计算工作单从开始到完成期间的 KPI,该时间段可能覆盖多个班次。
* 
计算 KPI 时可使用班次作为时间段或使用工作单作为时间段。这一自定义项会将所有 KPI 的计算更改为使用工作单。
使用这一自定义项后,每次计算 KPI 时,系统都会检索所有正在运行的工作单。正在运行的工作单是指满足以下两项的工作单:
当前时间晚于工作单的实际开始时间。
未定义工作单的实际结束时间。
对于检索到的每个工作单,会找到引用该工作单 UID 的所有资产。根据工作单的实际开始时间和当前时间来计算这些资产的当前 KPI 值。
要自定义使用工作单进行 KPI 计算,请完成下列步骤:
自定义 KPI 管理器
1. 创建派生自 PTC.SCA.SCO.KPIManagerThingTemplate 的新 KPI 管理器事物。
a. 单击“新建”,然后选择“事物”
b. 输入事物的“名称”
c. “基本事物模板”中,选择 PTC.SCA.SCO.KPIManagerThingTemplate 或派生自 PTC.SCA.SCO.KPIManagerThingTemplate 的事物模板。
d. 单击“保存”以保存新事物模板。
2. 编辑为系统定义的 KPIManager
a. 导航到启动点配置事物 (PTC.Factory.C_LaunchPointConfigurationThing_[ReleaseVersion])。
b. “配置”下的 ManagerConfigurationSettings 表中,单击 以编辑 KPIManager。将 Value 更改为步骤 1 中创建的 KPI 管理器事物,然后单击“设置”
c. 单击“保存”以保存对启动点配置事物的更新。
3. 在新 KPI 管理器事物上,创建一项服务来检索当前正在运行的工作单。
a. “服务”下,单击“添加”
b. “名称”中,输入 GetRunningJobOrders
c. “输出”中,从下拉菜单中选择“信息表”。在“数据形状”中,搜索并选择 PTC.SCA.SCO.JobOrder
d. 在服务编辑器中输入以下代码:

var filters = {
"filters": {
"filters": [
{
"dataShapeName": "PTC.SCA.SCO.JobOrder",
"fieldName": "ActualStartTime",
"type": "LE",
"value": new Date()
},
{
"dataShapeName": "PTC.SCA.SCO.JobOrder",
"fieldName": "ActualEndTime",
"type": "MISSINGVALUE"
}

],
"type": "AND"
},
"sorts": [
{
"fieldName": "ActualStartTime",
"isAscending": true
}
]
}
// result: THINGNAME
var productionOrder = Things["PTC.Factory.LaunchPointConfigurationThing"].GetProductionOrderManagerThingName();
// result: INFOTABLE dataShape: "PTC.SCA.SCO.JobOrder"
var result = Things[productionOrder].GetJobOrders({
filter: filters /* JSON */,
offset: -1 /* INTEGER */,
limit: 99999999 /* INTEGER */
});
e. 单击“保存并继续”
4. 在新 KPI 管理器事物上,创建一项服务来检索所有计算 KPI 且与此工作单相关的所有设备事物。
a. “服务”下,单击“添加”
b. “名称”中,输入 GetKPIElementsFromJobOrder
c. “输入”中,单击“添加”。在“名称”中,输入 JobOrderUID
d. “输出”中,从下拉菜单中选择“信息表”
e. 在服务编辑器中输入以下代码:
//Calculate all elements value
//Retrieve all KPIElement things
var elementThingShape = "PTC.SCA.SCO.KPIElementThingShape";
var maxItems = 300;
var filter = {
"filters" : {
"type" : "EQ",
"fieldName" : "JobOrderUID",
"value" : JobOrderUID
}
};

var tmpResult = Resources["SearchFunctions"].SearchThings({
searchExpression: undefined /* STRING */,
modelTags: undefined /* TAGS */,
networks: undefined /* JSON */,
types: {"items":["Thing"]} /* JSON */,
thingTemplates: undefined /* JSON */,
thingShapes: {"items":["PTC.SCA.SCO.KPIElementThingShape"]} /* JSON */,
aspects: undefined /* JSON */,
excludedAspects: undefined /* JSON */,
identifierSearchExpression: undefined /* STRING */,
query: filter /* QUERY */,
maxItems: maxItems /* NUMBER */,
maxSearchItems: maxItems /* NUMBER */
});
var result = tmpResult.getRow(0).thingResults;
f. 单击“保存并继续”
5. 在新 KPI 管理器事物上,查找并覆盖 GetKPIElementsFromTimeInfo 服务。
6. 将服务编辑器中的内容替换为以下代码:
var jobOrderUID = TimeInfo.getRow(0).UID+"";
var result = me.GetKPIElementsFromJobOrder({
JobOrderUID: jobOrderUID /* STRING */
});
7. 单击“完成”,然后单击“保存”
自定义 KPI 计算计划程序
完成下列步骤以自定义 KPI 计算计划程序:
1. 导航至 PTC.SCA.SCO.KPIScheduler
2. “服务”下,覆盖 GetTimeInfos 服务。
3. 将服务编辑器中的内容替换为以下代码:
var params = {
infoTableName : "InfoTable",
dataShapeName : "PTC.SCA.SCO.TimeInfo"
};
// CreateInfoTableFromDataShape(infoTableName:STRING("InfoTable"), dataShapeName:STRING):INFOTABLE(PTC.SCA.SCO.TimeInfo)
var result = Resources["InfoTableFunctions"].CreateInfoTableFromDataShape(params);

//Retrieve All JobOrders
var jobOrders =Things[Things["PTC.Factory.LaunchPointConfigurationThing"].GetKPIManagerThingName()].GetRunningJobOrders();
var tableLength = jobOrders.rows.length;
for (var x=0; x < tableLength; x++) {
var row = jobOrders.rows[x];
var uid = row.UID;
//Your code here
// PTC.SCA.SCO.ShiftInfo entry object
var newEntry = new Object();
newEntry.UID = uid; // LONG
newEntry.StartTimeDate = row.ActualStartTime; // DATETIME
newEntry.GeneratedID = 'JobOrder-'+uid; // STRING [Primary Key]
//newEntry.EndTimeDate = undefined; // DATETIME
newEntry.SiteUID = undefined; // LONG
result.AddRow(newEntry);
}
4. 单击“完成”,然后单击“保存”
将工作单与设备相关联
通过将设备事物上的 JobOrderUID 属性设置为作业单的 UID,将作业单与单个设备相关联。计算设备 KPI 时,工作单引用将作为 KPI 历史数据的一部分进行存储。
要将某一设备(例如资产或生产线)与工作单相关联:
1. ThingWorx Composer 中,导航至代表设备的事物。默认情况下,ThingWorx Composer 中的事物名称是 ThingWorx Apps 中显示的设备名称,带有设备类型前缀。例如,对于名为 1-2_GantryRobot 的资产,事物名称为 Asset_1-2_GantryRobot
2. “属性和警报”下,将 JobOrderUID 属性的值设置为相应作业单的 UID。
* 
创建作业单时,作业单的 UID 在 CreateJobOrders 服务输出中返回。您也可使用 GetJobOrders 服务来检索数据库中的作业单 (包括其 UID)。这两项服务位于默认生产订单管理器 (PTC.SCA.SCO.DefaultProductionOrderManager) 上。
3. 单击“保存”以保存对事物的更新。
有关作业单的详细信息,请参阅 作业单架构
开始工作单
通过设置作业单的 ActualStartTime 属性来开始作业单。
要设置工作单的开始时间:
1. ThingWorx Composer 中,导航至默认生产订单管理器 (PTC.SCA.SCO.DefaultProductionOrderManager)。
2. “服务”下,执行 UpdateJobOrders 服务。
3. JobOrders 输入参数表中,单击“添加”并提供要更新的作业单的 UID。在 ActualStartTime 字段输入新值。将其他字段留空。单击“添加”以将更新的信息添加到输入参数表中。
可通过将多个作业单分别添加到 JobOrders 输入参数表中来对其进行更新。
4. 单击“执行”
关闭工作单并触发最终 KPI 计算
通过设置作业单的 ActualEndTime 属性来关闭作业单。当工作单关闭时,必须触发最终 KPI 计算。执行最终 KPI 计算后,工作单和设备之间的关联可以被移除。
以下过程可创建一项服务,通过设置结束时间、触发最终 KPI 计算并移除工作单和设备之间的关联来关闭工作单。
1. 在新 KPI 管理器的“服务”下,单击“添加”
2. “名称”中,输入 CompleteJobOrder
3. 在服务编辑器中输入以下代码:
// result: INFOTABLE dataShape: "PTC.SCA.SCO.JobOrder"
var jobOrderManager = Things[Things["PTC.Factory.LaunchPointConfigurationThing"].GetProductionOrderManagerThingName()];
// result: INFOTABLE dataShape: "PTC.SCA.SCO.JobOrder"
var jobOrder = Things["PTC.SCA.SCO.DefaultProductionOrderManager"].GetJobOrder({
UID: jobOrderUID /* STRING */
});
//Update end Date
jobOrder.getRow(0).ActualEndTime = new Date();
var updatedJobOrder = jobOrderManager.UpdateJobOrders({
JobOrders: jobOrder /* INFOTABLE */
});
// CreateInfoTableFromDataShape(infoTableName:STRING("InfoTable"), dataShapeName:STRING):INFOTABLE(PTC.SCA.SCO.TimeInfo)
var timeInfo = Resources["InfoTableFunctions"].CreateInfoTableFromDataShape( {infoTableName : "InfoTable", dataShapeName : "PTC.SCA.SCO.TimeInfo"
});

var jobOrder = updatedJobOrder.rows[0];
var uid = jobOrder.UID;
// PTC.SCA.SCO.ShiftInfo entry object
var newEntry = new Object();
newEntry.UID = uid; // LONG
newEntry.StartTimeDate = jobOrder.ActualStartTime; // DATETIME
newEntry.EndTimeDate = jobOrder.ActualEndTime; // DATETIME
newEntry.GeneratedID = 'JobOrder-'+uid; // STRING [Primary Key]
newEntry.SiteUID = undefined; // LONG
timeInfo.AddRow(newEntry);

Things["PTC.SCA.SCO.KPIScheduler"].CalculateKPIsForTimeInfo({
TimeInfo: timeInfo /* INFOTABLE */
});

// result: INFOTABLE dataShape: ""
var result = Things[Things["PTC.Factory.LaunchPointConfigurationThing"].GetKPIManagerThingName()].GetKPIElementsFromJobOrder({
JobOrderUID: jobOrderUID /* STRING */
});
//Remove job order reference from the thing
var tableLength = result.rows.length;
for (var x=0; x < tableLength; x++) {
var row = result.rows[x];
//Your code here
Things[row.name].JobOrderUID = undefined;
}
4. 单击“完成”,然后单击“保存”