반응형

안녕하세요.

 

코딩하는남자에 코딩연습생입니다

 

이번에 회사에서 관리하는 MES 프로그램에 갑작스런 외국인 사용자가 추가 되어

 

기존 한국어/인도네시아어만 사용되고 있었는데 중국어를 추가해야 될 일이 발생했어요~

 

그래서 어떤식으로 다국어 기능을 구현할까 고민하다가 좋은 정보가 있어 블로그에 기재하게 되었습니다

 

원리는 간단합니다

 

기존 프로젝트에 언어별 Resource 파일을 추가해서 

 

컨트롤별 한국어/인도네이아어/중국어 작성해 놓고 이벤트에 따라 해당 리소스 파일의 정보를 보여주는식으로

 

구동 되어 집니다

 

 

[구현 방법]

1. 기존 프로젝트에 폴더를 삽입

   - 저는 Language라고 햇어요

     (솔루션 탐색기에서 폴더 추가하는 방법은 따로 설명하지 않을께요)

   

 

2. Language 폴더에 리소스 파일을 생성합니다

   - 리소스파일명은 개인 취향입니다 저는 Str.resx라고 했어요

     (Language폴더에서 마우스 오른쪽 버튼을 누루고 추가 새 항목 선택 후 리소스파일을 선택하면 됩니다)

   

 

  - 총 3개의 리소스 파일을 추가했습니다

    (Str.resx : 기본 리소스 파일, Str.ko-KR.resx : 한국어 리소스 파일, Str.zh-CN.resx : 중국어 리소스 파일)

 

3. 리소스 파일의 액세스 한정자 확인

   - Str.resx 기본 리소스 파일의 액세스 한정자 타입은 Internal 입니다

   

 

  - Str.ko-KR.resx와 Str.zh-CN.resx 파일의 액세스 한정자 타입은 코드 생성 안됨으로 하시면 됩니다

  (보통 생성 순서에 따르 자동 지정되니 확인만 하시면 될거 같습니다)

 

4. 디자인을 통해 언어 선택을 할 콤보박스를 생성

   - 저는 콤보박스로 했는데 이것도 개인취향이니 편하신데로 해도 되요

 

5. 콤보박스 이벤트 생성

   - comboBox1_SelectedIndexChanged 이벤트 생성하여 콤보박스의 Index가 변경될때 발생하도록 합니다

 

6. comboBox1_SelectedIndexChanged 코드 생성

   - CultureInfo 함수를 사용하기 위해서는 "using System.Globalization;" 선언문을 꼭 해주셔야 합니다

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex == 0)
            {
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("ko-KR");
                SetTextLanguage();
            }
            else if (comboBox1.SelectedIndex == 1)
            {
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("zh-CN");
                SetTextLanguage();
            }

        }

  - 언어 선택에 다른 컨트롤 변경 코드 생성

