# 액션

> 실행이 시작 시점이나 완료 시점에 내놓는, 이름을 붙인 라벨과 보고서와 Logic 액션과 데이터베이스 행의 묶음입니다. 그 명령, 라벨의 마커 연결, 데이터베이스 행의 열, 그리고 절차가 그것을 고르는 방식입니다.

**액션**은 실행이 내놓는 서류의 이름 붙은 묶음입니다. 그 안에는 내놓는 것마다 **명령** 하나가 있으며, 저마다 무엇이 나오는지(라벨이냐, 보고서냐, Logic 액션의 실행이냐, 공장 데이터베이스의 행이냐), 언제(시작 시점이냐 완료 시점이냐), 스테이션 라이브러리의 어떤 템플릿이나 어떤 Logic 액션으로, 또는 어떤 데이터베이스 테이블로, 그리고 완료 시점이면 어떤 종합 판정에 대해 나오는지를 말합니다. 절차는 액션 전체를 고르므로, 한 번 쓴 묶음이 그것을 내놓는 모든 절차에 쓰이고, 명령 하나를 고치는 일이 절차마다가 아니라 한 번의 편집이 됩니다. 액션은 Process > 모델 > 모델 > 셋업 > **액션** 아래에 삽니다. 액션을 만들고 없애는 일, 액션의 이름과 명령과 그 연결을 편집하는 일이 모두 같은 **레시피와 판정 편집** 권한을 봅니다. 페이지도 그렇게 말합니다("액션을 바꾸려면 “레시피와 판정 편집” 권한이 필요합니다.").

## 액션 폴더 {#the-actions-folder}

**액션** 줄을 고르면 셋업의 다른 폴더와 다른 페이지가 열립니다. 모델의 액션 목록과, 그 안에서 고른 액션이 나란히 놓입니다. 액션은 형제들 옆에서 읽는 것이기 때문입니다. 목록의 순서가 모든 절차가 액션을 내놓는 순서이므로, 줄의 동사는 액션을 옮기지 명령을 옮기지 않습니다. 페이지는 준비 상태를 가리려고 스테이션 라이브러리 둘(라벨 템플릿과 보고서 서식)을 읽어 들입니다. 하나를 읽지 못하면 알림 띠가 "공용 라벨 템플릿을 읽지 못했습니다: …"나 "공용 보고서를 읽지 못했습니다: …"라고 말합니다.

| 열 | 무엇을 보여 주는가 |
| --- | --- |
| **#** | 목록에서 그 액션의 자리입니다. |
| **이름** | 그 자리에서 편집하며 셀에서 떠날 때 확정됩니다. 비어 있는 이름은 "액션에는 현장에서 부를 이름이 있어야 합니다."와 함께 거부됩니다. |
| **명령** | 명령이 몇 개인지와 그것이 무엇을 내는지입니다. "0 · 아직 없음"이거나 "2 · 시작 시점에 라벨 1장, 완료 시점에 라벨 1장과 보고서 1부"입니다. Logic 액션 명령은 "완료 시점에 Logic 액션 1개"(또는 "시작 시점에 Logic 액션 2개")로 나옵니다. 데이터베이스 행 명령은 "완료 시점에 데이터베이스 행 1개"(또는 "시작 시점에 데이터베이스 행 2개")로 나옵니다. 도구 설명은 그것을 줄마다 하나씩 `완료 시점의 라벨 · <template>` 꼴로 나열하며, Logic 액션 명령은 액션의 이름과 함께, 아직 고르지 않았으면 "Logic 액션 없음"으로 나열하고, 데이터베이스 행 명령은 `<device>을(를) 거쳐 <table>` 꼴로, 아직 테이블을 고르지 않았으면 "테이블 없음"으로 나열합니다. |
| **상태** | **준비 완료**이거나, 액션이나 그 명령 가운데 무엇인가가 모자라면 **검토 필요**입니다. |
| 줄의 조작 | **액션 위로**, **액션 아래로**, **액션 제거**(위험을 나타내는 색이며 "액션 삭제"라고 묻고 "액션과 그 명령을 삭제합니다."를 붙입니다). |

목록 옆의 열은 머리가 **액션**이며, 고른 액션의 **이름**(여기에서도 편집할 수 있습니다), 준비 완료 / 검토 필요 필을 하나씩 단 읽기 전용 줄로서의 **명령**("명령은 열에 있는 이 액션 자신의 페이지에서 이 순서대로 편집합니다."), 그리고 모자란 것을 모두 나열하는 **검토 필요** 알림 띠를 보여 줍니다. 액션이 하나도 없으면 목록은 "액션이 없습니다. 이 모델의 절차가 라벨이나 보고서를 내거나, Logic 액션을 실행하거나, 데이터베이스 행을 써야 한다면 하나 추가하십시오."라고 말하고, 아무것도 고르지 않았으면 열은 "액션을 고르면 무엇을 내는지 읽습니다. 그 명령은 열에 있는 액션 자신의 페이지에서 편집합니다."라고 말합니다.

| 명령 | 하는 일 | 언제 흐려지는가(상황) | 언제 그려지지 않는가(역할) |
| --- | --- | --- | --- |
| **액션**(폴더를 고른 상태의 상세 막대, 오른쪽 클릭 **액션 추가**) | 모델의 어떤 액션도 아직 쓰지 않은 첫 번호로 `액션 <n>`을 목록 끝에 비어 있는 채로 더하고, 열에서 그것을 골라 보이는 곳까지 스크롤합니다. | 어느 유닛이든 실행을 지니고 있을 때, 또는 런타임이 정지했을 때. | 레시피와 판정 편집이 없을 때. |
| 위로 / 아래로 / 액션 제거(줄의 조작) | 순서를 바꾸거나 삭제합니다. | Process 관리가 없을 때, 엔지니어링 잠금 아래에서, 또는 런타임이 정지한 동안입니다(누르면 작업 기록 줄이 그 이유를 알립니다). | 언제나 그려집니다. |

