六大通讯库,围攻西门子

新阁教育-喜科堂 付工原创文章编程

自动化行业,正在慢慢往软件行业靠近。编程语言

西门子PLC通讯一直都是不少人感兴趣的话题。编辑器

本文主要以C#做为编程语言,结合目前市场上经常使用的6种通讯库,分别与西门子S7-1200PLC进行通讯测试,并对测试结果进行分享。学习

通讯库简介

1、S7.NET测试

简介:S7.NET是一款开源的S7协议通讯库,支持西门子S7通讯。ui

2、Sharp7spa

简介:Sharp7与S7.NET同样,是一款.NET版本的S7通讯库。3d

3、Snap7blog

简介:Snap7是一个开源的C++通讯库,支持西门子S7通讯。string

4、Prodave

简介:Prodave是官方提供的通讯库,支持西门子PLC各类方式通讯。

5、HslCommunication

简介:HslCommunication是一个商业通讯库,涵盖各类不一样设备的通讯。

6、xktComm

简介:xktComm是一个工业通讯库,涵盖西门子、欧姆龙、三菱、基恩士等PLC,也支持Modbus及OPC通讯。

测试编写

一、首先建立了几个变量,便于随时修改,实现不一样功能测试。

 

 

二、针对各个通讯库编写通讯代码

1、S7.NET

