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

워드 데이터와 비트 연산, 그리고 While문 활용의 한 예시

by 인터넷떠돌이 2017. 11. 14.
반응형

안녕하세요?


어제는 수업내내 CAD를 이용해서 회로 도면만 그렸기 때문에 따로 포스팅을 할만한 내용이 없었습니다만, 오늘은 내용이 많아서 수업의 내용을 2개의 파트로 나누어야 했습니다. 일단 첫 파트는 DAQ라는 장비를 이용해서 데이터 수집장비를 이용하는 경우가 있다고 합니다. 그런데 DAQ에서는 CiMon으로 워드 데이터라는 것이 오게 됩니다. 그리고 이 워드 데이터를 비트 데이터로 바꾸어야 하는 일이 있는데, 먼저 하는 과제는 이를 위해서 변환하는 과제입니다.



먼저 새로운 프로젝트를 생성 하도록 합니다.



일단 태그를 만드는데, DAQ에서는 아날로그 데이터가 오기 문에 이에 대한 아날로그 태그를 하나 만들도록 합니다. 그리고 비트 데이터로 처리하기 위해서 16개의 태그를 만들도록 합니다.




그리고 이번에는 워드 데이터를 비트로 변환하는 스크립트를 작성하도록 합니다. 여기서는 format이라는 함수가 나오는 것을 볼 수 있는데, 이 format은 다음과 같은 식으로 사용을 할 수 있습니다.


format(a,b)


a라는 것은 b라는 형식을 따라서 만들어라 하는 의미가 됩니다. 여기서는 "00"이라고 했으니, 01, 02, 03.... 이런 식으로 나오게 되는 것입니다.



이번에는 비트 데이터를 계산하는 방법입니다. 일단 비주얼 베이직에서는 듣자니 비트 데이터를 그대로 계산할 수 없습니다. 그래서 곱하기와 나누기를 하고서, 이런 식으로 계산을 한다고 합니다. 일단 이번 시간에서는 비트 연산에 대해서 깊이는 들어가지는 않았지만, 여기서는 AND라고 해서 +나 -연산이 아니라는 것에 주의를 해야 하니다.


즉, 우리가 익히 알고 있는 대로 AND라면 A와 B 둘다 1일 때 1이라는 값이 나오고, 그 외에는 모두 0이라는 값이 나온다는 것을 명심해야 한다는 것입니다.



다음으로는 아날로그 태그에 태그동작을 지정해서 워드 데이터를 비트 데이터로 바꾸어 주는 스크립트를 실행 시키도록 합니다. 



다음이 일일히 노가다 이기는 했지만 16개나 되는 디지털 태그에 태그동작을 지정 하고서, 여기다가 비트 데이터를 워드 데이터로 바꾸어 주는 스크립트가 실행되도록 지정을 합니다.



맨 처음에 모두 지정을 하고 CiMonX에서 실행을 해 보았습니다만, 스크립트에서 에러가 났다고 하면서 실행이 되지 않았습니다. 왜 그런가 하고 스크립트를 잘 보니....



오타로 인한 휴먼에러가 하나 났었던 것이였습니다.


 

이제서야 제대로 의도대로 작동하는 것을 볼 수 있었습니다. 아직까지는 이 비트라는 것과 워드라는 데이터가 매우 멀게만 느껴지는 중입니다만, 아두이노 보드를 볼때, 아마도 출력하는 핀과 이런 것을 연동하는 데, 이 워드 데이터를 비트 데이터로 바꾸어 주는 것이 연동되지 않을까 하는 생각이 듭니다.




이제 새로운 프로젝트로 뭐라고 해야 할까요? 저는 세차장이라고 했는데, 일단 차량이 컨베이어 밸트를 따라서 움직이다가, 세차터널이라고 해야 할까요? 여기 입구의 문이 열리면 들어가서 잠시 멈추고, 다시 나가는 출구가 열리고 나간 다음 출구의 문을 닫는 것을 구현해 보는 것입니다.



디자인 까지는 큰 문제가 없기는 없었습니다. 일단 차량은 라이브러리에 있는 운송이라는 항목에서 가져왔고, 컨베이어 밸트 역시 라이브러리에 있는 베이어 밸트 항목에서 가져왔습니다. 다소 헤메었던 부분은 컨베이어 밸트의 바퀴를 구성하는 것을 회전시키기 위해서, 여러번 그룹해제를 해야만 한다는 것을 몰라서 좀 헤메이기는 했습니다.



일단 태그는 아날로그 태그 3개에 디지털 태그가 2개 사용되었습니다. 그리고 여기서서 아날로그 태그는 각각 차량과 입구와 출구를 여닫는 용도로 쓰이며, 디지털 태그는 전체적인 운전과 컨베이어 밸트의 작동여부에 사용이 되었습니다.



먼저 스크립트입니다. main이라는 스크립트는 CiMonX가 처음 시작할 때 실행이 되는데, 이때 runscript를 이용해서 While문으로 계속 반복이 되는 스크립트를 작동시키도록 하는 것입니다. 




여기서 중요한 것은 하나인데, while문이 시작하기 전에 일단 아날로그 태그의 값을 변화시키기 위해서 사용하기 위한 변수는 while이 시작하기 바로 전에 선언을 하도록 합니다. 물론 처음부터 의도하지도 않게 아날로그 태그의 값이 변하는 것을 막기 위해서 0이라고 선언을 해야 합니다. 그렇지 않고 while아래에 변수=0 이라고 선언하면, 아무리 if문에서 변수의 값을 +로 바꾸어도 도로 0이 되어 버리고 맙니다.


변수1=0


while1

변수2=gettagval ("아날로그 태그의 이름")

if구문들

변수2=변수2+변수1

settagval "아날로그 태그의 이름",변수2

sleep(100)

wend


이런 형태로 코딩을 하여서, 하는 것이 기본이라고 할 수 있습니다. 이래저래 이것으로 오전에 했던 수업의 내용은 다 포스팅을 했는데, 조금은 어려운 내용을 조만간에 포스팅에서 올리도록 해 보겠습니다.

반응형