分享

新阁上位机开发---六大通信库,围攻西门子

 付工上位机 2022-03-30

自动化行业,正在慢慢往软件行业靠近。

上位机开发中西门子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、首先创建了几个变量,便于随时修改,实现不同功能测试。

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

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

一、S7.NET

   Console.WriteLine("S7.NET通信测试开始");
   objS7net = new Plc(CpuType.S71200, IpAddress, 00);
   try
   {
 objS7net.Open();
 Console.WriteLine("S7.NET连接成功");
 sw.Restart();
 Count = 0;
 for (int i = 0; i < Times; i++)
 {
  byte[] res = objS7net.ReadBytes(DataType.Memory, 00, 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, 00);
   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, 00);
   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, 00, (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, 00))
   {
 Console.WriteLine("xktComm连接成功");
 sw.Restart();
 Count = 0;
 for (int i = 0; i < Times; i++)
 {
  byte[] res = objxktComm.ReadBytes(StoreType.Marker, 00, 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内部没有做分包处理,如果使用,需要二次封装。

写在最后

越来越多的电气工程师意识到掌握一门高级语言的重要性,很多人想学习上位机开发,但是苦于无法入门,为此我们准备了很多的入门资料,旨在帮助更多的电气工程师突破技术瓶颈,在自动化的道路上走得更远。需要的小伙伴可以私信我

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多