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

CiMon Scada를 혼자서 반복문 만들고, 정답과 대조한 결과

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

안녕하세요?


이번 포스팅은 이번주 화요일에 있었던 수업이라기에는.... 일단 과제를 직접 부딧쳐서 해결해 보고자 했는 것인데, 그 내용을 포스팅 하는 것에 가깝다고 해야 겠습니다. 일단 일일히 시행착오를 했는 내용을 다 포스팅 하기에는 너무 복잡하기에, 이번에는 중요하다 싶은 내용만 될 수 있으면 간추렸는데, 너무 간추린 것이 아닌가 하는 생각이 듭니다.



일단 처음으로 하는 과제는 위 그림에서 나오는 것처럼 파란색의 피스톤을 최대한으로 빼었다가, 그 다음에 도로 되돌아 오는 작업을 자동으로 하게 만드는 것입니다.



일단 해결하기는 해결을 했는데, 먼저 move라는 스크립트를 짜서, 조건에 따라서 piston이라는 스크립트의 실행여부를 제어 하도록 합니다. 그리고 piston이라는 스크립트에서는 while문 안에 while문을 또 써서 처음에는 피스톤의 위치값에 해당하는 아날로그 태그의 값을 증가시키도록 합니다.




일단 while문 바로 옆에는 '반복문이 계속되는 조건'이라는 것이 붙을 수 있습니다. 그래서 아래와 같은 구조를 가지고서, while문을 2중으로 사용하였습니다.


while 1

피스톤에 관계된 아날로그 태그값을 가지고 오기

if 아날로그 태그<최대값 then

증가하는 공식

else

while 아날로그 태그>0

감소하는 공식

아날로그 태그에 값 쓰기

sleep( )

wend

end if

아날로그 태그에 값을 쓰기

sleep( )

wend


대략 이런 구조라고 보시면 됩니다. 일단 if문만으로 어떻게 하려고 했지만, 일이 생각만큼 잘 되지는 않았습니다. 그래서 하는 수 없이, 제 경우에는 이렇게 while문을 이중으로 구성해서 어떻게 왕복 운동을 하는 데는 성공하기는 했습니다.



다음은 새로운 프로젝트를 생성해서 작업에 다시금 들어 가도록 해 보겠습니다.



이번에는 조금 더 복잡하게도, 자동, 수동을 조절하는 스위치가 있으며, 자동운전에 관계된 스위치 2개와 수동운전에 관계된 스위치가 2개 있습니다. 여기서 스스로 학습하면서 알게된 한가지 사실인데, 스위치/램프 설정에서 램프설정이라는 항목이 있습니다. 전에는 이게 왜 있는지 몰랐지만, 이 설정을 안 해주면, CiMonX에서 실행 중일 때, 마우스 커서를 떼면 도로 상태0으로 돌아가 버린다는 것입니다. 즉, 토글이든 이런 방식이든 스위치의 상태를 상태1이나 이런 것으로 유지시키고 싶으면, 이 램프설정을 해줘야 한다는 것입니다.



이런저런 방식으로 프로그램을 짜면서 실행을 하는 그림입니다. 수동운전으로 전진이나 후진으로 움직이는 것도 되었으며, 자동으로 왕복운동을 하는 것까지는 어떻게 되기는 되었습니다.




하지만, 정말 중요한 것이였는 실린더가 왕복 운동을 했는 횟수를 기록하는 기능과, 횟수를 지정하면 이 횟수만큼 왕복운동을 하는 기능은 어떻게 구현을 하지 못했습니다.



위 스크린샷이 정답이라고 할 수 있는 것입니다. 일단 여기서 중요한 것은 while문을 무조건 실행 시키라는 것으로 사용을 했다는 것이고, 이 스크립트는 페이지를 열면 실행을 시키라고 되어 있다는 것입니다. 그리고 가장 핵심이라고 해야 할까요? 카운터는 다음과 같은 것을 사용하고 있습니다.


if 자동운전에 관한 태그=1 and 아날로그 태그가 최대값일 때 then settagval "카운터에 관한 태그", 카운터에 대한 변수 +1


여기서는 settagval이라는 함수가 then 조건 바로 뒤에 올 수 있다는 것입니다. 그리고 여기서 아날로그 태그가 최대값일 때, 즉 최대한으로 피스톤이 뻗어 나왔을 때, 카운터에 관한 태그의 값을 +1 한다는 것입니다. 그리고 이 문장은 if문으로 처리를 한다는 것입니다.


그리고 마지막으로 어떻게 하면 지정된 횟수에 도달하면, 완전히 피스톤이 들어간 상황에서 완전히 멈출 수 있느냐 하는 것인데, 이것도 핵심은 다음의 if문 조건을 형성 함으로서 간단히 해결이 되기는 되었습니다.


if 반복 지정 횟수>0 and 카운터 횟수=반복 지정 횟수 and 피스톤의 운동에 대한 아날로그 태그값 반영 변수=0 then

카운터를 0으로 지정, 이후 태그에 반영

반복 지정 횟수를 0으로 지정, 이후 태그에 반영

자동운전을 하는 것에 대한 태그값을 0으로 지정(OFF선언을 하는 것)

end if


이러한 구문을 사용한다고 보시면 됩니다. 조금은 어려울 수도 있는데, 아마 제가 100% 이해를 아직은 하지 않아서 발생한 현상이라는 생각이 듭니다. 그래서 가장 핵심은 카운터 횟수=반복 지정 횟수피스톤 운동에 대한 아날로그 태그값 반영 변수=0 이라는 이 두개의 조건을 if문에 적는 것이라는 생각이 듭니다.



이 과제는 뒤로 하고서, 이전에 했던 적이 있는 계단의 전등을 만드는 것에 대한 프로젝트를 새로 하고자 합니다.




상당수가 스크립트를 짜는 작업이라기 보다는, 디자인을 하는 작업에 좀 더 가까운 작업이 되었습니다. 아무튼 이 작업을 어떻게 완료하기는 하였습니다.




마지막으로 오늘의 하이라이트라고 해야 할까요? 저는 While문 안에 while문을 2중으로 사용해서 피스톤의 자동 왕복 운동을 하게 했지만, 실제로는 더 간단하게 하는 방법이 여기에 있는 것입니다. 


while 1


실린더에 관한 태그값을 반영하는 변수

전진이라는 신호값을 반영하는 변수

후진이라는 것을 반영하는 변수

자동/수동을 반영하는 셀렉터 스위치를 반영하는 변수


if 피스톤이 뻗어 나오는 조건문 then aaa=5

if 피스톤이 수축하는 경우의 조건문 then aaa=-5

settagval "실린더에 관한 태그",실린더에 관한 태그값을 반영하는 변수+aaa

sleep( )

wend


이런 구조를 가지고 사용한다는 것입니다. 일단 이게 제가 생각한 문장 보다는 더 깔끔하고 보기 좋다는 생각이 듭니다. 문제는 이 조건문을 짜는 것인데, 이 부분에 대해서는 아마 다시금 실습을 해야하는 일이 조만간에 생길 듯 한데, 그때 가서 더 이해가 되었다면, 다음 포스팅에서 다루도록 하겠습니다.

반응형