六大通訊庫,圍攻西門子

新閣教育-喜科堂 付工原創文章編程

自動化行業,正在慢慢往軟件行業靠近。編程語言

西門子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內部沒有作分包處理,若是使用,須要二次封裝。

寫在最後

愈來愈多的電氣工程師意識到掌握一門高級語言的重要性,然而,不少人都苦於沒法入門,爲此,咱們特地準備了一次上位機小白職場練造營,專門針對想要學習上位機的初學者,旨於幫助更多的電氣工程師突破技術瓶頸,在自動化的道路上走得更遠。

相關文章
相關標籤/搜索