Console.WriteLine("S7.NET通讯测试开始");
            objS7net = new Plc(CpuType.S71200, IpAddress, 0, 0);
            try
            {
                objS7net.Open();
                Console.WriteLine("S7.NET链接成功");
                sw.Restart();
                Count = 0;
                for (int i = 0; i < Times; i++)
                {
                    byte[] res = objS7net.ReadBytes(DataType.Memory, 0, 0, ReadLength);
                    if (res != null && res.Length == ReadLength)
                    {
                        Count++;
                    }
                    else
                    {
                        Console.WriteLine("S7.NET通讯测试读取失败");
                    }
                }
                Console.WriteLine("S7.NET通讯测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());
            }
            catch (Exception)
            {
                Console.WriteLine("S7.NET链接失败");
            }

2、Sharp7

Console.WriteLine("Sharp7通讯测试开始");
            int result = objSharp7.ConnectTo(IpAddress, 0, 0);
            if (result == 0)
            {
                Console.WriteLine("Sharp7链接成功");
                sw.Restart();
                for (int i = 0; i < Times; i++)
                {
                    byte[] buffer = new byte[65535];
                    result = objSharp7.MBRead(0, ReadLength, buffer);
                    if (result > 0)
                    {
                        Console.WriteLine("Sharp7通讯测试读取失败");
                    }
                    else
                    {
                        Count++;
                    }
                }
                Console.WriteLine("Sharp7通讯测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());
            }
            else
            {
                Console.WriteLine("Sharp7链接失败");
            }

3、Snap7

Console.WriteLine("Snap7通讯测试开始");
            int operateResult = objSnap7.ConnectTo(IpAddress, 0, 0);
            if (result == 0)
            {
                Console.WriteLine("Snap7链接成功");
                sw.Restart();
                for (int i = 0; i < Times; i++)
                {
                    byte[] buffer = new byte[65535];
                    result = objSnap7.MBRead(0, ReadLength, buffer);
                    if (result > 0)
                    {
                        Console.WriteLine("Snap7通讯测试读取失败");
                    }
                    else
                    {
                        Count++;
                    }
                }
                Console.WriteLine("Snap7通讯测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());
            }
            else
            {
                Console.WriteLine("Snap7链接失败");
            }

4、Prodave

 Console.WriteLine("Prodave通讯测试开始");
            short ConNr = 63; 
            string AccessPoint = "S7ONLINE";                  
            Prodave6.CON_TABLE_TYPE ConTable;
            int ConTableLen = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Prodave6.CON_TABLE_TYPE));
            int RetValue;
            List<byte> list = new List<byte>();
            foreach (var item in IpAddress.Split('.'))
            {
                list.Add(Convert.ToByte( item));
            }
            list.Add(0);
            list.Add(0);
            ConTable.Adr = list.ToArray();
            // Type of address: MPI/PB (1), IP (2), MAC (3)
            ConTable.AdrType = 2; 
            ConTable.SlotNr = 0; 
            ConTable.RackNr = 0;   
            RetValue = Prodave6.LoadConnection_ex6(ConNr, AccessPoint, ConTableLen, ref ConTable);
            if (RetValue == 0)
            {
                Console.WriteLine("Prodave链接成功");

                sw.Restart();
                for (int i = 0; i < Times; i++)
                {
                    byte[] pReadBufferM2 = new byte[(uint)ReadLength];
                    uint pDatLen = 0;
                    RetValue = Prodave6.field_read_ex6(Prodave6.FieldType.M, 0, 0, (uint)ReadLength, (uint)ReadLength, pReadBufferM2, ref pDatLen);
                    if (RetValue > 0)
                    {
                        Console.WriteLine("Prodave通讯测试读取失败");
                    }
                    else
                    {
                        Count++;
                    }
                }
                Console.WriteLine("Prodave通讯测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());
            }
            else
            {
                Console.WriteLine("Prodave链接失败");
            }

5、HslCommunication

 Console.WriteLine("HslCommunication通讯测试开始");
            objHsl = new SiemensS7Net(SiemensPLCS.S1200, IpAddress);
            var operate = objHsl.ConnectServer();
            if (operate.IsSuccess)
            {
                Console.WriteLine("HslCommunication链接成功");
                sw.Restart();
                for (int i = 0; i < Times; i++)
                {
                    operate = objHsl.Read("M0", (ushort)ReadLength);
                    if (operate.IsSuccess)
                    {
                        Count++;
                    }
                    else
                    {
                        Console.WriteLine("HslCommunication通讯测试读取失败");
                    }
                }
                Console.WriteLine("HslCommunication通讯测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());
            }
            else
            {
                Console.WriteLine("HslCommunication链接失败");
            }

6、xktComm

  Console.WriteLine("xktComm通讯测试开始");
            if (objxktComm.Connect(IpAddress, CPU_Type.S71200, 0, 0))
            {
                Console.WriteLine("xktComm链接成功");
                sw.Restart();
                Count = 0;
                for (int i = 0; i < Times; i++)
                {
                    byte[] res = objxktComm.ReadBytes(StoreType.Marker, 0, 0, ReadLength);
                    if (res != null && res.Length == ReadLength)
                    {
                        Count++;
                    }
                    else
                    {
                        Console.WriteLine("xktComm通讯测试读取失败");
                    }
                }
                Console.WriteLine("xktComm通讯测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());

            }
            else
            {
                Console.WriteLine("xktComm链接失败");
            }

测试环境

测试选择的PLC为S7-1200,型号为CPU 1214C DC/DC/DC,为排除PLC逻辑对通讯测试形成影响,PLC程序几乎为空。

循环测试

将ReadLength设置为200,Timers设置为100,即表示单次读取长度为200个字节,循环读取100次,取平均值做为通讯测试周期,结果以下所示:

 

 

从结果能够得出如下结论:

  • 基于C#与西门子PLC通讯,单次通讯时间间隔为10ms左右。

  • 从结果来看,除了Prodave以外,其他五种通讯时间几乎同样,Prodave稍长。

博图影响测试

开启TIA博图软件,并将其转至在线,以下所示:

 

 再次执行结果以下:

 

 

经过大量测试发现,通讯时间稍有增长,大约为0.4ms。

监控影响测试

建立一个监控表,打开并监控变量MD0,以下所示:

 

 再次执行结果以下:

 

 

经过大量测试发现,通讯时间增幅较大,大约为4ms。

多字节测试

将ReadLength设置为2000,Timers设置为10,即表示单次读取长度为2000个字节,循环读取10次,取平均值做为通讯测试周期,结果以下所示:

 

 

从结果能够得出如下结论:

  • 因为S7-1200的PDU为240,所以读取2000个字节耗时大约在100ms左右。

  • 从结果来看,Prodave内部没有作分包处理,若是使用,须要二次封装。

写在最后

愈来愈多的电气工程师意识到掌握一门高级语言的重要性,然而,不少人都苦于没法入门,为此,咱们特地准备了一次上位机小白职场练造营,专门针对想要学习上位机的初学者,旨于帮助更多的电气工程师突破技术瓶颈,在自动化的道路上走得更远。

相关文章
相关标签/搜索