## 액션의 페이지 {#the-actions-page}

트리에서 액션을 고르면 그것이 열립니다. 액션의 이름과 명령을 세는 필을 담은 머리글, 권한과 라이브러리 알림 띠, **이름** 입력란이 든 **액션** 카드(떠날 때 확정되고 비어 있으면 거부됩니다), 그리고 그 안에서 고른 명령과 나란히 놓인 **명령** 목록입니다.

| 명령 | 하는 일 | 언제 흐려지는가(상황) | 언제 그려지지 않는가(역할) |
| --- | --- | --- | --- |
| **명령**(액션을 고른 상태의 상세 막대, 오른쪽 클릭 **명령 추가**) | 아직 템플릿이 없는, **합격** 실행에 대해 **완료** 시점에 나오는 **라벨** 명령을 목록 끝에 더하고 열에서 그것을 골라 보이는 곳까지 스크롤합니다. | 어느 유닛이든 실행을 지니고 있을 때, 또는 런타임이 정지했을 때. | 레시피와 판정 편집이 없을 때. |
| **액션 제거**(위험 묶음, 오른쪽 클릭, 폴더 페이지 카드의 가위표) | "액션 삭제" 뒤에 액션과 그 명령을 삭제합니다. 그것을 고른 모든 절차가 더 이상 그것을 내놓지 않습니다. | 같습니다. | 레시피와 판정 편집이 없을 때. |

### 명령 목록 {#the-commands-list}

| 열 | 무엇을 보여 주는가 |
| --- | --- |
| **#** | 액션 안에서 그 명령의 자리이며, 곧 액션 안에서의 내놓는 순서입니다. |
| **내는 것** | **라벨**, **보고서**, **Logic 액션**, **데이터베이스 행** 가운데 하나입니다. |
| **트리거** | **시작** 또는 **완료**입니다. |
| **템플릿 또는 액션** | 목록 넷 위에 놓인 고르개 하나입니다. 라벨 줄은 라벨 템플릿을("(템플릿을 고르십시오)"), 보고서 줄은 보고서 서식을("(보고서를 고르십시오)"), Logic 액션 줄은 스테이션의 Logic 액션을("(Logic 액션을 고르십시오)") 내놓습니다. 모두 Logic 트리가 넣어 둔 폴더 아래에 놓이며, 사용 안 함인 것은 "`<name>` (사용 안 함)"으로 표시됩니다. 데이터베이스 행 줄은 Connector의 Database 장치를("(Database 장치를 고르십시오)") 내놓습니다. 목록에 더 이상 없는 참조는 잠긴 채로 "없어진 템플릿 · `<id>`", "없어진 보고서 · `<id>`", "없어진 Logic 액션 · `<id>`", "없어진 장치 · `<id>`"로 자리를 지키므로, 낮춰진 명령이 설정하지 않은 명령처럼 읽히지 않습니다. |
| **종합 판정** | 시작 명령이면 "시작 시점에는 쓰지 않음"이고, 그 밖에는 체크한 종합 판정("합격, 불합격")이거나 "고른 것 없음"입니다. |
| **마커** | 보고서면 "보고서는 쓰지 않음", Logic 액션이면 "Logic 액션은 쓰지 않음"입니다. 라벨이면 "템플릿 없음", "템플릿 없어짐", "명령 없음"(템플릿에 아직 프린터 명령이 없음), "읽을 수 없음", "고정, 마커 없음", 또는 "`<total>`개 가운데 `<bound>`개 이음"입니다. 데이터베이스 행이면 값이 있는 열을 세어 "테이블 없음" 또는 "`<total>`개 열 가운데 `<n>`개"입니다. |
| **상태** | **준비 완료** 또는 **검토 필요**입니다. |
| 줄의 조작 | **명령 위로**, **명령 아래로**, **명령 제거**("명령 삭제": "액션에서 그 명령을 삭제합니다."). |

명령이 하나도 없으면 목록은 "명령이 없습니다. 이 액션이 라벨이나 보고서를 내야 한다면 하나 추가하십시오."라고 말하고, 아무것도 고르지 않았으면 열은 "명령을 고르면 그 전체를 한자리에서 편집합니다. 이 액션이 라벨이나 보고서를 내야 한다면 위의 명령 모음에서 하나 추가하십시오."라고 말합니다.

### 명령 전체 {#the-command-in-full}

열은 고른 명령을 `명령 <n> · <트리거> 시점의 <종류>`를 머리에 달고 엽니다. 고른 종류가 지닌 항목만 보여 줍니다.

