퇴근5분전

  이번엔  프로그램을 제작할때 내가 사용하는 방법을 써보려 한다. 

글로 쓰면 얼마나 걸릴지 모르겠지만... 생각하는 데로 대충 끍적거리고 메모장에 요약해놓고 바로 코딩해버리지만... 

이건 비전공자들이 검색하다 우연히 볼까? 라는 생각으로 써보는 것이다. 

 이번 만들던 PLC모니터링 프로그램 구조도다.

알바형태로 하는 플젝이다 보니 문서가 없어 설명들을 듣고 내가 그렸다.

 

목적 ::: 이 프로그램의 목적은 PLC의 네가지 정보( 차단기, 수신, 위험수위, 해제수위 )를 모니터링 하는 것

 

## 주요 객체를 뽑으면 { 다리, PLC } 두개가 있다.  <옵션>에 대한건 제외... 

난 표현을 메모장 아래와 같이 쓰거나 직접 class를 구현한다.

#다리

{

        #[PLC]

        {

                  .차단기

                  .수위

                  .위험수위

                  .해제수위

                  .위치 { L, R }  // 옵션의 별도PLC와 타DB는 위치값을 C로 추가

        }

}

눈에 딱 보이는 것을 추려낸 내용이다

[] 기호는 n개를 표현한것이다.

 

/* 추가적으로 이해에 필요한 내용

     * PLC에 모드버스TCP라는 통신방식을 이용하여 요청하여 메모리값을 16bit(word)값을 응답받을 수 있다. 

     * 차단기, 수위, 위험수위, 해제수위는 각 메모리 주소값이 프로그래밍을 통하여 고정되어 있다.

       여기서 고민해볼 것이 다리는 1개 일까? - 현업과 얘기해보니 n개 였다. 현장마다 관리하는 다리 개수가 다르다. 

       PLC와 통신을 하려면 모드버스TCP라는 방식으로 통신을 하므로 PLC의 IP 정보가 필요하다. port는 502번 고정이다.

*/

 

#[다리]

{

        .다리위치명

        #[PLC]

        {

                  .IP

                  .차단기

                  .수위

                  .위험수위

                  .해제수위

                  .위치 { L, R }  // 옵션의 별도PLC와 타DB는 위치값을 C로 추가

        }

}

모니터링 대상이 여러개의 [다리]로 생각하고 배열 형태로 변경했다

 

실시간 모니터링이니 백그라운드에서 PLC에게 일정 주기마다 요청을 하고 응답을 받아야 한다. 

윈도우 서비스(Windows Service)를 구현해야 한다. 

 

#Service

{

            .OnStart( string[] args ) {

            }

            .OnStop() {

            }

}

윈도우 서비스를 .net으로 구현하면 초기 구현부가 위와 같은 형태로 나온다.

* OnStart, OnStop을 구현하면 되는데... 넘어가고.. 

 

모니터링을 하기 위해선 객체 관계를 생각해 볼 필요가 있다. 

일정 시간마다 PLC에 요청해서 응답을 받아야 한다.

핵심 의사코드를 작성해보면... 

무한 반복 

{

    반복( 다리 in 다리목록 ) {

          다리.PLC.요청( 차단기 ) : 응답

          DB업데이트(응답)

          다리.PLC.요청( 수위 ) : 응답

          DB업데이트(응답)

          다리.PLC.요청( 위험수위 ) : 응답

          DB업데이트(응답)

          다리.PLC.요청( 해제수위 ) : 응답

          DB업데이트(응답)

    }

}

위와 같은게 계속 반복하여 필요한 정보를 계속 요청하고, 응답받은건 DB에 업데이트 해주면 된다.

 

 이 프로그램은 개발 현장에서만 사용하는 것이 아니기에 다리정보, PLC정보를 별도 파일로 빼고

서비스 시작시 읽어서 객체화하여 종료시까지 요청/응답을 반복한다. 

 

환경설정 파일과 연계하기 위해 아래형태로 변경한다.

 

#다리정보

{

            ID : "BRD001"

            다리명 : 어디어디에 있는 다리

            L_ID  : "PLC_L00"

            R_ID  : "PLC_R00"

}

 

