학습목표   1

학습주제   1

예습내용   1

실습방법   1

       1

중요함수   1

 

 

PLC출력제어2단계(MASTER-K10s1)

학습목표

PC 화면에서 타이머와 모드 스위치에 따라 출력을 내보내는 프로그램을 만든다.

학습주제

1.     “PLC출력제어2단계”[바로가기]에서 작성한 통신 프로그램을 사용하여 여기서부터 프로그램을 시작한다.

2.     본문의 프로그램에서는  1번의 통신프로그램에 “C언어 타이머동작"[바로가기] 프로그램을 만들고 여기에 PLC 출력을 연결하여 통신 프로그램을 완성하겠습니다.

 

예습내용

 

 

실습방법

   

 

스위치를 선택하고콘트롤이벤트에서 이미 만들어져 있는 함수는 필요가 없으므로 삭제 한다.

6 스위치 모두 삭제 한다.

스위치를 선택하고속성창의속성에서 “Led” 선택한다. 나머지 버튼도 같은 모양으로 만든다.

 

 

 

 

도구상자에서 노브를 만든다.

속성값을 그림과 같이 입력한다.

변수 이름을 “m_nTimer” 한다.

노브를 추가하고 “Caption”모드 한다.

변수 이름을 “m_nMode” 한다.

속성에서 “Discrete” 바꾼다.

 

타이머 값이 변할 실행되는 함수PointerValueChangedCwknob1을 만든다.

“CRs232Dlg” 클래스를 선택하고함수를 추가한다.

반환형식은 “void” 하고 함수이름을 “Mode0”, “Mode1”, “Mode2” 3개를 만든다.

다이어로그박스를 선택하고 타이머 함수 “OnTimer” 만든다.

“CRs232Dlg” 클래스에 “iTime” 변수를 만든다.

 

 

 

 

 

 

 

 

출력 스위치를 변화 시키면 스위치를 검사하여 통신으로 값을 보낸다.

CheckOut(); 함수는 스위치의 상태를 검사하여 통신을 보낸다.

 

 

// Rs232Dlg.cpp : 구현파일

#include "stdafx.h"

#include "Rs232.h"

#include "Rs232Dlg.h"

//============================  프로그램 생략 ==========================

// CRs232Dlg 메시지처리기

 

BOOL CRs232Dlg::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: 여기에추가초기화작업을추가합니다.

              m_ComuPort.OpenPort( "COM1", 9600, 1 );

              iTime = 0;

              SetTimer(1,m_nTimer.Value,NULL);

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

}

 

//============================  프로그램 생략 ==========================

BEGIN_EVENTSINK_MAP(CRs232Dlg, CDialog)

//            ON_EVENT(CRs232Dlg, IDC_CWBOOLEAN1, DISPID_CLICK, CRs232Dlg::ClickCwboolean1, VTS_NONE)

//ON_EVENT(CRs232Dlg, IDC_CWBOOLEAN1, 1, CRs232Dlg::ValueChangedCwboolean1, VTS_BOOL)

//ON_EVENT(CRs232Dlg, IDC_CWBOOLEAN2, 1, CRs232Dlg::ValueChangedCwboolean2, VTS_BOOL)

//ON_EVENT(CRs232Dlg, IDC_CWBOOLEAN3, 1, CRs232Dlg::ValueChangedCwboolean3, VTS_BOOL)

//ON_EVENT(CRs232Dlg, IDC_CWBOOLEAN4, 1, CRs232Dlg::ValueChangedCwboolean4, VTS_BOOL)

//ON_EVENT(CRs232Dlg, IDC_CWBOOLEAN5, 1, CRs232Dlg::ValueChangedCwboolean5, VTS_BOOL)

//ON_EVENT(CRs232Dlg, IDC_CWBOOLEAN6, 1, CRs232Dlg::ValueChangedCwboolean6, VTS_BOOL)

ON_EVENT(CRs232Dlg, IDC_CWKNOB1, 1, CRs232Dlg::PointerValueChangedCwknob1, VTS_I4 VTS_PVARIANT)

END_EVENTSINK_MAP()

 

 

void CRs232Dlg::CheckOut(void)

{

              CString strTemp;

              strTemp.Format("%c%02dHP001006%1d%1d%1d%1d%1d%1d%c",0x05,

                            (int)m_nMachinNo.Value,(int)m_Out0.Value,(int)m_Out1.Value,

                            (int)m_Out2.Value,(int)m_Out3.Value,(int)m_Out4.Value,(int)m_Out5.Value,

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

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

 

}

 

void CRs232Dlg::PointerValueChangedCwknob1(long Pointer, VARIANT* Value)

{

              // TODO: 여기에메시지처리기코드를추가합니다.

              SetTimer(1,m_nTimer.Value,NULL);

}

 

void CRs232Dlg::Mode0(void)

{

              if(iTime >= 6)

                            iTime = 0;

             

              if(iTime==0)

                            m_Out0.Value=1;

              else if(iTime==1)

                            m_Out1.Value=1;

              else if(iTime==2)

                            m_Out2.Value=1;

              else if(iTime==3)

                            m_Out3.Value=1;

              else if(iTime==4)

                            m_Out4.Value=1;

              else if(iTime==5)

                            m_Out5.Value=1;

}

 

void CRs232Dlg::Mode1(void)

{

              if(iTime >= 3)

                            iTime = 0;

             

              if(iTime==0) {

                            m_Out2.Value=1;

                            m_Out3.Value=1;

              }

              else if(iTime==1) {

                            m_Out1.Value=1;

                            m_Out4.Value=1;

              }

              else if(iTime==2) {

                            m_Out0.Value=1;

                            m_Out5.Value=1;

              }

}

 

void CRs232Dlg::Mode2(void)

{

              if(iTime >= 3)

                            iTime = 0;

             

              if(iTime==2) {

                            m_Out2.Value=1;

                            m_Out3.Value=1;

              }

              else if(iTime==1) {

                            m_Out1.Value=1;

                            m_Out4.Value=1;

              }

              else if(iTime==0) {

                            m_Out0.Value=1;

                            m_Out5.Value=1;

              }

}

 

void CRs232Dlg::OnTimer(UINT_PTR nIDEvent)

{

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

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

              // 타이머함수가실행되면iTime의값이1씩증가하며그값이6이되면

              // 다시0으로만들어0~5까지반보적으로변하게한다.

              iTime++;

              // 초기에Led를모두off하고if문을사용하여iTime의값에

              // 해당하는LedOn이되게한다.

              m_Out0.Value=0;

              m_Out1.Value=0;

              m_Out2.Value=0;

              m_Out3.Value=0;

              m_Out4.Value=0;

              m_Out5.Value=0;

 

              if(m_nMode.Value == 0)

                            Mode0();

              else if(m_nMode.Value == 1)

                            Mode1();

              else if(m_nMode.Value == 2)

                            Mode2();

 

              CheckOut();

 

              CDialog::OnTimer(nIDEvent);

}

 

 

처음

   

 

중요함수