1、前言

大家好!我是付工。前面给大家介绍了一系列关于RS485与Modbus的知识。

终于有人把RS485说清楚了
终于有人把Modbus说明白了
通透!终于把ModbusRTU弄明白了
这样看来,ModbusTCP协议太简单了
今天跟大家聊聊关于C#如何实现Modbus通信。

2、开源通信库

通信库是对通信协议的封装,一般是以dll动态链接库的形式存在,对于编程者来说,只需要调用库的各种方法即可实现数据读写。

通信库有两种,一种是开源的,即使开源,也要注意看下开源许可证,开源并不一定免费,另外一种就是自己开发封装的,这个需要具备一定的开发能力。

Modbus通信有很多开源通信库,这其中使用较为广泛的是NModbus4,NModbus4是一个开源且免费的Modbus通信库,它的开源许可证是MIT,是一个相对宽松的软件授权条款,可以商用。

3、ModbusRTU通信

1、在项目解决方案资源管理器中,选择【引用】右击,在弹出的界面中,点击【管理NuGet程序包】选项,如下图所示:

2、在打开的选项卡中,选择【浏览】,然后输入NModbus4进行搜索,搜索到之后,选择最新稳定版2.1.0,点击【安装】即可:

3、在NModbus4基础上封装一个打开串口和关闭串口的方法:

