一、Modbus协议简介
Modbus是一种通讯协议,用于工业自动化领域中的数据通信,早在1979年就已经出现,现在已成为广泛应用的通信协议之一。Modbus通常是在串行通信中使用,但也可以在以太网上运行。
Modbus包括ASCII、RTU和TCP/IP协议,每种协议都有自己的特点和优点,根据应用的需求选择相应的协议。
二、C# Modbus库介绍
C# Modbus库是一种用于C#编程语言的Modbus通信工具,它可以快速的连接Modbus设备,并且以更快的速度读写Modbus寄存器。
以下是C# Modbus库的代码示例:
using System; using System.IO.Ports; using Modbus.Device; // 定义串口 using SerialPort _serialPort = new SerialPort("COM1"); // 创建Modbus工厂 var factory = new ModbusFactory(); // 连接设备 using (var modbus = factory.CreateRtuMaster(_serialPort)) { modbus.Transport.ReadTimeout = 1000; modbus.Transport.WriteTimeout = 1000; modbus.Transport.Retries = 3; // 读取寄存器 ushort[] registers = modbus.ReadHoldingRegisters(1, 0, 10); foreach (ushort register in registers) { Console.WriteLine($"register:{register} "); } // 写入寄存器 modbus.WriteSingleRegister(1, 1, 100); }
三、C# Modbus常用操作
1、读取寄存器
读取寄存器通常是获取Modbus设备中数据的常用方法。可以使用C# Modbus库中的ReadHoldingRegisters()方法来读取寄存器。
以下是C# Modbus库中读取寄存器的代码示例:
// 连接Modbus设备 using (var modbus = factory.CreateRtuMaster(_serialPort)) { // 读取寄存器 ushort[] registers = modbus.ReadHoldingRegisters(1, 0, 10); foreach (ushort register in registers) { Console.WriteLine($"register:{register} "); } }
2、写入寄存器
写入寄存器通常用于向Modbus设备中写入数据,可以使用C# Modbus库中的WriteSingleRegister()方法来写入寄存器。
以下是C# Modbus库中写入寄存器的代码示例:
using (var modbus = factory.CreateRtuMaster(_serialPort)) { // 写入寄存器 modbus.WriteSingleRegister(1, 1, 100); }
3、读取线圈状态
读取线圈状态通常用于获取Modbus设备中的开关量状态。可以使用C# Modbus库中的ReadCoils()方法来读取线圈状态。
以下是C# Modbus库中读取线圈状态的代码示例:
using (var modbus = factory.CreateRtuMaster(_serialPort)) { // 读取线圈状态 bool[] coilStatus = modbus.ReadCoils(1, 0, 10); foreach (bool status in coilStatus) { Console.WriteLine($"status:{status} "); } }
4、写入线圈状态
写入线圈状态通常用于设定Modbus设备中的开关量状态。可以使用C# Modbus库中的WriteSingleCoil()方法来写入线圈状态。
以下是C# Modbus库中写入线圈状态的代码示例:
using (var modbus = factory.CreateRtuMaster(_serialPort)) { // 写入线圈状态 modbus.WriteSingleCoil(1, 1, true); }
5、异常处理
在使用Modbus时,可能会遇到连接中断或数据读写错误等异常情况。为了保证程序的可靠性,需做好异常处理。
以下是C# Modbus库中异常处理的代码示例:
using (var modbus = factory.CreateRtuMaster(_serialPort)) { try { ushort[] registers = modbus.ReadHoldingRegisters(1, 0, 10); } catch (Exception ex) { Console.WriteLine($"Exception:{ex.Message} "); } }