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

CiMon을 이용해서 if문의 사용과, 도표의 사용, 그리고 반복문의 활용

by 인터넷떠돌이 2017. 11. 5.
반응형
DaumEditor Wygiwyg Panel

안녕하세요?


계속해서 PLC 자동제어 수업을 하면서 CiMon이라는 Scada라고 해야 할까요? 일종의 산업 현장에서 쓰이는 기계를 제어하는 프로그램인데, 이것을 가지고 프로그램을 제어하는 수업이 이어지는 중입니다. 이번 포스팅에서는 if문을 사용하는 법을 배웠고, CiMon에서 도표를 이용하는 법도 배웠는데, 그 내용을 포스팅 하고자 합니다.




언제나 그렇지만, 항상 새 프로젝트로 생성해서 작업을 시작하도록 합니다. 이번에는 반복구문을 만드는 법 부터 배우기 위한 프로젝트를 생성합니다.




일단 script1()이라고 이름을 바꾼 다음, 위 스크린샷과 같이 코딩을 하도록 합니다. 먼저 합계 라고 변수를 선언해 준 다음-다른 프로그래밍 언어와는 다르게 CiMonD에서는 비주얼 베이직을 쓰면서도, 한글로 변수이름을 지정할 수 있다고 합니다. for 구문을 사용하도록 합니다.




그리고 나서, 가장 중요한 것이 있습니다. 스크립트를 작성하는 것 보다, 스크립트를 실행시킬 조건을 만드는 것입니다. 우선 사각형 도형을 만들어 주고나서, 여기서 터치를 할 경우 스크립트를 실행하라는 명령식을 적어 주도록 합니다.




우선 위 스크린샷을 보시면, CiMonX 상에서 사각형 박스가 있는 것을 볼 수 있습니다. 이 상자를 누르기만 하면 위에서 작성한 스크립트가 실행이 됩니다.



위에서 MsgBox라는 명령어로 상자를 띄우라고 했더니, 1에서 10의 합계인 55가 뜨는 것을 볼 수 있었습니다.




다음으로는 위 그림과 같이 삽입 이라는 새 스크립트를 만들도록 합니다. 그리고 나서 이번에는 중요하게도 settagval 이라는 함수를 다음과 같이 사용을 하는 것입니다.


settagval "A" & i, i


여기서 "A" & i 는 바로 A라는 문제에다가 i라는 변수를 더하라는 말이 됩니다. 위에 For문에서 i값이 0에서 10까지 반복하라는 의미가 있었으니, 여기서는 A0 부터 A10까지 태그 값에다가 i의 값을 넣으라-즉, 0에서 10까지의 값을 넣어라고 하는 것입니다.



그리고 스크립트를 실행시키기 위해서, 방금전에 script1이라고 적혀 있던 부분을 삽입 이라는 것을 입력 하도록 합니다. 그렇게 하면 이전에 만들었던 사각형 박스에다가 바꾸어서, 작업을 일달락 짓도록 합니다.





그 다음에는 일일히 손으로 A0부터 아날로그로 지정하도록 합니다. 왜냐하면 1을 초과하는 값을 적어야 하기 때문에, 여기서는 디지털이 아니라 아날로그로 지정하는 것입니다.


여기서는 A1부터 A10까지 디지털 태그를 만들어 놓고나서, 스크립트를 실행시킨 결과입니다. 이렇게 해서 10개나 되는 태그에 일일히 값을 수작업으로 입력할 필요는 없고, 자동으로 채워지는 것을 볼 수 있습니다. 그런데 이런 것이 100개, 1000개를 넘어가면 상당히 애먹는 상황이 되는데, 이런 경우 태그를 일일히 작성하는 것이 아니라 엑셀파일 중요 csv파일을 이용해서 불러오는 것을 사용한다고 합니다.



이번에는 A1에서 부터 A10까지의 태그값에 2의 배수로 값을 넣는 것을 했는데, 하는 법은 간단했습니다. 들어가야 하는 i값에다가 2를 곱하기만 하면 되었는데, 위 스크린샷을 자세히 보시면 무언가 오류가 있습니다.




오류를 수정해서 새로이 삽입2 라는 스크립트를 작성하도록 했습니다.


