본문 바로가기
PLC 자동제어 학습/CiMon Scada 수업

CiMon을 이용한 모터를 제어하는 제어판을 만드는 작업

by 인터넷떠돌이 2017. 10. 13.
반응형

안녕하세요?


이래저래 PLC 자동제어 시스템을 구축하고 제어하는 방법에 대해서 배우고는 있는데, 일단 이래저래 배우는 속도랑 포스팅을 올리는 속도랑 차이가 나기는 납니다. 그래도 최대한 따라 잡기는 해야 하기에, 이번 포스팅을 올리고자 합니다. 이번 포스팅에서는 CiMonD라는 디자인 툴로 어떻게 모터의 회전을 표현하며, 이를 가지고서 버튼을 누르면 정방향으로 회전을 하다가 역방향으로 가는 버튼을 누르면 역방향으로 회전을 하도록 디자인을 할 것입니다.



먼저 정지한 모터의 회전판을 그리도록 합니다. 이번 모터의 회전판을 그리는 데 있어서 가장 중요한 것은 회전판이 3개라는 것입니다. 정회전을 하는 회전운동을 하는 회전판 1개, 역회전을 하는 회전판 1개, 그리고 정지해 있는 회전판 1개! 위 스크린샷은 정지된 회전판이 출몰하는 조건을 '태그'항목에다가 조건식을 써서 나타낸 것입니다.



위 그림을 보시다 시피 && 연산자를 이용하면, 양쪽 수식이 모두 참인 경우에는 1이라고 하고, 그 빡에는 0을 나타낸다고 합니다. 저는 처음에는 이 &&를 사용해서 잘 될것으로 생각했지만, 결과는 그렇지 않았습니다. 일단 위 도표를 보시면, 양쪽 수식이 모두 참이라는 1인 경우에만 1이 되고, 저는 출연 조건을 OFF라고 해서 0으로 두었습니다.




그런데 이렇게 하면, 정지된 화면으로 나오기는 하지만, 정지된 회전판이 정회전이나 역회전을 하고 있을 때는 계속해서 나타난다는 단점이 있습니다. 이래서야 곤란하기는 곤란하기에, 하는 수 없이 아래의 스크린샷처럼 태그의 연산자를 바꾸도록 했습니다.



이렇게 바꾸면, 이제는 양쪽 수식이 모두 0인 경우에만 0이 나온다고 합니다. 그리고 출몰조건은 OFF인 0으로 지정을 했으므로, 이렇게 하면 양쪽 수식이라는 '정방향으로 움직이라는 태그'와 '역방향으로 움직이라는 태그' 모두가 OFF인 상태-즉 모터를 정지하라는 제어명령이 떨어진 상태가 되어야 한다는 것입니다. 이렇게 해서 제 의도대로 정지하라는 명령어가 떨어질 때만 정지하는 회전판이 나올 수 있게 되었습니다.



다음은 위에서 설명한 대로 회전판이 3개인데, 정회전과 역회전을 구현하도록 합니다. 이 방법은 의외로 간단한 것이, 우선 그림의 설정으로 들어가서, 출몰 조건에 각자의 회전판이 회전하라는 태그가 ON이 되면 출몰하도록 설정하면 되는 것입니다. 그리고 '회전'항목으로 들어가서 제 경우에는 정방향은 시계방향, 역방향은 반시계방향으로 설정해 두었습니다.




다만 여기서 하나 문제가 되는 것이 정회전 버튼을 누른 다음, 역회전 버튼을 누르면, 2개의 회전판이 동시에 켜지는 문제점이 있었습니다. 그래서 여기서는 위 스크린샷에 보시면 버튼에 해당하는 사각형이 있습니다. 여기 버튼을 눌러서 '터치'라는 항목이 있는데, 명령식에 다음과 같이 정의하면 됩니다.


정회전 버튼을 누르면 실행되는 명령식

정회전의 태그=1

역회전의 태그=0


역회전 버튼을 누르면 실행되는 명령식

역회전의 태그=1

정회전의 태그=0


이런 식으로 지정하면, 정회전 버튼을 누르면 역회전의 태그는 0이 되어서 그대로 역회전의 회전판은 스톱되며, 사라집니다. 그리고 반대의 경우에는 정회전의 회전판이 멈추고 사라집니다. 이 부분은 어느정도 유니티5를 하면서 배웠는 C#의 프로그래밍과 유사성이 있는 부분으로 보입니다.


그런데 이러면 하나 문제가 있습니다. 모터의 경우 정회전을 하다가 갑자기 역회전을 하라는 명령을 걸어버리면 모터에 과부하라고 해야 할까요? 위험한 상황이 발생할 수 있다고 합니다. 그래서 이 경우에는 무조건 '정지'하라는 명령을 내리고 나서야 다시 모터가 회전을 하도록 만들어야 합니다.



위 스크린샷에 올라온 것처럼 다양한 시도를 하였지만, 특별하게 의미있는 결과를 얻을 수 없었습니다. 몇번을 CiMonD에서 디자인을 하고 실행을 하는 CiMonX에서 실행을 하였지만, 그때 다마 실패를 맛 봐야 했습니다.



정답부터 이야기를 하자면, 위 스크린샷에 나오는 것처럼 시계방향회전태그=(반시계방향회전태그==0) 이런 식으로 명령식을 짜야만 하는 것이였습니다. ==는 프로그래밍에서 같다는 의미를 담고 있는데, 당연히 반시계방향으로 움직이라는 태그가 OFF라서 0이면 ( ) 안의 값은 1이 됩니다. 이 경우에는 if문을 전혀 쓰지 않고도 이렇게 조건에만 반응을 할 수 있는 경우를 만들 수 있다는 것이 정말 놀라웠습니다.




그럼 반시계 방향의 경우는 어떻게 하느냐고 하실 건데요, 이 역시 정회전에서 태그만 바꾸면 간단하게 해결 할 수 있는 문제이기는 합니다. 반시계방향회전태그=(시계방향회전태그==0) 이렇게 명령식을 설정하면, 이 경우에는 정회전인 시계뱡향으로 움직이는 것이 ON인지 OFF인지를 따지는 명령식이 완성이 되며, ( )의 값은 시계방향회전을 하라는 디지털 태그의 값이 0일 경우에 1이 되어서 반시계방향회전태그를 ON시킬 수 있는 것입니다. 이처럼 저는 IF문을 쓸 생각만 했는데, 그냥 비교 연산자를 가지고서도 강력하게 명령을 내릴 수 있다는 점은 신선한 충격이었습니다.

반응형