학습목표   1

학습주제   1

예습내용   1

실습방법   1

       1

중요함수   1

 

 

HSC 단자를 사용한 고속카운터 만들기

학습목표

PLC 고속카운터(HSC) 사용하여 PC에서 모니터링한다.

학습주제

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

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

예습내용

고속카운터를 사용하여 엔코더의 값을 PC에서 읽어 옵니다. 이는 “masterk 고급교재” P120 기술된 “HSCNT” 참조하여 프로그램 하였습니다.

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

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

STX01GF014008EOT

위에서 01 기기번호, G 비트단위 데이터 읽기 명령, F0140 읽어올 메모리 번지, 08개의 데이터를 읽어 온다.

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

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

              m_nMachinNo PLC 번호

2.      수신데이터 분석

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

STX01G00001001EOT

위에서 01 기기번호, G 비트단위 데이터 읽기 명령, 00001001 읽어온 8개의 비트데이터 이다.

이는 이진수의 값으로 먼저 들어온 값이 일이 자리이다. 숫자는 아스키코드로 입력되어 이를 십진수로 바꾸어야 한다. 아래는 이를 계산한 값이다. 그러므로 계산된 값을 컴퓨터에 나타내야 한다.

 

실습방법

   

1. PLC 프로그램

다음은 프로그램과 파라메타 설정값이다. “P00” 24 입력하고 “HSC+-“ 엔코더의 “OUT A”, “OUT B” 연결하거나 “OUT A” “, 0V” 연결하여 엔코더가 회전하면 10,20,30회전 되었을 때마다 차례로 PLC OUT “P10”, “P11”, “P12” 차례로ON 된다.

아래는 설정치는 엔코더의 회전수이고 셋비트와 리셋비트는 출력 상태이다. 출력을 바꾸려면 이를 수정하면 된다. 상태에서는 30까지 카운트하고 0 리셋 됩니다.

입력조건이 ON 되면 F0140 에는 현재값 F0150에는 순서0 설정값이 나타납니다. 그러므로 통신에서는 F0140 저장된 값을 읽어 오면 현재의 카운터 값을 있습니다.

PC 에서는 아래의 프로그램은 F0140번지의 값을 G명령에 따라 비트 단위로 08개의 값을 읽어 옵니다.

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

 

 

PC 프로그램

프로그램은 지난주의 프로그램에서 소스 프로그램만 일부 수정하여 화면을 구성한다.

 

 

 

 

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

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

 

 

void CRs232Dlg::OnTimer(UINT nIDEvent)

{

              CString strTemp;

              // 입출력포트의 비트 단위로 상태를 읽어 온다.

              strTemp.Format("%c%02dGF014008%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==0x06 || aByte==21)

                                           j=0;

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

                            else { j--; size--; }

 

                            if(aByte==0x04)

                                          break;

              }

              m_nCount.Value=(buff[11]-48)*128+(buff[10]-48)*64+(buff[9]-48)*32

                            +(buff[8]-48)*16+(buff[7]-48)*8+(buff[6]-48)*4+(buff[5]-48)*2

                            +(buff[4]-48);         if(size > 0)

              m_Edit2.SetWindowText(buff);

              return 0;

}

 

 

 

처음

   

아래와 같이 리셋 값을 수정해서 PLC 프로그램을 바꾸어 봅니다. 255까지 수자가 올라 갔다. 다시 0으로 되어 회전수를 카운트 하기가 수월 합니다.

중요함수