public void SetTextLanguage()
        {
            lblUSERMODE.Text = POPMachine.Language.Str.lblUSERMODE;
            label4.Text = POPMachine.Language.Str.label4;
            NAME_DATE.Text = POPMachine.Language.Str.NAME_DATE;
            button1.Text = POPMachine.Language.Str.button1;
            button3.Text = POPMachine.Language.Str.button3;
            button4.Text = POPMachine.Language.Str.button4;
            label5.Text = POPMachine.Language.Str.label5;
            label14.Text = POPMachine.Language.Str.label14;
            label2.Text = POPMachine.Language.Str.label2;
            label8.Text = POPMachine.Language.Str.label8;
            label10.Text = POPMachine.Language.Str.label10;
            label7.Text = POPMachine.Language.Str.label7;
            label9.Text = POPMachine.Language.Str.label9;
            label6.Text = POPMachine.Language.Str.label6;
            label16.Text = POPMachine.Language.Str.label16;
            label11.Text = POPMachine.Language.Str.label11;
            label13.Text = POPMachine.Language.Str.label13;
            cmdRun_WMIX_NO1.Text = POPMachine.Language.Str.cmdRun_WMIX_NO1;
            cmdRun_WMIX_NO2.Text = POPMachine.Language.Str.cmdRun_WMIX_NO2;
            cmdRun_WMIX_NO3.Text = POPMachine.Language.Str.cmdRun_WMIX_NO3;
            cmdRun_WHLOT_NO.Text = POPMachine.Language.Str.cmdRun_WHLOT_NO;
            cmdRun_WRACK_NO.Text = POPMachine.Language.Str.cmdRun_WRACK_NO;
            cmdRun_NG_SELFCHACK.Text = POPMachine.Language.Str.cmdRun_NG_SELFCHACK;
            cmdRun_WPART_CUST.Text = POPMachine.Language.Str.cmdRun_WPART_CUST;
            cmdRun_WFORM_MCPLAN.Text = POPMachine.Language.Str.cmdRun_WFORM_MCPLAN;
            cmdRun_WLOT_NO.Text = POPMachine.Language.Str.cmdRun_WLOT_NO;
            hoverGradientButton1.Text = POPMachine.Language.Str.hoverGradientButton1;
            cmdRun_WPCardScan.Text = POPMachine.Language.Str.cmdRun_WPCardScan;
            cmdRun_WStart.Text = POPMachine.Language.Str.cmdRun_WStart;
            cmdRun_WOKQty.Text = POPMachine.Language.Str.cmdRun_WOKQty;
            cmdRun_WPrint.Text = POPMachine.Language.Str.cmdRun_WPrint;
            cmdRun_WMCStopHist.Text = POPMachine.Language.Str.cmdRun_WMCStopHist;
            cmdRun_WFinish.Text = POPMachine.Language.Str.cmdRun_WFinish;
            cmdRun_WProcImage.Text = POPMachine.Language.Str.cmdRun_WProcImage;
            cmdRun_WNGQty.Text = POPMachine.Language.Str.cmdRun_WNGQty;
            cmdRun_WLPrint.Text = POPMachine.Language.Str.cmdRun_WLPrint;
            cmdRun_WWaiting.Text = POPMachine.Language.Str.cmdRun_WWaiting;
            button5.Text = POPMachine.Language.Str.button5;
            cmdRun_Workers.Text = POPMachine.Language.Str.cmdRun_Workers;
            cmdRun_WorkHist.Text = POPMachine.Language.Str.cmdRun_WorkHist;
            cmdRun_Mold.Text = POPMachine.Language.Str.cmdRun_Mold;
            cmdRun_Wheel.Text = POPMachine.Language.Str.cmdRun_Wheel;
            cmdRun_SubPartImage.Text = POPMachine.Language.Str.cmdRun_SubPartImage;
            cmdRun_PCardStatus.Text = POPMachine.Language.Str.cmdRun_PCardStatus;
            cmdRun_Video.Text = POPMachine.Language.Str.cmdRun_Video;
            cmdRun_Call.Text = POPMachine.Language.Str.cmdRun_Call;
            cmdRun_Setting.Text = POPMachine.Language.Str.cmdRun_Setting;
            cmdRun_Exit.Text = POPMachine.Language.Str.cmdRun_Exit;

        }

 

저는 해당 화면에 컨트롤이 많아 이렇게 나열했지만 좀 더 응용하면 Resource 파일을 연계하여

 

같은 종류의 컨트롤별 자동 지정되도록 구현하면 Source Code가 좀 더 깔끔해질거 같네요

 

이렇게 구현하게되면 나중에 언어가 추가 될때 당황하지 않고 Resorce파일만 추가하여 적용해주면

 

더 많은 언어들의 쉽게 적용할 수 있습니다

 

한번 도전해 보세요^^

 

감사합니다

반응형
반응형

안녕하세요

 

코딩하는남자 "코딩연습생" 입니다!!

 

간혹 비쥬얼스튜디오로 코딩하고 빌드할려는데 "lc.exe가 종료되었습니다"라는 오류가 뜰 경우가 있습니다

 

 

 

이건 소스를 복사해서 사용하실대 Properties에 있는 licenses.licx라는 파일 안에 정보가 변경되어 나타나는

 

에러라고 합니다!!

 

그래서 나는 빌드를 하고 싶은데 "lc.exe"이(가) 종료되었습니다(코드: -1) 오류가 뜰때 해결 할 수 있는 방법을

 

알려드리겠습니다

 

 

[해결 방법]

1. 솔루션 탐색기에서 Properties 밑에 있는 licenses.licx 파일 찾습니다

 

 

2. licenses.licx 파일에서 마우스 오른쪽 버튼을 눌러 "삭제"를 해주세요

 

 

3. 삭제가 된것을 확인한 후에 다시 빌드를 해주세요

 

 