CiMonX에서 스크립트를 실행시켰고, 다음에는 태그값을 보았 습니다. 제 의도대로 태그의 값이 바뀌는 것을 확인할 수 있었습니다.


다음에는 삽입3 라는 스크립트를 작성해서 이번에는 홀수일 경우에는 태그값을 1, 그리고 짝수일 경우 0을 입력하도록 합니다. 여기서 사용이 되는 연산식이 Mod라는 것입니다. 이 값은 나눗셈을 해서 나머지를 구하라는 연산자인데, i Mod 2 라고 해서 2로 나눈 나머지를 구하기만 하면 됩니다.




실행을 시키기 위해서 아까전에 만들어 놓은 사각형 박스에서 이번에는 삽입3 라는 스크립트의 이름을 입력해 놓아서 방금 작성한 스크립트가 작동할 수 있도록 합니다.




에러가 났길래 무엇이 문제인가 했더니, i라는 변수이름을 쓰고나서 Mod를 바로 붙이면, iMod라고 이상한 문자열이 되어서 비주얼 베이직에서 아무 의미가 없습니다. 그래서 이런 경우에는 i Mod 2라고 해서 i자와 Mod를 띄워야 합니다.




CiMonX에서 스크립트를 실행시키고 나서, 태그값을 살펴본 결과 다음과 같다는 것을 알 수 있었습니다. 이것으로 제 의도대로 나왔는 것을 알 수 있었으며, 다음의 작업을 하러 가도록 합니다.



라이브러리를 눌러서 윈도우 컨트롤 화면에서 위 스크린샷과 같이 도표를 가져올 수 있습니다. 이렇게 도표를 가져온 다음 더블클릭하면, 위 스크린샷에서 볼 수 있는 것과 같은 화면을 띄워서 도표의 상세한 사항을 설정할 수 있습니다.




다음은 표 라는 스크립트를 작성해서, 여기서는 wdgridsetdata 라는 함수를 준비 하도록 합니다. 이 함수는 다음과 같이 사용을 할 수 있습니다.


wcgridsetdatqa "도표이름", X좌표, Y좌표, 입력할 값


이렇게 하면, 스크립트가 실행이 될때, 지정한 도표의 좌표에다가 입력할 값을 집어넣게 됩니다. 그런데 특이하게도 0,0 좌표가 바로 제일 좌측 상단이라는 것입니다.




역시나 실행을 위해서 만들어 둔 사각형 도형을 건드리면, 이번에는 표 라는 스크립트가 작동하도록 바꾸도록 합니다.




오타가 나서 다시 바꾸도록 했습니다. 원래는 C가 들어가야 하는데, 실수로 D가 들어간 것이였습니다.




CiMonX에서 제대로 실행이 되는 것을 보면서, 완성을 한 것을 볼 수 있었습니다. 이렇게 해서, 하나 완성하는 데 성공했습니다.




다음으로는 X축으로-옆으로 이어지면서 1에서 부터 4의 값을 입력하는 것을 하도록 도표를 입력하도록 합니다. for문을 사용하며, 여기서는 X좌표에 해당하는 자리에다가 i 값을 주어서 변하도록 하는 것이 핵심이라고 할 수 있습니다.




그렇게 해서, 제대로 값이 변하는 것을 확인할 수 있었습니다.




이번에는 조금은 복잡해 보일 수도 있지만, 생각해 보면 간단합니다. 일단 도표의 X축과 Y축이 모두 변해야 하는 것을 전제로 해서 스크립트를 짜야 하는데, 이 경우를 위해서 for문을 2개 겹치도록 이라고 해야 할까요? for문 안에 for 문이 있도록 했습니다.


for 조건1

  for 조건2

   wcgridsetdata ~~~~~~

  next 조건2의 변수

next 조건1의 변수



제 의도대로 제대로 도표의 값이 채워지는 것을 볼 수 있었습니다. 이렇게 해서 도표에 임의의 값을 지정해서 넣는 것은 할 수 있었는데, 이번에는 도표에 '태그'의 값을 집어 넣을 수 있는지에 대해서 실습을 하고자 합니다.




일단 위에서 나와 있는 것처럼 만들어서 스크립트를 실행시켜 보았습니다.



