학습목표   1

학습주제   1

예습내용   1

실습방법   1

       1

중요함수   1

 

 

입력 접점을 사용한 카운터 만들기

학습목표

PLC 입력포트를 카운터로 사용하고 이를 PC에서 모니터링 한다.

학습주제

1.      PLC 카운터 프로그램을 만든다..

2.      PC에서 카운터 값을 읽어 온다.

예습내용

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

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

STX01RC000101EOT

위에서 01 기기번호, R 데이터 읽기 명령, C0001 데이터 읽기의 시작번지, 01 읽을 워드단위 데이터 개수 이다.

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

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

              m_nMachinNo PLC 번호

2.      수신데이터 분석

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

STX01R0001EOT

 여기서 01 기기번호, R 읽기 명령 코드, 00001 카운터의 입력된 값이다.

실습방법

   

 

프로그램은 앞에서 학습한 프로그램을 그대로 사용한다..

 

 

카운터를 표시하기 위해 NumEdit Control 옆의 빨간 부분을 표시한다.

 

 

변수 이름은 m_nCount으로 한다.

 

 

 

 

OnInitDialog()함수 안에 SetTimer(1,500,NULL); 설정한다.

 

타이머 함수 안에서 포트의 상태를 읽어 오도록 프로그램 한다.

 

 

void CRs232Dlg::OnTimer(UINT nIDEvent)

{

              CString strTemp;

 

              strTemp.Format("%c%02dRC000101%c",0x05,(int)m_nMachinNo.Value,0x04);              // 워드단위로 카운터의 상태를 읽어 온다.

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

              CDialog::OnTimer(nIDEvent);

}

 

 

 

OnCommunication() 함수 안에 리턴 되어 오는 16진수 4개의 값을 정수로 바꾸어

    m_nCount 박스에 표시를 한다.

CharHexToInt(char in) 함수는 문자로 16진수를 10진수로 바꾸는 함수이다.

 

 

LONG CRs232Dlg::OnCommunication(UINT port, LONG lParam)

{

             

              BYTE aByte;

 

 

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

              /*

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

              {

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

                            if( aByte!= NULL ) buff[i]= aByte;

                            else { i--; size--; }

              }

              */

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

              {

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

                            if(aByte==0x06 || aByte==21)

                                           j=0;

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

                            else { j--; size--; }

 

                            if(aByte==0x04)

                                           break;

              }

 

              m_nCount.Value=CharHexToInt(buff[4])*16*16*16

                            +CharHexToInt(buff[5])*16*16+CharHexToInt(buff[6])*16

                            +CharHexToInt(buff[7]);

 

              //CheckInput();

 

              if(size > 0)

                            m_Edit2.SetWindowText(buff);

              return 0;

}

 

int CRs232Dlg::CharHexToInt(char in)

{

              if(in < 58)

                            return(in-48);

              else if(in < 71)

                            return(in-54);

              else

                            return(in-86);

 

}

 

 

다음은 완성된 프로그램으로 리턴된 16진수 R0027 10진수로 바꾸어 카운트에 표시 하였다.

 

다음은 PLC 프로그램이다.  “P00” 으로 입력을 하면 카운트가 진행된다. 그리고 카운트가 5 되면 “P10” 으로 출력이 나간다. “P01” 으로 입력을 하면 리셋된다.

새프로젝트를 선택하고 PLC “10S1” 선택한다.

아래를 선택하고 오른쪽그림과 같이 “P00” 입력한다.

아래를 선택하고 오른쪽 그림과 같이 “CTU C01 05” 입력한다.

 

아래는 완성된 프로그램이다. 입력 P00 카운터 되고 카운터 값이 5 되면 P10으로 출력이 나가고 P01 입력을 주면 리셋된다.

 

다음은 2개의 카운터 값을 입력하는 프로그램이다.

PC 프로그램

그림과 같이 카운트1 복사하여 하나 만들고 Member Variable “m_nCount2” 한다.

1개의 데이터를 읽어 오는 것을 2개의 데이터를 읽는 것으로 수정한다.

 

void CRs232Dlg::OnTimer(UINT nIDEvent)

{

              CString strTemp;

 

              //strTemp.Format("%c%02dRC000101%c",0x05,(int)m_nMachinNo.Value,0x04);                       strTemp.Format("%c%02dRC000102%c",0x05,(int)m_nMachinNo.Value,0x04);                         m_ComuPort.WriteComm((unsigned char*)(LPCTSTR)strTemp,strTemp.GetLength());

              CDialog::OnTimer(nIDEvent);

}

 

OnCommunication 함수에 2번째 데이터를 변환하는 프로그램을 추가 한다.

 

LONG CRs232Dlg::OnCommunication(UINT port, LONG lParam)

{

             

              BYTE aByte;

 

 

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

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

              {

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

                            if(aByte==0x06 || aByte==21)

                                           j=0;

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

                            else { j--; size--; }

 

                            if(aByte==0x04)

                                           break;

              }

 

              m_nCount.Value=CharHexToInt(buff[4])*16*16*16

                            +CharHexToInt(buff[5])*16*16+CharHexToInt(buff[6])*16

                            +CharHexToInt(buff[7]);

 

              m_nCount2.Value=CharHexToInt(buff[8])*16*16*16

                            +CharHexToInt(buff[9])*16*16+CharHexToInt(buff[10])*16

                            +CharHexToInt(buff[11]);

 

              if(size > 0)

                            m_Edit2.SetWindowText(buff);

              return 0;

}

 

다음은 완성된 프로그램이다.

 

처음

   

 

중요함수