4. 그럼 다음과 같이 빌드 성공이 됩니다

 

 

 

참 별것 아니지만 귀찮은 에러죠ㅎㅎ

 

프로젝트를 복사해서 이동해야 할 경우 이런 현상이 많이 발생하니 잘 알아두셨다가 

 

당황하지 마시고 조치 해서 해결하시길 바랍니다~

 

 

반응형
반응형

안녕하세요.

 

코딩하는남자의 코딩연습생입니다

 

이번 블로그 주제는 C#의 Soket 통신을 이용해서 OMRON RFID V680S 모델과 통신을 해서

 

단거리 무선 통신을 구현해볼려고 해요

 

이걸 시도하게 된 계기는 회사에서 진행되는 프로젝트 때문인데요

 

특정 바구니에 RFID Tag를 달고 임의 위치에 바구니가 사용될 때마다 Tag를 읽어들여

 

바누니의 현재 상황을 파악하기 위해 구성해봤습니다

 

현재 프로젝트의 규모는 RFID Reader 20ea + RFID Tag 80ea정도 공사가 진행되었구요

 

제가 만든 프로그램에서 20개의 Reader를 동시에 제어하여 20곳에 사용될 바구니의 정보를

 

실시간 습득합니다

 

전체 SourceCode를 Open할수 있다면 좋을거 같은데 아무래도 상용의 목적으로 구축된 부분이라

 

일부만 공개할수 있어서 아쉽습니다

 

혹시 저와 비슷한 프로그램을 목적으로 구성중이시라면 도움이 되셨으면 좋겠습니다

 

내용이 많아서 이번 블로그에서는 C#으로 소켓 통신 하는 부분만 설명 하겠습니다

 

[Source Code]

using System.Net;
using System.Net.Sockets;

 

public class AsynchronousClient
{
    private Socket rfSocket = null;
    private EndPoint rfEP;
    private ManualResetEvent connectDone = new ManualResetEvent(false);
    private ManualResetEvent DisconnectDone = new ManualResetEvent(false);
    private ManualResetEvent sendDone = new ManualResetEvent(false);
    private ManualResetEvent receiveDone = new ManualResetEvent(false);

    private string response = string.Empty;



    private int pByteSize = 0;
    private int pWordSize = 0;



public void StartClient()
{
    connectDone.Reset();
   DisconnectDone.Reset();

   try
   {
      rfSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      rfEP = new IPEndPoint(IPAddress.Parse(RFIDIP), RFIDPORT);

      connectDone.Reset();
      rfSocket.BeginConnect(rfEP, new AsyncCallback(ConnectCallback), rfSocket);
      connectDone.WaitOne();
   }
   catch (Exception e)
   {
      Console.WriteLine(e.ToString());
   }
}



private void Disconnect()
{
      if((rfSocket != null) && (rfSocket.Connected))
      {
          DisconnectDone.Reset();
          rfSocket.Shutdown(SocketShutdown.Both);
          rfSocket.BeginDisconnect(true, DisconnectCallback, rfSocket);
      }
      else
     {
         StartClient();
     }

}



private void ConnectCallback(IAsyncResult ar)
{
    connectDone.Set();

    try
    {
       Socket client = (Socket)ar.AsyncState;
       client.EndConnect(ar);

      Send();     
      Receive();
    }
    catch (Exception e)
   {
      Console.WriteLine(e.ToString());
      Disconnect();
   }
}



private void DisconnectCallback(IAsyncResult ar)
{
    DisconnectDone.Set();

    try
    {
       Socket client = (Socket)ar.AsyncState;
       client.EndDisconnect(ar);
       client.Close();
    }
    catch (Exception e)
    {
       Console.WriteLine(e.ToString());
    }

       StartClient();
}



private void Receive()
{
    try
    {
       rfSocket.BeginReceive(StateObject.buffer, 0, StateObject.BufferSize, 0,

                                    new AsyncCallback(ReceiveCallback), rfSocket);
    }
    catch (Exception e)
    {
       Console.WriteLine(e.ToString());
       Disconnect();
       return;
    }
}



private void ReceiveCallback(IAsyncResult ar)
{
    try
    {
        Socket client = (Socket)ar.AsyncState;
        client.EndReceive(ar);

    }

    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
        if (rfSocket.Connected)
           Send();
        else
           StartClient();
        return;
    }
}



