#강좌10
잔소리 :
이 강좌는 PC를 이용한 제어인데...이 PC로 제어를 하는 데, 있어서 대전제가 있어야 한다는 것이다.
그것은 바로 안전에 대한 것이다. 모터의 용량이 작은 경우(1KW 이하)는 상관이 없지만, 그 이상의 모터를 제어하는 것은 안전에 무척 주의하여 프로그램을 해야 하고, 안전 조치를 잘 해두고 제어 프로그램을 짜는 일을 시작해야 한다는 것이다. 실제로 400W 의 모터만 하더라도 볼스크류 부하의 경우, 3000rpm 이상의 고속회전을 하여 오동작을 한다면, 기구물이 부서지거나 사고로 연결 될 수 있기 때문이다. 특히, 리미트의 동작이나, 과속, 과전류등에 대해서 많은 주의를 요하며, 회전부하의 경우도 주의해야 하는 부하의 종류이다.
다들 알고 있는 부분이라 생각하지만, 산업현장에서 들은 얘기를 조금하면, 천안쪽에 있는 모 회사에서 PLC로 모터를 제어 하는 과정에서 모터의 오동작으로 사람이 죽는 사고가 났다는 얘기를 들었고, 그런 예가 아니더라도, 사람이 다치는 사고가 모터를 제어하는 현장에서 많이 일어나고 있기 때문이다.
더구나, PC는 바이러스라고하는 복병과, 하드디스크가 깨지는 현상이 발생하는 관계로 정상적인 프로그램과 하드웨어가 구성되어 있다고 해도 오동작을 하는 경우가 발생 할 가능성이 있기 때문에 특히 주의를 해야 한다.
기본적으로 프로그램을 짜는 데 있어서, 프로그램에서 사용되는 대부분의 내용은 while 문과 if, 또는 switch case 문이 거의 대부분을 차지할 것이다.
물론, 필요한 내용을 디스플레이하고, 계산을 하고, 뭐 이런 다른 과정들이 있긴 하겠지만...프로그램의 뼈대가 되는 내용은 while 문과 if,또는 switch case 문 일 것이라는 얘기다.
지금부터의 강좌는 C 언어를 조금 아는 사람들이 이 강좌를 볼 것이라는 전제하에 강좌를 진행해 나갈 것이다. 이점 양해해 주기 바라며...강좌를 시작한다.
간단히 프로그램의 모양을 본다면 아마도 다음과 같을 것이다.
#include <stdio.h>
#include 기타 헤더파일들..
전역변수 선언;
리턴할 값 main(인자)
{
변수선언;
시스템 초기화;
while(조건){
switch(조건){
case 1:
입력이나 조건에 대한 다른 함수호출;
break;
case 2:
입력이나 조건에 대한 다른 함수호출;
break;
default ;
break;
}
종료조건이 되면 break;
}
호출할 함수들()
{
while(조건){
처리할 내용();
디스플레이할 내용();
종료조건이 되면 break;
}
종료시 프로그램에서 초기화 할 내용 실행;
}
대충 이러한 모양을 할 것이다.
물론, 프로그램의 량이 많고, 메모리를 크게 사용하려면, 프로젝트를 만들어서 프로젝트명.PRJ를 가지고 LIB 나 다른 헤더, 소스 파일을 include 하여 프로그램을 짤수도 있지만...
그럼, 비주얼씨로는 어떤 방법으로 프로그램을 할까?
비주얼씨도 비슷하다.
간단하게 나열을 해보면, 대충 이런모양이 될 것이다.
프로젝트 위자드로 프로젝트를 데이터베이스를 사용하면, 그에 해당하는 프로젝트로 만들고, 단순히 버튼들과 edit box를 위주로 동작이 되는 프로그램이라면 formview 로 프로젝트를 일단 만들 것이다.
다음엔,
OnInitialUpdate() 부분에 초기화에 대한 내용을 프로그램하고,
OnTimer() 부분에서 디스플레이와 정기적으로 감지할 내용과 처리할 내용들이 프로그램 될 것이다.
종료시에 처리할 내용은 OnDestroy() 부분에서 처리하거나 다른 비슷한 계열의 함수들을 핸드링해서 프로그램이 될 것이다.
또, 더 빠른 I/O제어와 처리루틴의 실행을 위해서는 스레드를 사용하는 경우도 발생할 것이고...
아무튼, 이러한 모양을 갖고 프로그램이 될 것이라는 것은 당연할거라는 얘기다.
필자는 프로그램을 짜는 데 있어서, 아주 작은 함수들의 모듈로 프로그램을 짜고, 그 작은 모듈들을 상위의 모듈들이 하위의 모듈들을
관리하고, 다시 그런 함수들을 그룹으로 나누어 최상위그룹의 프로그램 모듈만을 기억하고 프로그램을 짜는 방법을 사용한다.
두 번이상 반복이 된다면, 무조건 함수를 만드는 버릇이 있고, 이렇게 하는 과정에서 나만의 알고리즘이 가미된 함수나 프로그램이 남게된다.
프로그래머로서 바로 이부분이 재산이 되는 것이고, 살아남기 위한 수단과 다른 사람들과의 경쟁에서 이길수 있게 해주는 재산이 되는 것이다.
이렇게 프로그램을 짜는 경력이 약 2∼3년정도 쌓이게 되면, 이미 만들어 놓은, 많은 자기자신만의 함수들을 보유하게 되고, 이런 것이 힘이되어 다른 사람들보다 빠른시간에 프로그램을 짜고 디버깅 시간도 많이 절약 할수 있는 유능한 제어 프로그래머로 성장하는 것이다.
필자도 많은 양의 프로그램을 코딩한적은 별로 없다. 많이 해본 것이 약 40000줄 정도가 가장 많이 코딩한 경우인데, 지금은 많은 부분이 함수로 만들어져서 20000줄을 넘는 경우가 별로 없고, 대부분의 프로그램을, 짠다
라고 표현하기보다는 기존에 만든 함수들을 logic에 맞추어 나열하는 모양으로 프로그램 짜는 작업으로 프로그래밍이 바뀌었다.
지금 필자가 하려는 말이 무슨 뜻인지...이해가 됬는지 모르겠는데...
강조를 하기위해...전에 있던 회사에서 일할때의 경우를 예를 들면, 4축 동시보간제어를 하고, I/O는 약 48점, 윈도우로 G 코드와 M 코드를 (CNC에서 사용하는 G코드를 의미한다) 사용하여 유저가 프로그램을 작성하여 동작하는 기계를 프로그래밍하는 데 걸린 시간이 약 2주정도 걸려서 완성한 적이 있었다. 다른 회사에서는 개발기간이 약 1달∼3개월을 얘기 했었다. 물론, 유저의 요구로 인해 프로그램을 오랜기간에 걸쳐 수정 작업을 거치긴 했지만...
그러한 부분은, 어느 application의 프로그램 일을 해도, 어쩔수 없이 소요되는 시간이므로 제외하고 얘기하는 것이다.
이러한 개발기간은 PLC나 CNC, 원칩 마이컴을 이용하는 경우에는 상상도 할수 없는 짧은 시간에 프로그램을 개발하는 것이다.
심한 경우는 배선하고, 프로그램 짜고, 일을 끝내는 데 걸린 시간이 3일 만에 끝난 경우도 있었다.
다품종 소량의 application을 개발하는 데, PC를 이용한 제어보다 빠르고 강력하며, 능률적인 방법은 아마도 찾기 어려울 것이다.
그 강점은 기성품을 사서 인터페이스만 하면 바로 시스템을 운영할수 있다는 장점에서 기인하는 것이고, 이 부분이 다품종 소량(수십대)이라는 시장에서 먹혀들어가는 부분이다. 반대로 대량(수백대이상)의 개념으로 가면, 원칩 마이컴쪽이 가격면에서나 작업을 빠르게 한다는 면에서는 유리하다는 것은 당연한 얘기일 것이다.
앞의 강좌에서 기본 프로그램의 모양을 얘기한적이 있다.
그 기본적인 모양을 가지고 실제 프로그램의 종류나 기타 제어하는 제어기?(PLC 나 CNC등)들과의 차이점을 짚고 나가기로 하자.
다들 알고 있는 것이겠지만... CNC는 모터를 제어하는 유닛+PLC를 시스템 메이커에서 모터를 제어하는 프로그램과 I/O를 제어하는 PLC 유닛을 조합하여 배선과 프로그램을 한 것을 이르는 말일 것이다.
이는 시스템 메이커에서 하는 프로그램을 가지고 유저가 필요에 따라 G 코드나 M 코드등을 이용하여 유저프로그램을 짜서 사용하게 하는 방식 이라는 것이다.
이는 OPEN 시스템이 아닌 CLOSE 된 개념의 시스템으로 모터를 제어하는 데 있어서 모터와 I/O를 동시에 제어할수 없다는 것과 CNC 메이커에서 제공하지 않는 펑션이나 동작을 하려면, 난관에 봉착하게 된다는 단점이 있다.
PC를 이용해서 제어하는 것도 이러한 CNC 처럼 프로그램하는 것과 그것과 다르게 PC의 장점을 그대로 살려서, 필요한 모든 동작을 구현해 내도록 하는 두가지 스타일의 프로그램방법으로 구별될 것이다.
즉, I/O가 됬든, 모터가 됬든, 하나의 동작이 끝나고, 그 끝난 상황을 보고, 다음으로 시퀀스를 진행할지, 아니면, 모터가 돌기 시작하면서, 다른 I/O를 동시에 구동하게 할지...뭐 이런 것 말이다.
또 한가지는 고정된 동작만을 계속하는 단순한 형태의 프로그램인지...
아니면, 유저의 유저용 프로그램에 따라 제어를 하게 할것인지...아닌지
이러한 것들도 프로그램을 시작하기전에 미리 염두에 두어야 할 부분들이다.
그리고, 도스로 짤지, 윈도우로 짤지, 이러한 것들도 미리 결정을 해야 할 것이며, 이러한 상황에서도 도스용과 윈도우용과의 프로그램 이식이 쉽도록 가능한한 기본 C언어를 이용해서 프로그램의 뼈대를 만들어야 하는 것은 당연한 것이다.
또한, 프로그램의 진행속도나, 시퀀스의 속도도 고려해야 한다.
예를 들면, 초당 처리하는 모터를 제어하는 position 수나 I/O를 제어하는 초당 제어하는 접점과 ON/OFF 횟수말이다.
모터의 경우, 1초당 수십개의 position 데이터 정도 처리하는 것이라면, 빠르지 않은 제어의 경우에 해당하며, 윈도우로 프로그램 할 경우, 일반적인 윈도우용 타이머를 구동하여 사용해도 무방한 경우가 많으며, 초당 posiotion의 개수가 백개 이상이 되면, 윈도우에서의 타이머는 사용 할수 없는 비교적 빠른 제어에 해당하게 된다. 윈도우에서 일반적으로 믿을수 있는 타이머의 정확도는, 시스템이나 램상주된 프로그램의 종류나 상태에 따라 다르긴 하지만... 약 50㎳∼100㎳정도의 시간을 믿을수 있는 시간으로 간주한다. 이것보다 빠르게 동작하는 것은 믿을수 없다는것이다. 이러한 경우는 윈도우에서 빠른 제어를 위해 제공되는 스레드를 사용하거나, 이것도 어려운 경우는 도스용으로 while 문을 사용하여 제어하는 것이 훨씬 유리하다.
물론, 프로그램을 짜기 가장 쉬운 것은 당연히, 고정된 동작을 반복하여 구동되는 것이 될 것이고, 그 다음은 어려운 것은, 고정된 동작중에서 모터와 I/O를 동시에 제어하는 것일 것이며, 그 다음 어려운 것은 CNC나 PLC처럼 유저가 프로그램을 짜서 운영되는 계통의 프로그램일 것이며, 조금 더 까다로운 것이 유저용으로 하되, 모터와 I/O를 동시에 제어하는 것일 것과 그렇지 않은 것이 혼재되어 있는 시스템을 프로그램 하는 것 일이다. 물론 같은 축수의 모터를 제어하는 것을 전제로 한 얘기다.
모터의 제어하는 축수가 많으면 많을수록 더 까다로와 질 것이고, I/O가 많으면 많을수록 더 까다로운건 당연한 것일테니까...
필자의 경우, 동시 3축을 제어하는 데, 3축의 위치 데이터를 초당 많은 경우, 400개 내외의 데이터를 처리하는 시스템을 윈도우로 프로그램 했던 경우가 있었는 데... 윈도우의 스레드를 사용해도 정상적으로 제어가 되질 않아서, 스레드에서 한번에 10개에서 20개정도의 위치 데이터를 한꺼번에 읽어서 처리하게 한적도 있었다.
이러한 경우, 문제가 시스템의 속도와 메모리 하고도 연관을 갖게 된다.
그럼, 하기 쉬운 제어의 형태부터 하나씩 프로그램을 어떻게 하는가에 대해 알아 보기로 하자! 간단한 예제를 서술하겠다.