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. 【ActiveJdbc】02

    一.基本的数据库操作 数据模型层: import org.javalite.activejdbc.Model; 数据访问层: import org.javalite.activejdbc.Base; ...

  2. 【MUI】工作总结

    1.快速创建页面结构: mDoctype HTML: <!doctype html> <html lang="en"> <head> <m ...

  3. 超简单stable_diffusion + novelai一键部署教程

    视频教程地址: 超简单stable_diffusion + novelai一键部署教程 个人的启动命令: sudo docker run -it --rm -e NVIDIA_DISABLE_REQU ...

  4. No such file or directory: 'patchelf': 'patchelf'

    安装mujoco报错: No such file or directory: 'patchelf': 'patchelf' 解决方法: sudo apt-get install patchelf

  5. 高校教编程是否应该将Python作为主语言

    偶读一文:https://www.cnblogs.com/qing-gee/p/12941219.html 想到了这样的一个老问题,个人搞计算机软件开发.人工智能的时间已经十余年,虽然个人能力有限但是 ...

  6. NVIDIA公司的半成品项目cule——GPU端运行的Atari2600游戏环境——已经废弃的项目

    官网介绍地址: https://developer.nvidia.com/blog/new-open-source-gpu-accelerated-atari-emulator-for-reinfor ...

  7. 16-canvas绘制圆弧

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  8. java本地增量打包工具

    在打增量包每次都需要将class文件.jsp文件等拷贝到增量包中比较麻烦.所以就写了一个增量打包工具. 工作原理:根据文件的最后修改时间来打增量. 1.查找Java类增量:根据eclipse工程下的. ...

  9. 【防忘笔记】Spring+Struts2古董框架学习

    Spring+Struts2项目框架梳理 若基于Spring+Struts2的方式进行开发,前后端的交互逻辑会与boot系以及MCV的组织结构有所不同 这里是对于学习过程的一些记录 前置通用知识 St ...

  10. 异源数据同步 → DataX 为什么要支持 kafka?

    开心一刻 昨天发了一条朋友圈:酒吧有什么好去的,上个月在酒吧当服务员兼职,一位大姐看上了我,说一个月给我 10 万,要我陪她去上海,我没同意 朋友评论道:你没同意,为什么在上海? 我回复到:上个月没同 ...