| 항목 | 무엇인가 | 값 / 기본값 | 효과(항목 아래의 줄) |
| --- | --- | --- | --- |
| **내는 것** | 이 명령이 무엇을 내놓는지입니다. | 라벨 / 보고서 / Logic 액션 / 데이터베이스 행이며 만들 때는 라벨입니다. | "명령 템플릿으로 라벨 한 장을 인쇄하며, 이 시점의 라벨용으로 유닛이 고른 대기열을 씁니다.", "스테이션 라이브러리의 보고서로 실행의 PDF를 냅니다.", "스테이션의 Logic 액션을 액션 차선에서 실행합니다.", 또는 "Connector의 Database 장치를 거쳐 공장 데이터베이스의 테이블에 행 하나를 추가합니다." 종류를 바꾸면 종합 판정 거르기가 새 종류의 기본값으로 다시 앉습니다(라벨은 합격, 보고서와 Logic 액션과 데이터베이스 행은 모든 종합 판정). |
| **트리거** | 실행의 어느 시점에 나오는지입니다. | 시작 / 완료이며 만들 때는 완료입니다. | 시작 시점의 라벨: "실행이 시작되는 순간, 아직 어떤 결과도 없을 때 만듭니다." 완료 시점의 라벨: "실행이 끝날 때, 아래에서 체크한 종료 종합 판정에 대해 만듭니다." 시작 시점의 보고서: "실행이 시작되는 순간에 냅니다. 아직 기록된 것이 없는 구역은 빠집니다." 완료 시점의 보고서: "실행이 끝날 때, 아래에서 체크한 종료 종합 판정에 대해 냅니다." 시작 시점의 Logic 액션: "실행이 시작되는 순간 대기열에 들어갑니다. 실행은 이를 기다리지 않습니다." 완료 시점의 Logic 액션: "실행이 저장된 뒤, 아래에서 체크한 종료 종합 판정에 대해 실행되며, 끝난 실행을 LastRun에서 읽습니다." 시작 시점의 데이터베이스 행: "실행이 시작되는 순간, 그 실행이 고정한 메타데이터로 씁니다. 실행은 데이터베이스를 기다리지 않습니다." 완료 시점의 데이터베이스 행: "실행이 저장된 뒤, 아래에서 체크한 종료 종합 판정에 대해, 끝난 실행으로 씁니다. 실행은 데이터베이스를 기다리지 않습니다." |
| **Logic 액션**(Logic 액션 명령) | 이 명령이 실행하는 스테이션 Logic의 액션입니다. | "(Logic 액션을 고르십시오)"나 액션 하나이며 만들 때는 없습니다. | 설명문: "이 명령이 실행하는 Logic 액션입니다. 식별자로 지정하므로 액션 이름을 바꿔도 여기에 남습니다." 효과: "액션을 고르십시오. 그전까지 이 명령은 아무것도 실행하지 않습니다.", "참조한 Logic 액션이 더 이상 없습니다. 이 명령은 아무것도 실행하지 않습니다.", "`<action>`을(를) 액션 차선에서 실행합니다.", 또는 "`<action>`은(는) 사용 안 함 상태입니다. 이 명령이 동작할 때마다 액션이 실행을 거부하고 그 이유를 기록합니다." |
| **보고서**(보고서 명령) | PDF를 낼 때 쓰는 스테이션 라이브러리의 서식입니다. | "(보고서를 고르십시오)"이나 서식 하나이며 만들 때는 없습니다. | "PDF를 발행하지 않습니다.", "참조한 보고서가 라이브러리에 없습니다.", "실행이 시작될 때 PDF를 발행합니다." / "실행이 끝날 때 PDF를 발행합니다."이며, 인쇄가 켜져 있으면 "유닛에서 이 명령이 쓰는 프린터 대기열로 보냅니다."가 붙습니다. |
| **보고서 인쇄: 자동으로 인쇄**(서식이 풀린 뒤에 보입니다) | 발행한 PDF를 이 시점에 대한 유닛의 보고서 대기열로도 보낼지입니다. | 만들 때는 꺼짐입니다. | 설명문: "PDF는 어느 쪽이든 이 명령의 시점에 발행됩니다. 인쇄 여부는 대기열로도 보낼지만 정합니다." 켜짐: "PDF는 유닛에서 이 명령이 쓰는 프린터 대기열로도 갑니다. 그 대기열은 프린터 화면에서 고릅니다." 꺼짐: "PDF는 보고서 폴더에 발행되고 그 이상 나아가지 않습니다." |
| **보고서 사본: 실행 안에 보관**(서식이 풀린 뒤에 보입니다) | 완성된 PDF를 실행 파일 안에 담아, 서식을 고치거나 지운 뒤에 다시 보내도 바로 그 바이트가 나가게 할지입니다. | 만들 때는 꺼짐입니다. | 설명문: "실행이 문서에서 무엇을 보관하는지, 곧 나중에 다시 보낼 때 무엇이 나가는지입니다." 켜짐: "실행마다 완성된 PDF를 수백 KB 크기로 함께 보관하며, 다시 보내면 바로 그 문서가 나갑니다." 꺼짐: "실행은 발행된 PDF를 가리키기만 하므로, 다시 보내면 그때 새로 그린 문서가 나갑니다." |
| **공용 템플릿**(라벨 명령) | 이 명령이 인쇄하는 스테이션 라이브러리의 라벨 템플릿이며, 그 마커를 아래에서 잇습니다. | "(템플릿을 고르십시오)"이나 템플릿 하나이며 만들 때는 없습니다. 하나를 고르면 템플릿이 선언한 마커 가운데 이 명령이 아직 잇지 않은 것마다 연결 줄이 생깁니다. | "템플릿을 고르십시오. 그 마커가 이 명령이 채우는 자리입니다.", "참조한 템플릿이 라이브러리에 더 이상 없습니다.", "이 템플릿에는 아직 프린터 명령이 없으므로 보낼 것이 없습니다.", "이 템플릿의 마커를 읽을 수 없습니다.", "마커가 없습니다. 조건에 맞는 모든 실행이 같은 바이트를 보냅니다. 프린터 대기열은 유닛이 고릅니다.", 또는 "마커 `<n>`개이며, 아래에서 저마다 이 실행에 대해 굳은 값 하나에 잇습니다. 프린터 대기열은 유닛이 고릅니다." |
| **낼 종료 종합 판정**(완료 트리거에만) | 어떤 종료 종합 판정이 이 명령을 움직이는지입니다. | 상자 넷입니다. **합격**, **불합격**, **판정 불가**, **종합 판정 없음**입니다. 라벨은 합격 하나로 시작하고, 보고서는 넷 모두로 시작합니다. 아무것도 판정하지 않는 절차는 종합 판정 없이 끝나는데 그래도 문서는 내야 하기 때문입니다. Logic 액션도 넷 모두로 시작합니다. 다른 시스템으로 보내는 실행이 아무도 모르게 불합격 제품을 건너뛰어서는 안 되기 때문입니다(종합 판정은 스크립트가 스스로 읽을 수 있습니다). | 체크한 종합 판정으로 끝나는 실행에서만 명령이 나갑니다. 시작 명령에는 아직 종합 판정이 없으므로 거르기를 읽지 않습니다. |

