当前位置:   article > 正文

五大通信库:Modbus (***)_easymodbus

easymodbus

关于ModbusTCP通信的内容。

五大通信库:Modbus

前记

本文主要以C#作为编程语言,结合目前市场上常用的5种通信库,分别与台达DVP-32 PLC进行通信研究,并对研究的结论进行分享。

通信库简介

一、EasyModbus

简介:EasyModbus支持Modbus TCP, Modbus UDP and Modbus RTU,开源协议为MIT。

二、SharpModbus

简介:SharpModbus是一个开源的Modbus工具,支持ModbusTCP与ModbusRTU,开源协议为MIT。

三、NModbus4

简介:NModbus4是一个开源的Modbus通信库,开源协议为MIT。

四、HslCommunication

简介:HslCommunication是一个商业通信库,涵盖各种不同设备的通信。

五、xktComm

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

通信库开发

  • 针对各种库创建了一个枚举类型:
  1. public enum ModbusLib
  2. {
  3. EasyModbus,
  4. SharpModbus,
  5. NModbus4,
  6. hslCommunication,
  7. xktComm
  8. }
  • 针对每个库创建一个通信对象:
  1. //创建对象
  2. //EasyModbus
  3. private ModbusClient easyModbus = new ModbusClient();
  4. //SharpModbus
  5. private ModbusMaster sharpModbus;
  6. //NModbus4
  7. private ModbusIpMaster nModbus;
  8. //HslCommunication
  9. private ModbusTcpNet hsl;
  10. //xktComm
  11. private ModbusTcp xktModbus = new ModbusTcp();
  • 针对各个库实现连接方法:
  1. private bool Connect(ModbusLib modbusLib)
  2. {
  3. try
  4. {
  5. switch (modbusLib)
  6. {
  7. case ModbusLib.EasyModbus:
  8. easyModbus.Connect(ipAddress, port);
  9. break;
  10. case ModbusLib.SharpModbus:
  11. sharpModbus = ModbusMaster.TCP(ipAddress, port);
  12. break;
  13. case ModbusLib.NModbus4:
  14. TcpClient tcpClient = new TcpClient();
  15. tcpClient.Connect(ipAddress, port);
  16. nModbus = ModbusIpMaster.CreateIp(tcpClient);
  17. break;
  18. case ModbusLib.hslCommunication:
  19. hsl = new ModbusTcpNet(ipAddress, port);
  20. return hsl.ConnectServer().IsSuccess;
  21. case ModbusLib.xktComm:
  22. return xktModbus.Connect(ipAddress, port);
  23. default:
  24. break;
  25. }
  26. }
  27. catch (Exception)
  28. {
  29. return false;
  30. }
  31. return true;
  32. }
  • 针对各个库实现断开连接方法
  1. private void DisConnect(ModbusLib modbusLib)
  2. {
  3. switch (modbusLib)
  4. {
  5. case ModbusLib.EasyModbus:
  6. easyModbus.Disconnect();
  7. break;
  8. case ModbusLib.SharpModbus:
  9. sharpModbus.Dispose();
  10. break;
  11. case ModbusLib.NModbus4:
  12. nModbus.Dispose();
  13. break;
  14. case ModbusLib.hslCommunication:
  15. hsl.ConnectClose();
  16. break;
  17. case ModbusLib.xktComm:
  18. xktModbus.DisConnect();
  19. break;
  20. default:
  21. break;
  22. }
  23. }
  • 针对各个库实现一个读取变量的方法:
  1. public bool ReadSingleReg(ModbusLib modbusLib)
  2. {
  3. try
  4. {
  5. switch (modbusLib)
  6. {
  7. case ModbusLib.EasyModbus:
  8. return easyModbus.ReadHoldingRegisters(0, 1).Length == 1;
  9. case ModbusLib.SharpModbus:
  10. return sharpModbus.ReadHoldingRegisters(1, 0, 1).Length == 1;
  11. case ModbusLib.NModbus4:
  12. return nModbus.ReadHoldingRegisters(0, 1).Length == 1;
  13. case ModbusLib.hslCommunication:
  14. return hsl.ReadInt16("0").IsSuccess;
  15. case ModbusLib.xktComm:
  16. return xktModbus.ReadKeepReg(0, 1).Length == 2;
  17. default:
  18. return false;
  19. }
  20. }
  21. catch (Exception)
  22. {
  23. return false;
  24. }
  25. }

通信功能开发

  • 由于每个库实现的功能都一样,所以开发了一个控件,将相关接口预留出来,后续直接调用即可。

  • 控件提供了启动(Start)、停止(Stop)事件,提供了Modbus库类型,可以选择设置,也可以通过属性对通信结果和耗时时间进行赋值。
  • 使用也非常简单,直接拖到界面上,设置好库类型,绑定上Start和Stop事件即可。
  • 测试的核心代码如下:
  1. private void modbusCtl1_Start(object sender, EventArgs e)
  2. {
  3. if (sender is ModbusCtl control)
  4. {
  5. ModbusLib modbusLib = control.ModbusType;
  6. if (Connect(modbusLib))
  7. {
  8. cts = new CancellationTokenSource();
  9. stopwatch.Restart();
  10. int successCount = 0;//成功次数
  11. int totalCount = 0;//总次数
  12. Task.Run(() =>
  13. {
  14. while (!cts.IsCancellationRequested)
  15. {
  16. if (ReadSingleReg(modbusLib))
  17. {
  18. successCount++;
  19. }
  20. totalCount++;
  21. if (successCount != 0 && totalCount != 0)
  22. {
  23. control.Result = successCount.ToString() + "/" + totalCount.ToString();
  24. control.CommRate = stopwatch.ElapsedMilliseconds / successCount;
  25. }
  26. }
  27. }, cts.Token);
  28. cts.Token.Register(() =>
  29. {
  30. stopwatch.Stop();
  31. Thread.Sleep(100);
  32. DisConnect(modbusLib);
  33. });
  34. }
  35. }
  36. }
  • 台达PLC测试结果如下:

  • ModbusSlave测试结果如下:

  • 西门子1200PLC测试结果如下:

  • 西门子1500PLC测试结果如下:

通过以上测试发现,ModbusTCP通信周期与ModbusTCP服务器(PLC硬件)紧密关联,甚至可以达到毫秒级。

可能有的小伙伴会感到疑惑,为什么SharpModbus连接台达PLC那么慢,连接其他PLC都正常呢?

发布于 2021-05-06 10:27

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/566144
推荐阅读
  

闽ICP备14008679号