Sequencer and Shift Register Instructions

12.1 Mechanical Sequencers

시퀀서(sequencer) 명령어는 그림 12-1에 나타난 기계식 회전 캠 리미트 스위치와 매우 유사한 방식으로 동작하도록 설계되었습니다. 이러한 기계식 시퀀서는 드럼 스위치(drum switch), 로터리 스위치(rotary switch), 스테퍼 스위치(stepper switch), 또는 캠 스위치(cam switch)라고도 불립니다. 이 장치는 반복적인 사이클로 동작하는 기계를 제어할 때 자주 사용됩니다.

그림 12-2는 캠으로 동작하는 시퀀서 스위치의 동작을 보여줍니다. 전기 모터는 여러 개의 캠을 구동하며, 리프 스프링(leaves‑spring) 방식의 접점(contact)이 캠과 맞물려 회전 각도에 따라 다양한 접점이 닫히거나 열립니다. 이를 통해 여러 전기 장비가 여자되거나 소자될 수 있습니다. 캠이 회전함에 따라 접점과 연결된 장치는 on → off, off → on으로 상태가 변하거나, 현재 상태를 유지할 수도 있습니다.

그림 12-3은 일반적인 기계식 드럼 구동 시퀀서 스위치를 보여줍니다. 이 스위치는 모터로 구동되는 드럼의 표면에 설치된 돌기(peg)에 의해 동작하는 여러 개의 정상 개방(normally open) 접점 블록으로 구성됩니다. 이 시퀀서의 동작은 다음과 같이 요약됩니다.

• 드럼의 원주 둘레 특정 위치에 돌기(peg)를 배치하여 접점 블록을 동작시킵니다.

• 드럼이 회전하면 돌기와 정렬된 접점은 닫히고, 돌기가 없는 위치의 접점은 열린 상태를 유지합니다.

• 돌기의 존재는 논리 1 또는 on 상태로 해석되며, 돌기가 없으면 논리 0 또는 off 상태로 해석됩니다.

• 이 드럼 실린더의 처음 네 단계(step)에 대한 논리 상태는 이에 대응하는 시퀀서 데이터 테이블로 표현됩니다.

• 드럼에 돌기(peg)가 있었던 위치는 1(on)로 표시되며, 돌기가 없었던 위치는 0(off)으로 표시됩니다.

시퀀서 스위치는 반복 가능한 동작 패턴이 필요할 때 매우 유용합니다. 예를 들어, 식기세척기(dishwasher)에서는 세척 사이클을 단계적으로 진행시키기 위해 시간 기반 시퀀서 스위치가 사용됩니다(그림 12-4). 세척 사이클은 항상 동일하며, 각 단계는 일정 시간이 설정된 고정된 작업 절차에 따라 수행됩니다. 가정용 세탁기, 건조기 및 기타 시간 클록(time‑clock)으로 제어되는 장치들도 모두 시퀀서를 사용하는 대표적 예입니다.

그림 12-5는 캠으로 동작하는 시퀀서(타이머라고도 함)를 사용하는 식기세척기의 배선도 및 타이밍 차트의 예를 보여줍니다. 동기 모터(synchronous motor)는 기계식 기어 트레인(mechanical train)을 구동하고, 이는 다시 일련의 캠 휠(cam wheel)을 구동합니다. 이 시퀀서의 동작은 다음과 같이 요약할 수 있습니다.

• 타이머 모터는 전체 동작 사이클 동안 지속적으로 동작합니다.

• 캠은 45초 단위의 시간 증가량(time increment)으로 전진합니다.

• 타이밍 차트는 타이머의 동작 순서(sequence of operation)를 나타냅니다.

• 총 60개의 45초 단계(step)를 통해 전체 45분 동작 사이클이 완료됩니다.

• 활성 장치(active devices) 열(Column)에 적힌 번호는 각 단계에서 활성 상태가 되는 제어 장치를 의미합니다.

12.2 Sequencer Instructions

PLC 시퀀서(sequencer) 명령은 반복 가능한 단계적 동작 순서를 가진 기계를 제어하기 위해 사용되던 기계식 드럼 시퀀서를 대체합니다. 프로그래밍된 시퀀서는 드럼 스위치로 반복적으로 수행되던 동일한 출력의 온/오프 패턴을 훨씬 더 유연하게 실행할 수 있습니다. 시퀀서 명령을 사용하면 하나의 명령 또는 명령 쌍만으로 복잡한 동작을 수행할 수 있으므로 래더 프로그램을 단순화할 수 있습니다. 예를 들어, 16개의 이산 출력의 온/오프 동작은 시퀀서 명령 하나만으로 단 한 개의 런(rung)에서 제어할 수 있습니다. 반면 동일한 접점-코일 방식의 래더 제어 구성을 사용한다면 프로그램에 16개의 런(rung)이 필요합니다.

PLC 제조사에 따라 다양한 시퀀서 명령을 프로그래밍할 수 있습니다. 그림 12-6은 Allen-Bradley SLC 500 PLC와 관련 소프트웨어인 RSLogix의 Sequencer 메뉴 탭을 보여줍니다. Allen-Bradley 계열 컨트롤러에서 사용되는 시퀀서 명령에는 다음이 포함될 수 있습니다:

SQO (Sequencer Output) — 출력 장치를 제어하기 위해 파일을 사용하는 출력 명령입니다.

SQI (Sequencer Input) — 입력 파일의 비트와 소스 주소의 비트를 비교하는 입력 명령입니다. 모든 비트 쌍이 동일할 경우 명령은 참이 됩니다.

SQC (Sequencer Compare) — 입력 소스 파일의 비트를 시퀀스 파일의 데이터 단어에 있는 해당 비트와 비교하는 출력 명령입니다. 모든 비트 쌍이 동일하면 제어 레지스터의 비트가 1로 설정됩니다.

SQL (Sequencer Load) — 기계를 수동으로 운전 순서에 따라 단계별로 진행시키면서 기준 조건을 캡처하는 데 사용되는 출력 명령입니다. 입력 소스 모듈의 데이터를 시퀀서 파일로 전송하며, 파일-투-워드(file-to-word) 전송 명령과 유사하게 동작합니다.

그림 12-7은 SQO (Sequencer Output) 명령의 예를 보여줍니다. SQO 명령은 데이터 파일 요소(워드)를 한 번에 하나씩 읽고, 마스크 워드를 적용하여 해당 데이터 파일 요소의 비트를 활성화하거나 비활성화한 후, 마스킹된 데이터 파일 요소를 지정된 출력으로 전송합니다.

시퀀서 명령 입력이 필요한 파라메터는 다음과 같이 설명됩니다.

