Mitsubishi PLC์™€ C# WinForms ์—ฐ๋™ ๊ฐ€์ด๋“œ ( Guide to Integrating Mitsubishi PLC with C# WinForms )

2024. 6. 14. 17:52ใ†Development๐Ÿ‘ฉ๐Ÿป‍๐Ÿฆณ/C#

 

Communication Setup Utility ๋ฅผ ์„ค์น˜ํ•œ ๋ชจ์Šต์ด๋‹ค
MITSUBISHI ActUtlType Controls Ver1.0 ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ•œ๋‹ค
์ƒ์„ธ์„ธํŒ… ๋ณ€๊ฒฝํ›„ ์—ฐ๊ฒฐ์— ์„ฑ๊ณตํ•œ ๋ชจ์Šต์ด๋‹ค

 

Testํƒญ์„ ํ†ตํ•ด ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋ฉด ๋œ๋‹ค


์ปดํฌ๋„ŒํŠธ๋ณ„๋กœ ๋ถ„๋ฅ˜๋œ C#๋ฉ”๋‰ด WindowsFormsApp์˜ ๋ชจ์Šต์ด๋‹ค
์—ฐ๊ฒฐ์„ฑ๊ณต์ฐฝ์ด๋‹ค

 



1. ActUtlType ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ๋ฐ ์„ค์ •

๋จผ์ €, PLC์™€์˜ ํ†ต์‹ ์„ ์œ„ํ•ด ActUtlType ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋กœ์ง€์ปฌ ์Šคํ…Œ์ด์…˜ ๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

csharp์ฝ”๋“œ ๋ณต์‚ฌ
private ActUtlType plc;

public Form1()
{
    InitializeComponent();
    plc = new ActUtlType();
    plc.ActLogicalStationNumber = 1; // ๋กœ์ง€์ปฌ ์Šคํ…Œ์ด์…˜ ๋ฒˆํ˜ธ ์„ค์ •
}

2. PLC ์—ฐ๊ฒฐ (Open Port)

PLC์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ btnOpenPort_Click ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ActUtlType ๊ฐ์ฒด์˜ Open ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ PLC์™€์˜ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

