학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

온도제어(한영전자)

학습목표

입출력제어 프로그램에 포토센서를 연결하여 PC 상태를 나타낸다.

학습주제

아래 화면에서 스위치로 출력을 제어하고 입력의 상태를 화면에 표시한다.

     

그림1 PC 제어 화면

 

[원본프로그램 다운 받기]

예습내용

통신 프로토콜

한영전자에서 제공하는 통신개요와 통신프로토콜 참조한다.

온도콘트롤러 셋업

단원의 프로그램은 소수점 1자리까지 읽도록 하였다. 그리고 통신속도와 셋업을 맟추어야 통신이 이루어진다.

사용메뉴얼 25페이지에서입력종류선택” [InP] “2” 한다.

사용메뉴얼 31페이지에서패리티(Parity) 체크선택” [Pr1] “0”으로 한다. 나머지는 매뉴얼대로 맟춘다.

실습방법

   

 

1.       RS232 통신 프로그램을 만든다.

2.       통신 프로그램이 완성되면 아래 그림과 같이 “NumEdit Control” 선택하여 온도를 표시하게 한다.

 

온도를 아래와 같이 “m_nTemp” 콘트롤베리어블을 정의 한다.

 

 

2. 아래 헤더 파일을 참조한다.

ThermDlg.h

// ThermDlg.h : header file

//

//{{AFX_INCLUDES()

#include "NiNumEdit.h"

//}}AFX_INCLUDES

 

#if !defined(AFX_THERMDLG_H__31949CED_A7D5_44C8_8CBD_59350B951C9E__INCLUDED_)

#define AFX_THERMDLG_H__31949CED_A7D5_44C8_8CBD_59350B951C9E__INCLUDED_

 

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

 

#include "CommThread.h"          // (1)

 

/////////////////////////////////////////////////////////////////////////////

// CThermDlg dialog

 

class CThermDlg : public CDialog

{

// Construction

public:

       int m_nBuff;

       int m_iPanelNo;

       int CharToInt(char in);

       double StringToDouble(char *in);

       CString strTemp;

       CThermDlg(CWnd* pParent = NULL); // standard constructor

       CCommThread m_ComuPort;     // (1)

 

// Dialog Data

       //{{AFX_DATA(CThermDlg)

       enum { IDD = IDD_THERM_DIALOG };

       CNiNumEdit   m_nTemp;

       //}}AFX_DATA

 

       // ClassWizard generated virtual function overrides

       //{{AFX_VIRTUAL(CThermDlg)

       protected:

       virtual void DoDataExchange(CDataExchange* pDX);      // DDX/DDV support

       //}}AFX_VIRTUAL

       afx_msg LONG OnCommunication(UINT, LONG); // Communication Message (2)

 

// Implementation

protected:

       HICON m_hIcon;

 

       // Generated message map functions

       //{{AFX_MSG(CThermDlg)

       virtual BOOL OnInitDialog();

       afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

       afx_msg void OnPaint();

       afx_msg HCURSOR OnQueryDragIcon();

       afx_msg void OnTimer(UINT nIDEvent);

       //}}AFX_MSG

       DECLARE_MESSAGE_MAP()

};

 

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

 

#endif // !defined(AFX_THERMDLG_H__31949CED_A7D5_44C8_8CBD_59350B951C9E__INCLUDED_)

 

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

ThermDlg.cpp

// ThermDlg.cpp : implementation file

//

 

#include "stdafx.h"

#include "Therm.h"

#include "ThermDlg.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

 

HWND hCommWnd;           // (2)

 

char sendBuff[500];

char buff[2048]="";

 

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

 

class CAboutDlg : public CDialog

{

public:

       CAboutDlg();

 

// Dialog Data

       //{{AFX_DATA(CAboutDlg)

       enum { IDD = IDD_ABOUTBOX };

       //}}AFX_DATA

 

       // ClassWizard generated virtual function overrides

       //{{AFX_VIRTUAL(CAboutDlg)

       protected:

       virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

       //}}AFX_VIRTUAL

 

// Implementation

protected:

       //{{AFX_MSG(CAboutDlg)

       //}}AFX_MSG

       DECLARE_MESSAGE_MAP()

};

 

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

       //{{AFX_DATA_INIT(CAboutDlg)

       //}}AFX_DATA_INIT

}

 

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

       CDialog::DoDataExchange(pDX);

       //{{AFX_DATA_MAP(CAboutDlg)

       //}}AFX_DATA_MAP

}

 

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

       //{{AFX_MSG_MAP(CAboutDlg)

              // No message handlers

       //}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

