首页 > 行业资讯 > 六种通信库与西门子S7-1200PLC进行通信测试

六种通信库与西门子S7-1200PLC进行通信测试

时间:2023-01-18 来源: 浏览:

六种通信库与西门子S7-1200PLC进行通信测试

电工电气学习
电工电气学习

dian_gon

专业电工电气领域自媒体,不容错过。电工电气学习必关注,我们始终专注于电工电气行业全方位信息,与您分享干货,助力行业发展!

收录于合集
微信搜一搜
电工电气学习

自动化行业,正在慢慢往软件行业靠近。 西门子PLC通信一直都是很多人感兴趣的话题。 本文主要以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、首先创建了几个变量,便于随时修改,实现不同功能测试。

[td]
序号
名称
说明
默认值
1 ReadLength 读取字节长度 200
2 Timers 循环读取次数 100
3 IpAddress PLC的IP地址 192.168.1.33

2、针对各个通信库编写通信代码

一、S7.NET
  1.             Console.WriteLine("S7.NET通信测试开始");

  2.             objS7net = new Plc(CpuType.S71200, IpAddress, 0, 0);

  3.             try

  4.             {

  5.                 objS7net.Open();

  6.                 Console.WriteLine("S7.NET连接成功");

  7.                 sw.Restart();

  8.                 Count = 0;

  9.                 for (int i = 0; i < Times; i++)

  10.                 {

  11.                     byte[] res = objS7net.ReadBytes(DataType.Memory, 0, 0, ReadLength);

  12.                     if (res != null && res.Length == ReadLength)

  13.                     {

  14.                         Count++;

  15.                     }

  16.                     else

  17.                     {

  18.                         Console.WriteLine("S7.NET通信测试读取失败");

  19.                     }

  20.                 }

  21.                 Console.WriteLine("S7.NET通信测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());

  22.             }

  23.             catch (Exception)

  24.             {

  25.                 Console.WriteLine("S7.NET连接失败");

  26.             }

复制代码
二、Sharp7
  1.   Console.WriteLine("Sharp7通信测试开始");

  2.             int result = objSharp7.ConnectTo(IpAddress, 0, 0);

  3.             if (result == 0)

  4.             {

  5.                 Console.WriteLine("Sharp7连接成功");

  6.                 sw.Restart();

  7.                 for (int i = 0; i < Times; i++)

  8.                 {

  9.                     byte[] buffer = new byte[65535];

  10.                     result = objSharp7.MBRead(0, ReadLength, buffer);

  11.                     if (result > 0)

  12.                     {

  13.                         Console.WriteLine("Sharp7通信测试读取失败");

  14.                     }

  15.                     else

  16.                     {

  17.                         Count++;

  18.                     }

  19.                 }

  20.                 Console.WriteLine("Sharp7通信测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());

  21.             }

  22.             else

  23.             {

  24.                 Console.WriteLine("Sharp7连接失败");

  25.             }

复制代码
      三、Snap7
  1.   Console.WriteLine("Snap7通信测试开始");

  2.             int operateResult = objSnap7.ConnectTo(IpAddress, 0, 0);

  3.             if (result == 0)

  4.             {

  5.                 Console.WriteLine("Snap7连接成功");

  6.                 sw.Restart();

  7.                 for (int i = 0; i < Times; i++)

  8.                 {

  9.                     byte[] buffer = new byte[65535];

  10.                     result = objSnap7.MBRead(0, ReadLength, buffer);

  11.                     if (result > 0)

  12.                     {

  13.                         Console.WriteLine("Snap7通信测试读取失败");

  14.                     }

  15.                     else

  16.                     {

  17.                         Count++;

  18.                     }

  19.                 }

  20.                 Console.WriteLine("Snap7通信测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());

  21.             }

  22.             else

  23.             {

  24.                 Console.WriteLine("Snap7连接失败");

  25.             }

复制代码
四、Prodave
  1. Console.WriteLine("Prodave通信测试开始");

  2.             short ConNr = 63;

  3.             string AccessPoint = "S7ONLINE";                  

  4.             Prodave6.CON_TABLE_TYPE ConTable;

  5.             int ConTableLen = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Prodave6.CON_TABLE_TYPE));

  6.             int RetValue;

  7.             List<byte> list = new List<byte>();

  8.             foreach (var item in IpAddress.Split(’.’))

  9.             {

  10.                 list.Add(Convert.ToByte( item));

  11.             }

  12.             list.Add(0);

  13.             list.Add(0);

  14.             ConTable.Adr = list.ToArray();

  15.             // Type of address: MPI/PB (1), IP (2), MAC (3)

  16.             ConTable.AdrType = 2;

  17.             ConTable.SlotNr = 0;

  18.             ConTable.RackNr = 0;   

  19.             RetValue = Prodave6.LoadConnection_ex6(ConNr, AccessPoint, ConTableLen, ref ConTable);

  20.             if (RetValue == 0)

  21.             {

  22.                 Console.WriteLine("Prodave连接成功");

  23.                 sw.Restart();

  24.                 for (int i = 0; i < Times; i++)

  25.                 {

  26.                     byte[] pReadBufferM2 = new byte[(uint)ReadLength];

  27.                     uint pDatLen = 0;

  28.                     RetValue = Prodave6.field_read_ex6(Prodave6.FieldType.M, 0, 0, (uint)ReadLength, (uint)ReadLength, pReadBufferM2, ref pDatLen);

  29.                     if (RetValue > 0)

  30.                     {

  31.                         Console.WriteLine("Prodave通信测试读取失败");

  32.                     }

  33.                     else

  34.                     {

  35.                         Count++;

  36.                     }

  37.                 }

  38.                 Console.WriteLine("Prodave通信测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());

  39.             }

  40.             else

  41.             {

  42.                 Console.WriteLine("Prodave连接失败");

  43.             }

复制代码
五、HslCommunication          
  1.   Console.WriteLine("HslCommunication通信测试开始");

  2.             objHsl = new SiemensS7Net(SiemensPLCS.S1200, IpAddress);

  3.             var operate = objHsl.ConnectServer();

  4.             if (operate.IsSuccess)

  5.             {

  6.                 Console.WriteLine("HslCommunication连接成功");

  7.                 sw.Restart();

  8.                 for (int i = 0; i < Times; i++)

  9.                 {

  10.                     operate = objHsl.Read("M0", (ushort)ReadLength);

  11.                     if (operate.IsSuccess)

  12.                     {

  13.                         Count++;

  14.                     }

  15.                     else

  16.                     {

  17.                         Console.WriteLine("HslCommunication通信测试读取失败");

  18.                     }

  19.                 }

  20.                 Console.WriteLine("HslCommunication通信测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());

  21.             }

  22.             else

  23.             {

  24.                 Console.WriteLine("HslCommunication连接失败");

  25.             }

复制代码
六、xktComm         
  1.     Console.WriteLine("xktComm通信测试开始");

  2.             if (objxktComm.Connect(IpAddress, CPU_Type.S71200, 0, 0))

  3.             {

  4.                 Console.WriteLine("xktComm连接成功");

  5.                 sw.Restart();

  6.                 Count = 0;

  7.                 for (int i = 0; i < Times; i++)

  8.                 {

  9.                     byte[] res = objxktComm.ReadBytes(StoreType.Marker, 0, 0, ReadLength);

  10.                     if (res != null && res.Length == ReadLength)

  11.                     {

  12.                         Count++;

  13.                     }

  14.                     else

  15.                     {

  16.                         Console.WriteLine("xktComm通信测试读取失败");

  17.                     }

  18.                 }

  19.                 Console.WriteLine("xktComm通信测试结束,耗时:" + (sw.ElapsedMilliseconds / Convert.ToSingle(Times)).ToString());

  20.             }

  21.             else

  22.             {

  23.                 Console.WriteLine("xktComm连接失败");

  24.             }

复制代码
测试环境 测试选择的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内部没有做分包处理,如果使用,需要二次封装。

免责声明:本文转自网络,版权归原作者所有,如涉及作品版权问题,请及时与我们联系删除,谢谢!

猜您喜欢

◆  75例经典电气控制接线图、电子元件工作原理图,学会不求人!

◆  新八级工制度考核下放到单位,电工“技师”们到底有多狂?

◆  适合电工初学及提高自身技能的6本书推荐

◆  惨!不验电,当场触电死亡!

◆  致命的插线板!乌鲁木齐10死9伤原因查明!用完不拔插头,这个习惯很多人都有……

◆  维修电工的最高境界,就是要猜车间主任的心,绝对胜过学技术

推荐阅读 西门子S7-1500与欧姆龙安全PLC的TCP/IP通讯 , 戳下方 阅读原文”

版权:如无特殊注明,文章转载自网络,侵权请联系cnmhg168#163.com删除!文件均为网友上传,仅供研究和学习使用,务必24小时内删除。
相关推荐