실행을 위한 준비도 마쳤지만........




태그값이 나오라고 했지, 변수의 이름이 나오라고 한 것은 아닌데, 이렇게 나오게 되었습니다. 이렇게 1차 시도는 실패 했습니다.




정답부터 이야기를 하자면, 임의로 입력할 값에다가 태그의 값을 가지고 오는 함수를 집어넣는 것이 정답이라고 할 수 있었습니다. 


wcgridsetdata "도표이름" ,X좌표,Y좌표, gettagval("태그이름")


이렇게 하면 태그의 값으 가지고 올 수 있습니다. 그런데 여기서는 1개의 태그 값만 가지고 오는 것이 아니라는 것이 문제라면 문제입니다. 그래서 이런 경우에는 위에서 보았던 것의 변형을 시도하였습니다.


"A"&for문의 변수


이렇게 지정을 하는 식으로 해서 반복문이 반복될 때 마다 변수의 값도 바뀌고, 그 값을 따라서 태그가 A1, A2..... 이런 식으로 변형이 되는 것을 볼 수 있는 것입니다.


CiMonX에서 스크립트를 실행 시키자, 기본적으로 태그가 가지고 있는 0이라는 값만이 나오는 것을 볼 수 있었습니다. 그래서 여기서 태그의 값을 임의로 변형 시켜서 제대로 작동하는 지를 알아 보고자 합니다.



태그값 변경에 들어가도록 합니다.


A1의 태그값을 100이라고 수정했더니 제대로 변형된 것이 반영되는 것을 확인할 수 있었습니다.



이제 새로운 프로젝트를 생성해서 새로운 것을 실습해 볼 시간이 되었습니다.


여기서 해볼 것은 위에 있는 로봇팔이 우측으로 뻗어서 나온 다음에, 아래로 내려가고, 집게가 회전을 해서 물건을 잡는 동작을 일차적으로 완성을 시켜야 합니다.


여기서 사용해야 할 태그는 총 7개가 되는데 이중에 한개는 자동이라고 하는 스크립트를 작동시키는 데 사용이 된다고 해야 할까요? 자동으로 움직이는 데 관계가 된 것입니다.



다음은 일련의 로봇팔의 일부가 움직이는 것을 보여줍니다. 수직이동과 수평이동을 동시에 준 이유는 수직으로 옆으로 뻗어 나오기도 해야 하고, 그리고 나서 아래로 내려가는 액션도 CiMonD상에서 보여줘야 하기 때문에 이런 속성을 부여하는 것입니다.


그리고 다음은 사용자 버튼이라고 해서, 사각형 박스말고, CiMonD상에서 따로 버튼이 있습니다. 이것을 눌러서 실행시키는데, 여기다가 토글이라는 것을 체크해 두면, 자동으로 토글 스위치가 된다고 합니다.


다음에는 인형뽑기 팔을 전체적으로 오른쪽으로 움직이게 할 수 있도록 하는 스크립트를 제작하도록 합니다. 그리고 나서 문제는 이렇게 버튼을 지정하면, 어떻게 스크립트를 실행시킬 수 있느냐 하는 것인데.....


이렇게 디지털 태그가 태그값이 바뀔 경우에 태그동작을 지정하면 간단하게 해결되는 문제이기는 합니다. 이렇게만 해 놓으면 버튼을 눌러서 버튼1의 값이 0에서 1로 바뀌든, 1에서 0으로 바뀌든 간에 스크립트는 실행이 되는 것입니다.


사소하긴 하지만, 일단 if문을 사용할 때 다음과 같은 규칙을 지켜야만 합니다. 우선 한줄안에 끝이 나도록 하기 위해서는 다음과 같이 사용해야 합니다.


if 조건문 then 실행문 : 실행문2 : 실행문3


그러나 문제는 한번이라도 엔터키를 쳐서, 줄을 바꾸었다면, 아래와 같이 무조건 형식을 지켜야만 합니다. end if만이 아니라 then다음에 오는 실행문도 반드시 then뒤가 아니라 줄을 바꾸어야만 합니다.


if 조건문 then

실행문1

실행문2

실행문3

else

실행문4