/////////////////////////////////////////////////////////////////////////////

// CThermDlg dialog

 

CThermDlg::CThermDlg(CWnd* pParent /*=NULL*/)

       : CDialog(CThermDlg::IDD, pParent)

{

       //{{AFX_DATA_INIT(CThermDlg)

              // NOTE: the ClassWizard will add member initialization here

       //}}AFX_DATA_INIT

       // Note that LoadIcon does not require a subsequent DestroyIcon in Win32

       m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

 

void CThermDlg::DoDataExchange(CDataExchange* pDX)

{

       CDialog::DoDataExchange(pDX);

       //{{AFX_DATA_MAP(CThermDlg)

       DDX_Control(pDX, IDC_CWNUMEDIT1, m_nTemp);

       //}}AFX_DATA_MAP

}

 

BEGIN_MESSAGE_MAP(CThermDlg, CDialog)

       //{{AFX_MSG_MAP(CThermDlg)

       ON_WM_SYSCOMMAND()

       ON_WM_PAINT()

       ON_WM_QUERYDRAGICON()

       ON_WM_TIMER()

       ON_MESSAGE(WM_COMM_READ, OnCommunication)    // Communication Message Handleer  (2)

       //}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

/////////////////////////////////////////////////////////////////////////////

// CThermDlg message handlers

 

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); // 타이머 시간을 설정한다.

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

}

 

void CThermDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

       if ((nID & 0xFFF0) == IDM_ABOUTBOX)

       {

              CAboutDlg dlgAbout;

              dlgAbout.DoModal();

       }

       else

       {

              CDialog::OnSysCommand(nID, lParam);

       }

}

 

// If you add a minimize button to your dialog, you will need the code below

//  to draw the icon.  For MFC applications using the document/view model,

//  this is automatically done for you by the framework.

 

void CThermDlg::OnPaint()

{

       if (IsIconic())

       {

              CPaintDC dc(this); // device context for painting

 

              SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

 

              // Center icon in client rectangle

              int cxIcon = GetSystemMetrics(SM_CXICON);

              int cyIcon = GetSystemMetrics(SM_CYICON);

              CRect rect;

              GetClientRect(&rect);

              int x = (rect.Width() - cxIcon + 1) / 2;

              int y = (rect.Height() - cyIcon + 1) / 2;

 

              // Draw the icon

              dc.DrawIcon(x, y, m_hIcon);

       }

       else

       {

              CDialog::OnPaint();

       }

       hCommWnd= m_hWnd;            // (2)

}

 

// The system calls this to obtain the cursor to display while the user drags

//  the minimized window.

HCURSOR CThermDlg::OnQueryDragIcon()

{

       return (HCURSOR) m_hIcon;

}

 

void CThermDlg::OnTimer(UINT nIDEvent)

{

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

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

       strTemp.Insert(0,0x02);

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

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

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

       CDialog::OnTimer(nIDEvent);

}

 

LONG CThermDlg::OnCommunication(UINT port, LONG lParam)  // (2)

{

      

       BYTE aByte;

 

       int size= (m_ComuPort.m_QueueRead).GetSize();

       for( int i=0; i< size; i++ )

       {

              (m_ComuPort.m_QueueRead).GetByte(&aByte);

              if(aByte==0x02) m_nBuff=0; // 통신시작을 나타낸다.

              if( aByte!= NULL ) buff[m_nBuff++]= aByte;

              else { i--; size--; }

       }

 

 

       if(aByte==0x0A)    {// 통신끝을 나타낸다.

              if(buff[3]=='D' && buff[4]=='R' && buff[5]=='S' && buff[7]=='O' && buff[8]=='K') {

                    m_nTemp.Value=StringToDouble(&buff[10])/10.;

              }

       }

       return 0;

}

 

 

double CThermDlg::StringToDouble(char *in)

{

       return (double)(CharToInt(in[0])*16*16*16+CharToInt(in[1])*16*16

                    +CharToInt(in[2])*16+CharToInt(in[3]));

}

 

int CThermDlg::CharToInt(char in)

{

       if(in < 0x41)

              return (int(in)-48);

       else

              return (int(in)-55);

}

 

 

보기1

 

 

 

 

처음