private void Send()
{
     try
    {
        if ((rfSocket != null) && (rfSocket.Connected))
        {
               rfSocket.BeginSend(CurrfidCommand(), 0, CurrfidCommand().Length, 0,

                                        new AsyncCallback(SendCallback), rfSocket);
        }
    }
    catch (Exception e)
    {
       Console.WriteLine(e.ToString());
       Disconnect();
    }
}



public void Reset_Send()
{
    try
    {
         if ((rfSocket != null) && (rfSocket.Connected))
         {
                rfSocket.BeginSend(ResetCommand(), 0, ResetCommand().Length, 0,

                                         new AsyncCallback(SendCallback), rfSocket);
          }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
        Disconnect();
    }
}



private void SendCallback(IAsyncResult ar)
{
     try
    {
          Socket client = (Socket)ar.AsyncState;

          int bytesSent = client.EndSend(ar);

          sendDone.Set();

    }
    catch (Exception e)
    {
          Console.WriteLine(e.ToString());
          Disconnect();
          return;
    }
}

}

 

 

 

 

 

 

해당 위의 Source Code는 비동기식 Soket 통신입니다

 

그래서 BeginConnect(), BeginReceive(), BeginSend()를 사용합니다

 

해당 공개한 Source Code를 응용해서 비동기식 Soket 통신 모듈을 직접 개발하여 이더넷 여러 기기와

 

통신이 가능한 프로그램 제작을 시도해 보시면 좋을거 같습니다

 

이어 두번째 영상에는 현재 만들어진 비동기식 Soket 프로그램을 통해 OMRON RFID V680S 모델과

 

통신하는 방법에 대한 글을 이어서 작성하도록 하겠습니다

 

 

반응형
반응형

안녕하세요.

 

코딩 연습생입니다.

 

이번에는 C# 프로그래밍을 통해 어떤 프로세스가 실행되고 있는지 확인을 하여

 

중복실행 방지 또는 강제 프로세스 종료 Kill(PID) 등에 활용할 수 있는 프로세스 검색 하는 Source Code를

 

한번 구현해 봤어요 이미 인터넷에 많이 공개되어 있는 부분이라 특별히 소스에 대한 설명을 생략할께요

 

이 소스를 활용하여 배포시에 좀 더 안정성 있는 프로그램이 되지 않을까 싶습니다~^^

 

 

 

