网站首页 > 编程文章 正文
前面给大家介绍了一系列关于RS485与Modbus的知识。
今天跟大家聊聊关于C#如何实现Modbus通信。
一、开源通信库
通信库是对通信协议的封装,一般是以dll动态链接库的形式存在,对于编程者来说,只需要调用库的各种方法即可实现数据读写。
通信库有两种,一种是开源的,即使开源,也要注意看下开源许可证,开源并不一定免费,另外一种就是自己开发封装的,这个需要具备一定的开发能力。
Modbus通信有很多开源通信库,这其中使用较为广泛的是NModbus4,NModbus4是一个开源且免费的Modbus通信库,它的开源许可证是MIT,是一个相对宽松的软件授权条款,可以商用。
二、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库二次封装即可。
三、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);
}
}
猜你喜欢
- 2025-05-02 汇川技术|汇川PLC中ModbusTCP的应用(H3U、AM600)
- 2025-05-02 西门子1200与施耐德M241PLC的Modbus TCP通讯教程
- 2025-05-02 [西门子] S7-1200和汇川521PLC——modbus-tcp/ip通讯
- 2025-05-02 欧姆龙PLC分别做modbus tcp客户端和服务器的通讯案例
- 2025-05-02 分分钟教会你PLC 与 Modbus/TCP 通信,赶紧收藏!
- 2025-05-02 【畅学技术】全网都在找 S7-200 SMART Modbus TCP 客户端编程实现秘籍
- 2025-05-02 新手教程:在西门子 S7-1200 PLC 中配置 TCP/IP 通信的步骤
- 2025-05-02 [西门子PLC] 两个S7-1200之间实现Modbus TCP客户端和服务器通信
- 2025-05-02 C# Modbus库推荐:轻松实现Modbus通信的利器
- 2025-05-02 S7-1200 PLC 与ATV340 Modbus TCP 通讯设置(含部分程序)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- spire.doc (59)
- system.data.oracleclient (61)
- 按键小精灵源码提取 (66)
- pyqt5designer教程 (65)
- 联想刷bios工具 (66)
- c#源码 (64)
- graphics.h头文件 (62)
- mysqldump下载 (66)
- sqljdbc4.jar下载 (56)
- libmp3lame (60)
- maven3.3.9 (63)
- 二调符号库 (57)
- 苹果ios字体下载 (56)
- git.exe下载 (68)
- diskgenius_winpe (72)
- pythoncrc16 (57)
- solidworks宏文件下载 (59)
- qt帮助文档中文版 (73)
- satacontroller (66)
- hgcad (64)
- bootimg.exe (69)
- android-gif-drawable (62)
- axure9元件库免费下载 (57)
- libmysqlclient.so.18 (58)
- springbootdemo (64)
本文暂时没有评论,来添加一个吧(●'◡'●)