PLC 래더 프로그래밍을 하는 과정에서 반복적인 회로가 필요할 때가 있습니다.

 

제목에 '인덱스 레지스터'라는 생소한 용어가 하나 보일텐데,

이 레지스터는 값을 저장하는 레지스터가 아닌 메모리의 위치를 저장하는 레지스터라고 할 수 있겠습니다.

대충 PC 계열의 프로그래밍에서는 '포인터'라는 개념과 상당히 유사합니다.

 

이 '포인터'라는 개념만큼 어렵지는 않지만, 나름 사람에 따라 난이도가 있다고 느낄 수도 있습니다.

하지만 알아두면 프로그래밍이 상당히 간결해지고 편리해지는 장점이 있죠.

 

인덱스 레지스터는 총 IR0~IR15까지 넉넉하게 제공이 되고,

태스크마다 IR/DR을 공유할 것인지, 별도로 사용할 것인지에 대한 부분을 PLC 설정에서 바꿀 수 있습니다.

 

간단하게 예를 들기 위해서 예제 회로 하나를 준비했습니다.

반복 회로 (사진 1)

위 사진을 보시면 똑같은 형태의 회로가 반복되고 있습니다.

이 회로를 인덱스 레지스터와 반복문을 이용하여 다음과 같은 형태로 줄일 수 있습니다.

 

인덱스 레지스터를 사용한 반복 회로 (사진 2)

 

처음부터 각 렁(Rung)마다 하나씩 설명드리자면...

Rung 0 : IR0 (첫번째 인덱스 레지스터)에 0.00의 주소값을 대입합니다. (MOV가 아닌 MOVR을 사용합니다.)

 

Rung 1 : IR1 (두번째 인덱스 레지스터)에 W0.00의 주소값을 대입합니다.

 

Rung 2 : FOR 명령어를 이용해 회로를 반복합니다. 반복 횟수는 11번으로 지정해줍니다. (0.00 ~ 0.10까지 총 11개)

 

Rung 3 :

인덱스 레지스터의 핵심입니다. 회로의 모양은 사진 1과 같은 회로입니다.

다만 여기서 '콤마(,) 기호'를 통해서 IR0이 가리키는 주소값을 받아옵니다.

따라서 ,IR0는 IR0가 가리키는 주소값을 불러오게 됩니다.

여기서 맨 뒤에 '더하기(+) 기호'를 추가하여 오토 인크리먼트(Auto Increment; 자동 증가) 옵션을 사용하면 ,IR0에서 값을 불러온 후 IR0가 다음 주소값을 가리키도록 할 수 있습니다.

따라서 ,IR0+는 IR0가 가리키는 주소값을 불러오고 다음 주소값을 자동으로 가리키게 됩니다.

 

Rung 4 : ++L 명령어를 사용해 IR1의 주소값을 하나 증가시킵니다.

 

Rung 5 : FOR 명령어 반복의 마지막을 나타내는 NEXT 명령어입니다.

 

여기서 모두들 왜 IR0는 오토 인크리먼트로 다음 주소값을 가리키면서, IR1은 따로 ++L 명령어를 사용하여 다음 주소값을 가리키냐가 가장 궁금하실 것이라고 생각이 됩니다.

 

래더 프로그램의 특성 상 순차적으로 실행이 되고, 필요없는 부분은 건너뛰기 때문에 ,IR0 ,IR1 모두 꺼져있거나, 리셋 스위치가 켜져 있는 경우에는 출력부인 [OUT ,IR1]이 실행되지 않습니다.

 

출력부 자체가 실행되지 않으므로 오토 인크리먼트를 적용할 경우에는 IR1은 증가하지 않고 IR0만 증가하게 되어 회로가 꼬이게 됩니다.

+ Recent posts