정보 콘텐츠 및 액세스 권한 사용자 정의 > KPI 구성 및 사용자 정의 > 교대 근무 대신 작업 지시서를 사용하여 KPI 계산
교대 근무 대신 작업 지시서를 사용하여 KPI 계산
일정 기간 동안 교대 근무 대신 작업 지시서를 사용하도록 사용자 지정하여 KPI를 계산할 수 있습니다. 이렇게 하면 해당 기간에 여러 교대 근무가 포함될 때 작업 지시서 기간(시작부터 완료까지) 동안 KPI를 계산합니다.
* 
일정 기간 동안의 근무 교대를 사용하거나 일정 기간 동안의 작업 지시서를 사용하여 KPI를 계산할 수 있습니다. 이 사용자 지정은 모든 KPI의 계산을 작업 지시서를 사용하도록 변경합니다.
이 사용자 지정이 생성되면 KPI가 계산될 때마다 시스템에서는 실행 중인 모든 작업 지시서를 검색합니다. 실행 중인 작업 지시서는 다음 문이 모두 true인 작업 지시서입니다.
현재 시간이 작업 지시서의 실제 시작 시간 이후입니다.
작업 지시서의 실제 종료 시간이 정의되지 않았습니다.
검색한 각 작업 지시서에 대해 작업 지시서의 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. 출력의 드롭다운 메뉴에서 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로 설정합니다.
* 
작업 지시서가 생성될 때 작업 지시서의 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. 완료를 클릭한 후 저장을 클릭합니다.