csharp์ฝ”๋“œ ๋ณต์‚ฌ
private void btnOpenPort_Click(object sender, EventArgs e)
{
    int result = plc.Open(); // PLC์— ์—ฐ๊ฒฐ ์‹œ๋„
    if (result == 0)
    {
        MessageBox.Show("PLC์— ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); // ์—ฐ๊ฒฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€
    }
    else
    {
        MessageBox.Show("PLC์— ์—ฐ๊ฒฐ ์‹คํŒจ: " + result.ToString()); // ์—ฐ๊ฒฐ ์‹คํŒจ ๋ฉ”์‹œ์ง€
    }
}

3. PLC ์—ฐ๊ฒฐ ์ข…๋ฃŒ (Close Port)

PLC์™€์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ btnClosePort_Click ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ActUtlType ๊ฐ์ฒด์˜ Close ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

csharp์ฝ”๋“œ ๋ณต์‚ฌ
private void btnClosePort_Click(object sender, EventArgs e)
{
    int result = plc.Close(); // PLC ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ๋„
    if (result == 0)
    {
        MessageBox.Show("PLC ์—ฐ๊ฒฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); // ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€
    }
    else
    {
        MessageBox.Show("PLC ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹คํŒจ: " + result.ToString()); // ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹คํŒจ ๋ฉ”์‹œ์ง€
    }
}

4. ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ (Read Data)

PLC์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ btnReadData_Click ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ActUtlType ๊ฐ์ฒด์˜ GetDevice ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํŠน์ • ๋ ˆ์ง€์Šคํ„ฐ(D100)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

csharp์ฝ”๋“œ ๋ณต์‚ฌ
private void btnReadData_Click(object sender, EventArgs e)
{
    int data;
    int result = plc.GetDevice("D100", out data); // D100 ๋ ˆ์ง€์Šคํ„ฐ ์ฝ๊ธฐ ์‹œ๋„
    if (result == 0)
    {
        txtReadData.Text = data.ToString(); // ์ฝ์€ ๋ฐ์ดํ„ฐ ํ…์ŠคํŠธ ๋ฐ•์Šค์— ํ‘œ์‹œ
        MessageBox.Show("์ฝ์€ ๋ฐ์ดํ„ฐ: " + data.ToString()); // ์ฝ๊ธฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€
    }
    else
    {
        MessageBox.Show("๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์‹คํŒจ: " + result.ToString()); // ์ฝ๊ธฐ ์‹คํŒจ ๋ฉ”์‹œ์ง€
    }
}

5. ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ (Write Data)

PLC์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ btnWriteData_Click ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ActUtlType ๊ฐ์ฒด์˜ SetDevice ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํŠน์ • ๋ ˆ์ง€์Šคํ„ฐ(D100)์— ๋ฐ์ดํ„ฐ๋ฅผ ์”๋‹ˆ๋‹ค.

csharp์ฝ”๋“œ ๋ณต์‚ฌ
private void btnWriteData_Click(object sender, EventArgs e)
{
    int data;
    if (int.TryParse(txtWriteData.Text, out data)) // ํ…์ŠคํŠธ ๋ฐ•์Šค์—์„œ ์ˆซ์ž ์ž…๋ ฅ ํ™•์ธ
    {
        int result = plc.SetDevice("D100", data); // D100 ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์‹œ๋„
        if (result == 0)
        {
            MessageBox.Show("๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์„ฑ๊ณต"); // ์“ฐ๊ธฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€
        }
        else
        {
            MessageBox.Show("๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์‹คํŒจ: " + result.ToString()); // ์“ฐ๊ธฐ ์‹คํŒจ ๋ฉ”์‹œ์ง€
        }
    }
    else
    {
        MessageBox.Show("์œ ํšจํ•œ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”."); // ์ž…๋ ฅ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š์Œ
    }
}

์ „์ฒด ์ฝ”๋“œ ์š”์•ฝ

์•„๋ž˜๋Š” ์ฃผ์š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํฌํ•จํ•œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

csharp์ฝ”๋“œ ๋ณต์‚ฌ
using System;
using System.Windows.Forms;
using ActUtlTypeLib; // ActUtlTypeLib ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ฐธ์กฐ

namespace PLCCommunication
{
    public partial class Form1 : Form
    {
        private ActUtlType plc;

        public Form1()
        {
            InitializeComponent();
            plc = new ActUtlType();
            plc.ActLogicalStationNumber = 1; // ๋กœ์ง€์ปฌ ์Šคํ…Œ์ด์…˜ ๋ฒˆํ˜ธ ์„ค์ •
        }

        // Open Port ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
        private void btnOpenPort_Click(object sender, EventArgs e)
        {
            int result = plc.Open(); // PLC์— ์—ฐ๊ฒฐ ์‹œ๋„
            if (result == 0)
            {
                MessageBox.Show("PLC์— ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); // ์—ฐ๊ฒฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€
            }
            else
            {
                MessageBox.Show("PLC์— ์—ฐ๊ฒฐ ์‹คํŒจ: " + result.ToString()); // ์—ฐ๊ฒฐ ์‹คํŒจ ๋ฉ”์‹œ์ง€
            }
        }

        // Close Port ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
        private void btnClosePort_Click(object sender, EventArgs e)
        {
            int result = plc.Close(); // PLC ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ๋„
            if (result == 0)
            {
                MessageBox.Show("PLC ์—ฐ๊ฒฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); // ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€
            }
            else
            {
                MessageBox.Show("PLC ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹คํŒจ: " + result.ToString()); // ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹คํŒจ ๋ฉ”์‹œ์ง€
            }
        }

        // Read Data ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
        private void btnReadData_Click(object sender, EventArgs e)
        {
            int data;
            int result = plc.GetDevice("D100", out data); // D100 ๋ ˆ์ง€์Šคํ„ฐ ์ฝ๊ธฐ ์‹œ๋„
            if (result == 0)
            {
                txtReadData.Text = data.ToString(); // ์ฝ์€ ๋ฐ์ดํ„ฐ ํ…์ŠคํŠธ ๋ฐ•์Šค์— ํ‘œ์‹œ
                MessageBox.Show("์ฝ์€ ๋ฐ์ดํ„ฐ: " + data.ToString()); // ์ฝ๊ธฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€
            }
            else
            {
                MessageBox.Show("๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์‹คํŒจ: " + result.ToString()); // ์ฝ๊ธฐ ์‹คํŒจ ๋ฉ”์‹œ์ง€
            }
        }

        // Write Data ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
        private void btnWriteData_Click(object sender, EventArgs e)
        {
            int data;
            if (int.TryParse(txtWriteData.Text, out data)) // ํ…์ŠคํŠธ ๋ฐ•์Šค์—์„œ ์ˆซ์ž ์ž…๋ ฅ ํ™•์ธ
            {
                int result = plc.SetDevice("D100", data); // D100 ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์‹œ๋„
                if (result == 0)
                {
                    MessageBox.Show("๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์„ฑ๊ณต"); // ์“ฐ๊ธฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€
                }
                else
                {
                    MessageBox.Show("๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์‹คํŒจ: " + result.ToString()); // ์“ฐ๊ธฐ ์‹คํŒจ ๋ฉ”์‹œ์ง€
                }
            }
            else
            {
                MessageBox.Show("์œ ํšจํ•œ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”."); // ์ž…๋ ฅ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š์Œ
            }
        }
    }
}

์ด ์ฝ”๋“œ๋Š” PLC์™€์˜ ํ†ต์‹ ์„ ์„ค์ •ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๋ชจ๋“  ์ฃผ์š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์„œ๋“œ์—๋Š” ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•˜์˜€์Šต๋‹ˆ๋‹ค  ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด PLC์™€์˜ ํ†ต์‹ ์ด ์ •์ƒ์ ์œผ๋กœ ์„ค์ •๋˜๊ณ  ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

C#ui์ ์šฉํ›„ plc์™€ ํ†ต์‹ ์— ์„ฑ๊ณคํ•œ ๋ชจ์Šต์ด๋‹ค


ํ†ต์‹  ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ์ „๋ฐ˜์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ๊ณผ ๋ฌผ๋ฆฌ์  ๋งค์ฒด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋œ ํ†ต์‹  ๋ฐฉ์‹์€ Mitsubishi์˜ PLC์™€ PC ๊ฐ„์˜ ํ†ต์‹ ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ActUtlType ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ CC-Link๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. CC-Link๋Š” ์‚ฐ์—… ์ž๋™ํ™” ์‹œ์Šคํ…œ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ•„๋“œ๋ฒ„์Šค ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.

(ํ•ด๋‹น๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์ง„ํ–‰ํ•  ์˜ˆ์ •) ํ†ต์‹  ๋ฐฉ์‹์˜ ์˜ˆ์‹œ: CC-Link

CC-Link (Control & Communication Link)๋Š” ๊ณ ์† ํ•„๋“œ ๋„คํŠธ์›Œํฌ๋กœ, ๋‹ค์–‘ํ•œ ์ž๋™ํ™” ๊ธฐ๊ธฐ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. CC-Link๋Š” ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  1. CC-Link Network: ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฌผ๋ฆฌ์  ๋ฐ ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ.
  2. Master-Slave ๊ตฌ์กฐ: ๋งˆ์Šคํ„ฐ ์žฅ์น˜์™€ ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜ ๊ฐ„์˜ ํ†ต์‹  ๋ฐฉ์‹. ๋งˆ์Šคํ„ฐ๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ์ œ์–ดํ•˜๊ณ  ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜์— ๋ช…๋ น์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  3. ํ†ต์‹  ํ”„๋ ˆ์ž„: ๋ฐ์ดํ„ฐ ํŒจํ‚ท์˜ ๊ตฌ์กฐ๋กœ, ์ฃผ์†Œ, ๋ช…๋ น, ๋ฐ์ดํ„ฐ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

CC-Link๋ฅผ ์‚ฌ์šฉํ•œ ํ†ต์‹  ์˜ˆ์‹œ

CC-Link๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Mitsubishi PLC์™€ PC ๊ฐ„์˜ ํ†ต์‹ ์„ ์„ค์ •ํ•˜๋Š” ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” C#๊ณผ ActUtlType ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CC-Link ๋„คํŠธ์›Œํฌ์—์„œ PLC์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

1. ActUtlType ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ๋ฐ ์„ค์ •

csharp์ฝ”๋“œ ๋ณต์‚ฌ
private ActUtlType plc;

public Form1()
{
    InitializeComponent();
    plc = new ActUtlType();
    plc.ActLogicalStationNumber = 1; // ๋กœ์ง€์ปฌ ์Šคํ…Œ์ด์…˜ ๋ฒˆํ˜ธ ์„ค์ •
}

2. PLC ์—ฐ๊ฒฐ (Open Port)

PLC์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

csharp์ฝ”๋“œ ๋ณต์‚ฌ
private void btnOpenPort_Click(object sender, EventArgs e)
{
    plc.ActLogicalStationNumber = 1; // ๋กœ์ง€์ปฌ ์Šคํ…Œ์ด์…˜ ๋ฒˆํ˜ธ ์„ค์ •
    int result = plc.Open(); // PLC์— ์—ฐ๊ฒฐ ์‹œ๋„
    if (result == 0)
    {
        MessageBox.Show("PLC์— ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); // ์—ฐ๊ฒฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€
    }
    else
    {
        MessageBox.Show("PLC์— ์—ฐ๊ฒฐ ์‹คํŒจ: " + result.ToString()); // ์—ฐ๊ฒฐ ์‹คํŒจ ๋ฉ”์‹œ์ง€
    }
}

3. ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ (Read Data)

PLC์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

csharp์ฝ”๋“œ ๋ณต์‚ฌ
private void btnReadData_Click(object sender, EventArgs e)
{
    int data;
    int result = plc.GetDevice("D100", out data); // D100 ๋ ˆ์ง€์Šคํ„ฐ ์ฝ๊ธฐ ์‹œ๋„
    if (result == 0)
    {
        txtReadData.Text = data.ToString(); // ์ฝ์€ ๋ฐ์ดํ„ฐ ํ…์ŠคํŠธ ๋ฐ•์Šค์— ํ‘œ์‹œ
        MessageBox.Show("์ฝ์€ ๋ฐ์ดํ„ฐ: " + data.ToString()); // ์ฝ๊ธฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€
    }
    else
    {
        MessageBox.Show("๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์‹คํŒจ: " + result.ToString()); // ์ฝ๊ธฐ ์‹คํŒจ ๋ฉ”์‹œ์ง€
    }
}

4. ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ (Write Data)

PLC์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

csharp์ฝ”๋“œ ๋ณต์‚ฌ
private void btnWriteData_Click(object sender, EventArgs e)
{
    int data;
    if (int.TryParse(txtWriteData.Text, out data)) // ํ…์ŠคํŠธ ๋ฐ•์Šค์—์„œ ์ˆซ์ž ์ž…๋ ฅ ํ™•์ธ
    {
        int result = plc.SetDevice("D100", data); // D100 ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์‹œ๋„
        if (result == 0)
        {
            MessageBox.Show("๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์„ฑ๊ณต"); // ์“ฐ๊ธฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€
        }
        else
        {
            MessageBox.Show("๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์‹คํŒจ: " + result.ToString()); // ์“ฐ๊ธฐ ์‹คํŒจ ๋ฉ”์‹œ์ง€
        }
    }
    else
    {
        MessageBox.Show("์œ ํšจํ•œ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”."); // ์ž…๋ ฅ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š์Œ
    }
}

์š”์•ฝ

  1. ๋ ˆ์ง€์Šคํ„ฐ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ: ํŠน์ • ๋ ˆ์ง€์Šคํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ์ž‘์—…์œผ๋กœ, ์ด๋Š” ํ†ต์‹  ๋ฐฉ์‹์˜ ์ž‘์€ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
  2. ํ†ต์‹  ๋ฐฉ์‹: CC-Link๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PLC์™€ PC ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  3. CC-Link ๋„คํŠธ์›Œํฌ: ๊ณ ์† ํ•„๋“œ ๋„คํŠธ์›Œํฌ๋กœ, ๋งˆ์Šคํ„ฐ-์Šฌ๋ ˆ์ด๋ธŒ ๊ตฌ์กฐ์™€ ํ†ต์‹  ํ”„๋ ˆ์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด CC-Link๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Mitsubishi PLC์™€ PC ๊ฐ„์˜ ํ†ต์‹ ์„ ์„ค์ •ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ต์‹  ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ์ „๋ฐ˜์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ ˆ์ง€์Šคํ„ฐ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๋Š” ๊ทธ ์ผ๋ถ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

 


 

์ž๋™ํ™” ๋ถ„์•ผ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ํ†ต์‹  ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

๊ฐ๊ฐ์˜ ํ†ต์‹  ๋ฐฉ์‹์€ ํŠน์ • ๋ชฉ์ ๊ณผ ํ™˜๊ฒฝ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ์‚ฐ์—… ์ž๋™ํ™” ์‹œ์Šคํ…œ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ฃผ์š” ํ†ต์‹  ๋ฐฉ์‹๋“ค์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

1. Ethernet/IP (Ethernet Industrial Protocol)

  • ์„ค๋ช…: Ethernet/IP๋Š” ์‚ฐ์—…์šฉ ์ด๋”๋„ท ํ”„๋กœํ† ์ฝœ๋กœ, ํ‘œ์ค€ ์ด๋”๋„ท ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฐ์—…์šฉ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ๊ณ ์† ๋ฐ์ดํ„ฐ ์ „์†ก
    • ๋Œ€๊ทœ๋ชจ ๋„คํŠธ์›Œํฌ ์ง€์›
    • CIP (Common Industrial Protocol) ๊ธฐ๋ฐ˜

2. PROFINET (Process Field Net)

  • ์„ค๋ช…: PROFINET์€ ์ง€๋ฉ˜์Šค(Siemens)์—์„œ ๊ฐœ๋ฐœํ•œ ์‚ฐ์—…์šฉ ์ด๋”๋„ท ํ‘œ์ค€์ž…๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก
    • ๊ณ ์† ๋ฐ ์ €์† ์žฅ์น˜ ๋ชจ๋‘ ์ง€์›
    • ๊ฐ•๋ ฅํ•œ ์ง„๋‹จ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ๊ธฐ๋Šฅ

3. Modbus

  • ์„ค๋ช…: Modbus๋Š” Modicon (ํ˜„์žฌ๋Š” Schneider Electric)์—์„œ ๊ฐœ๋ฐœํ•œ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ๋กœ, ์‚ฐ์—… ์ž๋™ํ™” ์‹œ์Šคํ…œ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ์˜คํ”ˆ ํ”„๋กœํ† ์ฝœ
    • ๋งˆ์Šคํ„ฐ-์Šฌ๋ ˆ์ด๋ธŒ ๊ตฌ์กฐ
    • ๋‹ค์–‘ํ•œ ๋ฌผ๋ฆฌ์  ๋งค์ฒด(RS-232, RS-485, TCP/IP) ์ง€์›

4. CC-Link (Control & Communication Link)

  • ์„ค๋ช…: CC-Link๋Š” Mitsubishi Electric์—์„œ ๊ฐœ๋ฐœํ•œ ํ•„๋“œ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ๊ณ ์† ํ†ต์‹ 
    • ์ฃผ๋กœ ์•„์‹œ์•„ ์ง€์—ญ์—์„œ ์‚ฌ์šฉ
    • ๋งˆ์Šคํ„ฐ-์Šฌ๋ ˆ์ด๋ธŒ ๊ตฌ์กฐ

5. DeviceNet

  • ์„ค๋ช…: DeviceNet์€ CAN (Controller Area Network) ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์‚ฐ์—…์šฉ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ๋น„์šฉ ํšจ์œจ์ 
    • ๊ฐ„๋‹จํ•œ ๋ฐฐ์„ 
    • ๋†’์€ ์‹ ๋ขฐ์„ฑ

6. CANopen

  • ์„ค๋ช…: CANopen์€ CAN (Controller Area Network) ๊ธฐ๋ฐ˜์˜ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ๋กœ, ์ฃผ๋กœ ์‚ฐ์—… ์ž๋™ํ™” ๋ฐ ์ œ์–ด ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ์ง€์›
    • ๋†’์€ ์‹ ๋ขฐ์„ฑ
    • ๋ณต์žกํ•œ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

7. HART (Highway Addressable Remote Transducer)

  • ์„ค๋ช…: HART๋Š” ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ์™€ ๋””์ง€ํ„ธ ์‹ ํ˜ธ๋ฅผ ๋™์‹œ์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ๊ธฐ์กด 4-20mA ์•„๋‚ ๋กœ๊ทธ ๋ฐฐ์„ ์„ ์‚ฌ์šฉ
    • ๋””์ง€ํ„ธ ํ†ต์‹  ์ถ”๊ฐ€
    • ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๊ฐ€๋Šฅ

8. Profibus (Process Field Bus)

  • ์„ค๋ช…: Profibus๋Š” ์ง€๋ฉ˜์Šค(Siemens)์—์„œ ๊ฐœ๋ฐœํ•œ ํ•„๋“œ๋ฒ„์Šค ํ”„๋กœํ† ์ฝœ๋กœ, ๊ณต์žฅ ์ž๋™ํ™” ๋ฐ ๊ณต์ • ์ž๋™ํ™”์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ๊ณ ์† ๋ฐ์ดํ„ฐ ์ „์†ก
    • ๊ฐ•๋ ฅํ•œ ์ง„๋‹จ ๊ธฐ๋Šฅ
    • ๋‹ค์–‘ํ•œ ์žฅ์น˜์™€ ํ˜ธํ™˜์„ฑ

9. AS-Interface (Actuator Sensor Interface)

  • ์„ค๋ช…: AS-Interface๋Š” ๊ฐ„๋‹จํ•œ ๋””์ง€ํ„ธ ๋ฐ ์•„๋‚ ๋กœ๊ทธ ์„ผ์„œ/์•ก์ถ”์—์ดํ„ฐ์™€ ์ œ์–ด ์‹œ์Šคํ…œ ๊ฐ„์˜ ์ €๊ฐ€ํ˜• ๋„คํŠธ์›Œํฌ์ž…๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ๊ฐ„๋‹จํ•œ ๋ฐฐ์„ 
    • ์ €๋น„์šฉ
    • ์„ค์น˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด

10. SERCOS (Serial Real-time Communication System)

  • ์„ค๋ช…: SERCOS๋Š” ์ฃผ๋กœ ๋ชจ์…˜ ์ œ์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ์‹ค์‹œ๊ฐ„ ํ†ต์‹ 
    • ๊ณ ์† ๋ฐ์ดํ„ฐ ์ „์†ก
    • ๋ชจ์…˜ ์ œ์–ด์— ์ตœ์ ํ™”

11. BACnet (Building Automation and Control Networks)

  • ์„ค๋ช…: BACnet์€ ๋นŒ๋”ฉ ์ž๋™ํ™” ๋ฐ ์ œ์–ด ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ํ‘œ์ค€ํ™”๋œ ํ”„๋กœํ† ์ฝœ
    • HVAC, ์กฐ๋ช…, ํ™”์žฌ ๊ฒฝ๋ณด ์‹œ์Šคํ…œ ํ†ตํ•ฉ
    • ์ƒํ˜ธ ์šด์šฉ์„ฑ

12. EtherCAT (Ethernet for Control Automation Technology)

  • ์„ค๋ช…: EtherCAT์€ ๊ณ ์† ์ด๋”๋„ท ๊ธฐ๋ฐ˜ ํ•„๋“œ๋ฒ„์Šค ์‹œ์Šคํ…œ์œผ๋กœ, ์ฃผ๋กœ ์‚ฐ์—… ์ž๋™ํ™”์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ๋งค์šฐ ์งง์€ ์‚ฌ์ดํด ํƒ€์ž„
    • ๋†’์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Ÿ‰
    • ์ •๋ฐ€ํ•œ ๋™๊ธฐํ™”

์š”์•ฝ

์ด๋Ÿฌํ•œ ๋‹ค์–‘ํ•œ ํ†ต์‹  ๋ฐฉ์‹๋“ค์€ ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ๊ณผ ํŠน์ • ์šฉ๋„์— ๋งž๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ํ†ต์‹  ๋ฐฉ์‹์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณ ์† ๋ฐ์ดํ„ฐ ์ „์†ก๊ณผ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ EtherCAT์ด๋‚˜ SERCOS๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹จ์ˆœํ•˜๊ณ  ์ €๋น„์šฉ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ AS-Interface๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.