학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

디지털 포트의 출력

학습목표

디지털포트의 출력을 이해하고 이를 기계제어에 응용한다.

학습주제

PCI6024에는 8개의 디지털포트를 입출력으로 사용할 있다. 이를 이용하여

1.     LED 동작 시키다.

입력 스위치를 만들고 LED 함께 동작시킨다.

예습내용

1.     디지털포트 출력에 대한 보드메뉴얼 4-20페이지를 읽어본다.

2.     오른쪽 링크파일Report 읽어 보고 디지털 포트와 LED 동작을 알아보고 다음 함수DIG_Prt_Config(1, 0, 0, 1), DIG_Out_Prt(1, 0, 0)  함수를 설명하시오.

3.     아래는 “C:/Program Files/National Instruments/NI-DAQ/Examples/DAQmx ANSI C/” 모든 예제 프로그램이 포함되어 있어서 이를 참조하여 프로그램한다. 이곳의 함수는 “ANSI C” 되어 있어서 이를 “Visual C++” 프로그램으로 수정 하여야 한다.

 

4.     비쥬얼 프로그램에서는 다음의 헤더파일과 라이브러리 파일을 추가해야 한다.

다음 디렉토리를 추가한다.

C:\PROGRAM FILES\NATIONAL INSTRUMENTS\NI-DAQ\DAQMX ANSI C DEV\INCLUDE

다음 디렉토리를 추가한다.

C:\PROGRAM FILES\NATIONAL INSTRUMENTS\NI-DAQ\DAQMX ANSI C DEV\LIB\MSVC

5.     메뉴에서 아래의 파일을 추가한다.

C:\Program Files\National Instruments\NI-DAQ\DAQmx ANSI C Dev\include

C:\Program Files\National Instruments\NI-DAQ\DAQmx ANSI C Dev\lib\msvc

실습방법

   

1. LED 보드의 제작    1

2. 프로그램 작성    1

1. LED 보드의 제작

LED 발광 다이오드로서 전압을 가하면 적색이나 녹색 자신의 색으로 발광 한다. 보통 2V 정도의 전압에 10mA-20mA 전류 흐른다.

1)     5V 전원 사용 저항값 (허용전류 9mA 설계)

R=(5V-2V)/9mA=330 W

2)     12V 전원 사용 저항값 (허용전류 10mA 설계)

R=(12V-2V)/10mA=1000 W

다음과 같이 보드를 설계한다. LED 보드에 연결된 단자가 0V(접지) 연결될 발광한다.

Led 있는 보드의 CON1 숫컨넥터를 사용하고 위에서 보았을 다음과 같이 연결한다.

2

4

6

8

10

1

3

5

7

9

디지털 포트가 0V LED 점등된다. 아래는 LED 동작에 따는 출력 값을 표시한 것이다.

 

상위비트

하위비트

 

LED

Dp

g

f

E

d

c

b

a

출력

보드핀이름

DIO7

DIO6

DIO5

DIO4

DIO3

DIO2

DIO1

DIO0

 

보드핀번호

48

16

51

19

47

49

17

52

 

0

5V

5V

5V

5V

5V

5V

5V

0V

0xfe

1

5V

5V

5V

5V

5V

5V

0V

5V

0xfd

2

5V

5V

5V

5V

5V

0V

5V

5V

0xfb

3

5V

5V

5V

5V

0V

5V

5V

5V

0xf7

4

5V

5V

5V

0V

5V

5V

5V

5V

0xef

5

5V

5V

0V

5V

5V

5V

5V

5V

0xdf

6

5V

0V

5V

5V

5V

5V

5V

5V

0xbf

7

0V

5V

5V

5V

5V

5V

5V

5V

0x7f

 

2. 프로그램 작성

다음은 디지털 포트를 출력으로 사용하여LED 2개가 10 점등하는 프로그램이다.

다음은 “C:/Program Files/National Instruments/NI-DAQ/Examples/DAQmx ANSI C/Digital/Generate Values/Write Dig Chan” 프로그램이다. 이는 “data[8]={0,1,0,1,1,1,1,1};” 데이터 값으로 8개의 출력이 지정된 포트로 나타난다. 이를 실습해 보고 비쥬얼 프로그램으로 전환해서 프로그램해 본다.

#include <stdio.h>

#include <NIDAQmx.h>

 

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

 

int main(void)

{

              int32       error=0;

              TaskHandle  taskHandle=0;

              uInt8       data[8]={0,1,0,1,1,1,1,1};

              char        errBuff[2048]={'\0'};

 

              /*********************************************/

              // DAQmx Configure Code

              /*********************************************/

              DAQmxErrChk (DAQmxCreateTask("",&taskHandle));

              DAQmxErrChk (DAQmxCreateDOChan(taskHandle,"Dev1/port0/line0:7","",DAQmx_Val_ChanForAllLines));

 

              /*********************************************/

              // DAQmx Start Code

              /*********************************************/

              DAQmxErrChk (DAQmxStartTask(taskHandle));

 

              /*********************************************/

              // DAQmx Write Code

              /*********************************************/

              DAQmxErrChk (DAQmxWriteDigitalLines(taskHandle,1,1,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL));

 

Error:

              if( DAQmxFailed(error) )

                             DAQmxGetExtendedErrorInfo(errBuff,2048);

              if( taskHandle!=0 ) {

                             /*********************************************/

                             // DAQmx Stop Code

                             /*********************************************/

                             DAQmxStopTask(taskHandle);

                             DAQmxClearTask(taskHandle);

              }

              if( DAQmxFailed(error) )

                             printf("DAQmx Error: %s\n",errBuff);

              printf("End of program, press Enter key to quit\n");

              getchar();

              return 0;

}

 

