Reader Level:
ARTICLE

PLC Communication Using .Net

Posted by Syed Shanu Articles | Visual Studio July 05, 2013
This article explains how to communicate with a Programmable Logic Controller (PLC).
  • 0
  • 0
  • 10739
Download Files:
 

PLC-Communication-Using -Net.jpg

Introduction

This article explains how to communicate with a Programmable Logic Controller (PLC). I started my PLC communication in 2007. Since then I have developed several programs for PLC Communication using .Net.

For basic understanding of what is PLC use Google, because basically iam not a PLC Engineer or Electrical Engineer, but I will explain to you about how to connect PLC using .NET programs, how to read data from PLC, and how to write data to PLC. My sample programs are all based on MELSEC PLC using TCP/IP Communication.

There are different Kind of PLC available like MELSEC ,SIMENS and etc,For each PLC Communication there are different type of protocols available. Today in this demo program I have used TCP IP Communication for MELSEC PLC.

Here I said .Net Programs instead of any language of .Net. Yes that means that attached to this article are 4 ZIP files.

  1. ShanuMelsecPLCComponent.ZIP contains PLC Component DLL Source code. I started this PLC Communication program in 2007. At that time I was coding using VB.Net. I created my own Winsock component using VB.Net, I am still using that Winsock component MelsecPLC.dll in my projects for PLC Communication. In that component I have a simple function for Connect, Disconnect, Read, Write and DataArrival Events. In my sample project that I have attached I have also used the same DLL.
  2. ShanuPLCC#.NetSample.ZIP contains a C# Sample program to demonstrate how to Connect, Read and Write to PLC using my MelsecPLC.dll.
  3. ShanuPLCVB.NetSample.ZIP contains a VB.NET Sample program to demonstrate how to Connect, Read and Write to PLC using my MelsecPLC.dll
  4. ShanuPLCWPF.Net.ZIP contains a WPF Sample program to demonstrate how to Connect, Read and Write to PLC using my MelsecPLC.dll

Before we start PLC Communication Programming, I would like to explain the read and write process in PLC Communication.

Read Data from PLC

PLC Read Command: To read the data from PLC we need to send the command to PLC, basically the command we send will be like this "500000FF03FF000018000A04010000D*0095000001";

String   cmd = "";

cmd = cmd + "5000"// sub HEAD (NOT)

cmd = cmd + "00"  ;  //   network number (NOT)

cmd = cmd + "FF"  ;  //PLC NUMBER

cmd = cmd + "03FF" ; // DEMAND OBJECT MUDULE I/O NUMBER

cmd = cmd + "00"//  DEMAND OBJECT MUDULE DEVICE NUMBER

cmd = cmd + "001C"  ;//  Length of demand data

cmd = cmd + "000A"; //  CPU inspector data

cmd = cmd + "0401"; //  Read command (to read the data from PLC we should "0401"

cmd = cmd + "0000" ;//  Sub command

cmd = cmd +"D*"  ;//   device code

cmd = cmd + "009500"; //adBase

cmd = cmd + "0001"//Device No ,It's a Address every PLC device will have an address we need to send the appropriate address to read the data.

Write Data from PLC

PLC Write Command: To write the data to PLC we need to send the command to PLC, basically the command we send will be like this: "500000FF03FF00001C000A14010000D*0095010002"

String   cmd = "";

cmd = cmd + "5000";// sub HEAD (NOT)

cmd = cmd + "00";//   network number (NOT)

cmd = cmd + "FF";//PLC NUMBER

cmd = cmd + "03FF";// DEMAND OBJECT MUDULE I/O NUMBER

cmd = cmd + "00";//  DEMAND OBJECT MUDULE DEVICE NUMBER

cmd = cmd + "001C";//  Length of demand data

cmd = cmd + "000A";//  CPU inspector data

cmd = cmd + "1401";//  Write command

cmd = cmd + "0000";//  Sub command

cmd = cmd + "D*";//   device code

cmd = cmd + "009501"; //adBase

cmd = cmd + "0002"//BASE ADDRESS

You can see the difference. To read we use "0401" and "009500" but for the write we use "1401" and "009501". The detailed code will be listed below.
 
Using the Code

I have attached VB.Net, C# and WPF sample programs for the PLC Communication to this article but as an explanation here I have used C# code.

Here I have used my Component MelsecPLC.dll in my test project. First add the MelsecPLC.dll to your project.

1. Delcare MelsecPLC.dll in form

using MelsecPLC;

2. Variable Declarations

public MelsecPLC.Winsock winsock1; // Declare the MelsecPLC Winsock Component

