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

CiMon Scada를 이용해서 select switch문 연습과, 이벤트 보고서 만들기

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

안녕하세요?


이번 포스팅은 화요일에 있었던 CiMon Scada를 이용해서 자동문을 구현하는 작업을 하였고, 그 다음에는 이벤트 보고서라고 해서, 일이 벌어지면 CiMon내에서 벌어진 일을 기록하는 것을 포스팅 하고자 합니다.



일단 새 프로젝트를 만들어 주도록 합니다.



그리고 나서, 일련의 디자인 작업을 하도록 합니다.



그리고 다음으로는 태그를 3개 만들도록 합니다.



다음으로는 제 경우에는 아날로그 태그의 값이 변경될 때 마다 스크립트를 실행하도록 설정합니다.



일차적으로 사람이 접근하면 자동문이 열리는 것은 확인을 할 수 있었습니다.



스크립트는 일단 저는 위와 같이 짜는데 성공했습니다. 사람이 일정 범위 이상 접근하면 센서라는 태그가 켜지게 하고.



그리고 main이라는 함수로는 doorcontrol을 실행 시키도록 합니다.



그래서 센서의 태그값을 가져오기로 한 다음에 그에 따라, 증가하고 감소하는 것을 설정합니다. 즉, 변수 하나가 문이 열리는 경우에는 증가하도록 하고, 문이 닫히는 경우에는 감소하도록 설정합니다.



그런데 여기서, 자동문이 닫힐 때, 잠시 멈춰야 하는 것이 있어서, 제 경우에는 위와 같이 문의 값이 최대이고, 센서가 꺼졌을 때, 잠시 정지하라고 sleep명령을 주었습니다.



그리고 다음으로는 CiMonX에서 어떻게 하면 외부의 프로그램을 실행 시킬 수 있는지에 대해서 실습을 해 보았습니다. 의외로 간단하다면 간단한 것이, 일단 버튼에서 명령식을 하도록 하고, 여기다가 다음과 같은 명령식만 입력하면 되었습니다.




runapp("실행하고자 하는 프로그램의 실행파일이 있는 경로","")



다음으로는 윈도 탐색기를 여는데, 원하는 위치의 폴더를 여는 방법에 대해서 하는 것입니다. runapp("윈도 탐색기가 있는 경로","열고자 하는 폴더가 있는 경로")



일단 CiMonX를 종료시키는 버튼을 만들고자 하면, exit() 라는 명령식만 쓰면 되지만, 아예 컴퓨터 자체를 종료 시킬 명령식을 쓰자면, 우선 bat라고 배치 파일을 만들도록 합니다.



그리고 runapp이라는 명령식을 써서, 배치파일이 있는 경로를 지정 하도록 합니다.



메모장에서는 위와 같이 명령식을 입력하면, 즉시 컴퓨터를 다시 시작하라는 의미가 됩니다. 그리고 실제로 실행을 해 보았을 때, 제대로 다시 시작을 하는 것을 확인할 수 있었습니다.



다음으로는 새 프로젝트를 생성해서, 이벤트 보고서에 대해서 실습을 하도록 합니다.



먼저 main에서 while문으로 반복하는 함수를 만들어서, ana1과 ana2라는 아날로그 태그의 값을 0~100까지 랜덤으로 지정하는 함수를 만들고자 합니다. 물론 간격은 0.5초 간격입니다.



태그는 디지털 태그1개를 포함해서, 3개를 만들었는데, 스위치의 움직임에 반응해서, 보고서가 작성이 되도록 합니다.



여기서 중요한 것은 보고서용 데이터 생성이라는 항목을 체크해야만 합니다. 그래야 나중에 보고서를 작성할 수 있습니다.




다른 태그도 지정을 하도록 합니다.



다음은 도구라는 항목에 있는 이벤트 보고서라는 것을 불러 오도록 합니다.



여기서 보고서 모델 이름이라는 것을 지정하도록 하고, 시작 조건으로 보고서를 언제 작성하기 시작하고, 어떤 조건에서 보고서를 출력하는 지를 지정할 수 있습니다.



우선 새로 만들기를 이용해서 보고서 양식 이라는 xlsx라는 파일 형식으로 하나 만들도록 합니다.



그리고 여기서는 위 스크린샷과 같이 보고서 양식을 만들어 주도록 합니다.