항목 아래의 **검토 필요** 알림 띠가 이 명령에 모자란 것을 모두 나열합니다(아래의 준비 상태를 보십시오).

인쇄되는 문서가 가는 대기열은 명령의 항목이 아닙니다. 명령의 종류와 시점으로 유닛의 프린터 자리 넷을 거쳐 풀리므로, 같은 조합의 명령 둘은 일부러 프린터를 함께 씁니다. [프린터](process-printers)를 보십시오. Logic 액션 명령은 아무것도 인쇄하지 않으며 자리도 없습니다.

### Logic 액션 명령 {#logic-action-commands}

Logic 액션 명령은 실행이 스테이션을 프로그래밍하는 사람에게 남겨 두는 고리입니다. 경계에서 [Logic](logic-actions) 액션 하나를 실행하며, 그 액션은 어떤 드라이버를 거쳐서든 실행을 다른 시스템으로 보내거나, 램프를 켜거나, 카운터를 0으로 돌릴 수 있습니다. 액션은 식별자로 고르므로 Logic 페이지에서 이름을 바꿔도 여기는 아무것도 바뀌지 않습니다. 액션 자신의 편집 화면은 **사용하는 곳** 카드에 이 명령을 나열합니다.

| 측면 | 시작 시점 | 완료 시점 |
| --- | --- | --- |
| 언제 실행되는가 | 실행이 시작되는 순간, 같은 시점의 라벨과 보고서보다 먼저 액션 차선의 대기열에 들어갑니다. | 실행이 저장되고 유닛의 [LastRun](process-addresses#lastrun)이 그것을 지닌 뒤입니다. |
| 실행이 무엇을 기다리는가 | 아무것도 기다리지 않습니다. 액션이 느리든, 거부되든, 실패하든 실행은 그대로 나아갑니다. | 아무것도 기다리지 않습니다. 실행은 이미 끝났습니다. |
| 어떤 실행이 호출하는가 | 시작하는 모든 실행입니다. | 체크한 종합 판정으로 끝나는 모든 실행입니다. 다만 실패로 끝난 실행은 아무것도 호출하지 않습니다. |
| 액션이 실행에서 읽는 것 | `Procedure.Metadata.<Field>`, 곧 시작하는 실행이 얼린 값입니다. | `LastRun.*`, 곧 그 실행의 식별자, 상태, 종합 판정, 시각, 메타데이터, 모든 판정 기준의 결과입니다. |

같은 시점의 Logic 액션 명령이 여럿이면 아래의 내놓는 순서대로 하나씩 실행되며, 앞의 것이 아직 돌고 있다고 건너뛰는 것은 없습니다. 실행마다 저마다의 한 번이 있습니다. 실행이 액션에 무엇을 했는지는 액션의 페이지에서 읽습니다. 그 **마지막 실행** 띠는 실행을 `Process · <unit> · <action>`으로 부르고, 오류와 거부된 쓰기가 있으면 함께 나열하며, 진단 로그가 그것을 남깁니다. 실행 파일에는 아무것도 쓰지 않습니다. 명령을 설정한 뒤에 삭제된 액션은 건너뛰고 진단 로그에 경고를 남깁니다. 사용 안 함인 액션은 실행을 거부하고 그 이유를 기록합니다.

### 데이터베이스 행 명령 {#database-row-commands}

**데이터베이스 행** 명령은 공장 데이터베이스의 테이블, 곧 MES가 이미 갖고 있는 추적성 테이블에 행 하나를 추가합니다. 부품의 일련번호, 종합 판정, 측정값을 그 테이블이 이미 가진 열 이름으로 씁니다. 행은 Connector 페이지에 있는 [Database](driver-database) 드라이버의 장치를 거쳐 가며, 연결과 로그인을 그 장치가 갖고 있으므로 명령은 서버를 지정하지 않고 비밀번호도 갖지 않습니다. 테이블은 이미 있는 것이며, 스테이션은 테이블을 만들거나 바꾸지 않고 행만 추가합니다.

| 필드 | 무엇인지 | 값 / 기본값 | 효과(필드 아래 줄) |
| --- | --- | --- | --- |
| **Database 장치** | 행이 거쳐 가는 장치입니다. | "(Database 장치를 고르십시오)" 또는 Connector의 Database 장치 하나이며, 만들 때는 없습니다. | 설명: "행이 거쳐 가는 Connector의 Database 장치입니다. 연결과 로그인을 이 장치가 갖고 있으므로 여기서는 아무것도 입력하지 않습니다." 효과: "장치를 고르십시오. 그전까지 이 명령은 아무것도 쓰지 않습니다.", "참조한 장치가 더 이상 없습니다. 이 명령은 아무것도 쓰지 않습니다.", 또는 "`<device>`을(를) 거쳐 씁니다." |
| **데이터베이스 테이블** | 행을 추가할 테이블입니다. | "(테이블을 고르십시오)" 또는 장치의 데이터베이스에 있는 테이블 하나입니다. 테이블은 명령이 열려 있는 동안 장치를 거쳐 읽으며, 기본 테이블만, 연결이 기본으로 읽지 않는 스키마라면 그 스키마를 붙여 보여 줍니다. 데이터베이스가 더 이상 나열하지 않는 테이블은 잠긴 채로 "`<table>` (데이터베이스에 없음)"으로 자리를 지킵니다. | 설명: "행을 추가할 테이블입니다. 데이터베이스에 이미 있는 테이블이며, 스테이션은 테이블을 만들지 않습니다." 효과: 고르기 전까지는 "테이블을 고르십시오. 그 열은 데이터베이스에서 읽습니다."입니다. 테이블을 고르면 그 열을 읽습니다. |

테이블을 읽는 동안 고르개 아래 줄은 "데이터베이스의 테이블을 읽는 중…"이라고 말합니다. 읽지 못하면 이유를 말하고("`<device>`의 테이블을 읽지 못했습니다: `<cause>`"), 테이블이 500개를 넘는 데이터베이스면 "데이터베이스에 목록에 보이는 것보다 많은 테이블이 있습니다. 처음 500개만 보여 줍니다."라고 말합니다. 데이터베이스 행은 보고서처럼 모든 종료 종합 판정에 대해 나오는 상태로 만들어집니다.

필드 아래의 **테이블 열**은 테이블의 열마다 한 줄을 테이블의 순서대로 보여 줍니다. 각 열에는 데이터베이스가 쓰는 그대로의 형식이 붙고, 그 열에 값이 없는 행을 테이블이 거절하는 곳(빈 값을 받지 않고, 기본값이 없으며, ID 열도 자동 증가 열도 계산 열도 아닌 열)에는 **테이블 필수** 표시가 붙습니다. 각 열에 **값**을 하나 고릅니다. 데이터베이스에 맡긴 열은 행에서 빠지므로, 데이터베이스가 자기 기본값으로 채웁니다.

| 값 | 시작 시점 | 완료 시점 | 보내지는 형태 |
| --- | --- | --- | --- |
| (데이터베이스에 맡김) | 예 | 예 | 없음: 그 열은 행에서 지정되지 않습니다 |
| 고정 문자(**쓸 문자**에 입력) | 예 | 예 | 문자, 모든 행에서 같습니다 |
| 메타데이터 · 목록 항목(**목록의 메타데이터**로 고름) | 예 | 예 | 문자: 실행이 그 항목에 고정한 값입니다 |
| 실행 · 식별자, 절차 · 이름, 유닛 · 이름, 유닛 · 코드, 실행 · 종료 상태, 실행 · 종합 판정 | 아니요 | 예 | 문자(`Completed` 또는 `Aborted`, `Ok`, `Nok`, `Indeterminate` 또는 `None`) |
| 실행 · 시작 시각, 실행 · 종료 시각 | 아니요 | 예 | 날짜와 시각, 스테이션의 현지 시각입니다 |
| 실행 · 소요 시간(초) | 아니요 | 예 | 숫자 |
| 실행 · 사이클 수, 실행 · NOK 사이클 수 | 아니요 | 예 | 정수 |
| 판정 기준 · 결과, 판정 기준 · 한계(**판정 기준**으로 고름) | 아니요 | 예 | 문자 |
| 판정 기준 · 합격 | 아니요 | 예 | 참 또는 거짓 |
| 판정 기준 · 측정값, 판정 기준 · 최솟값, 판정 기준 · 최댓값, 판정 기준 · 최악 이탈 | 아니요 | 예 | 숫자 |
| 판정 기준 · NOK 사이클 수 | 아니요 | 예 | 정수 |

완료 시점의 값은 유닛의 [LastRun](process-addresses#lastrun)이 Logic에 주는 값과 같으며, 판정 기준은 판정한 모든 사이클에 걸쳐 접은 값입니다. 실행이 묻지 않은 항목과 판정하지 않은 판정 기준은 값을 내지 않습니다(NULL). 목록 머리의 **열 다시 읽기**는 데이터베이스에서 테이블의 열을 다시 읽습니다. 열은 받은 값을 지키고, 새 열은 값 없이 목록에 들어오며, 테이블에 더 이상 없는 열은 목록에서 빠집니다.

| 관점 | 시작 시점 | 완료 시점 |
| --- | --- | --- |
| 행이 나가는 때 | 실행이 시작되는 순간, 실행이 고정한 메타데이터로 나갑니다. | 실행이 저장되고 유닛의 LastRun이 그것을 가졌을 때입니다. |
| 실행이 기다리는 것 | 없음: 행은 장치 자신의 대기열에서 기다리고 실행은 계속됩니다. | 없음: 실행은 이미 끝났습니다. |
| 행을 쓰는 실행 | 시작하는 모든 실행입니다. | 체크한 종합 판정으로 끝나는 모든 실행입니다. 다만 실패로 끝나는 실행은 아무것도 쓰지 않습니다. |

행은 값이 있는 열을 지정하는 INSERT 하나이며, 모든 값은 자기 형식의 매개변수로 보내지고 문장 안에 문자로 쓰이지 않습니다. 그래서 따옴표나 SQL 낱말이 든 일련번호도 있는 그대로의 문자로 저장됩니다. 데이터베이스는 어떤 값이든 바꾸는 것과 같은 방식으로 각 값을 그 열의 형식으로 바꿉니다. 행을 거절하거나, 드라이버의 10초 안에 답하지 않거나, 닿을 수 없는 데이터베이스는 알리기만 합니다. 실행은 영향을 받지 않고, 진단 로그가 거절을 기록하며, 실행 기록이 행을 거절과 그 이유와 함께 [이력](histories-documents#database-rows)의 **데이터베이스 행** 서류에 남깁니다. 나중에 보내려고 붙들어 두는 것은 없으며, 그곳의 **다시 보내기**가 같은 값을 손으로 보냅니다. 같은 시점의 데이터베이스 행 여럿은 아래의 내놓는 순서대로 하나씩 나갑니다.

데이터베이스 행 명령에 모자란 것은 아래 준비 상태 목록에 고치는 순서대로 들어갑니다: "Database 장치를 고르십시오.", "지정한 Database 장치가 더 이상 없습니다.", "지정한 장치 `<device>`은(는) Database 장치가 아닙니다.", "테이블을 고르십시오.", "적어도 열 하나에 값을 주십시오. 열이 없는 행은 쓰지 않습니다.", "`<column>` 열은 테이블이 요구하는데 값이 없습니다.", "`<column>`: 이 값은 시작 시점에 아직 없습니다. 그때 있는 것은 메타데이터 항목과 고정 텍스트뿐입니다.", "`<column>`: 이 모델의 메타데이터 목록에서 항목을 고르십시오.", "`<column>`: 이 모델의 판정 가운데 하나에서 판정 기준을 고르십시오." 데이터베이스만 말할 수 있는 것은 이 페이지에서 명령이 열려 있는 동안 읽으며, 같은 목록에 들어갑니다: "`<table>` 테이블이 더 이상 데이터베이스에 없습니다.", "`<column>`은(는) 더 이상 테이블의 열이 아닙니다. 열을 다시 읽으십시오.", "테이블에 이 명령이 아직 읽지 않은 열이 있습니다: `<columns>`. 열을 다시 읽으십시오.", "데이터베이스에서 테이블을 읽지 못했습니다: `<cause>`". 액션을 고르는 절차는 열에 대해 모자란 것을 말합니다: "`<column>` 열이 이 절차가 묻지 않는 메타데이터 항목을 읽습니다. 위의 메타데이터에서 그 항목을 체크하십시오.", "`<column>` 열이 판정 기준의 결과를 읽는데, 이 절차는 어떤 판정도 하지 않습니다.", 또는 "`<column>` 열이 이 절차의 판정에 없는 판정 기준을 읽습니다."

### 마커 {#markers}

마커는 라벨 템플릿이 실행이 채우도록 남겨 둔 `{{NAME}}` 자리이므로, 이 구역은 라벨 명령에만 그려지고 그 밖에는 그려지지 않습니다. 상태는 템플릿을 따릅니다.

| 상태 | 구역이 무엇을 보여 주는가 |
| --- | --- |
| 템플릿을 고르지 않음 | "템플릿을 골라 그 마커를 이으십시오." 앞선 템플릿에서 저장한 연결이 있으면 "템플릿이 없는 동안에도 저장한 연결은 그대로 남습니다."와 그 마커 이름이 함께 놓입니다. |
| 템플릿이 라이브러리에서 사라짐 | "템플릿을 쓸 수 없음"이며, 남아 있는 같은 목록이 함께 놓입니다. |
| 템플릿에 프린터 명령이 없음 | 알림 띠입니다. "“`<template>`”에는 아직 프린터 명령이 없습니다. 템플릿 ▸ 라벨에서 명령을 쓰거나 가져오기 전에는 보낼 것도, 이을 마커도 없습니다." |
| 마커를 읽을 수 없음 | 알림 띠 "“`<template>`”의 마커를 읽을 수 없습니다: `<error>`"와, "저장한 연결은 그대로 둠. 이 바인딩을 바꾸기 전에 템플릿을 고치거나 바꾸십시오."입니다. |
| 템플릿에 마커가 없음 | "고정 템플릿. 이 템플릿에는 마커가 없어, 조건에 맞는 모든 실행에 같은 바이트를 보냅니다." |
| 마커를 찾음 | 마커마다 한 줄이며, 머리에 마커와 **이음** / **필수** 필이 놓이고 아래의 항목이 딸립니다. |

| 항목 | 무엇인가 | 값 / 기본값 |
| --- | --- | --- |
| **굳은 값의 신호원** | 마커에 대신 넣는 하나뿐인 실행 값입니다. | "(잇지 않음)"과 아래 표의 신호원입니다. 시작 명령은 시작 시점에 쓸 수 있는 신호원만 나열하고, 완료 명령은 모두 나열합니다. "메타데이터 · 목록 항목"은 모델의 메타데이터 목록에 항목이 있을 때만 나오고, 판정 기준 신호원은 모델의 어떤 판정이 판정 기준을 선언했을 때만 나옵니다. 지금 시점이 답할 수 없는 신호원은 잠긴 채로 "…(이 명령에서는 쓸 수 없음)"으로 자리를 지킵니다. 신호원을 바꾸면 앞의 것에 대해 골랐던 항목과 사이클과 형식이 비워집니다. |
| **목록의 메타데이터**(메타데이터 신호원) | 모델 목록의 어느 항목인지입니다. | "(목록의 메타데이터를 고르십시오)", 사라진 항목이면 "없어진 항목 · `<id>`", 그다음 모든 항목을 "`<name>` · 문자 / 숫자 / 일련번호"로 내놓습니다. |
| **판정 기준**(판정 기준 신호원) | 모델의 어느 판정의 어느 판정 기준인지입니다. | "(판정 기준을 고르십시오)", "없어진 판정 기준 · `<id>`", 그다음 모든 판정 기준을 "`<evaluation>` · `<criterion or Criterion n>` · `<channel>`"로 내놓습니다. |
| **사이클(0부터)**(판정 기준 신호원) | 어느 사이클의 결과인지입니다. 결코 짐작하지 않으며 반드시 입력해야 합니다. | 0부터, 모델의 어떤 절차가 도는 가장 큰 사이클 수에서 1을 뺀 값까지이며 안내 문구는 "필수"입니다. 그 범위를 벗어난 수는 입력란 아래에서 거부됩니다. |
| **값 형식**(날짜와 시각 신호원) | 그 시각을 어떻게 적는지입니다. | 기록된 그대로(기본값), 스테이션 날짜, 스테이션 시각, 스테이션 날짜와 시각, ISO 8601 형식입니다. |
| **소수 자릿수**(숫자 신호원과 숫자 메타데이터 항목) | 정해진 소수 자릿수입니다. | 0에서 9까지이며 안내 문구는 "자동"입니다(스테이션 자신의 설정). |
| **잘못된 형식 지우기** | 신호원이 쓸 수 없는 형식을 연결이 지니고 있을 때 그려지는 단추입니다(날짜에 소수 자릿수, 숫자에 날짜 형식, 문자에 그 어느 쪽이든). | 문제가 된 항목을 되돌립니다. |

고르개가 나열하는 순서대로의 신호원입니다.

| 신호원 | 시작 시점에 쓸 수 있는가 | 갈래 |
| --- | --- | --- |
| 메타데이터 · 목록 항목 | 예 | 문자이며 숫자 항목이면 숫자입니다 |
| 모델 · 이름, 모델 · 개정, 유닛 · 이름, 유닛 · 코드, 절차 · 이름, 절차 · 코드, 실행 · 식별자 | 예 | 문자 |
| 실행 · 시작 시각 | 예 | 날짜와 시각 |
| 실행 · 상태(시작 시점) / 실행 · 종료 상태(완료 시점) | 예 | 문자 |
| 실행 · 종료 시각 | 아니요 | 날짜와 시각 |
| 실행 · 소요 시간(초) | 아니요 | 숫자 |
| 실행 · 종합 판정, 실행 · 종료 사유 | 아니요 | 문자 |
| 판정 기준 · 이름, 채널, 한계, 심각도, 결과, 오류, 해당 채널 | 아니요 | 문자 |
| 판정 기준 · 구간 시작 시각, 구간 종료 시각 | 아니요 | 날짜와 시각 |
| 판정 기준 · 판정한 샘플, 한계를 벗어난 샘플, 읽지 못한 샘플, 잘못된 샘플, 최악 이탈 | 아니요 | 숫자 |

마커 줄 아래의 **제거된 마커**는 지금 템플릿이 더 이상 선언하지 않는 마커에 대해 저장된 연결을 나열하며("낡은 것 `<n>`개", "이 연결은 고른 템플릿에 더 이상 없으므로 제거해야 합니다."), 저마다 **낡은 마커 연결 제거**를 답니다.

### 준비 상태 {#readiness}

두 페이지의 준비 완료 / 검토 필요 필과, 검증 페이지가 나열하는 줄은 하나의 판단에서 나옵니다. 명령이 없는 액션은 하나가 모자랍니다. "명령을 더하십시오. 이 액션은 아직 아무것도 내지 않습니다." 명령에 모자란 것은 고치는 순서대로 이렇습니다.

- "완료 종합 판정을 하나 이상 고르십시오."(완료 명령인데 종합 판정을 하나도 체크하지 않은 경우)
- "보고서를 고르십시오." / "고른 보고서가 더 이상 없습니다."
- "Logic 액션을 고르십시오." / "지정한 Logic 액션이 더 이상 없습니다." / "지정한 Logic 액션이 사용 안 함 상태라 호출될 때마다 거부됩니다."
- "라벨 템플릿을 고르십시오." / "템플릿을 비우거나 삭제했습니다. 저장한 연결은 그대로 남습니다." / "고른 공용 템플릿이 더 이상 없습니다."
- "고른 템플릿에는 아직 프린터 명령이 없습니다. 실행이 이 명령에 이르기 전에 명령을 쓰거나 가져오십시오."
- "템플릿 마커를 읽을 수 없습니다: `<error>`"
- "{{M}} 마커에는 신호원이 필요합니다." / "{{M}} 마커를 두 번 넘게 이었습니다."
- "{{M}}: 신호원을 고르십시오", "이 신호원은 시작 시점에 쓸 수 없습니다", "이 모델의 메타데이터 목록에서 항목을 고르십시오", "이 모델의 판정 가운데 하나에서 판정 기준을 고르십시오", "0에서 `<n>`까지, 0부터 세는 사이클 번호를 지정하십시오", "이 날짜/시각 신호원에서 소수 자릿수를 제거하십시오", "이 숫자 신호원에는 기본 형식을 쓰십시오", "소수 자릿수는 0에서 9 사이여야 합니다", "이 문자 신호원에서 숫자와 날짜 형식을 제거하십시오"
- "{{M}} 마커는 지금 템플릿에서 빠졌습니다. 저장한 연결을 제거하십시오."

검토가 필요한 명령도 그대로 돕니다. 내놓을 때 버려지는 것은 없고, 풀리지 않는 마커는 늘 그랬듯 그 라벨 하나를 실패시킵니다. 그것을 배우는 자리는 구성 화면이지 인쇄된 라벨이 아닙니다.

## 절차가 액션을 고르는 방식 {#how-a-procedure-selects-actions}

절차의 페이지에는 **이 절차가 내는 액션** 카드가 있으며, "`<n>`개 고름" 필과 모델의 액션마다 목록 순서대로 체크 상자 하나가 놓입니다. 줄마다 그 액션이 내놓는 것을 적은 줄("시작 트리거에 라벨 1장, 완료 트리거에 라벨 1장과 보고서 1부", 또는 "아직 아무것도 내지 않습니다. 이 액션에는 명령이 없습니다.")과, 고른 뒤에는 **준비 완료**나 **검토 필요** 필을 보여 줍니다. 검토 필요는 이 절차가 그 액션의 마커에 대해 무엇이 모자란지를 마커마다 한 줄씩 나열합니다. 실행마다 풀리는 마커는 절차가 그것이 부르는 것을 가지고 있어야만 풀리기 때문입니다.

- "{{M}} 마커가 이 절차가 묻지 않는 메타데이터 항목을 읽습니다. 위의 메타데이터에서 그 항목을 체크하십시오."
- "{{M}} 마커가 판정 기준의 결과를 읽는데, 이 절차는 어떤 판정도 하지 않습니다."
- "{{M}} 마커가 이 절차의 판정에 없는 판정 기준을 읽습니다."
- "{{M}} 마커가 사이클 `<c>`번을 읽는데, 이 절차는 사이클을 한 번만 돕니다." / "… 이 절차는 `<n>`번 돕니다."
- "지정한 Logic 액션이 더 이상 없습니다."(액션 안의 Logic 액션 명령인데 그 액션이 삭제된 경우. 절차는 그 자리에서 아무것도 실행하지 않습니다)

액션이 감춰지지도, 거부되지도 않습니다. 절차가 무엇이 모자란지 말하고, 고치는 자리도 같은 페이지에 있습니다. 모델에 액션이 하나도 없으면 카드는 "아직 이 모델에 액션이 없습니다. 모델의 액션에서 몇 개 추가하십시오."라고 말합니다.

### 내놓는 순서 {#the-emission-order}

실행의 경계에서, 고른 액션은 모델 목록의 순서대로 나오고 각 액션 안에서는 명령 순서대로 나오며, 그 경계의 시점에 맞는 것만 걸러집니다. 모델 전체에 하나의 답이며 결코 절차마다가 아닙니다. 시작 명령은 실행이 실체가 된 뒤에(일련번호 메타데이터를 잡아 둔 뒤에) 돌고, 완료 명령은 종료 종합 판정이 봉해진 뒤에 돕니다. 명령은 저마다 따로 놉니다. 실패해도 아무것도 발행하지 않고, 실행에 대해 아무것도 바꾸지 않으며, 뒤의 명령을 결코 멈추지 않습니다. 보고서는 실행과 그것을 낸 액션의 이름을 따라 이름이 붙고, 같은 명령을 나중에 다시 그리면 그 명령의 문서만 바뀝니다. Logic 액션 명령은 같은 시점의 Logic 액션 명령들 사이에서 이 순서를 지킵니다. 언제 실행되는지는 [Logic 액션 명령](#logic-action-commands)에 있습니다. 내놓을 때마다 실행에 무엇이 기록되고 이력에서 어떻게 다시 내보내는지는 [라벨과 보고서 내놓기](process-emission)에 있습니다.

## 액션이 하지 않는 것 {#what-an-action-does-not-do}

- 스스로는 아무것도 내지 않습니다. 절차가 그것을 골라야 하고, 그 절차의 실행이 경계에 이르러야 합니다.
- 절차를 확인하지 않습니다. 마커가 부르는 항목을 절차가 묻는지, 마커가 부르는 판정으로 절차가 판정하는지는 절차의 페이지에서, 선택 옆에 적힙니다.
- 프린터를 고르지 않습니다. 대기열은 유닛의 것이며 종류와 시점으로 [프린터](process-printers)에서 정해집니다.
- 템플릿을 편집하지 않습니다. 라벨 명령과 보고서 서식은 [템플릿](process-templates) 아래에서 쓰며, 액션은 그것을 이름으로 부를 뿐입니다.
- 실제로 인쇄되었는지 확인하지 않습니다. 라벨이나 인쇄된 보고서가 기록하는 것은 대기열이 받아들였다는 사실이지 종이가 나왔다는 증거가 아닙니다.
- Logic 액션을 기다리지 않으며, 실행에 기록하지도 않습니다. 액션의 결과는 Logic에 있는 그 액션의 페이지와 진단 로그에 있습니다.
- 테이블을 만들거나 바꾸지 않으며, 거절된 행을 나중에 보내려고 붙들어 두지도 않습니다. 데이터베이스 행은 공장 데이터베이스에 이미 있는 테이블로 갑니다. 거절은 실행에 기록되고, 이력에서 손으로 다시 보냅니다.