string Jig01; // To store the PLC read data.

3. Connect (PLC Connection).

For the connection we need the PLC IP Address. Here my PLC IP Address is "10.126.224.221". Enter the Local port and Remote port. Here I have used "1027" for the local port and "8000" for the remote port.

In the form load we call the PLC Connect function and we create a MelsecPLC DataArrival event. The DataArrival event will be triggered when PLC sends data to the PC (our computer).
 
The details of the connect functions and DataArrival declaration in the form load follows:
 

private
void Form1_Load(object sender, EventArgs e)

{

    winsock1Connect();

    winsock1.DataArrival += new MelsecPLC.Winsock.DataArrivalEventHandler(winsock1_DataArrival);

    timer1.Enabled = true;

    timer1.Start();

}

 

private void winsock1Connect()

{

   try

   {

        if (winsock1.GetState.ToString() != "Connected")

        {

 

            winsock1.LocalPort = 1027;

            winsock1.RemoteIP ="10.126.224.221";

            int a = 8000;

            winsock1.RemotePort = 8000;

            winsock1.Connect();

        }

   }

   catch (Exception ex)

   {

   }

}

4.DataArrival Event
 

In the Data Arrival Event we get the actual data sent by the PLC after a Read Signal is sent to the PLC.

This event will be triggered whenever the PLC sends data to the PC. To get the data from the PLC we use the winsock1.GetData() method.

private void winsock1_DataArrival(MelsecPLC.Winsock sender, int BytesTotal)

{

    String s = String.Empty;

    winsock1.GetData(ref s);

    Jig01 = s;

}
  
5. Read Data From PLC

To read the data from the PLC we need to send the signal to the PLC for readiing the data. I have explained the read functions in my Article Introduction.

To send a read signal to the PLC we use the winsock1.Send() Method as in the following:

 
private void btnRead_Click(object sender, EventArgs e)

 {

      if (winsock1.GetState.ToString() != "Connected")

      {

          winsock1Connect();

      }

      //String cmd = "500000FF03FF000018000A04010000D*0095000001";

      String cmd = "";

      String OutAddress = "0001";

      cmd = "";

      cmd = cmd + "5000" ;// sub HEAD (NOT)

      cmd = cmd + "00"  ;//   network number (NOT)

      cmd = cmd + "FF"  ;//PLC NUMBER

      cmd = cmd + "03FF"   ;// DEMAND OBJECT MUDULE I/O NUMBER

      cmd = cmd + "00"  ;//  DEMAND OBJECT MUDULE DEVICE NUMBER

      cmd = cmd + "001C"  ;//  Length of demand data

      cmd = cmd + "000A";//  CPU inspector data

      cmd = cmd + "0401";//  Read command

      cmd = cmd + "0000" ;//  Sub command

      cmd = cmd +"D*"  ;//   device code

      cmd = cmd + "009500"; //adBase

      cmd = cmd + OutAddress;  //BASE ADDRESS          

      winsock1.Send(cmd);        

  }


6. Write Data to PLC

To write the data to the PLC we need to send the signal to the PLC to write the data. I have explained the write functions in my Article Introduction.

To send a write signal to the PLC we use the winsock1.Send() Method as in the following:

private void btnWrite_Click(object sender, EventArgs e)

{

     if (winsock1.GetState.ToString() != "Connected")

     {

         winsock1Connect();

     }     

     String cmd = "";

     String OutAddress = txtWrite.Text.Trim();

     cmd = "";

     cmd = cmd + "5000";// sub HEAD (NOT)

     cmd = cmd + "00";//   network number (NOT)

     cmd = cmd + "FF";//PLC NUMBER

     cmd = cmd + "03FF";// DEMAND OBJECT MUDULE I/O NUMBER

     cmd = cmd + "00";//  DEMAND OBJECT MUDULE DEVICE NUMBER

     cmd = cmd + "001C";//  Length of demand data

     cmd = cmd + "000A";//  CPU inspector data

     cmd = cmd + "1401";//  Write command

     cmd = cmd + "0000";//  Sub command

     cmd = cmd + "D*";//   device code

     cmd = cmd + "009501"; //adBase

     cmd = cmd + OutAddress;  //BASE ADDRESS

     winsock1.Send(cmd);

}

Points of Interest

I love to work and play with the Human Interface Program (HMI). I have worked with several HMI programs using C# .Net like PLC, Sensor Programing and Nutrunner tool communication Program. I want the end users reading this article to benefit by this program.

COMMENT USING

Trending up