프로그램을 Visual 프로그램으로 작성해 보겠습니다.

 

 

아래와 같이 프로젝트를 만듭니다.

MeasurmentStudio 없이 아래 Visual C++ 만으로는 아래와 같이 프로젝트를 만들고 후는 똑같이 프로그램하면 된다.

다이어로그 박스에 에러메세지와 프로그램 결과를 표현할 “Edit Box”창을 하나 만듭니다.

 

메뉴에서 “View”-“ClassWizard” 선택하여 아래와 같이 에디트 박스의 Member Variable “m_sResult” 한다.

 

클래스에서 아래와 같이 선택하여 “Error” 함수를 만들어 여기에 에러처리 함수를 프로그램한다.

 

“VisualWriteDigChanDlg.h” 파일에 메시지를 기술하기 위한 다음의 변수를 추가한다.

class CVisualWriteDigChanDlg : public CDialog

{

// Construction

public:

              CString strTemp;

              void Error();

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

 

아래와 같이 타이머 함수를 만든다.

아래와 같이 다이어로그 박스가 사라질 실행되는 함수를 만든다.

아래 소스프로그램의 빨간색 글씨 부분을 추가하고 실행한다.

// VisualWriteDigChanDlg.cpp : implementation file

//

 

#include "stdafx.h"

#include "VisualWriteDigChan.h"

#include "VisualWriteDigChanDlg.h"

#include <stdio.h>

#include <NIDAQmx.h>

 

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

 

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

 

// 변수 선언

int32       error=0;

TaskHandle  taskHandle=0;

uInt8       data[8]={0,1,0,1,1,1,1,1};

char        errBuff[2048]={'\0'};

 

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

// 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()

 

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

// CVisualWriteDigChanDlg dialog

 

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

                   : CDialog(CVisualWriteDigChanDlg::IDD, pParent)

{

                   //{{AFX_DATA_INIT(CVisualWriteDigChanDlg)

                   m_sResult = _T("");

                   //}}AFX_DATA_INIT

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

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

}

 

void CVisualWriteDigChanDlg::DoDataExchange(CDataExchange* pDX)

{

                   CDialog::DoDataExchange(pDX);

                   //{{AFX_DATA_MAP(CVisualWriteDigChanDlg)

                   DDX_Text(pDX, IDC_EDIT1, m_sResult);

                   //}}AFX_DATA_MAP

}

 

BEGIN_MESSAGE_MAP(CVisualWriteDigChanDlg, CDialog)

                   //{{AFX_MSG_MAP(CVisualWriteDigChanDlg)

                   ON_WM_SYSCOMMAND()

                   ON_WM_PAINT()

                   ON_WM_QUERYDRAGICON()

                   ON_WM_TIMER()

                   //}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

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

// CVisualWriteDigChanDlg message handlers

 

BOOL CVisualWriteDigChanDlg::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

                   /*********************************************/

                   // DAQmx Configure Code

                   /*********************************************/

                   DAQmxErrChk (DAQmxCreateTask("",&taskHandle));

                   DAQmxErrChk (DAQmxCreateDOChan(taskHandle,"Dev1/port0/line0:7","",DAQmx_Val_ChanForAllLines));

                  

                   SetTimer(1,500,NULL);

Error:

                   Error();

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

}

 

void CVisualWriteDigChanDlg::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 CVisualWriteDigChanDlg::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();

                   }

}

 

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

//  the minimized window.

HCURSOR CVisualWriteDigChanDlg::OnQueryDragIcon()

{

                   return (HCURSOR) m_hIcon;

}

 

void CVisualWriteDigChanDlg::Error()

{

                   if( DAQmxFailed(error) )

                                      DAQmxGetExtendedErrorInfo(errBuff,2048);

                  

                   if( DAQmxFailed(error) )

                                      m_sResult.Format("DAQmx Error: %s\n",errBuff);

                   else

                                      m_sResult.Format("%x 프로그램 성공",data);

                   UpdateData(FALSE);

}

 

void CVisualWriteDigChanDlg::OnTimer(UINT nIDEvent)

{

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

                   /*********************************************/

                   // DAQmx Start Code

                   /*********************************************/

                   DAQmxErrChk (DAQmxStartTask(taskHandle));

                   DAQmxErrChk (DAQmxWriteDigitalLines(taskHandle,1,1,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL));

                   DAQmxStopTask(taskHandle);

                  

Error:

                   Error();

                   CDialog::OnTimer(nIDEvent);

}

 

BOOL CVisualWriteDigChanDlg::DestroyWindow()

{

                   // TODO: Add your specialized code here and/or call the base class

                   if( taskHandle!=0 ) {

                                      /*********************************************/

                                      // DAQmx Stop Code

                                      /*********************************************/

                                      DAQmxClearTask(taskHandle);

                   }

                   return CDialog::DestroyWindow();

}

 

arrow01c처음

   

For 문을 사용하여 1 간격 DIO0~7까지을 차례로 10번을 점등하는 프로그램을 완성하시오.