안녕하세요?


이번 포스팅은 이번주 월요일에 있었는 수업의 내용을 모두 포스팅 할 예정이였습니다만, 수업 안에 들어간 내용이 너무 많아서 하는 수 없이 최소한 2 부분으로 나누어야 했습니다. 그래서 이번 포스팅에서는 XCH라고 해서 데이터를 바꾸는 식의 명령을 사용하고, 다음으로는 for, next문을 PLC의 래더에서 구현하는 것을 포스팅 하고자 합니다.



먼저 등장하는 XCH가 나옵니다. 이 명령어는 16비트=1워드 단위로 디바이스 간의 데이터를 바꾸라는 것을 명령합니다. 그래서 아래와 같이 사용을 하게 됩니다.


[XCH D1 D2] -> D1과 D2에 있는 워드를 서로 교환하라.



GT designer에서 위 스크린샷과 같이 한번 준비해 보도록 합니다.



그리고 시뮬레이션을 돌리도록 해 봅니다.



실제로 D1과 D2에 들어가 있는 데이터가 서로 바뀌는 것을 확인할 수 있습니다. 위 스크린샷에서는 25와 20이 서로 바뀌는 것을 볼 수 있었습니다.



XCH가 16비트=1워드 단위로 바꾸었다면, 이번에 나온 SWAP이라는 명령어는 8비트=1바이트 단위로 1개 워드 안에 있는 데이터의 앞뒤를 바꾼다고 합니다. 실제로 이런 것이 나오는 지를 살펴 보도록 하겠습니다.


먼저 GT designer에서 대충 디자인을 하고나서, 다음에는 시뮬레이션을 돌렸습니다.






실제로 바뀌는 것을 볼 수 있었으며, GIF파일로서 제대로 보여 드리겠습니다.



SWAP라는 명령어가 1개 워드 안에서 1바이트 단위로 앞과 뒤가 바뀌어서 마지막에 나오는 값이 달라지는 것을 볼 수 있었습니다.



실제로 SWAP명령어가 어떤 식으로 데이터를 바꾸는 지를 볼 수 있습니다. 복잡하기는 하지만, 간단하게 설명을 하자면, 중간을 잘라서 앞뒤를 바꾼다고 보면 속이 편합니다.


먼저 SWAP라는 명령어를 실행하기 전에 디바이스 안에 저장되어 있는 데이터입니다.



SWAP라는 명령어를 실행시키고 나자, 앞뒤가 바뀌는 것을 볼 수 있습니다.



위 스크린샷에 나있는 SM400으로 나오는 것이 아래에 있는 BCD명령어를 풀어 쓴 것입니다. 우선 시뮬레이션을 작동시켜서 어떻게 움직이는 지를 보여 드리겠습니다.



실제로 BCD명령어를 실행시킨 결과와 같이 나오는 것을 볼 수 있습니다. 옥에 티라면 티라는 것이 제가 어느정도 오타가 나와서 뭐가 제대로 나오지 않았지만, 어쨋든 BCD라는 명령어 하나만 쓰면 되는 것을 이렇게 어렵게 풀어써야 하는 것을 볼 수 있습니다.





그리고 위에 나와있는 매뉴얼에 있는 나눗셈(/)에 대해서 보여주고 있습니다. 일단 [/ k1 k2 d1] 이라고 해서 k1/k2를 나누기 사칙연산을 하고나서, 그 몫을 D1에 저장하겠다는 것입니다. 그리고 D2에서는 특이하게도 아무런 명령을 지정하지 않았지만, 나머지를 D+1이라고 해서 D2에 나머지를 저장하는 시스템이 있습니다. 절대 나머지를 구하는 다른 연산자가 있지 않고, 나눗셈 연산자가 자동으로 지정을 합니다.



실제로 / 연산자를 사용해서 1234라고 하나로 묶어진 값들이 하나하나 짤라지는 것을 볼 수 있습니다.



그리고 XCH 없이 하니 이상한 값이 나오는 것을 볼 수 있습니다. 왜 이러는 지는 모르지만, 아마도 4321이 되는 것을 볼 수 있어 보입니다.




결국 XCH명령어까지 지정하고 나서야 제대로 된 값이 나오는 것을 볼 수 있었습니다.



위 스크린샷은 For Next문의 설명 부분을 가지고 온 것입니다.



그리고 첫번째 과제로서 For문을 참고해서 나누기 연산을 이용, 소수점 4자리까지 표현 되도록 구현하라고 과제인데, 첫 시도는 무언가 무리여서 도저히 잘 안되었습니다.



일단 위 스크린샷에 나오는 것이 정답입니다. 우선 -[FOR K4] 라고 하면 For문을 앞으로 4회 실행 시키라는 명령이 됩니다. 그리고 이 For문은 -[NEXT}까지 자기들 4회를 다 끝나고 나서 래더의 1회 스캔이 끝나기 때문에, For문이 반복실행에 우선권이 있다고 보시면 됩니다.



D10에 7을, D11에 6의 값을 대입에서 제대로 작동이 되는 것인지 한번 보려고 합니다.



먼저 설명을 해야 되는 것이 있는데, For문을 사용하기 위해서는 Z0라고 하는 인덱스가 필요한데, D30Z0의 의미는 다음과 같이 됩니다.


D30 + Z0


그런데 이것은 사칙연산을 한 결과값이 아니라, 번지수가 달라진다는 것을 볼 수 있습니다. 즉 위 스크린샷을 보시면 다음과 같이 구성이 되어 있는 것을 볼 수 있습니다.


제일 먼저 [MOV K1 Z0]라고 해서, Z0를 초기화 시킨다고 볼 수 있습니다. 그래서 For문이 시작하자마자 D30Z0는 D30 + 1이 되어서 D31이라는 디바이스의 번호가 됩니다.


그리고 -[NEXT] 위에 있는 [+ K1 Z0]라는 것을 보면, Z0라는 인덱스의 값이 1에서 +1씩 증가하게 되는데, 결과적으로 D31, D32, D33, D34에 데이터를 저장하게 됩니다.



실제로 D31부터 데이터가 저장이 되는 것을 확인할 수 있었습니다.



GT designer에서 일단 디자인을 하도록 합니다.



시뮬레이션 결과 제대로 뜨는 것을 확인할 수 있었습니다. 일단 급하게 정리를 하기는 했는데, For Next문에 대해서 추가적인 설명이 필요한게 아닌가 하는 생각이 들기도 하는데, 언제 이 밀린 포스팅을 다 하고 나서 새로 PLC의 For Next문을 더 자세하게 정리할 수 있을지는 모르겠습니다.

+ Recent posts

티스토리 툴바