반응형

시리얼 통신을 통해 컨트롤하는 릴레이 사용법을 알아보자.

 

 

A frame instruction is generally composed of device address, function code, register address, register data, check code, and frame length is related to the function code.
Generally, the first byte of each frame data is the device address, which can be set to 1~255. The default is 255(0xFF), and the last two bytes are the CRC check code.

- Turn on relay_1
FF 05 00 00 FF 00 99 E4
3~4 바이트: 릴레이 번호
5~6 바이트: FF00 = 릴레이 켜기, 0000 = 릴레이 끄기
마지막 두 바이트: CRC16 (명령어가 바뀔때마다 다시 계산해야 한다)

- Turn on relay_2
FF 05 00 01 FF 00 C8 24

- Turn off relay_1
FF 05 00 00 00 00 D8 14

 

- Turn off relay_2
FF 05 00 01 00 00 89 D4

- Turn on all relays
FF 0F 00 00 00 08 01 FF 30 1D

- Turn off all relays
FF 0F 00 00 00 08 01 00 70 5D

- 1번 릴레이 2초 켰다 끄기
FF 10 00 03 00 02 04 00 04 00 14 C5 9F
3~4 바이트: 릴레이 번호, 0003=1번, 0008=2번, 000D=3번, 0012=4번, 0017=5번, 001C=6번
10~11 바이트: 딜레이 시간, 10~11바이트 값에 0.1초를 곱하는 숫자가 딜레이 시간, 0014*0.1 = 20*0.1 = 2초

- 3번 릴레이 5초 켰다 끄기
FF 10 00 0D 00 02 04 00 04 00 32 C5 C9

- 3초 후 릴레이 1번 켜기 (켜져 있는 상태에서 하면 꺼졌다가 3초 후 다시 켜진다)
FF 10 00 03 00 02 04 00 02 00 1E A5 99
3~4 바이트: 릴레이 번호, 0003=1번, 0008=2번, 000D=3번, 0012=4번, 0017=5번, 001C=6번
10~11 바이트: 딜레이 시간, 10~11바이트 값에 0.1초를 곱하는 숫자가 딜레이 시간, 001E*0.1 = 30*0.1 = 3초

- 5초 후 릴레이 4번 켜기 (켜져 있는 상태에서 하면 꺼졌다가 5초 후 다시 켜진다)
FF 10 00 12 00 02 04 00 02 00 32 64 84

- Read device address
00 03 00 00 00 01 85 DB
결과로 돌아오는 값에서 5번째 바이트가 주소 (ex: FF)

- Read baud rate
FF 03 03 E8 00 01 11 A4
결과로 돌아오는 값에서 5번째 바이트가 baud rate
0x02=4,800 0x03=9,600 0x04=19,200

 

아래는 JK-SR-2 시리얼 릴레이 사용법이다.

컴퓨터에 연결할 때 JK-SR-2의 시리얼 포트(RS-232) 9핀을 분리해서 USB to UART 컨버터에 연결해 사용하지 말고 USB to RS-232/DB-9 케이블(컨버터)을 사용하자. RS-232와 UART(TTL)는 신호 레벨이 다르고(12V, 5V) 논리도(정논리, 부논리) 다르기 때문에 UART의 RX, TX, GND 핀을 연결해도 이상하게 작동한다.

실제 연결해서 확인해 보면 논리가 다르기 때문인지, 연결하자마자 아무 메세지를 보내지 않아도 끊임없이 FF값이 수신된다.(위 파란색 제품도 마찬가지일 듯..)

 

 

 

아래는 Ethernet (Wi‑Fi) Relay 설명이다.

 

I1~I8과 GND를 단락시켜서 릴레이 조작이 가능하다. (스위치를 만들 수 있을것이다)

 

relay_sdk.z01
19.53MB
relay_sdk.z02
19.53MB
relay_sdk.z03
19.53MB
relay_sdk.zip
11.20MB

 

SDK를 이용해 간단한 C# 프로그램을 만들어 보자.

우선 컴퓨터와 랜케이블로 연결하고 192.168.1.100에 접속한다. (ID, Password는 admin, admin)

Relay Connect - TCP Server가 Dingtian String으로 되어 있지 않다면 Dingtian String으로 바꾸고 Save한다. (Local Port도 60001로 바뀐다)

 