위 스크린샷을 보시면, 보고서 양식 밑에 양식파일이라는 것이 있습니다. 여기에 방금 만들어 준 경로를 입력하고, SW라는 태그가 1로 켜지면, 보고서를 작성하기 시작하며, 0으로 꺼지면 출력시키기로 합니다.



다음은 태그 등록이라는 것을 실행 하도록 합니다. 여기서 어떤 태그를 지정하며, 엑셀파일의 어느 셀에서 부터 저장을 시작할 것ㅎ인지를 지정할 수 있습니다.



우선 시간을 기록해야 겠으니, timestr(42)라는 것을 지정하도록 합니다. 일단 저로서는 이 명령식이 정확하게 무슨 내용인지는 알 수 없지만, 그래도 초 단위의 중요한 데이터를 저장한다는 것을 알 수 있었습니다.



시각적으로 데이터가 나오는 것을 알기 위해서, 일단 경향감시를 불러 오도록 합니다.



5초 간격으로 지정합니다.



일단 위에서 처럼, 시각적으로 데이터가 모인다는 것을 볼 수 있도록 디자인을 하도록 합니다.



버튼을 눌러서 스위치를 누르면 기록을 시작하고, 다시 stop을 시키면, 보고서가 출력되는 형식입니다.



일단 제대로 엑셀파일이 지정된 폴더에서 생성이 되는 것을 볼 수 있었습니다.




엑셀파일을 열어보니, 제대로 보고서가 나왔는 것을 볼 수 있었습니다. 이것으로 보고서 양식을 지정만 하면, 만드는 것이 가능하다는 것입니다. 하지만 한가지 제약이 있는데, 우선 세로로 데이터를 저장할 수는 있지만, 가로로 가는 데는 제약이 많다는 것입니다. 그리고 '겹쳐쓰기'라는 것에서는 새로이 파일을 생성해서 다시 저장을 한다는 것을 볼 수 있었습니다.



위 스크린샷에 보이는 것처럼, 새로운 보고서 파일이 나오는 것을 볼 수 있었습니다. 이것으로 이벤트 보고서까지 출력을 할 수 있었습니다. 이것으로 화요일의 수업 내용을 다 정리하는 데 성공했으며, 조만간에 다른 수업의 내용도 정리해서 올리도록 해 보겠습니다.


Sub MoveDoor()


    DOOR_OPEN_TIME = 4000  '도어 자동 닫기 대기시간

delta = 10

remain = 0

mode = 0


while 1

mode = GetTagVal ("운전모드")

sensor = GetTagVal ("사람감지센서")

push_button = GetTagVal ("푸쉬버튼")

Select case mode


'---------------------------

case 0 ' 자동모드

'---------------------------

if sensor = 1 then   '감지는 이전 센싱스크립트에서 확인됨, 1이면 감지가 된상태 

remain = DOOR_OPEN_TIME

delta = 10          '문을 여는 변화율

elseif remain <= 0 then

delta = -10         '문을 닫는 변화율

end if

'---------------------------

case 1 ' 수동모드

'---------------------------

if push_button = 1 then

remain = DOOR_OPEN_TIME

delta = 10         '문을 여는 변화율

else 

delta = -10        '문을 닫는 변화율 

end if

'---------------------------

case 2 ' 암호입력모드

'---------------------------

        end Select           '아무 동작을 하지 않음     


        '도어개폐태그 설정

'delta가 양수 -> '개"

'delta가 음수 -> '폐'

if delta > 0 then

SetTagVal "도어개폐", 1

else 

SetTagVal "도어개폐", 0

end if

        SetTagVal "도어수평움직임", ( GetTagVal ("도어수평움직임") + delta ) 

'현재의 DOOR 위치 값을 읽고 변화율을 적용, 열면 +10, 닫으면 -10

' 0 -> 240으로 10씩 증가 => 여는 경우

'240->0으로 10씩 감소 => 닫는 경우

        remain = remain - 100

if remain <= 0 then remain = 0

sleep(100)


wend


End Sub


마지막으로 저는 아직 이해를 못했는데, 위 스크립트를 사용해서 문이 닫히고 열리는 것을 지연시키는 데 성공했다고 합니다. 그런데 어떻게 해서 sleep명령어를 안 쓰고서 지연을 시켰는지 아직은 알 수 없었습니다. 나중에 몇가지 테스트를 해 보고 나서 이해가 되면, 이 내용을 다시금 올리도록 하기도 하겠습니다.

반응형