File — 시퀀서(sequencer) 파일 내 레지스터의 시작 주소이며, 이 주소에는 반드시 인덱스 파일 표시(#)를 사용하셔야 합니다. 이 파일에는 명령이 거짓(false)에서 참(true)으로 전이될 때 목적지 주소로 전송될 데이터가 포함됩니다. 파일의 각 워드는 0번 위치부터 시작하여 파일 길이까지 연속되는 위치(position)를 나타냅니다.

Mask — 시퀀서 명령이 소스 데이터를 목적지 주소로 이동시킬 때 사용하는 비트 패턴입니다. 마스크 비트 패턴에서 1은 값을 통과시키고, 0은 데이터 흐름을 차단한다는 점을 기억하셔야 합니다. 프로그램 제어에 따라 마스크 패턴을 변경하려는 경우 마스크 레지스터 또는 파일 이름을 사용합니다. 매개변수 뒤에 h를 붙이면 마스크가 16진수임을 나타내고, B는 2진수 표기를 의미합니다. 십진수 표시는 별도의 표시 없이 입력합니다.

Source — SQC 및 SQL 명령이 시퀀서 파일에 입력하거나 비교를 위해 데이터를 가져오는 입력 워드 또는 파일의 주소입니다.

Destination — SQO 명령이 시퀀서 파일의 데이터를 이동시키는 출력 워드 또는 파일의 주소입니다.

Control — 명령의 제어 정보를 포함한 매개변수가 저장되는 주소입니다. 제어 레지스터에는 명령의 상태 바이트(status byte), 시퀀서 파일의 길이, 현재 파일 위치가 다음과 같이 저장됩니다:

  • Enable 비트(EN; 비트 15)는 런(rung)이 거짓에서 참으로 전이될 때 설정되며, 명령이 활성화됨을 나타냅니다. 이 비트는 런 조건을 따릅니다.
  • Done 비트(DN; 비트 13)는 시퀀서 파일의 마지막 워드가 전송된 후 설정됩니다. DN 비트가 설정된 상태에서 다음 런의 거짓-참(false-to-true) 전이가 발생하면 위치 포인터는 1로 재설정됩니다.
  • Error 비트(ER; 비트 11)는 프로세서가 음수 위치 값 또는 음수 혹은 0의 길이 값을 감지했을 때 설정됩니다.

Length — 시퀀서(sequencer) 파일의 단계 수를 의미하며, 위치(position) 1부터 시작합니다. 위치 0은 시작(start‑up) 위치입니다. 명령은 매 사이클이 완료될 때 위치 1로 리셋(랩, wrap)됩니다. 실제 파일 길이는 명령에서 입력한 파일 길이에 1을 더한 값이 됩니다.

Position — 시퀀서 명령이 시작할 원하는 단계를 나타냅니다. 이 위치는 시퀀서 파일에서 명령이 데이터를 이동시키는 워드 위치 또는 단계(step)입니다. 입력값은 파일 길이까지 허용되지만, 마지막 위치까지 동작한 후 참에서 거짓(true‑to‑false)으로 전이되면 항상 위치 1로 리셋됩니다. 시퀀스를 시작하기 전에 시퀀서가 중립(neutral) 상태에 있도록 시작 위치가 필요합니다. 시작 위치는 모든 비트가 0인 상태이며, 이는 출력이 모두 꺼져 있는 위치 0을 의미합니다.

시퀀서를 프로그래밍하려면 먼저 연속된 메모리 워드들로 구성된 시퀀서 파일 또는 레지스터에 이진(binary) 정보를 입력합니다. 시퀀서 파일은 일반적으로 비트 파일(bit file)이며, 시퀀스의 각 단계에서 요구되는 출력 동작을 나타내는 하나의 비트 파일 워드를 포함합니다. 제어 애플리케이션 요구 사항에 따라 각 시퀀서 단계에 데이터를 입력합니다. 시퀀서가 단계를 진행함에 따라, 이진 정보가 시퀀서 파일에서 출력 워드로 전송됩니다.

시퀀서 파일의 목적과 기능을 설명하기 위해 그림 12-8에 제시된 4단계 시퀀스 동작을 살펴보겠습니다. 이 시퀀서는 두 방향의 교통을 제어하는 데 사용됩니다. 이 과정의 동작은 다음과 같이 요약됩니다:

• 하나의 16‑포인트 출력 모듈에서 총 6개의 출력이 동작됩니다.

• 각 신호등은 출력 워드 O:2의 한 비트 주소에 의해 제어됩니다.

• 첫 6비트를 사용하여 다음과 같은 신호등 출력 시퀀스를 실행하도록 프로그램합니다:

    • Step 1: 출력 O:2.0(빨간불)과 O:2.5(녹색불)을 동작시킵니다.
    • Step 2: 출력 O:2.0(빨간불)과 O:2.4(노란불)을 동작시킵니다.
    • Step 3: 출력 O:2.2(녹색불)과 O:2.3(빨간불)을 동작시킵니다.
    • Step 4: 출력 O:2.1(노란불)과 O:2.3(빨간불)을 동작시킵니다

• 워드 B3:0, B3:1, B3:2, B3:3, B3:4는 시퀀서(sequencer) 파일을 구성합니다.

• 네 단계 각각에서 필요한 신호등의 온/오프 상태를 반영하는 이진(binary) 정보(1과 0)를 시퀀서 파일의 각 워드에 입력합니다.

• 시퀀스를 시작하기 전에 시퀀서가 중립(neutral) 위치에 있도록 시작점이 필요합니다. 시작 위치는 모든 비트가 0인 상태이며, 이를 통해 중립 위치가 제공됩니다.

시퀀서 명령의 동작 방식으로 인해, 모든 출력 포인트는 하나의 출력 모듈에 있어야 합니다. 시퀀서가 하나의 전체 출력 워드에 대해 동작할 때, 해당 워드에는 시퀀서가 제어할 필요가 없는 출력도 포함될 수 있습니다. 본 예에서는 출력 워드 O:2의 비트 6부터 15까지는 시퀀서에서 사용되지 않지만, 프로그램의 다른 부분에서 사용할 수 있습니다. 이러한 출력 워드의 비트들이 시퀀서에 의해 제어되지 않도록 하기 위해 마스크(mask) 워드가 사용됩니다. 마스크 워드의 사용은 그림 12-9에 나와 있으며, 마스크의 동작은 다음과 같이 요약할 수 있습니다:

• 마스크 워드는 시퀀서 워드 파일에서 출력 워드로 전달되는 데이터를 선택적으로 걸러냅니다.

• 16진수 값 003Fh가 마스크 매개변수로 입력됩니다.

• 시퀀서가 출력 워드 O:2의 특정 비트를 제어하려면, 해당 비트와 대응되는 마스크 워드의 비트는 1로 설정해야 합니다.

• 그림의 화살표는 마스크에서 가려지지 않고(masked되지 않고) 목적지 주소로 전달되는 비트를 나타냅니다.

• 목적지 주소의 비트에 있는 대시는 시퀀싱 동안 변경되지 않는 비트임을 나타냅니다.

• 변경되지 않는 이 비트들은 시퀀서와 독립적으로 사용할 수 있습니다.

시퀀서(sequencer) 출력 명령은 자신이 위치한 런(rung)의 앞쪽에 논리 조건이 필요합니다. 이 논리가 거짓(false)에서 참(true)으로 전이될 때, 시퀀서는 자신의 기능을 수행하도록 트리거됩니다. 시퀀서 명령은 오직 앞단 논리가 거짓에서 참으로 변할 때만 데이터 파일을 읽고, 마스크(mask)를 적용하며, 마스킹된 데이터 파일을 출력(destination)으로 전송하는 기능을 수행합니다. 이 사이클이 완료되면, 시퀀서는 다음 단계로 증가하기 위한 또 다른 거짓→참(false‑to‑true) 전이를 기다립니다.

그림 12-10은 시퀀서가 파일의 데이터를 출력으로 이동시키는 방법을 보여줍니다. 해당 논리 런의 동작은 다음과 같이 요약됩니다:

• 푸시버튼 PB는 시퀀서 출력 명령으로 거짓→참 트리거 신호를 보내는 데 사용됩니다.

• 시퀀서 명령의 위치(position)는 시퀀서 런의 각 거짓→참 전이마다 1씩 증가합니다.

• PB가 순간적으로 눌리면 시퀀서는 활성화되고 동시에 다음 위치로 진행합니다.

• 시퀀서가 1단계에 있을 때, 시퀀서 파일의 워드 B3:1(100001)의 이진 정보가 출력 워드 O:2로 전송됩니다.

• 그 결과 O:2/0과 O:2/5 출력이 켜지고 나머지는 모두 꺼집니다.

• 시퀀서를 2단계로 진행하면 워드 B3:2(010001)의 데이터가 O:2로 전송됩니다.

• 그 결과 O:2/0과 O:2/4 출력이 켜지고 나머지는 꺼집니다.

• 시퀀서를 3단계로 진행하면 워드 B3:3(001100)의 데이터가 O:2로 전송됩니다.

• 그 결과 O:2/2와 O:2/3 출력이 켜지고 나머지는 꺼집니다.

• 시퀀서를 4단계로 진행하면 워드 B3:4(001010)의 데이터가 O:2로 전송됩니다.

• 그 결과 O:2/1과 O:2/3 출력이 켜지고 나머지는 꺼집니다.

• 위치(position) 파라미터가 4(길이 length 파라미터에 입력된 값)에 도달하면 모든 워드가 이동된 것이므로 명령의 DN(done bit)이 1로 설정됩니다.

• DN 비트가 설정된 상태에서 다음 거짓→참 전이가 발생하면, 위치 포인터는 자동으로 1로 리셋됩니다.

시퀀서 명령은 일반적으로 유지(retentive) 기능을 가지며, 하나의 명령으로 동작할 수 있는 외부 출력과 단계 수에는 상한이 있을 수 있습니다. 많은 시퀀서 명령은 마지막 단계가 끝나면 자동으로 시퀀서를 1단계로 리셋합니다. 어떤 명령은 별도의 리셋 제어 라인을 제공하거나 두 기능을 조합한 형태일 수도 있습니다.

12.3 Sequencer Programs

시퀀서 프로그램은 이벤트(event) 기반 또는 시간(time) 기반으로 구성할 수 있습니다. 이벤트 기반 시퀀서는 기계식 스테퍼 스위치처럼 동작하며, 입력 펄스가 들어올 때마다 한 단계씩 증가합니다. 시간 기반 시퀀서는 기계식 드럼 스위치처럼 동작하며, 설정된 시간 주기마다 자동으로 한 단계씩 증가합니다.

그림 12-11과 같은 시퀀서 차트는 시퀀서 명령에 의해 제어되는 출력의 동작 순서를 표 형태로 나타낸 것입니다. 이러한 표는 행렬(matrix) 형식의 차트를 사용합니다. 행렬은 2차원 직사각형 형태의 배열입니다. 시간 기반 시퀀서 차트는 일반적으로 가로축에 출력, 세로축에 시간(duration)을 표시합니다. 이벤트 기반 시퀀서는 가로축에 출력, 세로축에 입력 또는 이벤트를 표시합니다.

그림 12-12는 모든 단계의 시간이 동일하지 않은 시간 기반 시퀀서의 예입니다. 이 시퀀서 프로그램은 4방향 교차로의 자동 신호등 제어에 사용됩니다. 출력 신호등은 서로 다른 시간 길이를 가진 단계들을 순차적으로 동작합니다. 시스템에는 두 개의 SQO 명령이 필요합니다. 하나는 신호등 출력용이며, 다른 하나는 시간 단계(time steps)용입니다. 두 SQO 모두 제어(control) 주소로 R6:0을 사용하고 길이(length)는 4입니다. 첫 번째 위치는 25초, 두 번째는 5초, 세 번째는 25초, 네 번째는 5초 동안 유지됩니다.

시간순 시퀀스 프로그램의 운영은 다음과 같이 설명할 수 있습니다.

• 첫 번째 SQO 명령에서 교통 신호등 출력을 제어하는 비트들은 정수(integer) 파일 #N7:0에 저장됩니다. 각 위치(position)에 대해 필요한 출력 비트 설정은 그림 12-13과 같이 이진 테이블 형식으로 입력되어 저장됩니다. #N7:0 파일의 각 워드는 앞서 설명한 방식대로 프로그램에 의해 목적지 출력 워드 O:2로 이동됩니다.

• 두 번째 SQO 명령의 시퀀서(sequencer) 파일 #N7:10에는 25, 5, 25, 5초의 사전 설정(preset) 타이머 값이 저장되어 있습니다. 이러한 값들은 그림 12-14에 나타난 것처럼 워드 N7:11, N7:12, N7:13, N7:15에 저장됩니다. #N7:10 파일의 각 워드는 프로그램에 의해 타이머의 사전 설정 값인 주소 T4:1.PRE로 이동됩니다. 프로그램은 이 파일의 정보를 타이머 T4:1의 프리셋으로 이동하며, 마스크(mask)는 필요한 데이터만 통과시키고 불필요한 데이터는 차단합니다.

• 타이머는 두 개의 SQO 명령을 네 개의 상태(state)를 통해 순환시키며 동작합니다.

• 두 SQO 명령 모두 제어(control) 주소로 R6:0을 사용하고 길이(length)가 4이기 때문에, 두 명령은 동일한 단계로 함께 진행되며 순차적인 시간 제어 출력이 이루어집니다.

시간 구간이 항상 일정한 값으로 유지되는 시간 기반(time‑driven) 시퀀서 프로그램의 예는 그림 12-15에 나와 있습니다. 이 프로그램의 동작은 다음과 같이 요약할 수 있습니다:

• 타이머 T4:0의 프리셋(preset) 시간은 3초로 설정됩니다.

• 각 시퀀서 위치(position)에 대한 출력 비트 설정은 비트 파일 #B3:0에 입력되어 저장됩니다.

• 스위치 SW가 닫히면 타이머가 기동되며, 3초 후 타이머의 완료 비트(done bit)가 1로 설정됩니다.

• 그 결과, 타이머 완료 비트는 SQO 명령을 다음 위치로 증가시키고 타이머를 리셋합니다.

• 목적지(destination)는 O:2이며, 이 워드의 16비트가 모두 출력으로 사용됩니다.

• 마스크(mask)는 16진수 FFFF 또는 2진수 1111111111111111이며, 이를 통해 16비트 전체가 모두 통과됩니다.

• 입력 SW가 닫혀 있는 한, 프로그램은 각 시퀀서 단계 사이에 3초의 간격을 두고 계속 동작합니다.

이벤트 기반(event‑driven) 시퀀서에서는 SQO 명령이 사전 설정된 시간이 아닌 외부 펄스 입력 이벤트에 의해 다음 단계로 진행됩니다. 이벤트 기반 시퀀서의 예는 그림 12-16에 나와 있으며, 동작은 다음과 같이 요약됩니다:

• 시퀀서 SQO 명령은 OR로 구성된 두 개의 센서 스위치(S1과 S2)를 사용합니다.

• 두 병렬 경로 중 어느 하나라도 SQO 런(rung)을 참(true)으로 만들 수 있습니다.

• 각 이벤트가 발생하면 해당 OR 분기(branch)가 거짓→참(false‑to‑true) 전이를 만들어 시퀀서 위치가 증가합니다.

• 데이터는 비트 파일 #B3:0에서 마스크 워드 F0FF(hex) 또는 1111000011111111(binary)을 통해 목적지 O:2로 복사됩니다. 마스크 비트가 1인 경우 데이터가 통과하며, 0인 경우 데이터가 마스킹됩니다.

• 위치(position)가 마지막 위치에 도달한 후, 명령이 참에서 거짓(true‑to‑false)으로 전이되면 위치는 1로 리셋됩니다.

• 출력 워드 O:2의 데이터는 파일 내 위치 2의 데이터와 일치하지만, 비트 8~11의 데이터는 예외입니다.

• 비트 8~11은 마스크(mask)의 해당 비트가 0으로 설정되어 있기 때문에 시퀀서 명령의 영향을 받지 않으며, 프로그램의 다른 부분에서 제어될 수 있습니다.

시퀀서 입력(SQI; Sequencer Input) 명령은 입력 데이터를 시퀀서 파일에 저장된 데이터와 비교하여 동일(equal) 여부를 검사할 수 있도록 해줍니다. 예를 들어, 입력 장치들의 상태가 원하는 상태와 일치하는지 비교하여, 조건이 맞으면 명령이 참이 됩니다.

SQI 명령은 Allen‑Bradley PLC‑5 및 ControlLogix 컨트롤러에서 사용 가능한 입력 명령입니다. PLC 시퀀서 입력 명령의 예는 그림 12-17에 나와 있습니다. 명령에 입력되는 항목들은 시퀀서 출력 명령과 유사하지만, 목적지(destination)가 소스(source)로 대체된 점이 다릅니다. 프로그램 동작은 다음과 같이 요약됩니다:

• SQI 명령은 입력 데이터 I:3을 마스크 FFF0을 통해 시퀀서 파일 N7:11~N7:15에 저장된 데이터와 비교하여 동일 여부를 검사합니다.

• 비교에 사용되는 시퀀서 파일 내 특정 데이터는 위치(position) 파라미터에 의해 결정됩니다.

• 마스킹되지 않은 입력(source) 비트들이 시퀀서 파일 워드의 해당 비트들과 일치하면 명령은 참이 되고, 그렇지 않으면 거짓이 됩니다.

• 이 예에서는 위치 2의 데이터가 마스킹되지 않은 입력 데이터와 일치하므로, SQI 명령이 참이 되어 런(rung)과 출력 PL1을 참으로 만듭니다.

• 입력 데이터는 입력 장치의 상태를 나타낼 수 있으며, 예제 프로그램에서는 여러 입력 스위치 조합의 상태를 의미합니다.

• 열린(open) 스위치와 닫힌(closed) 스위치의 조합이 시퀀서 참조 파일의 해당 단계에 있는 1과 0의 조합과 동일할 때마다, 시퀀서의 PL1 출력이 동작(energized)합니다.

SQI 명령은 SQO 명령과 마찬가지로 제어 레지스터를 사용하지만 완료비트(done bit)는 없습니다. 또한 SQI 명령은 입력에서 제어 로직이 거짓(false)에서 참(true)으로 전이될 때마다 위치 값이 자동으로 증가하지 않습니다. SQI 명령을 단독으로 사용할 경우, 새로운 입력 파일(file) 값을 선택하여 소스 주소의 값과 비교하려면 다른 명령(예: move 명령)을 사용해 위치 값을 변경해야 합니다.

SQI 명령이 동일한 제어 주소를 가진 SQO 명령과 함께 사용되면, 위치 값은 두 명령 모두에 대해 SQO 명령에 의해 증가합니다. 그림 12-18의 프로그램은 순차 동작을 감시하고 제어하기 위해 각각 시퀀서 입력 명령과 시퀀서 출력 명령을 쌍으로 사용하는 방법을 보여 줍니다. 프로그램의 동작은 다음과 같이 요약할 수 있습니다.

• 두 명령 모두 동일한 제어 주소, 길이 값(length), 위치 값(position)을 사용합니다.

• 시퀀서 입력 명령은 시퀀서 출력 명령에 의해 인덱스되며, 이는 두 제어 요소가 동일한 주소(R6:5)를 사용하기 때문입니다.

• 이러한 프로그래밍 기법을 사용하면 입력 및 출력 시퀀스가 동시에 동작하게 되어, 특정 입력 시퀀스가 발생할 때 특정 출력 시퀀스가 나타나도록 할 수 있습니다.

Allen-Bradley SLC 500의 시퀀서 비교(SQC) 명령은 SQI 명령과 유사하지만 동일하지 않습니다. 주요 차이점은 다음과 같습니다.

• SQC 명령은 입력 명령이 아니라 출력 명령입니다.

• SQC 명령은 위치(position) 파라미터를 증가시킵니다.

• SQC 명령에는 추가적인 상태 비트 — 발견 비트(found bit, FD)가 있습니다. 소스 패턴이 시퀀서 파일 단어와 일치할 때 FD가 1로 설정됩니다. 다른 모든 조건에서는 0입니다.

SLC 500 시퀀서 비교(SQC) 명령의 예제 프로그램이 그림 12-19에 제시되어 있습니다. 프로그램의 동작은 다음과 같이 요약할 수 있습니다.

• 소스(I:1)의 상위 4비트 데이터가 파일 B3:22의 데이터와 비교됩니다.

• 이 예에서는 I:1의 상위 4비트가 스텝 위치 3에서 B3:25의 상위 4비트 상태와 일치합니다.

• 이 시점에서 푸시버튼 입력 I:1/0이 참(true)이라면 발견 비트(found bit, FD)가 설정되며, 이에 따라 출력 PL1이 켜집니다.

• 입력 I:1/12, I:1/13, I:1/14, I:1/15에 연결된 스위치들의 열림/닫힘 조합이 시퀀서 기준 파일의 특정 스텝에 기록된 1과 0의 조합과 동일하고, 동시에 입력 I:1/0이 참일 경우 PL1 출력이 여자(energized)됩니다.

• 마스크(F000h)는 시퀀서 명령에서 사용되지 않는 비트들을 독립적으로 사용할 수 있도록 해줍니다. 이 예에서는 사용되지 않는 비트 I:1/0이 시퀀서 비교 런(rung)의 조건 입력으로 사용됩니다.

시퀀서 로드(SQL) 명령은 PLC 입력 모듈을 읽고 해당 입력 데이터를 시퀀서 파일에 저장하는 데 사용됩니다. 많은 공정 단계에 대한 입력 조건을 수동으로 로드하는 것은 오류가 발생하기 쉽습니다. 이런 경우 시퀀서 로드 명령을 사용하여 시퀀서 파일에 데이터를 한 번에 한 스텝씩 로드할 수 있습니다. 예를 들어, 로봇을 수동 조그(jog) 모드로 순차 동작 경로를 따라 이동시키면서 각 단계에서 입력 장치를 읽고, 해당 스텝마다 시퀀서 비교 명령의 데이터 파일에 기록할 수 있습니다. 그 결과 시퀀서 파일은 각 스텝에서 원하는 입력 상태를 포함하게 되며, 자동 모드에서 장비가 동작할 때 이 데이터가 입력 장치와 비교하는 데 사용됩니다.

그림 12-20은 SLC 500 시퀀서 로드(SQL) 명령 프로그램의 예제를 보여줍니다. 프로그램의 동작은 다음과 같이 요약됩니다.

• 시퀀서 로드 명령은 파일을 로드하는 데 사용되며, 장비의 정상 동작 중에는 기능하지 않습니다.

• 프로그래밍 터미널을 사용하여 데이터를 파일에 수동으로 입력하던 작업을 대체합니다.

• 시퀀서 로드 명령은 마스크를 사용하지 않습니다. 소스 주소의 데이터를 시퀀서 파일에 직접 복사합니다.

• 명령이 거짓(false)에서 참(true)으로 전이되면 다음 위치로 인덱싱되고 데이터를 복사합니다.

• 명령이 마지막 위치에서 동작하고 참에서 거짓으로 전이되면 위치 1로 리셋됩니다.

• 위치 0에 있을 때, 명령이 참이고 프로세서가 프로그램 모드에서 런 모드로 전환될 때에만 위치 0의 데이터를 전송합니다.

• 장비를 수동 조그하여 싸이클을 진행시키면, 소스 입력 I:2에 연결된 스위치 상태를 각 스텝마다 읽고 PB1을 순간적으로 눌러 파일에 기록할 수 있습니다. 그렇지 않으면 데이터를 파일에 수동으로 입력해야 합니다.

12.4 Bit Shift Registers

PLC는 고정된 패턴의 레지스터(word) 비트만 사용하는 것이 아니라, 개별 비트를 쉽게 조작하고 변경할 수도 있습니다. 비트 시프트 레지스터(bit shift register)는 단일 레지스터 또는 레지스터 그룹을 통해 비트를 이동(shifting)할 수 있는 레지스터를 말합니다. 비트 시프트 레지스터는 배열 내에서 비트들을 직렬(serially)로, 즉 비트에서 비트로 순차적으로 이동시킵니다.

시프트 레지스터는 부품의 이동을 모방하거나 정보의 흐름을 추적하는 데 사용할 수 있습니다. 어떤 사건의 상태를 저장해 두었다가 나중에 해당 상태를 기반으로 동작해야 할 때 시프트 레지스터를 사용합니다. 시프트 레지스터는 상태(status)나 값을 데이터 파일(data fi les)을 통해 이동시킬 수 있습니다. 시프트 레지스터의 일반적인 응용 예는 다음과 같습니다.

• 조립라인에서 부품 추적

• 기계 또는 공정 운전 제어

• 재고 관리

• 시스템 진단

그림 12-21은 시프트 레지스터의 기본 개념을 보여 줍니다. 시프트 펄스 또는 클록(clock)이 발생하면 시프트 레지스터 내의 각 비트는 오른쪽으로 한 위치 이동합니다. 어느 시점이 되면 시프트 레지스터에 입력되는 데이터 비트의 수가 레지스터의 저장 용량을 초과하게 됩니다. 이때 시프트 펄스에 의해 가장 먼저 입력된 데이터 비트는 시프트 레지스터의 끝에서 제거됩니다. 일반적으로 시프트 레지스터의 데이터는 다음을 나타낼 수 있습니다.

• 부품의 종류, 품질, 크기

• 부품의 존재 여부

• 사건이 발생한 순서

• 식별 번호 또는 위치

• 정지를 야기한 고장 조건

비트 시프트 레지스터는 그림 12-22에서 보듯이 데이터 파일을 통해 상태(status) 또는 값을 좌측 또는 우측으로 이동하도록 프로그래밍할 수 있습니다. 부품을 상태 기반으로 추적하고자 할 때는 비트 시프트 레지스터를 사용합니다. 비트 시프트 명령은 소스 비트 주소의 비트 상태를 데이터 파일을 통해 언로드 비트(unload bit)까지 한 번에 한 비트씩 이동시킵니다. 비트 시프트 명령에는 비트 시프트 좌(BSL, bit shift left)와 비트 시프트 우(BSR, bit shift right) 두 가지가 있습니다.

BSL은 낮은 주소 번호에서 높은 주소 번호 방향으로 비트 상태를 데이터 파일을 통해 이동시키며,

BSR은 높은 주소 번호에서 낮은 주소 번호 방향으로 비트를 이동시킵니다.

일부 PLC는 패턴을 반복적으로 사용할 수 있도록 순환 시프트 레지스터(circulating shift register) 기능을 제공합니다.

비트 시프트 레지스터를 사용할 때는 레지스터 내에서 각 비트를 해당 위치(position)로 식별할 수 있습니다. 따라서 레지스터 내의 특정 비트를 다루는 것은 기존의 워드 번호/비트 번호 방식이 아니라, 레지스터 내에서 그 비트가 차지하는 위치를 식별하는 방식으로 처리됩니다.

그림 12-23은 File Shift 메뉴 탭과 Allen-Bradley SLC 500 컨트롤러의 명령어 세트에 포함된 BSL 및 BSR 명령 블록을 보여 줍니다. 명령은 다음과 같이 요약할 수 있습니다.

BSL (Bit Shift Left) — 비트 데이터를 비트 배열에 로드하고, 배열을 통해 데이터를 왼쪽으로 이동시키며, 배열의 마지막 비트를 언로드(unload)합니다.

BSR (Bit Shift Right) — 비트 데이터를 비트 배열에 로드하고, 배열을 통해 데이터를 오른쪽으로 이동시키며, 배열의 마지막 비트를 언로드합니다.

시프트 레지스터는 조립라인을 따라 이동하는 부품의 상태 또는 식별값을 추적하는 데 유용합니다. 시프트 레지스터에 사용되는 데이터 파일은 일반적으로 비트 파일(bit fi le)인데, 이는 데이터가 이진(binary) 형식으로 표시되어 읽기 쉽기 때문입니다. BSL과 BSR은 데이터를 한 번에 한 비트씩 비트 배열에 로드하는 출력 명령입니다. 데이터는 배열을 통해 이동한 후, 한 비트씩 언로드됩니다.

BSL 명령은 BSR 명령과 동일한 오퍼랜드(operand)를 사용합니다. 차이점은 비트가 인덱스되는 방향뿐입니다. 비트 시프트 명령은 입력 제어 로직이 거짓(false)에서 참(true)으로 전이될 때 실행됩니다. 비트 시프트 명령을 프로그램하기 위해서는 프로세서에 다음 정보를 제공해야 합니다.

File — 조작하려는 비트 배열의 주소입니다. 주소는 반드시 # 기호로 시작해야 하고, 첫 번째 워드 또는 요소의 비트 0에서 시작해야 합니다. 배열의 마지막 워드에서 남아 있는 비트는 명령이 이를 무효화하므로 프로그램의 다른 곳에서는 사용할 수 없습니다.

Control — R 데이터 테이블 형식입니다. 주소는 해당 명령에 고유하며 다른 어떤 명령의 제어에도 사용할 수 없습니다. 제어 요소는 세 개의 워드로 구성되며, 상태 워드(status word), 길이(length), 위치(position)가 포함됩니다.

Bit address — 소스 비트의 주소입니다. 명령은 이 비트의 상태를 배열의 첫 번째(가장 낮은) 비트 위치(BSL 명령의 경우) 또는 마지막(가장 높은) 비트 위치(BSR 명령의 경우)에 삽입합니다.

Length — 이동시킬 비트 수 또는 파일 길이(비트 단위)를 나타냅니다.

제어 워드의 상태 비트에는 enable, done, error, unload 비트가 있으며, 기능은 다음과 같습니다.

  • Enable Bit (EN) — 명령 상태를 따라가며, 명령이 참일 때 1로 설정됩니다.
  • Done Bit (DN) — 파일의 모든 비트가 한 위치씩 이동되면 1로 설정됩니다. 명령이 거짓이 되면 0으로 리셋됩니다.
  • Error Bit (ER) — 길이가 음수로 입력되는 등의 오류가 발생하면 1로 설정됩니다.
  • Unload Bit (UL) — 명령이 실행될 때 파일의 마지막 비트가 언로드 비트로 이동하면서 이 비트의 상태가 결정됩니다. 이는 명령이 거짓에서 참으로 전이될 때 파일의 마지막 비트 상태가 이동하는 위치입니다. 다음 시프트가 발생하면 이 데이터는 추가 프로그램이 없는 한 사라지게 됩니다.

예시 비트 시프트 좌(BSL) 명령 프로그램이 그림 12-24에 제시되어 있습니다. 프로그램의 동작은 다음과 같이 요약할 수 있습니다.

• 리미트 스위치 LS가 순간적으로 동작하면 BSL 명령이 실행됩니다.

• 런(rung)이 거짓(false)에서 참(true)으로 전이되면 enable 비트가 설정되고, 데이터 블록은 왼쪽(더 높은 비트 번호 방향)으로 한 비트씩 이동됩니다.

• 센서 비트 주소 I:1/1에서 지정된 비트가 첫 번째 비트 위치 B3:10/0으로 이동됩니다.

• 마지막 비트는 배열에서 밀려나서 언로드 비트(unload bit) R6:0/UL에 저장됩니다.

• 이전에 언로드 비트에 있던 상태는 사라집니다.

• 파일 마지막 워드의 사용되지 않는 부분에 있는 모든 비트는 무효화되므로 프로그램의 다른 곳에서 사용해서는 안 됩니다.

• 래핑(wraparound) 동작을 위해서는 비트 주소의 위치를 배열의 마지막 비트 또는 UL 비트로 설정해야 합니다(적용되는 경우).

비트 시프트 우(BSR) 명령 프로그램의 예가 그림 12-25에 제시되어 있습니다. 프로그램의 동작은 다음과 같이 요약할 수 있습니다.

• 런이 거짓에서 참으로 전환되기 전, B3:50과 B3:51의 비트 상태는 그림과 같습니다.

• 비트 주소 I:3/5의 상태는 0이며, 언로드 비트 R6:1/UL의 상태는 1입니다.

• 리미트 스위치 LS가 닫히면 비트 주소 I:3/5의 상태가 파일의 24번째 비트인 B3:51/7로 이동합니다.

• 파일 내 모든 비트의 상태는 총 24비트 길이를 따라 오른쪽으로 한 위치씩 이동합니다.

• B3:50/0의 상태는 언로드 비트 R6:1/UL로 이동하며, 이전 언로드 비트의 상태는 사라집니다.

래핑 기능이 포함된 비트 시프트 좌(BSL) 명령 프로그램의 예가 그림 12-26에 제시되어 있습니다. 클록 펄스 입력은 T4:0 온딜레이 타이머에 의해 생성되는 고정적인 3초 주기 펄스입니다. 프로그램의 동작은 다음과 같이 요약될 수 있습니다.

• 데이터 테이블에서 B3:0/0, B3:0/1, B3:0/2 비트 주소를 logic 0으로 설정하고, R6:0/UL을 logic 1로 설정합니다.

• PLC를 run 상태로 전환하면 B3:0/0이 logic 1이 되어 PL1이 켜집니다.

• 입력 스위치 SW를 닫으면 타이머 T4:0이 동작을 시작합니다.

• 3초 후 타이머 done 비트가 설정되어 누적값이 0으로 리셋되고, logic 1 비트는 왼쪽으로 이동하여 B3:0/1이 됩니다.

• 이에 따라 PL1은 꺼지고 PL2가 켜집니다.

• 다시 3초 후 타이머 done 비트가 또 한 번 설정됩니다.

• BSL 명령이 비트를 다시 왼쪽으로 이동시키며 PL2가 꺼지고 PL3이 켜집니다.

• 각 파일럿 램프는 3초씩 순차적으로 켜지며 이 과정이 계속됩니다.

시프트 레지스터는 컨베이어에서 이동하는 부품과 동기화되어야 하는 이진(binary) 정보가 필요한 자재 취급(material handling) 공정에서 자주 사용됩니다. 이진 정보란 이동 중인 제품에 대해 설정할 수 있는 두 가지 조건을 의미하는데, 예를 들어 부품의 존재 또는 부재가 될 수 있습니다. 부품이 컨베이어를 따라 이동하는 동안 센싱 장치가 해당 제품이 두 조건 중 어느 것에 해당하는지 판별합니다.

그림 12-27은 컨베이어 위에서 이동하는 상자를 광전 센서(photoelectric sensor)가 감지하는 모습을 보여 줍니다. 시프트 레지스터의 데이터 라인을 구동하는 센서는 빔이 상자의 존재 또는 부재를 감지하도록 고정되어 있습니다. 센서 상태가 logic 1이면 상자가 존재함을 나타내고, 0이면 존재하지 않음을 나타낼 수 있습니다.

그림 12-28의 공정은 비트 시프트 좌 레지스터(bit shift left register)에 의해 제어되는 스프레이 도장 작업을 보여 줍니다. 부품이 생산 라인을 따라 이동함에 따라, 시프트 레지스터의 비트 패턴은 컨베이어 행어에 매달린 도장 대상 품목을 나타냅니다. 파일의 각 비트 위치는 라인의 하나의 스테이션을 의미하며, 해당 비트의 상태는 그 스테이션에 부품이 존재하는지 여부를 나타냅니다.

프로그램은 스프레이 도장 작업을 위한 것이며 그림 12-29에 나타나 있습니다. 그 동작은 다음과 같이 요약할 수 있습니다.

• 리미트 스위치 LS1은 행어(hanger)를 감지하며, 리미트 스위치 LS2는 부품을 감지합니다.

• 행어에 의해 동작되는 리미트 스위치 LS1이 생성하는 펄스는 부품 감지 리미트 스위치 LS2가 제공하는 데이터의 상태를 시프트합니다.

• 이 동작의 논리는, 도장이 필요한 부품과 부품 행어가 동시에 스테이션 1에 도달할 때(LS2와 LS1이 동시에 닫힐 때 표시됨), logic 1이 시프트 레지스터의 B3:0/0에 입력되도록 되어 있습니다.

• 이로 인해 SOL 1 런(rung)이 참이 되면서 언더코트 스프레이 건이 여자(energize)됩니다.

• 스테이션 5에서는 시프트 레지스터 B3:0/5에 1이 나타나 SOL 2 런이 참이 되고, 탑코트 스프레이 건이 여자됩니다.

• 시프트 레지스터에 logic 0이 있으면 컨베이어 위에 도장할 부품이 없다는 의미이며, 이 경우 스프레이 건의 동작이 차단됩니다.

• 카운터 C5:1은 공정에 진입하는 부품을 계수하고, 카운터 C5:2는 공정을 빠져나오는 부품을 계수합니다.

• 도장 중인 부품이 없을 때 두 카운터의 값은 동일해야 합니다.

• 두 계수 값이 동일할 경우, equal 명령이 실행되어 파일럿 램프 PL1이 켜집니다. 이는 도장을 시작한 부품 수와 도장을 마친 부품 수가 동일하다는 표시입니다.

16개의 스테이션을 지나는 캐리어(carrier)를 추적하기 위해 사용되는 비트 시프트 프로그램의 예가 그림 12-30에 나타나 있습니다. 프로그램의 동작은 다음과 같이 요약할 수 있습니다.

• 근접 스위치 1은 캐리어를 감지하고, 근접 스위치 2는 캐리어 위의 부품을 감지합니다.

• 캐리어 근접 스위치 I:1/1이 생성하는 클록 펄스는 부품 감지 근접 스위치 I:1/2가 제공하는 데이터의 상태를 시프트합니다.

• I:1/2와 I:1/1이 동시에 닫혀 부품과 용기(container)가 함께 감지되면 logic 1이 시프트 레지스터의 출력 O4:0/0에 입력되어 여기에 연결된 파일럿 램프가 켜집니다.

• 출력 모듈 O:4에 연결된 나머지 파일럿 램프들은 부품이 실린 캐리어가 각 스테이션을 통과함에 따라 순차적으로 켜집니다.

• 빈 캐리어가 이동할 때는 램프가 꺼지거나 꺼진 상태를 유지합니다.

• 스테이션 5는 부품을 검사하는 검사 스테이션입니다.

• 부품이 불량일 경우, 검사자는 부품을 제거하면서 PB1을 눌러 출력 O:4/4를 끕니다.

• 재작업(rework) 부품은 스테이션 7에서 시스템에 다시 삽입할 수 있습니다.

• 작업자가 빈 캐리어에 부품을 올려놓으면 PB2를 눌러 출력 O:4/6을 켜고 추적을 재개합니다.

12.5 Word Shift Operations

First In, First Out(FIFO) 명령은 워드 시프트(word shift) 동작으로, 비트 시프트 동작과 유사한 기능을 수행합니다. 워드 시프팅은 일반적으로 스택(stack)이라고 불리는 파일에 데이터를 로드하고 언로드하는 과정을 더욱 단순화해 줍니다. 이 방식은 조립라인에서 부품을 추적할 때 자주 사용되며, 부품은 부품 번호나 조립 코드와 같은 값을 통해 표현됩니다. 그림 12-31은 박스에 인쇄된 바코드 데이터를 읽기 위해 사용되는 바코드 리더(barcode reader)를 보여 줍니다.

비트 시프트 레지스터는 한 워드 또는 여러 워드 내에서 정보를 한 비트씩 이동시키기 때문에 동기식(synchronous) 또는 직렬(serial) 방식으로 동작합니다. 즉, 하나의 비트가 입력될 때마다 하나의 비트가 출력되며, 비트 시프트 레지스터에 입력된 데이터는 레지스터 길이만큼(시프트 펄스당 한 위치) 이동해야만 출력이 가능합니다.

반면 FIFO 기능은 비동기식(asynchronous)으로 동작합니다. 워드 내에서 비트 정보를 이동시키는 대신, 완전한 하나의 워드 단위로 데이터를 파일(스택)로 이동시킵니다. 비트 시프트 레지스터와 달리, FIFO에서는 두 개의 별도 시프트 펄스가 필요합니다. 하나는 데이터를 파일에 로드(load)하는 펄스이고, 다른 하나는 파일에서 데이터를 언로드(unload)하는 펄스입니다. 이 두 펄스는 서로 독립적으로(비동기적으로) 동작합니다. FIFO에 로드된 데이터는 스택의 길이와 관계없이 즉시 언로드가 가능합니다.

FFL과 FFU 명령은 쌍(pair)으로 사용됩니다.

FFL 명령은 사용자 정의 FIFO 스택(stack)이라 불리는 파일에 논리 워드를 로드합니다.

FFU 명령은 FIFO 스택에 들어온 순서대로 워드를 언로드하며, 가장 먼저 입력된 워드가 가장 먼저 출력됩니다.

그림 12-32는 SLC 500의 FIFO Load(FFL) 명령을 나타냅니다. 명령 블록에 입력해야 하는 파라미터는 다음과 같이 요약됩니다.

Source — 데이터를 FIFO 파일에 입력할 워드 주소입니다.

FIFO — 데이터가 입력될 파일의 주소이며 # 기호로 시작해야 합니다.

Control — R 데이터 테이블 형식으로, 제어 구조(control structure)의 파일 주소입니다. 이 요소에는 상태 비트(status bits), 스택 길이(length), 위치(position)가 저장됩니다.

Length — 파일의 길이를 워드 단위로 지정합니다. 즉, 스택에 저장할 수 있는 최대 워드 수를 의미합니다.

Position — 스택에 데이터를 로드하는 다음 사용 가능한 위치입니다. 스택의 첫 번째 주소는 위치 0입니다. 각 워드가 스택에 입력될 때마다 FFL과 FFU 모두에서 위치 카운터가 1씩 증가합니다. 위치 값이 길이(length)와 같아지면 스택은 가득 찬 것으로 간주됩니다.

제어 워드의 상태 비트에는 enable(EN), done(DN), empty(EM) 비트가 있으며, 기능은 다음과 같습니다.

  • Enable Bit (EN) — 명령이 참(true)이면 1로 설정되며 명령 상태를 따라갑니다.
  • Done Bit (DN) — 명령의 position이 length와 같아지면 1로 설정됩니다. DN 비트가 설정되면 FIFO는 가득 찬 것이며 더 이상 데이터를 받아들이지 않습니다. 또한 이때 명령이 false에서 true로 전이되어도 FIFO 파일의 기존 데이터는 덮어쓰여지지 않습니다.
  • Empty Bit (EM) — FIFO 파일에서 모든 데이터가 언로드되면 1로 설정됩니다.

그림 12-33은 SLC 500 FIFO 언로드(FFU) 명령을 보여 줍니다. SLC 500 FFU 명령에는 다음과 같은 파라미터를 입력해야 합니다.

FIFO — 데이터가 입력되는 파일의 주소입니다. 주소는 반드시 # 기호로 시작해야 합니다. FFL 명령과 쌍으로 사용할 경우 이 주소는 FFL과 동일합니다.

Destination — FFU가 데이터를 언로드하는 대상 주소입니다.

Control — R 데이터 테이블 형식이며, 상태 워드(status word), 길이(length), 위치(position)로 구성된 세 개의 워드 요소입니다. FFL과 쌍으로 사용할 경우 제어 주소는 동일합니다.

Length — 파일의 길이를 워드 단위로 지정합니다. 스택에 저장할 수 있는 최대 워드 수를 의미합니다.

Position — 명령이 거짓(false)에서 참(true)으로 전이될 때 데이터가 언로드되는 위치입니다.

제어 워드의 상태 비트는 enable(EN), done(DN), empty(EM)이며 기능은 다음과 같습니다.

enable 비트는 명령 상태를 따라가며, done 비트는 명령의 position이 length와 같아지면 설정되며, empty 비트는 FIFO 파일의 데이터가 모두 언로드되면 설정됩니다.

그림 12-34의 프로그램은 FFL과 FFU 명령 쌍을 사용해 FIFO 파일에 데이터를 인덱싱하는 방법을 보여 줍니다. 프로그램의 동작은 다음과 같이 요약할 수 있습니다.

• FIFO load와 FIFO unload 명령은 동일한 제어 요소 R6:0을 공유하며, 이 제어 요소는 다른 어떤 명령에도 사용할 수 없습니다.

• FIFO인 #N7:12는 스택의 주소이며, FFL과 FFU 명령 모두에 동일하게 사용됩니다.

• 입력 A가 거짓에서 참으로 전이될 때 소스 주소 N7:10의 데이터가 FIFO 파일로 입력됩니다.

• FFL 명령에서 거짓에서 참으로 전이되면 데이터가 명령에 지정된 position 위치에 저장되며, 이후 position은 FIFO 파일에 현재 저장된 데이터 항목의 개수를 나타냅니다.

• FIFO 파일은 FIFO 파일의 시작 주소에서부터 채워지며, 입력 A의 매 false-to-true 전이마다 한 주소씩 증가합니다.

• 입력 B가 거짓에서 참으로 전이되면 FIFO 파일 내 모든 데이터가 파일의 시작 주소 방향으로 한 위치 이동하며, 파일 시작 주소의 데이터는 대상 주소 N7:11로 이동합니다.

FIFO 명령은 재고 관리(inventory control)에 자주 사용됩니다. 한 예로, 생산에 사용하기 위해 서로 다른 부품을 재고에서 제거해야 하는 경우가 있습니다. 각 부품에는 고유한 코드가 부여되어 FIFO 스택(stack)에 로드되며, 부품은 스택이 규정한 순서대로 제거됩니다. 이러한 제어 방식은 재고에서 가장 오래된 부품이 먼저 사용되도록 보장하는데, 이는 먼저 입력된 부품이 먼저 제거되기 때문입니다.

반대 원리는 마지막으로 저장된 데이터가 가장 먼저 검색되는 방식이며, 이를 LIFO(Last In, First Out)라고 합니다. LIFO 명령은 가장 나중에 입력된 데이터를 먼저 출력하고 가장 먼저 입력된 데이터를 마지막에 출력함으로써 데이터의 순서를 역전시킵니다. 유용한 비유로는 책상 위의 업무 더미를 들 수 있습니다. 새로운 업무가 도착할 때마다 스택 상단에 놓습니다. 만약 스택이 LIFO 방식이라면 다음 작업은 더미 맨 위에서 가져오게 됩니다. 반면 스택이 FIFO라면 더미 맨 아래에서 작업을 선택하게 됩니다.

그림 12-35는 컨테이너 적재 작업에서 FIFO와 LIFO 방식이 어떻게 동작하는지 보여 줍니다.

FIFO 스택과 LIFO 스택의 차이점은 LIFO 명령이 데이터를 로드한 순서의 역순(마지막 입력이 첫 번째 출력)으로 데이터를 제거한다는 점입니다. 그림 12-36은 LIFO 명령 쌍의 예를 보여 주며, 이 기능의 동작은 다음과 같이 요약할 수 있습니다.

• LIFO 스택의 로드와 언로드는 FIFO 스택과 유사하게 동작하지만, LIFO 스택에서는 스택에 마지막으로 저장된 워드가 가장 먼저 언로드됩니다.

• 스택에 이미 로드된 워드를 방해하지 않고 LIFO 스택에 새로운 워드를 추가할 수 있습니다.

• 이 외에는 LIFO 명령은 FIFO 명령과 동일하게 동작합니다.