using System.Net.Sockets;
using System.Text.RegularExpressions;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 3)
            {
                string ipAddress = args[0];
                string relayNumber = args[1];
                string desiredState = args[2].ToLower();
                // IP 주소 유효성 검사
                Regex ip = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b");
                MatchCollection result = ip.Matches(ipAddress);

                if (result.Count != 0)
                {
                    if (desiredState == "on" || desiredState == "off")
                    {
                        if (relayNumber == "1" || relayNumber == "2" || relayNumber == "3" || relayNumber == "4")
                        {
                            SendTcpPacket(relayNumber, desiredState, ipAddress);
                        }
                        else
                        {
                            Console.WriteLine("Relay must be a number from 1 to 4");
                        }
                    }
                    else
                    {
                        Console.WriteLine("Invalid State informed. Please use only ON or OFF.");
                    }
                }
                else
                {
                    Console.WriteLine("Invalid IP address, please check the command and try again");
                }
            }
            else
            {
                Console.WriteLine("Use: RelayModule_CSharp_ConsoleApp [IPAddress] [RelayNumber(1~4)] [DesiredState(on/off)]");
                Console.WriteLine("Example: RelayModule_CSharp_ConsoleApp 192.168.1.100 1 on");
            }
        }

        public static bool SendTcpPacket(string relayNumber, string status, string ipAddress)
        {
            try
            {
                string text = "";
                Int32 port = 60001;
                TcpClient client = new TcpClient(ipAddress, port);

                if (relayNumber == "1")
                    if (status == "on")
                        text = "11";
                    else
                        text = "21";

                if (relayNumber == "2")
                    if (status == "on")
                        text = "12";
                    else
                        text = "22";

                if (relayNumber == "3")
                    if (status == "on")
                        text = "13";
                    else
                        text = "23";

                if (relayNumber == "4")
                    if (status == "on")
                        text = "14";
                    else
                        text = "24";

                Byte[] data = System.Text.Encoding.ASCII.GetBytes(text);
                NetworkStream stream = client.GetStream();
                stream.Write(data, 0, data.Length);
                stream.Close();
                client.Close();

                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Fail to connect to relay board. Error details: " + ex.ToString());

                return false;
            }
        }
    }
}

 

위 코드를 빌드하고 "ConsoleApp1.exe 192.168.1.100 1 on" 명령을 실행하면 1번 릴레이가 켜진다.

 

이번에는 Programming Manual 3페이지(Protocol: Dingtian String)의 명령을 직접 사용하도록 바꿔보자.

programming_manual_en.pdf
1.58MB

 

using System.Net.Sockets;
using System.Text.RegularExpressions;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 2)
            {
                string ipAddress = args[0];
                string command = args[1];
                // IP 주소 유효성 검사
                Regex ip = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b");
                MatchCollection result = ip.Matches(ipAddress);

                if (result.Count != 0)
                {
                    SendTcpPacket(ipAddress, command);
                }
            }
            else
            {
                Console.WriteLine("Use: RelayModule_CSharp_ConsoleApp [IPAddress] [Command]");
                Console.WriteLine("Example");
                Console.WriteLine("Relay 1 on: RelayModule_CSharp_ConsoleApp 192.168.1.100 11");
                Console.WriteLine("Relay 1 off: RelayModule_CSharp_ConsoleApp 192.168.1.100 21");
                Console.WriteLine("Relay 1 toggle: RelayModule_CSharp_ConsoleApp 192.168.1.100 T1");
                Console.WriteLine("All relays on: RelayModule_CSharp_ConsoleApp 192.168.1.100 1X");
                Console.WriteLine("Relay 1 on and off after 30s: RelayModule_CSharp_ConsoleApp 192.168.1.100 11:30");
            }
        }

        static void SendTcpPacket(string ipAddress, string command)
        {
            try
            {
                using (TcpClient client = new TcpClient(ipAddress, 60001))
                {
                    NetworkStream stream = client.GetStream();
                    byte[] data = System.Text.Encoding.ASCII.GetBytes(command);
                    stream.Write(data, 0, data.Length);
                    Console.WriteLine($"Sent command: {command}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error sending TCP packet: {ex.Message}");
            }
        }
    }
}

 

위 코드를 빌드하고 "ConsoleApp1.exe 192.168.1.100 11:30" 명령을 실행하면 1번 릴레이가 켜지고 30초 후 꺼진다.

 

Ethernet은 컴퓨터와 랜케이블로 연결하고 192.168.1.100에 접속하면 간단히 되는데 Wi-Fi는 어떻게 해야 할지 모르겠다. 잘 안 된다.

 

반응형
Posted by J-sean
: