학습목표   1

학습주제   1

예습내용   1

실습방법   1

       1

중요함수   1

 

 

PLC입력제어(MASTER-K10s1)

학습목표

0.1 간격으로 PLC 입력 접점의 상태를 읽어 PC 화면에 표시한다.

학습주제

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

2.      타이머를 설정하고 0.1초로 동작 시킨다.

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

4.      타이머 함수 안에 입력포트 상태를 읽어올 문을 프로그램하여 송신한다.

5.      수신 프로그램 OnCommunication() 안에 PLC 상태를 읽어 PC 화면의 Led 표시 한다.

예습내용

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 입력되고 있다.

3.      배선은 입력의 “COM” “24V+” 연결하여 0V 입력 동작 하도록 한다.

실습방법

   

 

NumEdit Control] 선택하여 통신기기 번호를 설정하게 한다.

“Values”에서 “Discrete” 선택한다.

 

 

설정한 키의 멤버 변수 이름을 아래와 같이  “m_nMachinNo” 한다.

 

 

[Button Control] 선택하여 스위치 모양에서 Led 모양으로 변경한다.

 

 

8 Led 변수 이름을 아래와 같이 만든다.

 

 

[ClassWizard]에서 아래와 같이 타이머 함수를 만든다.

 

 

 

 

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

 

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

 

 

void CRs232Dlg::OnTimer(UINT nIDEvent)

{

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

              CString strTemp;

 

              strTemp.Format("%c%02dGP000008%c",0x05,(int)m_nMachinNo.Value,0x04);            // 입출력포트의 상태를 읽어 온다.

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

              CDialog::OnTimer(nIDEvent);

}

 

 

 

OnCommunication() 함수 안에 리턴 되어 오는 값을 체크하는 CheckInput() 함수를 만들어 입력 값을 컴퓨터에 표시한다.

CheckInput() 함수는 수신된 데이터의 해당 비트가 0인지 1인지 판단하여 해당 Led 불이 들어게 한다.

 

 

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;

              }

 

              CheckInput();

 

              if(size > 0)

                            m_Edit2.SetWindowText(buff);

              return 0;

}

 

 

void CRs232Dlg::CheckInput()

{

              if(buff[4]==0x31)

                            m_In0.Value = 1;

              else

                            m_In0.Value = 0;

 

              if(buff[5]==0x31)

                            m_In1.Value = 1;

              else

                            m_In1.Value = 0;

 

              if(buff[6]==0x31)

                            m_In2.Value = 1;

              else

                            m_In2.Value = 0;

 

              if(buff[7]==0x31)

                            m_In3.Value = 1;

              else

                            m_In3.Value = 0;

 

              if(buff[8]==0x31)

                            m_In4.Value = 1;

              else

                            m_In4.Value = 0;

 

              if(buff[9]==0x31)

                            m_In5.Value = 1;

              else

                            m_In5.Value = 0;

 

              if(buff[10]==0x31)

                            m_In6.Value = 1;

              else

                            m_In6.Value = 0;

 

              if(buff[11]==0x31)

                            m_In7.Value = 1;

              else

                            m_In7.Value = 0;

 

}

 

 

처음

   

 

중요함수