Bootstrap

C#使用S7netPlus与PLC通讯(超简单)

前言

在这里插入图片描述

刚接到手一个项目,是开发一款程序,要和PLC有数据交互,如上图,设备发生故障后,PLC会发电报,我们收到电报后把故障显示出来,同时点击解除故障,也会给PLC发送相对应的电报。查了蛮多资料但是感觉还是无从下手(资料是挺多的,但是感觉太繁琐了,有很多地方都没有必要,比如模拟PLC环境,一连下四五个软件,我感觉没有必要。),最后问了一下我之前公司的好哥们,正好他就是做上位机的,所以跟着学会了怎么连接PLC,怎样读写数据。我这里暂时也没有PLC,所以我使用的也是仿真模拟软件:HslCommunication
在这里插入图片描述
安装包下载:

链接:https://pan.baidu.com/s/1dE3KAFUQgXJ2wRB7oWJewA 
提取码:acpk

1.引入S7netPlus包

在这里插入图片描述

2.连接

           //PLC类型 IP地址 机架号 槽号
           //这里我们使用的是仿真软件,所以默认是的IP地址是本机地址
           Plc plc = new Plc(CpuType.S7300, "127.0.0.1", 0, 0);
            try
            {
                plc.Open();
                if (plc.IsConnected == false)
                {
                    textBox1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ")+"PLC连接失败!";
                }
                else
                {
                    textBox1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ")+"PLC连接成功!";
                }
            }
            catch (Exception ex)
            {
                textBox1.Text = ex.Message;
            }

效果图如下:
在这里插入图片描述
在这里插入图片描述
这样就连接上了,真实情况下的PLC也可以连接上。

3.读取数据

我这里写的比较多,是因为我专门写了个Demo来测试连接、读写的。

///代码中用到三种数据获取方式: DBX、DBW、DBD,深入理解的可以查一下网上资料
            ///简单理解就是 DBX读取位,比如bool类型;DBW读取字;DBD读取数值
            ///注释中是对应的 TIA Portal 数据块类型
            var db1Bool1 = (bool)plc.Read("DB1.DBX0.0");
            Console.WriteLine("DB1.DBX0.0: " + db1Bool1);

            bool db1Bool2 = (bool)plc.Read("DB1.DBX0.1");
            Console.WriteLine("DB1.DBX0.1: " + db1Bool2);

            // Int
            int intVariable = (ushort)plc.Read("DB1.DBW2.0");
            Console.WriteLine("DB1.DBW2.0: " + intVariable);
            // Real
            var realVariabl = ((uint)plc.Read("DB1.DBD4.0")).ConvertToFloat();
            Console.WriteLine("DB1.DBD4.0: " + realVariabl);
            // DInt
            var dIntVariable = (uint)plc.Read("DB1.DBD8.0");
            Console.WriteLine("DB1.DBD8.0: " + dIntVariable);
            // DWord
            var dWordVariable = (uint)plc.Read("DB1.DBD12.0");
            Console.WriteLine("DB1.DBD12.0: " + dWordVariable);
            // Word
            var wordVariable = (ushort)plc.Read("DB1.DBW16.0");
            Console.WriteLine("DB1.DBW16.0: " + wordVariable);

拿DB1.DBD12.0来举例:

var dWordVariable = (uint)plc.Read("DB1.DBD12.0");
textBox1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ")+"DB1.DBD12.0读取值为:"+dWordVariable ;

在这里插入图片描述
我们可以看到在软件里面这个程序块的值是123456,那么我们接下来用程序试一下。
在这里插入图片描述
很完美,读取到了这个模块里的值。

4.写入数据

 plc.Write("DB1.DBD12.0", 123457);

一行写入,简单到爆炸,那么我们验证下效果。
在这里插入图片描述
写入成功!是不是超级简单。

;