학습목표   1

학습주제   1

예습내용   1

실습방법   1

       1

중요함수   1

 

 

타이머 만들기(MASTER-K10s1)

학습목표

0.5 간격으로 타이머를 동작 시켜 시간을 확인하고 컴퓨터의 설정한 시간 동안 PLC 동작 시킨다.

학습주제

1.      원격제어” 3주차 프로그램을 사용하여 프로그램한다.

2.      타이머 설정을 0.5초로 동작 시킨다.

3.      읽어올 PLC 번호를 설정한다.

4.      PLC 동작 시간을 설정한다.

5.      타이머 함수 안에 입력된 시간과 컴퓨터 시간을 비교하여 0.5 이내면 On/Off PLC 출력한다.

6.      컴퓨터에서 출력만 내보내므로 수신 프로그램 OnCommunication() 동작 프로그램을 입력할 필요가 없다.

예습내용

1.      “PLC 데이터 읽기명령문 작성

읽기 명령을 아래와 같이 보낸다.

STX01GP000008EOT

위에서 01 기기번호, G 데이터 읽기 명령, P0000 데이터 읽기의 시작번지, 08 읽을 데이터 개수 이다.

이를 프로그램 하면 아래와 같다.

              strTemp.Format("%c%02dGP000008%c",0x05,(int)m_nMachinNo.Value,0x04);          

              m_nMachinNo PLC 번호

2.      수신데이터 분석

위와 같이 보내면 수신되어 오는 데이터는 아래와 같다.

STX01G10000000EOT

 여기서 01 기기번호, G 읽기 명령 코드, 10000000 8 입력 포트 P00~P07 까지 8개의 데이터 상태로 지금은 P00 24V 연결되고 나머지 P01~P07 0V 입력되고 있다.

실습방법

   

 

 

예제1  OnInitDialog() 함수 안에 타이머 설정을 0.5(500ms) 바꾼다.

 

 

BOOL CRs232Dlg::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_ComuPort.OpenPort( "COM1", 9600, 1 );

              SetTimer(1,500,NULL);

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

}

 

 

“NumEdit Control” 선택하고 마우스 오른쪽 키를 눌러서 “Properties” 선택하여 “styles” “Time”으로 설정한다.

같은 방법으로 오른쪽 그림과 같이시작시간” “종료시간” “현재시간” 3개를 만든다.

 

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

 

시간표시

Control IDs

Member

 

 

시작시간

IDC_CWNUMEDIT1

m_StartTime

 

 

종료시간

IDC_CWNUMEDIT2

m_EndTime

 

 

현재시간

IDC_CWNUMEDIT3

m_NowTime

 

 

“OnTimer” 함수에서 현재 시간을 체크하여 설정 시간 사이에 있으면 출력 스위치의 On/Off 체크하여 상태를 출력으로 내보낸다. 다음은 함수 이다.

 

예제2  OnTimer 함수

 

 

void CRs232Dlg::OnTimer(UINT nIDEvent)

{

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

      struct _timeb timebuffer;                                           // (7)

      char *timeline;

      char Tbuf[9];

 

      _ftime( &timebuffer );

      timeline = ctime( & ( timebuffer.time ) );                     

      Tbuf[0]=timeline[11];

      Tbuf[1]=timeline[12];

      Tbuf[2]=timeline[13];

      Tbuf[3]=timeline[14];

      Tbuf[4]=timeline[15];

      Tbuf[5]=timeline[16];

      Tbuf[6]=timeline[17];

      Tbuf[7]=timeline[18];

      Tbuf[8]=0x00;

 

      // 현재 시간 계산하여 표시한다.

      m_NowTime.Value =((double)(timeline[11]-0x30)*10+(double)(timeline[12]-0x30))/24.

           +((double)(timeline[14]-0x30)*10+(double)(timeline[15]-0x30))/(24.*60.)

           +((double)(timeline[17]-0x30)*10+(double)(timeline[18]-0x30))/(24.*60.*60.);

 

      // 설정 시간 사이에 있으면 출력을 내보낸다.

      if(m_NowTime.Value>=m_StartTime.Value && m_NowTime.Value<=m_EndTime.Value)

           CheckOut();

      else {

           CString strTemp;

           strTemp.Format("%c%02dHP001006000000%c",0x05, (int)m_nMachinNo.Value,0x04);

           // P0001 에서부터 6개의 포트로 111111 비트 상태로 출력

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

      }

 

      UpdateData(FALSE);

 

      CDialog::OnTimer(nIDEvent);

}

 

 

 

처음

   

 

중요함수