반응형

안녕하세요

 

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

 

가끔 개발 업무 하면서 피곤할때가 있는데 그럴때 가끔 애니메이션을 찾아 보게 되는데요~

 

구글로 검색을 하다가 우연히 찾게된 애니 싸이트가 있어서 공유합니다

 

이미 많은 분들이 접속하셔서 이용하고 계신거 같은데 저는 왜 이제야 알게 된걸까요?ㅎㅎ

 

주변에 이런걸 공유하고 알려주는 사람이 없다능..ㅋ

 

싸이트 주소는 

 

https://ani24zo.com/

 

Ani24

애니24,애니119,모애니,ANI.TODAY,MOENI,애니갓

ani24zo.com

 

거의 최신 애니까지 다 있는거 같아요ㅎ

 

좋은 정보는 나눔하면 좋은거니깐ㅎ

 

참고로 개인적으로 그냥 제가 알고 있는 정보를 나눔하는거라 저작권이나 불법 연계 뭐 이런게 문제 소지가 있다면

 

언제든 뎃글 남겨 주세요

 

바로 즉시 블로그 내리도록 하겠습니다!!

 

※ 상업적 공유가 아니기 때문에 문제가 될 시 바로 삭제 하겠습니다

반응형
반응형

안녕하세요

 

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

 

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

 

 

 

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

 

에러라고 합니다!!

 

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

 

알려드리겠습니다

 

 

[해결 방법]

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

 

 

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

 

 

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

 

 

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

 

 

 

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

 

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

 

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

 

 

반응형
반응형

안녕하세요

 

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

 

이번 중국 프로젝트를 진행하면서 알게된 내용입니다만 혹시 모르시는 분들이 계실까봐

 

한번 올려 봅니다ㅎㅎ

 

일반적으로 varcahr은 가변 문자열이라고 하고 nvarchar은 가변 유니코드 문자열이라고 하네요

 

그래서 프로그램 개발시에 다국어를 염두하고 있다면 MSSQL 연동시에 필드를 nvarchar를 사용해야 한다고 합니다

 

보통 영문이나 숫자는 1바이트이고 한글이나 중국 간체 등은 2바트로 구성되어지는데

 

varchar과 nvarchar의 차이가 바로 이 문자 저장 바이트 크기 차이 라고 합니다

 

소소하지만 저는 모르고 있었던 내용입니다ㅎ

 

아마 저와 같이 별거 아니지만 모르고 계셨던 분들은 이 블로그를 읽으시고 적용하시면

 

도움이 되지 않을까 싶습니다~

 

[테스트 Query 결과]

 

 

 

varchar(3)에 테스트라는 문자열을 넣었는데 길이가 1바이트 밖에 되지 않아 한자리만 출력되고 있습니다

 

그에 반면 nvarchar(3)은 3자리가 모두 출력되는 결과가 나오네요

 

무조껀 SQL 작성할때 저는 nvarchar을 사용하려고 합니다

 

반응형
반응형

안녕하세요.

 

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

 

이번 블로그 주제는 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 모델과

 

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

 

 

반응형
반응형

안녕하세요.

 

코딩연습생 입니다ㅎㅎ

 

이번 회사 프로젝트로 물류 자동이식을 구현하기 위해 사용된 RFID Reader로 OMRON RFID를 사용해 봤습니다

 

공장내에서 사용해야 하는 문제로 분진, 먼지, 충격, 온도, 등에 강성이 있는 제품을 고르다 보니 해당 제품을 사용하게

 

되었는데요

 

 

아무래도 국내에 관련 자료가 많치 않아서 고생하다가 한국어 버젼의 메뉴얼을 구하기 되어

 

블로그에 기재 합니다

 

필요하신분을 다운 받아 사용하시기 바랍니다

 

RFID Reader V680S 모델을 활용한 C# 프로그래밍은 프로젝트 완료가 되면 내용 정리해서

 

공유 하도록 하겠습니다~^^

 

※혹시 저작권이나 정보 공유 목적에 위반되는 사항이 발생하면 내리도록 하겠습니다

 

V680S_UG(SDGR-709A-01)_KO_RFID_설명서.zip
5.78MB

반응형
반응형

안녕하세요.

 

코딩 연습생입니다.

 

이번에는 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이 아닌 값이 들어오게 되면 대리자를 호출하여 처리 요청을 한뒤 바로 다름 응답코드를 수신할 수 있도록 운영합니다.

 

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

 

참고하시기 바랍니다

 

반응형

+ Recent posts