// PLC_L00.json, PLC_R00.json 으로 파일을 만들고 아래 형태로 읽고/쓰기를 한다.

#PLC_Device { 

       .ID

       .IP

       .WebTitle

       [모니터링]

       {

                타입 : { 차단기, 수위, 위험수위, 해제수위 }

                PLC_메모리주소 

                FunctionCode // Modbus TCP프로토콜에 함수코드 ( 0x03, 0x04 )

       }      

}

 

! 코드가 아래와 같이 추가 변경된다. 

//반복되기 전에 환경설정된 파일을 읽어서 만든다.

//다리정보 읽기

모니터링[] monitorings ;

반복 ( 다리 in 다리목록 )

{

          // { 다리정보. PLC_L_ID }.json 읽기

          monitorings.목록추가( PLC_L_Device.모니터링  )

          // { 다리정보. PLC_R_ID }.json 읽기

          monitorings.목록추가( PLC_R_Device.모니터링  )

}

 

무한 반복 

{  

    반복( 모니터링 in monitorings ) {

          모니터링.요청( ) : 응답

          DB업데이트(응답) 

    }

}

이런 형태로 바꾼다. 

보통 여기까지의 샘플 코드까지가 대략 반나절정도 걸린다. 좀더 규모가 큰 것들은 하루 이틀 정도?...

 

 이후 부터는

 1. 실제 PLC장비를 연결하고,

 2. 모드버스TCP프로토콜 샘플을 만들기 

     Read Write 샘플 및 테스트

 3. 서비스 프로젝트 생성 후 코드 반영.

 4. 로그 기록

 5. DB연결 및 스키마 생성 및 읽기/쓰기 쿼리문 작성 

 6. 간이 테스트 문서

 7. 상세코드 작성 및 디버깅

 1~7 정도 하면 1~2주 훌쩍 간다.

기존에 했던 작업들이면 1~2일 정도면 된다.

 

위 작업들을 보면 목적 프로그램의 주연들을 찾아내고 정의해서

관계를 설정하고 의사코드로 역할과 호출순서를 정한다. 

기본적으로 객체.할수있는일( 필요한 것들... ) : 결과값 정의해서 누가 뭘 할지 결정하고 

필요한 것들을 붙여나가면서 프로그래밍 하면 좋겠다.

 

어떤 기능을 구현한다 했을때 이런게 있겠지? 라고 생각하고 

해당 기능을 가진 객체를 구글링하면 대부분 존재한다. 그럼 그걸 가져다 샘플 만들어서 돌려보고 

코드에 반영하게 된다. 이럴때도 "할수 있는 일" 을 찾을때 도움이 된다. 

 

 두번째 이야기.... 

첫번째로 객체.할수있는일( 필요한 것들... ) : 결과 형태로 수백가지 정도 써본다면 

처음엔 잘 안떠오르는데... 하다보면 막 보이는데로 쓰게 되고, 그러다보면 이게 뭔짓인가 싶을때가 있었다.

그때 그만하면 된다. 

 

 표현하는 객체들이 할수 있는 일과 그 일에 필요한 것들을 적어본다면 객체와 객체간의 관계에 대하여 고민을 할때가 된거다. 뉴스 만화 영화 등을 보면서 장면 장면 기억에 남는거라든가? 스크린샷등으로 이미지를 남겨놓고 그 상황을 코딩해보면 좋다. 이때 의사코드(Pseudo)를 사용해본다. 

 이런 코드도 한 일주일 정도 투자해서 이거 저거 상황을 코드화 해보면 코딩할 준비가 된거라 생각한다. 

 

 우리처럼 비전공 개발자들이 초반에 코드에만 빠져 있다보면 객체들을 서로 관계지어 설계하는 과정을 체득하지 못하기에 미리 이런식으로 객체를 정의하고 객체간의 관계등을 미리 글쓰듯이 해보는 것이 중요하다 생각된다. 

 실제 작성하는 코드들이 그렇게 어려운 코드들이 없다. 대부분이 이미 만들어진 객체들을 활용하며 순서를 정해 호출하고 