end if


여기서 else가 뭐냐고 하실 분도 있으실 건데요, 간단합니다. if 뒤에 오는 조건문에 걸리지 않는 모든 경우에 한해서 아래의 실행문4를 실행 시키라는 의미가 되는 것입니다.


하지만 이래저래 제대로 로봇팔이 뻗어지지 않아서 애를 먹는 상황이 많이 발생을 하였습니다. 분명히 while문을 사용하는 것이 맞는데도, 무언가 제대로 되지를 않는 상황이 벌어지는 것입니다.


알고보니, while 문 안에다가 gettagval 함수를 주어서, 지속적으로 아날로그 태그의 값을 모니터링 해야 할 필요성이 있었는 것입니다. 즉, 반복문의 안에다가 settagval과 gettagval을 주어서 먼저 태그의 값을 가져오고, 증가 시키거나 감소시키고, 그걸 다시 쓰고나서, 또 가져오는 것을 반복해야 하는 것이였습니다.


반복문의 밖에다가 gettagval을 주면, 스크립트가 실행이 될 때 딱 한번만 태그의 값을 가져오고는, 더 이상은 태그의 값을 읽으려 하지를 않는데, 이 때문에 계속해서 만족스럽게 뭐가 일이 되지를 않았던 것이였습니다.


이제서야 만족스럽게 로봇팔이 뻗어는 나오는데, 문제는 너무 한번에 최대치로 순식간에 뻗어 나온다는 문제가 발생하였습니다. 그래서 이런 경우에는 하는 일단 sleep 함수를 사용하도록 하였습니다.


200이라고 입력해서 0.2초간 정지를 하도록 하였습니다. 이번에는 부드럽게 로봇팔이 오른쪽으로 뻗어 나오는 것을 볼 수 있었습니다.



이번에는 두번째 버튼의 태그동작을 정의해서, 아래로 로봇팔이 내려오는 실린더를 지정하도록 하였습니다.



여기서 부터는 상대적으로 쉽기는 했습니다. 우선은 위에서 만들어 둔 스크립트에서 이름과 중간에 들어가 있는 태그만 바꾸어 주기만 하면, 나머지는 알아서 되었습니다.



마지막으로 집게가 물체를 집는 동작을 하도록 하는 동작에서도 태그의 이름이나, 스크립트의 이름을 조금만 변형시켜 주기만 하면 다 해결이 되기는 되었습니다.



그리고 태그에서도 마찬가지로 태그 동작을 지정해 주도록 합니다.


그래픽상으로 조금은 어색한 것이 나오기는 했지만, 그래도 일단 작동을 하는 것은 확인하기는 했기에, 본질적으로 중요한 것은 해결이 되었다는 생각이 들었습니다. 그래서 이번에는 그래픽 적인 것은 그냥 넘어 가기로 했습니다.


다음으로는 자동으로 로봇팔을 움직이게 하는 스크립트인데, 일단 스크립트의 안에서 다른 스크립트를 실행 시킬 수 있다는 것을 알아 주었으면 합니다. 이렇게 해서 다른 스크립트 3개를 미리미리 실행 시키고 나서, 버튼에 관계된 태그의 값만 바꾼다음 로봇팔이 움직일 동안의 시간만 주면 되기는 되는 것입니다. 의외로 자동으로 움직이는 스크립트를 짜는 것은 간단했습니다.

그리고 이번에도 자동이라는 스크립트를 작동 시키기 위한 것은 간단하게도, 자동이라는 태그의 값이 변동될 때 태그 동작이 작동하도록 지정하기만 하면 되었습니다.


너무 빠르다는 느낌이 들어서 한번 sleep에 들어가는 시간을 더 늘려 보기도 하였고, 이래저래 시행착오를 여러번 겪기는 겪어 보았습니다만, 일단은 하나하나 완성이 되어 갔으며


최종 적으로 자동으로 움직이는 것 까지 완성 시키는 데 성공을 하였습니다. 이렇게 해서 지난주 화요일에 했던 수업이라고 해야 할까요? 잠시 감기 몸살로 어떻게 정리하는 게 늦기는 했지만, 그래도 정리를 하기는 하는데 성공을 하였습니다.

반응형