自訂資訊內容與存取 > 設定及自訂 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。更改在步驟 1 中建立的 KPI 管理員的 Value 值,然後按一下「設定」
c. 按一下「儲存」,儲存啟動點組態物件的更新。
3. 在新的 KPI 管理員物件上,建立服務以檢索目前正在執行的工作訂單。
a. 「服務」下按一下「新增」
b. 對於「名稱」,輸入 GetRunningJobOrders
c. 對於 「輸出」,請從下拉選單中選取 「INFOTABLE」。對於 「資料形式」,搜尋並選擇 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. 對於 「輸出」,請從下拉選單中選取 「INFOTABLE」
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。
* 
建立工作訂單時,會在 CreateJobOrders 服務輸出中傳回工作訂單的 UID。您也可以使用 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. 按一下「完成」,然後按一下「儲存」