본문 바로가기
PLC 자동제어 학습/LS산전 PLC 수업

LS산전 PLC를 가지고 했던 MOV명령어와 메모리에 관한 실습

by 인터넷떠돌이 2018. 1. 7.
반응형

안녕하세요?


이번 포스팅에서는 목요일에 있었던 LS산전 PLC를 가지고서 디바이스 메모리에 관련된 영역을 가지고서 실습을 하였고 그 내용을 포스팅하고자 합니다. 



먼저 언급해야 하는 사항으로는, 모든 컴퓨터가 그렇지만, PLC도 일종의 컴퓨터처럼 데이터가 입력이 되면, 이를 2진수의 코드로 바꾸어서 저장을 한다는 것입니다. 이를 의식해서 항상 생각을 해야만 합니다.



그렇게 먼저 4라는 값을 MOV명령어를 이용해서 P2라는 디바이스에 집어 넣도록 하는 것입니다. 여기서 중요한 것은 MOV명령어에 지정이 된 디바이스 P2라는 것은 '비트'가 아니라 '워드'를 의미한다는 것입니다.



실제로 PLC 디바이스 모니터를 보면, 위 스크린샷과 같이 여러개의 0이 표시되어 있는 것을 볼 수 있는데, MOV 명령어를 먼저 실행해 보도록 하겠습니다.



위에서 보면 P2라는 워드안에 4라는 값이 저장되어 있는 것을 볼 수 있습니다.



이 값을 2진수로 바꾸어 보면, 위 스크린샷과 같이 워드단위에는 4라는 온전한 값인지는 모르지만, 그 안에는 2진수로 0과 1이 바뀌는 것을 볼 수 있습니다.



위 그림에서 표현을 하자면, MOV에서 지정을 한 것은 P0라는 워드입니다. 이 워드 안에는 2진수로 표현하면 16개의 0이 들어있는 형태입니다. 그걸 위 그림에서는 '불이 안 켜진 전구'로 표현을 했습니다. 그럼 여기서 비트는 어디 갔느냐고 하실 건데, 바로 비트가 '전구 한개'입니다.




그래서 어떤 숫자가 들어오든 간에, 일단 들어오는 숫자는 '워드 단위'로 저장이 되고, 그 데이터는 2진수로 변환이 되어서, 각각의 비트를 ON시키게 됩니다. 지금까지는 스위치를 켜고 끄는 상황에서는 '비트단위'로 충분했지만, 여러개의 스위치를 다루게 되면 이제 이런 워드 단위를 다루어야 합니다.



그리고 헷갈리기 쉬운것이, 이 비트의 주소입니다. 예를 들어서 P20이라는 워드 안에 들어간 비트 하나를 지정하고 싶으면 'P20 + n'이라고 해서 'P20바로 뒤에 덧셈이 아니라'그냥 숫자가 붙는 형대가 됩니다.



그래서 P2라는 워드안에 들어가 있는 비트를 모두 ON 시키고 싶으면 최대값을 입력하면 됩니다. 즉, 워드가 수용할 수 있는 최대값을 입력하면 된다는 것입니다.



실수로 값을 초과했는데, 최대값을 65535라고 합니다. 지금 생각해보면 그냥 사칙연산으로 저 최대값에 도달을 할 수 있을지 의문이기는 합니다.



일단 최대값이 입력이 되어서, P2라는 워드안에 있는 모든 비트의 값이 전부 ON=1이 된 것을 볼 수 있었습니다.



이제 2진수로 숫자를 어떻게 바꾸냐 하는 문제가 남았는데, 이 문제는 간단하게도, 윈도에서 기본적으로 제공해 주는 계산기에 있는 프로그래머용 이라는 것에 들어가면 해결이 될 수 있었습니다.




위에서처럼 워드의 최대값도 문제없이 구할 수 있는데, 문제는 하다보면 특정 비트만을 켜야하는 경우가 생깁니다. 이럴 경우 2진수를 일일히 계산해서 10진수로 변경할 게 아니라, 계산기에서 Bin을 클릭해서 2진수로 입력을 하고, Dec를 눌러 10진수로 변환하면 간단히 해결이 됩니다.



그래서 이번에는 16개나 되는 램프를 건드려야 하는 과제인데, 이런 것을 예전이라면 출력을 16개 만들어서 래더상에서 16줄이 발생했을 가능성이 굉장히 높습니다.



그러나 이렇게 특정한 조건이 될 때, 래더에서 특정한 값을 MOV명령어를 사용해서 입력하면 이를 간단하게 해결할 수 있었습니다. 이제 그 결과가 제대로 나오는 지를 확인해 보아야 합니다.



우선 제대로 각각의 램프가 각각의 P2라는 워드 안에 들어간 비트와 연동이 되어 있는지를 확인해야 합니다.



시뮬레이션을 돌리도록 합니다.



제대로 일련의 동작이 되는 것을 확인할 수 있었습니다. 문제는 0이 짝수인지 홀수인지 몰라서, 일단 빼 놓았다는 것이 있기는 했습니다.



이제 두번째 과제를 할 때가 왔습니다. 이 과제에서는 첳ㅅ번째로 스위치를 눌렀다가 뗄때는 아무런 일이 일어나지 않다가, 두번째 부터는 P20이 켜지고, 세번째 누르면 P21이 켜지고 난 다음에 P20이 1초 뒤에 꺼집니다. 그리고 네번째로 버튼을 눌렀다가 떼면 P22가 켜지고 P21이 1초 뒤에 꺼집니다.




다섯번째로 버튼을 눌렀다가 떼면, 이번에는 P20이 켜지고, P22가 1초 뒤에 꺼지도록 해서, 계속 반복이 되면 OK이 인 과제입니다. 먼저 위 스크린샷처럼 래더를 작성하도록 했습니다.



그리고 나서 XB builder에서도 버튼을 눌렀을 때에만 ON이 되도록 지정을 하도록 합니다.



그리고 이번에도 제 의도대로 작동을 하는 것을 확인할 수 있었습니다.



이제 세번째 과제에 들어간 상황입니다. 과제의 내용은 단순했으나 수행은 어려웠는데, 내용은 일단 플릭커 회로라고 점멸을 하는 회로가 있는데, 이걸 원래는 타이머가 2개 들어갑니다. 이걸 타이머 한개만으로 구현하는 것이라고 합니다. 일단 위 스크린샷의 래더처럼 시도를 했을 때, 오류가 생긴게, D로 시작하는 디바이스로는 A나 B접점을 만들 수 없어서, 하는 수 없이 P로 바꾸어야 했습니다.



그리고 정답인 회로입니다. 여기서 핵심이 되는 것은 FF라고 적혀진 이 플립플롭회로입니다. 그런데 여기서는 그냥 FF라고 지정이 되어 있지만, 이를 풀어서 쓰면 아래와 같이 됩니다.



위 스크린샷에서 붉은색 박스안의 내용이 FF M1을 풀어쓴 내용이고, 특히 처음보는 -(P)- 라는 것이 있는데, 이게 바로 양변환 검출 코일이라고 해서, 0에서 1로 변하는 것을 감지하는 코일이라고 합니다. 즉, 이게 바로 FF m1을 풀어쓰는데 가장 핵심이 되는 파트라고 할 수 있습니다.



그렇게 해서 제대로 작동을 하는 것을 마지막으로 확인을 할 수 있었습니다. 조금은 어렵기는 하지만, 단 한줄로 16개나 되는 램프를 켜고 끄는 것을 생각해 보면, 이는 가볍게 넘겨서는 안되겠다는 생각이 듭니다.

반응형