:: 진공에 대해 알려주마.

PC에서 PLC ACCESS 하기 (2) 본문

진공/노하우

PC에서 PLC ACCESS 하기 (2)

하이백 2019. 12. 2. 23:52

MX Component가 설치되면 C: \MELSEC 디렉터리에 있는 아래의 두 개 파일을 사용해야 한다. 이 프로그램을 다른 PC에서 사용한다고 해도 MX Component를 해당 PC에 설치해야 한다. 

  • C:\MELSEC\Act\Control\ActEther.dll
  • C:\MELSEC\Act\Control\ActUtlType.dll

1. 선언

C# Windows Forms 응용프로그램으로 프로젝트를 생성한다. 그리고 위의 두개 파일을 참조 추가하여 참조에 등록한다.

두개의 파일을 참조에 추가한다.
화면 구성

 

2. 전역 변수 선언

위의 두개 파일을 참조에 추가하면 ActUtlTypeLib를 사용 할 수 있다.  MELSEC에서는 PLC Access를 위하여 Prog type과 Utl type 두 개 타입을 제공하는 두개의 차이는 좀더 확인  다시 설명하겠다.

// PLC 연결을 위한 정의 
ActUtlTypeLib.ActUtlType ActUtilType;

 

3. CONNECT PLC 

여기에서는 연결 버튼을 구성하였으나 프로그램 시작과 동시에 자동 연결을 원하면 아래 코드를 Form load event에 추가하면 된다.

private void btnConnect_Click(object sender, EventArgs e)
  {
    // PLC 연결을 위한 라이브러리 정의
    ActUtilType = new ActUtlTypeLib.ActUtlType();

    // 여기의 Station 번호는 MX Component에서 설정한 번호를 정의 한다.
    ActUtilType.ActLogicalStationNumber = 1;

    // PLC 연결. 리턴값이 "0"이면 성공
    int nRtn = ActUtilType.Open();
      if(nRtn == 0)
      lbMessage.Text = "PLC에 접속 성공";
  }

 

4. DISCONNECT

private void btnDisconnect_Click(object sender, EventArgs e)
{
    int nRtn = ActUtilType.Close();
    if(nRtn == 0) 
        lbMessage.Text = "PLC 접속 닫기 완료";
}    

 

5. MEMORY MAP

Memory Map을 참고하여 접근할 주소를 확인하고 프로그램에 추가한다. 여기서는 PLC가 생성하는 난수 3개를 화면에 표시하고 난수를 발생시키는 스위치를 만들어 난수의 발생과 중지를 제어한다.

6. RANDOM SWITCH

PLC Memory map에서 난수를 발생시키는 스위치 역할의 M1에 값을 On, Off 할 수 있는 버튼을 만들고 이를 이용하여 PLC의 해당 주소에 값을 쓰는 부분을 작성한다.

	private void btnRandom_Click(object sender, EventArgs e)
	{
		int plcData = 0;

		// 스위치 "M1"의 값을 읽어 0인지 1인지 판단한다.
		ActUtilType.GetDevice("M1", out plcData);
		if(plcData == 0)
		{
			ActUtilType.SetDevice("M1", 1);
			lbMessage.Text = "랜덤 발생 스위치 켜기";
		}
		else
		{ 
			ActUtilType.SetDevice("M1", 0);
			lbMessage.Text = "랜덤 발생 스위치 끄기";
		}
	}
    

 

7. GET DEVICE

Memory map의 난수 발생 주소인 W1~W3 까지를 계속 화면에 표시해 주는 함수를 작성한다.

		private void tmrUpdate_Tick(object sender, EventArgs e)
		{
			int readData1 = 0;
			int readData2 = 0;
			int readData3 = 0;

			ActUtilType.GetDevice("W1", out readData1);
			ActUtilType.GetDevice("W2", out readData2);
			ActUtilType.GetDevice("W3", out readData3);

			lbRandom1.Text = readData1.ToString();;
			lbRandom2.Text = readData2.ToString();;
			lbRandom3.Text = readData3.ToString();;
		}

 

