학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

온도제어(한영전자)

학습목표

온도콘트롤러의 조절 온도를 SV 변화 시켜 제어한다.

학습주제

아래 화면에서 온도가 표시되고 제어 온도 SV 설정하고 보내기 버튼을 누르면 콘트롤러의 제어온도가 변하게 한다.

 

프로그램구성

먼저 작성한 프로그램은 타이머를 0.5 간격으로 동작 시키면서 타이머 함수에서 온도를 읽어오는 형식이었다. 시간 간격을 0.2 이하로 하면은 콘트롤러의 응답시간 이전에 통신을 보내게 되어 통신 오류가 발생힌다.

프로그램에서 SV 값을 입력하고 보내기 버튼을 눌러서 바로 송신을 하면 타이머 함수에서 보내는 통신과 시간간격이 0.2 이내로 되면 에러가 발생한다. 그러므로 SV 통신은 타이머 함수에서 통신 대기를 하고 있다. 통신이 이루지게 하여야 한다.

프로그램에서는 m_nMode라는 변수를 설정하여 m_nMode=0이면 온도를 읽어오고 m_nMode=1 이면 SV읽기 통신을 하고 다시 m_nMode=0 자동 환원되게 프로그램 하였다.

예습내용

 

실습방법

   

 

1. 아래 그림과 같이 “NumEdit Control” 사용하여 “SV”값을 입력 하도록 한다.

아래와 같이 Member Variable “m_nSv” 정의 한다.

보내기 버튼을 만들고 이를 더블 클릭하여 멤버 함수를 만든다.

아래와 같이 m_nMode 정의 하여 0이면 온도를 보내고 1이면 SV값을 변화 시킨다.

 

아래와 같이 OnInitDialog() 함수에 m_nMode=0으로 초기화 한다.

BOOL CThermDlg::OnInitDialog()

{

       CDialog::OnInitDialog();

 

       // Add "About..." menu item to system menu.

 

       // IDM_ABOUTBOX must be in the system command range.

       ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

       ASSERT(IDM_ABOUTBOX < 0xF000);

 

       CMenu* pSysMenu = GetSystemMenu(FALSE);

       if (pSysMenu != NULL)

       {

              CString strAboutMenu;

              strAboutMenu.LoadString(IDS_ABOUTBOX);

              if (!strAboutMenu.IsEmpty())

              {

                    pSysMenu->AppendMenu(MF_SEPARATOR);

                    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

              }

       }

 

       // Set the icon for this dialog.  The framework does this automatically

       //  when the application's main window is not a dialog

       SetIcon(m_hIcon, TRUE);                 // Set big icon

       SetIcon(m_hIcon, FALSE);         // Set small icon

      

       // TODO: Add extra initialization here

       m_iPanelNo=1;

       m_ComuPort.OpenPort( "COM1", 9600, 1 );    // RS232 통신을 연다.

       SetTimer(1,500,NULL); // 타이머 시간을 설정한다.

       m_nMode=0;

       return TRUE;  // return TRUE  unless you set the focus to a control

}

 

보내기 버튼을 누르면 m_nMode = 1 되게 프로그램하고 OnTimer 함수에서 m_nMode 값에 따라 해당 통신을 하도록 한다.

아래 소스파일을 참조한다.

void CThermDlg::OnButton1()

{

       m_nMode = 1;

}

 

void CThermDlg::OnTimer(UINT nIDEvent)

{

       // TODO: Add your message handler code here and/or call default

       if(m_nMode == 0)

              strTemp.Format("%02dDRS,02,0001",m_iPanelNo);

       else if(m_nMode == 1) {

              strTemp.Format("%02dDWS,02,0300,0001,%04x",m_iPanelNo,(int)(m_nSv.Value*10));

              m_nMode = 0;

       }

 

       strTemp.Insert(0,0x02);

       strTemp.Insert(strTemp.GetLength()+1,0x0D);

       strTemp.Insert(strTemp.GetLength()+1,0x0A);

       strTemp.MakeUpper();

       m_ComuPort.WriteComm((unsigned char*)(LPCTSTR)strTemp,strTemp.GetLength());

       CDialog::OnTimer(nIDEvent);

}

 

처음