C# ModBus Tcp读写数据 与服务器进行通讯

C# ModBus Tcp读写数据 与服务器进行通讯

前言


 本文将使用一个NuGet公开的组件技术来实现一个ModBus TCP的客户端,方便的对Modbus tcp的服务器进行读写,这个服务器可以是电脑端C#设计的,也可以是PLC实现的,也可以是其他任何支持这个通信协议的服务器。

github地址:https://github.com/dathlin/HslCommunication 如果喜欢可以star或是fork,还可以打赏支持。

联系作者及加群方式(激活码在群里发放):http://www.hslcommunication.cn/Cooperation

在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装:

1

Install-Package HslCommunication

NuGet安装教程  http://www.cnblogs.com/dathlin/p/7705014.html

组件API地址:http://www.cnblogs.com/dathlin/p/7703805.html

 

 

关于两种模式


在PLC端,包括三菱和西门子,欧姆龙以及Modbus Tcp客户端的访问器上,都支持两种模式,短连接模式和长连接模式,现在就来解释下什么原理。

短连接:每次读写都是一个单独的请求,请求完毕也就关闭了,如果服务器的端口仅仅支持单连接,那么关闭后这个端口可以被其他连接复用,但是在频繁的网络请求下,容易发生异常,会有其他的请求不成功,尤其是多线程的情况下。

长连接:创建一个公用的连接通道,所有的读写请求都利用这个通道来完成,这样的话,读写性能更快速,即时多线程调用也不会影响,内部有同步机制。如果服务器的端口仅仅支持单连接,那么这个端口就被占用了,比如三菱的端口机制,西门子的Modbus tcp端口机制也是这样的。以下代码默认使用短连接,方便测试。

在短连接的模式下,每次请求都是单独的访问,所以没有重连的困扰,在长连接的模式下,如果本次请求失败了,在下次请求的时候,会自动重新连接服务器,直到请求成功为止。另外,尽量所有的读写都对结果的成功进行判断。

 

特别感谢


  • 网友:陈恩富                  对float,int数据的读取测试,才修复了权重位颠倒的BUG。
  • 网友:U4幸福的蜗牛      发现了博客上错误的一个方法名称,已于2018年1月8日13:34:39更新。并反馈了一些特殊设备(modbus tcp服务器)的读取数据的BUG。已修复。

 

随便聊聊


只要是网络访问,就会存在主从的区别,此处的设计模式是客户端主动请求服务器数据,然后接收服务器的反馈数据,支持原生的指令收发,支持其他一些方便的API收发。特殊功能码需要使用原生收发的API,本组件支持如下的功能操作:

  • 0x01    读取线圈的操作,
  • 0x02    读取离散的操作,
  • 0x03    读取寄存器的值,
  • 0x05    写一个线圈操作,
  • 0x06    写一个寄存器值,
  • 0x0F    批量写线圈操作,
  • 0x10    批量写寄存器值,

 如果你的设备需要这些功能之外的数据,可以使用原生API方法,但是这个方法的前提就是你对MODBUS TCP协议非常清晰才可以,如果你不了解这个协议,可以参照下面的博客说明:

 http://blog.csdn.net/thebestleo/article/details/52269999

 如果你需要搭建自己的ModBus服务器,可以参照这边文章:http://www.cnblogs.com/dathlin/p/7782315.html

 在你开发自己的客户端程序之前,可以先用MODBUS测试工具进行测试,以下地址的一个开源项目就是基于这个组件开发的Modbus tcp测试工具,可直接用于读写测试。

 ModbusTcpServer.zip

 C# ModBus Tcp读写数据 与服务器进行通讯_第1张图片 

 

访问测试项目


下面的一个项目是这个组件的访问测试项目,您可以进行初步的访问的测试,免去了您写测试程序的麻烦,这个项目是和三菱,西门子PLC的访问写在一起的。可以同时参考。

下载地址为:HslCommunicationDemo.zip

C# ModBus Tcp读写数据 与服务器进行通讯_第2张图片

 

 

Reference


 

ModBus组件所有的功能类都在 HslCommunication.ModBus命名空间,所以再使用之前先添加

1

2

using HslCommunication.ModBus;

using HslCommunication;

你可能感兴趣的:(C#,WinForm)