8. REFLASH

PLC의 값은 connection 된 상태에서만 읽어 올 수 있으므로 Connect 버튼에 함수의 접속 성공 함수에 다음을 추가하고 Disconnet 직전에 timer를 끄는 명령을 추가한다.

		// PLC 연결. 리턴값이 "0"이면 성공
		int nRtn = ActUtilType.Open();
		if(nRtn == 0)
		{ 
			lbMessage.Text = "PLC에 접속 성공";
              
			// Update timer를 시작한다.
			tmrUpdate.Enabled = true;
			tmrUpdate.Interval = 100;
		}
            
            
		// Disconnect함수의 PLC접속 close 직전에 추가하여 타이머를 꺼준다.
		tmrUpdate.Enabled = false;

 

전체 코드

/////////////
using System;
using System.Windows.Forms;

namespace AccessPLC
{
	public partial class Form1 : Form
	{
		// PLC연결을 위한 정의
		ActUtlTypeLib.ActUtlType ActUtilType;

		public Form1()
		{
			InitializeComponent();
		}

		private void btnConnect_Click(object sender, EventArgs e)
		{
			// PLC 연결을 위한 라이브러리 정의
			ActUtilType = new ActUtlTypeLib.ActUtlType();

			// 여기의 Station 번호는 MX Component에서 설정한 번호를 정의 한다.
			ActUtilType.ActLogicalStationNumber = 1;

			// PLC 연결. 리턴값이 "0"이면 성공
			int nRtn = ActUtilType.Open();
			if(nRtn == 0)
			{ 
				lbMessage.Text = "PLC에 접속 성공";

				tmrUpdate.Enabled = true;
				tmrUpdate.Interval = 100;
			}
		}

		private void btnDisconnect_Click(object sender, EventArgs e)
		{
			tmrUpdate.Enabled = false;

			int nRtn = ActUtilType.Close();
			if(nRtn == 0) 
				lbMessage.Text = "PLC 접속 닫기 완료";
		}

		private void btnRandom_Click(object sender, EventArgs e)
		{
			int plcData = 0;

			// 스위치 "M1"의 값을 읽어 0인지 1인지 판단한다.
			ActUtilType.GetDevice("M1", out plcData);
			if(plcData == 0)
			{
				ActUtilType.SetDevice("M1", 1);
				lbMessage.Text = "랜덤 발생 스위치 켜기";
			}
			else
			{ 
				ActUtilType.SetDevice("M1", 0);
				lbMessage.Text = "랜덤 발생 스위치 끄기";
			}
		}

		private void tmrUpdate_Tick(object sender, EventArgs e)
		{
			int readData1 = 0;
			int readData2 = 0;
			int readData3 = 0;

			ActUtilType.GetDevice("W1", out readData1);
			ActUtilType.GetDevice("W2", out readData2);
			ActUtilType.GetDevice("W3", out readData3);

			lbRandom1.Text = readData1.ToString();;
			lbRandom2.Text = readData2.ToString();;
			lbRandom3.Text = readData3.ToString();;
		}
	}
}
//////////

 

이 프로그램이 제대로 동작하기 위해서는 아래의 순서대로 프로그램이 진행되어야 한다.

  • GX Works를 실행하고 레더를 작성 후 시뮬레이션 실행
  • MX Component의 설정
  • AccessPLC 프로그램 실행

 

AccessPLC.zip
0.03MB
LIB.zip
0.09MB

 

만일 더 많은 데이터를 읽고 쓰는 경우에는 다음의 명령을 사용하여 대량의 데이타를 한 번에 읽어와 필요한 크기로 잘라 Bit 혹은 Word 단위로 해석하여 사용해야 한다. 

 

'진공 > 노하우' 카테고리의 다른 글

모드버스  (3) 2020.04.01
RS-232 시리얼 통신  (10) 2019.12.08
PC에서 PLC ACCESS 하기 (1)  (13) 2019.09.19
RS-232 Serial 통신-3  (0) 2019.06.25
RS-232 Serial 통신-2  (0) 2019.06.19
Comments