完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文主要以C#作为编程语言,结合目前市场上常用的6种通信库,分别与西门子S7-1200PLC进行通信测试,并对测试结果进行分享。
通信库简介 一、S7.NET 简介:S7.NET是一款开源的S7协议通信库,支持西门子S7通信。 二、Sharp7 简介:Sharp7与S7.NET一样,是一款.NET版本的S7通信库。 三、Snap7 简介:Snap7是一个开源的C++通信库,支持西门子S7通信。 四、Prodave 简介:Prodave是官方提供的通信库,支持西门子PLC各种方式通信。 五、HslCommunication 简介:HslCommunication是一个商业通信库,涵盖各种不同设备的通信。 六、xktComm 简介:xktComm是一个工业通信库,涵盖西门子、欧姆龙、三菱、基恩士等PLC,也支持Modbus及OPC通信。 测试编写 1、首先创建了几个变量,便于随时修改,实现不同功能测试。 2、针对各个通信库编写通信代码 一、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连接失败”); } 二、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连接失败”); } 三、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连接失败”); } 四、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连接失败”); } 五、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连接失败”); } 六、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内部没有做分包处理,如果使用,需要二次封装。 写在最后 越来越多的电气工程师意识到掌握一门高级语言的重要性,然而,很多人都苦于无法入门,为此,我们特意准备了一次上位机小白职场练造营,专门针对想要学习上位机的初学者,旨于帮助更多的电气工程师突破技术瓶颈,在自动化的道路上走得更远。 |
|
|
|
只有小组成员才能发言,加入小组>>
890浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 19:16 , Processed in 0.480724 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号