IOT/PLC

[GX Works2] MC Protocol을 이용한 PC와 PLC 통신 (Binary)

IT 기술자 2025. 3. 28. 11:00

Q03 UDVCPU의 이더넷 포트를 이용해 PC와 통신을 하려고 한다.

이번에는 Binary 모드로 통신을 하려 한다.

Project > Parameter > PLC Parameter를 더블클릭하여 Q Parameter Setting 팝업창을 연다.

Communication Data Code를 Binary Code로 세팅한다.

 

이하 PLC 처리는 https://it-technician.tistory.com/5 이전 글을 참조한다.

 

Visual Studio 2022 > 콘솔 앱을 생성한다.

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

internal class Program
{
    private static async Task Main(string[] args)
    {
        IPAddress ipAddress = IPAddress.Parse("192.168.1.233");
        IPEndPoint ipEndPoint = new(ipAddress, 2500);

        using Socket client = new(
            ipEndPoint.AddressFamily,
            SocketType.Stream,
            ProtocolType.Tcp);

        await client.ConnectAsync(ipEndPoint);

        // Send request.
        string message = "500000FFFF03000C00100001040000881300900300";
        byte[] messageBytes = new byte[message.Length / 2];
        int index = 0;
        for (int i = 0; i < message.Length; i += 2)
        {
            string sub = message.Substring(i, 2);
            byte result = 0;
            byte.TryParse(sub, NumberStyles.HexNumber, null, out result);
            messageBytes[index++] = result;
        }
        _ = await client.SendAsync(messageBytes, SocketFlags.None);
        Console.WriteLine($"sent : \"{message}\"");

        // Receive response.
        var buffer = new byte[1_024];
        var received = await client.ReceiveAsync(buffer, SocketFlags.None);
        int dataLength = int.Parse(buffer[7].ToString(), NumberStyles.HexNumber, null);
        var receiveBuffer = new byte[8 + dataLength];
        Array.Copy(buffer, receiveBuffer, 8 + dataLength);
        string hex = BitConverter.ToString(receiveBuffer);
        var response = hex.Replace("-", "");
        Console.WriteLine($"received: \"{response}\"");

        client.Shutdown(SocketShutdown.Both);
    }
}

Program.cs 파일을 위 코드로 바꿔준다.

M5000 메모리에서 시작하여 2 워드(M5000~M5047)까지 메모리 값을 가져온다.

received의 마지막 6바이트가 메모리 값이다. (000000000000 모든 메모리 값이 0)