또 객체가 할 일에 필요한 자원들을 빠짐없이 전달해주는 역할을 개발자가 해주는 것이다. 

 우리는 3인칭 시점에서 내려다보면서 이야기를 써내려가면 된다. 이야기를 써내려가면서 흐름에 따라 등장하는 객체들이 있을 것이며 그 객체들이 어떤 라이브러리에 있는지 찾아서 끼워 맞춰주는 역할을 하면 된다. 시작은 그렇게 하면 된다고 본다. 좀더 관심있고, 좋은 업체들로 이직을 하려면 일 외에도 따로 전공자들보다는 더 많은 노력을 기울여 공부해야 한다.

 

 다음에 시간이 되면 현재 개발중인 내용을 설계과정등을 시간순서대로 나열해보려한다. 

 

 유튜브을 보다보면 개발자를 목표로 하는 사람들에 대한 이야기들이 참 많다. 

언어별로 각종 강의자료들... 몇몇 자료들을 봤지만, 언어 소개 이후 론 대부분 코딩을 제일 먼저 시작한다.

 

 개발자를 시작하려면 가장 먼저 일주일 정도 시간을 내서 객체지향에 대한 이해가 먼저 선행되었으면 한다.

 SI일을 다니다가 신입 직원들을 봤을때... 코딩도 그럭저럭 하지만...

 전공자들은 학교 다니면서 동기, 선배, 교수들과 함께 투자한 시간만큼 코딩이 가능하다.

비전공인 분들을 각자의 센스? 또는 국비에서 강사들의 복불복에 코딩이 변죽을 부린다. 

나도 처음 개고생한거 생각하면, 그만큼 절실했으니까. C++ 책만 7번씩 볼 수 있지 않았을까? 

 

비전공자가 개발자를 하기전에 반드시 이거 하나는 해보고 공부를 시작했으면 한다.

 

프로그램 코딩 대부분 기본 구조는 아래와 같다.

 주어.동사( 동사의 목적에 필요한 데이타 목록,... ) : 결과 

주어는 객체이고, 동사는 객체로 할수 있는 일, 

그리고 객체가 하는 일에 필요한 데이타 또는 관련 객체들로 채워준다. 

개체가 한 일에 대한 결과가 나오는 것이 있고, 없는 것도 있다 ( void )

 

  우리 프로그래머들은 순차적으로 할 일들을 정의하고 순서대로 일을 할수 있는 문서를 작성하는 것이다.

 int a = 10; 이런게 중요한게 아니고... 

  하나의 프로그래밍을 완성하기위해 필요한 주요 객체들과 그 객체들이 할 수 있는 일(동사)들이 떠올라야 한다고 생각한다.  그림이나 사진, 또는 자기 경험등... 눈앞에 보이는 모두를 객체.일() 로 정의할 수 있으면 좋겠다. 

 

1. 자기 자신부터 동사를 붙여본다

    나.잔다( 시간 )

    나.일어난다()

    나.이동한다( 목적지 )

2. 이런 형태로 객체를 100여가지 정도는 정의해보자. 

3. 100여가지 중에 공통적인 것들을 분류해보자. ( 나중에 상속과 다형성 공부할때 좋은 자료가 된다 )

 

 17년 정도 프로그래밍을 했지만, 기본 적인 비지니스 업무흐름이라는게 회사마다 제각각이라 기획 같은게 어렵지 

코딩 자체가 어려운건 없다. 가끔 고수준의 크리티컬한 쓰레드 자원 관리나 게임프로그래밍 처럼 수학이 절실한거 아니면..  그냥 라이브러리를 얼마나 아는가? 또는 필요한 객체들의 어떤 행위들을 추측이 가능한가? 정도이다. 

진짜 어려운 프로그래밍은 전공자들 중 top class가 할꺼다. 

 그리고 이제 AI 시대가 왔다. 개발자들을 대체하기엔 시간이 좀 필요하겠지만... 발전 속도를 보면... 

깔려있는걸 한번에 뒤집는건 불가능해도 새로 만드는 것들에 대해서는 점점 가능해지지 않을까? 

 그러면 이제 개발이란건 기획! 이란게 진짜 필요할 지도 모르겠다.