[C# Source Code]

using System.Diagnostics;

 

private void Confirm()

{

   Process[] processList = Process.GetProcessesByName("찾을려는 프로세스 이름");

   if(processList.Length < 1)

   {

      //프로세스가 실행되지 않고 있을때

   }

   else

   {

     //프로세스가 실행되고 있을때

   }

}

 

 

반응형
반응형

안녕하세요

 

코딩하는남자에 코딩연습생입니다~

 

간혹 프로젝트를 진행하다 보면 두개의 프로젝트를 하나의 솔루션에 합쳐서 개발해야 할 때가 발생한다

 

뭐 프로젝트 두개 실행시키는거야 어렵지 않은데...

 

한쪽의 프로젝트에서 나머지 한쪽을 제어하는듯(?)이 보여 주고 싶을 때가 있다

 

예를들면 1번 프로젝트가 실행되고 나면 자연스럽게(?) 두번째 프로젝트가 실행된다던지

 

1번 프로젝트를 종료하면 자연스럽게(?) 두번째 프로젝트가 종료되는 이런 간단한 조작이 필요할 때가 있다

 

저의 경우 ClickOnce를 주로 사용하여 배포를 하는데 이 경우 실행된 프로세스를 통해 다음과 같은

 

동작을 구현할수 있다

 

이게 좋은 방법인지 아닌지는 잘 모르겠다 하지만 필요할때가 있다

 

 

[C# Source Code]

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows.Forms;

using System.Diagnostics;

using System.Runtime.InteropServices;

using System.Threading;
namespace Ex_Process_Ctl

{

  static class Program

  {

     //이미 실행중이면 포커스

     [DllImport("user32.dll")]

     private static extern bool SerForegroundWindows(IntPtr handle);

     //이미 실행중일때 활성화

     [DllImport("user32.dll")]

     private static extern int ShowWindow(IntPtr hwnd, int nCmdShow);

     //이미 실행중일때 최상위 표시

     [DllImport("user32.dll")]

     private static extern void BringWindowToTop(IntPtr hwnd);

     //중복실행 방지

     [DllImport("user32.dll")]

     private static extern IntPtr FindWindow(string IpClassName, string IpWindowName);



    ///<summary>

   ///The main entry point for the application.

   ///</summary>

   [STAThread]

   static void Main()

   {

      try

      {

         //프로그램 중복 체크

         if(bCreated == true)

         {

            Application.EnbleVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);

            Application.Run(new frmMain());

         }

         else

         {

            foreach(Process process in Process.GetProcesses())

            {

               if(process.ProcessName == GV.ProcessName)

               {

                  ShowWindow(process.MainWindowHandle, 5);

                  BringwindowToTop(process.MainWindowHandle);

                  SetForegroundWindow(process.MainWindowHandle);

               }

            }

         }

      }

      catch(Exception Ex)

      {

          MessageBox.Show(Ex.ToString());

      }

   }

  }

}

 

반응형
반응형

안녕하세요

 

코딩하는남자의 코딩연습생입니다

 

프로그래밍을 하다보면 CallBack 함수를 사용해야 되는 상황이 발생합니다

 

예를들면 Soket통신을 구현할때 수신/응답을 비동기식으로 구현해야할 경우가 이에 해당하죠

 

Soket 통신의 원리르 보면 이더넷 환경의 장비에 응답코드를 송신하여 그에 해당하는 결과 값을 받아오게 되죠

 

이경우 두가지 형식으로 구현을 합니다 동기식/비동기식.

 

동기식은 송신후 응답코드가 수신될때까지 멈춰 대기 하게 됩니다

 

구현할려는 장비와 운영 방법에 따라 즉시 응답이 가능하다면 동기식으로 구현하는것이 맞겠죠

 

하기만 한번에 여러대의 장비와 통신을 해야 하는 경우 혹은 수신까지 걸리는 ReadTime이 길 경우에는 무한정

 

기다릴수 만은 없기 때문에 비동기식 구현 방법을 사용 합니다

 

비동기식은 동기식과 반대로 응답코드를 송신하고 수신이 올때까지 다른 대기자가 대기하고 다른 프로세스를 실행 할 수 있죠 

 

 

비동식에서 사용해야 하는 "대리자"가 바로 이번 작성할려는 주제입니다

 

CallBack 함수를 사용할려면 누군가는 항상 값을 받을 준비를 하고 있어야 합니다

 

그 대리자가 Delegate 입니다

 

이번 C#으로 RFID 통신을 구현하면서 사용한 Source Code의 일부를 가지고 설명을 해드릴께요

 

 

1. Delegate 선언

   - RFID Tag와 Reader간 통신을 하면서 Reader가 Tag의 값을 읽기 전까지 무한 대기 합니다

   - 그후 선언된 Delegate를 통해 Tag가 읽히게 되면 나머지 프로세서를 처리하게 되는 구조 입니다

   - Delegate선언 방법은 간단합니다

     

//delegate 선언
//CallBack Fucntion 타입 정의
public delegate void OnSendToRFIDDelegate(int nCmdID, byte[] bBuf, int nSize, string sDump);
public delegate void OnReceiveFromRFIDDelegate(int nCmdID, byte[] bBuf, int nSize, string sDump);
public delegate void OnAddRFIDMsgDelegate(string sMsg);
public delegate void OnRFIDExceptionDelegate();

//CallBack 호출을 위한 전역함수 정의
Public OnSendToRFIDDelegate OnSendToFRID;
public OnReceiveFromRFIDDelegate OnReceiveFromRFID;
public OnAddRFIDMsgDelegate OnAddRFIDMsg;
public OnRFIDExceptionDelegate OnRFIDException;

 

다음과 같이 Delegate를 선언하고 그 Delegate 호출을 위한 전역함수를 선언합니다

 

그리고 Soket 통신을 위한 구문을 작성하죠.

private byte[] RcvBuf = new byte[4096];
byte[] sndBuf = new byte[12];

using(Socket socket = new Socket(AddressFamily.interNetwork, SocketType.Stream, ProtocolType.Tcp))
{
	EndPoint plcEP = new IPEndPoint(IPAddress.Parse("IP주소"), 포트번호);
    
    socket.Connect(plcEP);
    socket.Send(sndBuf);
    
    //Delegate 사용
    if(OnSendToRFID != null)
    	OnSendToRFID(CurCmd, SndBuf, 12, DumpBytes(sndBuf, 12));
        
    int nRecv = 0;
    
    nRecv = socket.Receive(RcvBuf);
    
    //Delegate 사용
    if(OnReceiveFromRFID != null)
    	OnReceiveFromRFID(CurCmd, RcvBuf, nRecv, DumpBytes(RcvBuf, nRecv));
    
    socket.Close();
}

 

운영 원리는 다음과 같습니다 Socket으로 접속하여 송신 응답 메세지를 보낸뒤 대리자를 선언하여 대리자가 null이 아닐때까지 By Psss 되고 null이 아닌 값이 들어오게 되면 대리자를 호출하여 처리 요청을 한뒤 바로 다름 응답코드를 수신할 수 있도록 운영합니다.

 

해당 글은 필자가 개인적인 코딩 연습을 위한 구현이므로 실제 정의와는 다른 의미가 있을 수 있으니

 

참고하시기 바랍니다

 

반응형
반응형

안녕하세요

 

코딩하는남자의 코딩연습생입니다

 

이번 블러그에서는 C#에서 MX Component V4의 API를 이용하여 PLC와 통신할 수 있는

 

설정 방법을 다뤄보겠습니다

 

 

1. MX Conmpnent의 Communication Setup Utility를 이용해서 기본 셋팅 한다

    필자가 작성한 게시글중 MX Componnent v4 설정 방법의 게시글을 참고

 

 

2. GX Works2를 실행 및 새 프로젝트 생성해서 간단한 Ladder 코드를 작성하고 GX Simulator를 실행한다

    Ladder코드는 검색을 통해 작성하시기 바란다.

 

 

3. 비쥬얼스튜디오 2017를 실행해서 프조게트를 생성한다

   C#이든 WPF든 생성한다

   

 

 

4, 비쥬얼 스튜디오에 MX Component의 설치 경로에 있는 DLL 파일을 참조 추가 한다

ActEther.dll 은 이더넷 카드를 통해서 LAN선으로 연결하고자 할 사용 가능하다. 다만 설정할 것들이 좀 있다

ActPcUsb.dll은 CPU의 USB Port를 통해서 PLC에 접근하고자 할 때 사용할 수 있다

ActUtlType.dll은 Step1에서 설정한 내용을 기준으로 PLC에 접근이 가능하도록 해준다

 

 

 

5. 비쥬얼 스튜디오 디자인을 다음과 같이 간단하게 한다

 

6. 비쥬얼 스튜디오에서 소스를 입력한다

 

 

소스코드까지 입력하고 난뒤에 프로젝트를 실행한뒤 Logical station number 부분에 MX Component V4에서 설정한

 

station number를 입력한뒤 connect 버튼을 클릭하게 되면 우측 상단의 Connected : 부분에 현재의 PLC의 상태 값이

 

표시된다

 

정상적으로 표시가 된다면 연결에 성공하신것이다

반응형
반응형

안녕하세요

 

코딩하는남자의 코딩 연습생입니다

 

미쯔비시 PLC와 통신하기 위한 MX Componnent v4 설정방법에 대한 글을 게시햇었는데

 

GX Works2 시뮬레이션 환경 설정 방법에 대한 글이 없어 작성하게 되엇습니다

 

해당 글은 실제 미쯔비시 PLC가 없더라도 GX Works2의 시뮬레이션 환경을 통해

 

PLC의 환경을 구성해 줍니다

 

설정 방법은 아래를 참고해 주세요~

 

 

1. GX WORKS2를 설치 한다

   다운 받아서 다음 버튼을 통해 설치하면 되므로 설명은 생략

 

 

2. GX WORKS2를 실행하고 New Project를 실행해서 기본 정보를 입력해서 OK 버튼을 누른다

간단한 Ladder 코드를 자것ㅇ하고 M0가 접점이 이고, D0가 랜덤하고 값을 입력하는 코드

 

 

3. Ladder를 작성 한뒤 Debus > Start/Stop Simulation 클릭

4. 시뮬레이션 가동 상태

    처음 실행시 ERR 발생시 RESET 후 RUN 해야 함

 

 

5. 시뮬레이션 정상 가동인 상태

 

 

 

반응형

+ Recent posts