학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

디지털 포트의 입력

학습목표

디지털포트의 입력을 이해하고 이를 센서 계측에 활용한다.

학습주제

스위치의 입력에 따라 Led 불이 들어 온다.

예습내용

아래와 같이 입력보드를 만든다.

실습방법

   

1. 입력 보드의 연결    1

2. 프로그램 작성    1

1. 입력 보드의 연결

보드의 입력 스위치는 평상시응 5V 입력되고 스위치를 누르면 0V 입력된다.

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

2

4

6

8

10

1

3

5

7

9

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

 

상위비트

하위비트

 

스위치

Dp

g

f

E

d

c

b

a

입력

보드핀이름

P1.0

P1.1

P1.2

P1.3

P1.4

P1.5

P1.6

P1.7

 

보드핀번호

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. 프로그램 작성

다음은 “C:/Program Files/National Instruments/NI-DAQ/Examples/DAQmx ANSI C/Digital/Read Values/Read Dig Chan ” 프로그램을 나타낸 것이다. 이는 에러 함수를 제거하여 간단히 프로그램이다. 입력은 배열 data[8] 들어온다.

//ANSI C Example program: ReadDigChan.c

#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[100];

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

        int32           i;

        int32           read,bytesPerSamp;

 

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

        // DAQmx Configure Code

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

        DAQmxCreateTask("",&taskHandle);

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

 

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

        // DAQmx Start Code

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

        DAQmxStartTask(taskHandle);

 

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

        // DAQmx Read Code

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

        DAQmxReadDigitalLines(taskHandle,1,10.0,DAQmx_Val_GroupByChannel,data,100,&read,&bytesPerSamp,NULL);

 

        // assuming 8 channels acquired

        for(i=0;i<8;++i)

                printf("Data acquired, channel %d: 0x%X\n",i,data[i]);

        if( taskHandle!=0 ) {

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

                // DAQmx Stop Code

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

                DAQmxStopTask(taskHandle);

                DAQmxClearTask(taskHandle);

        }

        getchar();

               

        return 0;

}

 

 

이제 비쥬얼 프로그램을 만들어 보겠습니다.

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

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

이후 나머지는 기본값으로 선택하고 “Finish” 선택한다.

 

화면 오른쪽의도구상자 “Button” 선택하여 다이어로그 박스에 만든다.

 

속성속성페이지에서 버튼의 모양을 Led 형태로 바꾼다. 과정으로 8개를 만든다.

Led0 선택한 마우스 오른쪽 버튼을 눌러벼수를 추가한다. 

Led 8개를 m_led0~m_led7 가지 반복하면 그림과 같이 클래스에 변수가 추가되어 있는 것을 있다.

다이어로그 박스를 선택한 후에속성메시지 선택하고 “WM_TIMER” “OnTimer” 함수를 만든다.

타이머를 0.5초마다 동작시켜서 읽어 오겠습니다.

ReadDigChanDlg.h : 헤더파일에 아래를 선언한다.

// CReadDigChanDlg 대화상자

class CReadDigChanDlg : public CDialog

{

// 생성입니다.

public:

        CReadDigChanDlg(CWnd* pParent = NULL);   // 표준생성자입니다.

 

// 대화상자데이터입니다.

        enum { IDD = IDD_READDIGCHAN_DIALOG };

 

        protected:

        virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.

 

 

// 구현입니다.

protected:

        HICON m_hIcon;

 

private:

    std::auto_ptr<CNiDAQmxTask> m_task;

    std::auto_ptr<CNiDAQmxDigitalSingleChannelReader> m_reader;

 

        // 생성된메시지맵함수

        virtual BOOL OnInitDialog();

        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

        afx_msg void OnPaint();

        afx_msg HCURSOR OnQueryDragIcon();

        DECLARE_MESSAGE_MAP()

 

아래 값을 초기 선언 한다.

BOOL CReadDigChanDlg::OnInitDialog()

{

        CDialog::OnInitDialog();

 

        // 시스템메뉴에"정보..." 메뉴항목을추가합니다.

 

        // IDM_ABOUTBOX는시스템명령범위에있어야합니다.

        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);

                }

        }

 

        // 이대화상자의아이콘을설정합니다. 응용프로그램의주창이대화상자가아닐경우에는

        //  프레임워크가이작업을자동으로수행합니다.

        SetIcon(m_hIcon, TRUE);                  // 큰아이콘을설정합니다.

        SetIcon(m_hIcon, FALSE);         // 작은아이콘을설정합니다.

 

        // TODO: 여기에추가초기화작업을추가합니다.

        // Create the task

        m_task = std::auto_ptr<CNiDAQmxTask>(new CNiDAQmxTask());

 

        // Create the digital input channel

        m_task->DIChannels.CreateChannel(

            "Dev1/port0/line0:7",

            "",

            DAQmxOneChannelForAllLines);

        // Create the reader

        m_reader = std::auto_ptr<CNiDAQmxDigitalSingleChannelReader>(new CNiDAQmxDigitalSingleChannelReader(m_task->Stream));

 

        // Enable the timer

        SetTimer(1, 500, NULL);

 

        return TRUE;  // 포커스를컨트롤에설정하지않으면TRUE를반환합니다.

}

 

 

OnTimer 함수에 아래를 프로그램한다.

void CReadDigChanDlg::OnTimer(UINT_PTR nIDEvent)

{

        // TODO: 여기에메시지처리기코드를추가및/또는기본값을호출합니다.

        CNiBoolVector readData(8);

       

        // Read the digital channel

        m_reader->ReadSingleSampleMultiLine(readData);

 

        // Led로출력을내보낸다.

        // 0V에서On이됨으로10으로00이아닌값으로

        m_led0.Value = readData[0]-1;

       m_led1.Value = readData[1]-1;

       m_led2.Value = readData[2]-1;

       m_led3.Value = readData[3]-1;

       m_led4.Value = readData[4]-1;

       m_led5.Value = readData[5]-1;

       m_led6.Value = readData[6]-1;

       m_led7.Value = readData[7]-1;

 

        CDialog::OnTimer(nIDEvent);

}

 

arrow01c처음

   

시작, 정지 버튼을 만들어 입력을 이에 따라 동작하도록 프로그램 하시오.