拙网论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 345|回复: 0

PLC Communication Using .Net

[复制链接]

949

主题

1001

帖子

3736

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3736
发表于 2018-10-24 19:46:59 | 显示全部楼层 |阅读模式
https://www.c-sharpcorner.com/Up ... nication-using-net/
https://www.codeproject.com/arti ... unication-using-net

PLC Communication Using .NET
syed shanu, 22 Jan 2015




Introduction
In this article I will explain how to communicate with PLC (Programmable Logic Controller). I started my PLC communication program using .NET from 2007.
For a basic understanding of what PLC is, use Google because basically I am not a PLC Engineer or Electrical Engineer, but I will explain to you 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 kinds of PLC available like MELSEC ,SIMENS, and etc. For each PLC communication there are different types of protocols available. In this demo program I have used TCP IP communication for MELSEC PLC.
Here I have mentioned .NET programs instead of a language in .NET. In my article you will find four Zip files:
  • SPLCSharpConnect.zip contains the PLC component DLL source code. I started PLC communication programming in 2007. At that time I was coding using VB.NET. I created my own Winsock component using VB.NET. Even now for PLC communication I am using the same Winsock component MelsecPLC.dll in my projects. In that component I have created simple functions as Connect, Disconnect, Read, Write, and a DataArrival event. In the sample project I have attached I have used the same DLL.
Before we start PLC communication programming, I'd like to explain the read and write processes in PLC communication.
Read Data from PLC
PLC Read Command: To read data from PLC we need to send the command to PLC. Basically the command we send will be like this: "500000FF03FF000018000A04010000D*0095000001";
Hide   Copy Code

String   cmd = "";cmd = cmd + "5000" ;  // sub HEAD (NOT)cmd = cmd + "00"  ;  //   network number (NOT)cmd = cmd + "FF"  ;  //PLC NUMBERcmd = cmd + "03FF" ; // DEMAND OBJECT MUDULE I/O NUMBERcmd = cmd + "00" ;  //  DEMAND OBJECT MUDULE DEVICE NUMBERcmd = cmd + "001C"  ;//  Length of demand datacmd = cmd + "000A"; //  CPU inspector datacmd = cmd + "0401"; //  Read command (to read the data from PLC we should "0401"cmd = cmd + "0000" ;//  Sub commandcmd = cmd +"D*"  ;//   device codecmd = 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 to PLC
PLC Write Command: To write data to PLC we need to send the command to PLC. Basically the command we send will be like this: "500000FF03FF00001C000A14010000D*0095010002".
Hide   Copy Code

String   cmd = ""; cmd = cmd + "5000";// sub HEAD (NOT)cmd = cmd + "00";//   network number (NOT)cmd = cmd + "FF";//PLC NUMBERcmd = cmd + "03FF";// DEMAND OBJECT MUDULE I/O NUMBERcmd = cmd + "00";//  DEMAND OBJECT MUDULE DEVICE NUMBERcmd = cmd + "001C";//  Length of demand datacmd = cmd + "000A";//  CPU inspector datacmd = cmd + "1401";//  Write commandcmd = cmd + "0000";//  Sub commandcmd = cmd + "D*";//   device codecmd = cmd + "009501"; //adBase cmd = cmd + "0002";  //BASE ADDRESS
You can see the difference, to read we use "0401" and "009500" but for write we use "1401" and "009501". The detailed code will be listed below.
Using the Code
I have attached C# sample programs for PLC communication in this article but for explanation here, Here I have used my component MelsecPLC.dll in the test project. First add MelsecPLC.dll to your project.
1. Delcare MelsecPLC.dll in the form
Hide   Copy Code

//using MelsecPLC;2. Variable declarations
Hide   Copy Code

//public MelsecPLC.Winsock winsock1; // Declare the MelsecPLC Winsock Componentstring Jig01; // To store the PLC read data.3. Connect (PLC connection)
For 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 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 detailed connect functions and DataArrival declaration in the form load are listed below.
Hide   Copy Code

//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 DataArrival event we get the actual data send by PLC after the Read signal is sent to PLC. This event will be triggered whenever PLC sends data to the PC. To get data from PLC we use the winsock1.GetData()method.
Hide   Copy Code

//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 data from PLC we need to send the signal to PLC for data read. I have explained the read functions in my article introduction. To send read signal to PLC, we use the winsock1.Send() method.
Hide   Copy Code

//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 data to PLC we need to send the signal to PLC for data write. I have explained the write functions in my article introduction. To send a write signal to PLC here we use the winsock1.Send() method.
Hide   Copy Code

//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 HMI (Human Interface Program). I have worked with several HMI programs using C#, like PLC, Sensor Programming, and NutRunner tool communication program. I want readers to benefit from this program.
History
  • Initial release: 2013/07/05.





License
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|抱朴守拙BBS

GMT+8, 2025-5-26 06:42 , Processed in 0.193317 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表