private SerialPort serialPort;
private ModbusSerialMaster master;
public void Open(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
{
if (this.serialPort != null && this.serialPort.IsOpen)
{
this.serialPort.Close();
}
this.serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
this.serialPort.Open();
this.master = ModbusSerialMaster.CreateRtu(this.serialPort);
this.master.Transport.WriteTimeout = 2000;
this.master.Transport.ReadTimeout = 2000;
this.master.Transport.WaitToRetryMilliseconds = 500;
this.master.Transport.Retries = 3;
}
public void Close()
{
if (this.serialPort != null && this.serialPort.IsOpen)
{
this.serialPort.Close();
}
this.master = null;
}

4、在NModbus4基础上封装各种读写的方法,这里以读取保持型寄存器为例,其他方法都是类似的:

public byte[] ReadHoldingRegisters(byte slaveId, ushort start, ushort length)
{
try
{
ushort[] data = this.master.ReadHoldingRegisters(slaveId, start, length);
List<byte> result = new List<byte>();
foreach (var item in data)
{
result.AddRange(BitConverter.GetBytes(item).Reverse());
}
return result.ToArray();
}
catch (Exception ex)
{
throw new Exception("【读取保持寄存器】失败:" + ex.Message);
}
}

基于NModbus4实现ModbusRTU通信,不需要关注协议及报文,只需要对NModbus4库二次封装即可。

4、ModbusTCP通信

NModbus4不仅支持ModbusRTU通信,也同样支持ModbusTCP通信,ModbusTCP与ModbusRTU的封装过程非常类似,主要是存在以下两个不同点:

  • ModbusRTU是基于串口通信,因此主要使用的是SerialPort类,而ModbusTCP是基于以太网通信,主要使用的是TcpClient类。

  • ModbusRTU的读取和写入方法中都必须包含从站地址,而ModbusTCP可以把SlaveAddress作为一个可选项。

ModbusTCP通信库封装过程如下:1、在NModbus4基础上封装一个TCP连接和断开的方法:

private TcpClient tcpClient;
private ModbusIpMaster master
public void Connect(string ip, int port)
{
tcpClient = new TcpClient();
tcpClient.Connect(IPAddress.Parse(ip), port);
this.master = ModbusIpMaster.CreateIp(this.tcpClient);
this.master.Transport.WriteTimeout = 2000;
this.master.Transport.ReadTimeout = 2000;
this.master.Transport.WaitToRetryMilliseconds = 500;
this.master.Transport.Retries = 3;
}
public void DisConnect()
{
if (this.tcpClient != null && this.tcpClient.Connected)
{
this.tcpClient.Close();
}
this.master = null;
}

2、封装一个读取输出线圈的方法,其他读写方法都是类似的:

public bool[] ReadOutputCoils(ushort start, ushort length, byte slaveAddress = 1)
{
try
{
return this.master.ReadCoils(slaveAddress, start, length);
}
catch (Exception ex)
{
throw new Exception("【读取输出线圈】失败:" + ex.Message);
}
}
 

C#轻松实现Modbus通信的更多相关文章

  1. 物联网无线数传应用中的Modbus通信网关协议到底是什么?

    什么是物联网 通信Modbus网关 Modbus协议无线通信网关就是将一种Modbus协议帧转换为其他物联网无线数传协议帧. 比如将Modbus RTU的数据与Modbus TCP数据进行相互转换:也 ...

  2. C# MODBUS 通信

    背景 电厂有多组监控设备,需要在指定的设备上显示某些数据(其他设备对接过来的).通信协议是modbus主从结构. 源码: http://download.csdn.net/download/wolf1 ...

  3. PC和单片机通过MODBUS RTU通信

    最近研究了一下MODBUS通信,在STC12C5A60S2单片机上实现了MODBUS协议的部分功能,方便上位机从单片机系统上获取数据,比如由单片机获取的温度.湿度.或者控制信号的状态等.有了MODBU ...

  4. Modbus​协议​深入​讲解_NI

    from:https://www.ni.com/zh-cn/innovations/white-papers/14/the-modbus-protocol-in-depth.html 已​更新 Mar ...

  5. 【应用笔记】【AN001】VC#开发环境下基于以太网的4-20mA电流采集(基于modbus tcp 协议)

    版本:第一版 作者:毛鹏 杨帅 日期:20151108 简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC#环境下进行温 ...

  6. 推荐一本书:清华出版的《Modbus软件开发实战指南》

    前言: 最近在研究Modbus开发,如果只是简单的了解了一些modbus基础知识,但是不够系统和全面. 其实,modbus虽然比较简单,但是如果不注意有很多坑,特别是寄存器的位数,大小端处理,浮点数, ...

  7. 写出稳定的Modbus代码之点滴经验

    1.引言 Modbus是工业领域重要的协议,物理层有常见的RS485双绞线和TCP,所以又常说Modbus 485开发和Modbus TCP开发. 前者就是串口通信,比较简单.后者涉及到网络协议,复杂 ...

  8. modbus串口通讯C#

    简介 公司给的一个小任务,这篇文章进行详细讲解 题目: modbus串口通讯 主要内容如下: 1.实现使用modbus通讯规约的测试软件: 2.具有通信超时功能: 3.分主站从站,并能编辑报文.生成报 ...

  9. Modbus

    Modbus 串行链路协议是一个主-从协议.在同一时刻,只有一个主节点连接于总线,一个或多个子节点 (最大编号为 247 ) 连接于同一个串行总线. Modbus 通信总是由主节点发起.子节点在没有收 ...

  10. modbus tcp 入门详解

    Modbus tcp 格式说明 通讯机制 附C#测试工具用于学习,测试   前言: 之前的博客介绍了如何用C#来读写modbus tcp服务器的数据,文章:http://www.cnblogs.com ...

随机推荐

  1. 【Vue】07 Webpack Part3 Loader

    Loader是Webpack的核心概念: 除了JS文件以外我们还有CSS,图片,包括一些ES6规范的代码 或者是TypeScript各种前端类型的文件 但是最终必须统一转换成JS文件,Webpack本 ...

  2. Typora配置自动上传图片到图床

      在多平台发布文章时,如果遇到图片不能导入的问题,推荐使用图床!推荐使用阿里云或腾讯云,免费的不用考虑了! PicGo下载 链接:https://pan.quark.cn/s/2ec95402631 ...

  3. 学术写作: These authors contributed equally to this work. —— 共同一作

    早些年很少看到论文里面有: These authors contributed equally to this work. 不过现在这种方法在论文中出现的还是比较多的,说白了,这种共同一作的声明其实是 ...

  4. 【转载】 NetworkManager——nmcli命令连接WIFI和创建热点

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u014695839/article/de ...

  5. 阿里2021年春季实习笔试题(最后一道大题)(2020 China Collegiate Programming Contest, Weihai Site) (C. Rencontre codeforces.com/gym/102798)

    实验室的慕师弟phd马上要毕业了,正准备先找个实习,投了阿里2021年春季实习的招聘,遇到最后一道编程大题没有思路事后找到了该题的最原始出处,即 2020 China Collegiate Progr ...

  6. python 中 ctypes 的使用尝试

    最近在看Python的性能优化方面的文章,突然想起ctypes这个模块,对于这个模块一直不是很理解,不过再次看完相关资料有了些新的观点. ctypes 这个模块个人观点就是提供一个Python类型与C ...

  7. MindSpore1.3.0 GPU pip方式安装 —— Ubuntu18.04系统 (最终安装结果为成功)需要管理员权限,sudo安装

    官网地址: https://www.mindspore.cn/install =========================================================== 安 ...

  8. 【转载】 Pytorch手动释放显存

    原文地址: http://www.shijinglei.com/2020/04/20/pytorch%E9%87%8A%E6%94%BE%E6%98%BE%E5%AD%98/ ============ ...

  9. Mongolia地区民间风俗的一些理解

    声明:本文的内容为自己学习历史后的一些个人理解,其中内容的真实性并未考证. 总所周知,Mongolia地区有内外之分现在,但是以前均为我国领土,后来由于种种历史原因导致外Mongolia分离了出去,这 ...

  10. ffmpeg和ffplay常用指令

    FFmpeg 常见用法 1. 基本命令结构 ffmpeg [global_options] -i input_file [input_options] output_file [output_opti ...