以下是一个使用 C# 实现 Modbus TCP 服务端的示例代码。这个示例使用了 NModbus4 库,这是一个开源的 Modbus 库,支持 Modbus TCP 和 Modbus RTU 协议。
首先,您需要安装 NModbus4 库。您可以通过 NuGet 包管理器来安装:
Install-Package NModbus4
然后,您可以编写以下代码来实现一个简单的 Modbus TCP 服务端:
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
using NModbus;
using NModbus.Logging;
using NModbus.Tcp;class Program
{static async Task Main(string[] args){// 设置服务端监听的IP地址和端口IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 });int port = 502;// 创建TcpListenerTcpListener listener = new TcpListener(address, port);listener.Start();Console.WriteLine($"Modbus TCP Server is listening on {address}:{port}");// 创建Modbus工厂var factory = new ModbusFactory(new ConsoleModbusLogger(LoggingLevel.Info));// 创建Modbus TCP Slavevar network = factory.CreateSlaveNetwork(listener);var slave = factory.CreateSlave(1);// 添加从站到网络network.AddSlave(slave);// 初始化寄存器值slave.DataStore.HoldingRegisters[1] = 123;slave.DataStore.InputRegisters[1] = 456;slave.DataStore.CoilDiscretes[1] = true;slave.DataStore.InputDiscretes[1] = false;// 启动Modbus服务端var slaveNetworkTask = network.ListenAsync();Console.WriteLine("Press any key to stop the server...");Console.ReadKey();// 停止服务端network.Stop();// 确保服务端任务完成await slaveNetworkTask;}
}
代码解释:
-
设置监听地址和端口:这里我们使用本地地址
127.0.0.1
和标准 Modbus TCP 端口502
。 -
创建 TcpListener:用于监听 TCP 连接请求。
-
创建 Modbus 工厂:使用 NModbus4 库创建 Modbus 工厂,包含一个简单的日志记录器。
-
创建 Modbus TCP Slave 网络:创建一个从站网络并添加一个从站。
-
初始化寄存器和位:为从站的保持寄存器、输入寄存器、线圈和离散输入初始化一些值。
-
启动服务端:调用
ListenAsync()
启动服务端以异步方式监听请求。 -
等待用户输入停止服务端:按任意键停止服务端并停止监听。
运行代码:
确保在运行代码之前,您已经安装了 NModbus4 库,并且您的项目可以访问该库。
这个示例代码展示了一个基本的 Modbus TCP 服务端的实现,您可以根据实际需求进行扩展和修改。例如,您可以添加更多的寄存器和位,处理更多的从站请求等。
接下来是一个使用 C# 实现 Modbus TCP 客户端的示例代码,同样使用 NModbus4 库。这个客户端将连接到之前创建的 Modbus TCP 服务端并读取/写入数据。
首先,确保您已经安装了 NModbus4 库:
Install-Package NModbus4
然后,您可以编写以下代码来实现一个简单的 Modbus TCP 客户端:
using System;
using System.Net.Sockets;
using NModbus;
using NModbus.Logging;
using NModbus.Tcp;class Program
{static void Main(string[] args){// 设置服务端的IP地址和端口string ipAddress = "127.0.0.1";int port = 502;// 创建TCP客户端using (TcpClient client = new TcpClient(ipAddress, port)){// 创建Modbus工厂var factory = new ModbusFactory(new ConsoleModbusLogger(LoggingLevel.Info));// 创建Modbus TCP Mastervar master = factory.CreateMaster(client);// 读取保持寄存器ushort startAddress = 1;ushort numRegisters = 5;ushort[] holdingRegisters = master.ReadHoldingRegisters(1, startAddress, numRegisters);Console.WriteLine("Holding Registers:");for (int i = 0; i < holdingRegisters.Length; i++){Console.WriteLine($"Register {startAddress + i}: {holdingRegisters[i]}");}// 读取输入寄存器ushort[] inputRegisters = master.ReadInputRegisters(1, startAddress, numRegisters);Console.WriteLine("Input Registers:");for (int i = 0; i < inputRegisters.Length; i++){Console.WriteLine($"Register {startAddress + i}: {inputRegisters[i]}");}// 写入保持寄存器ushort writeAddress = 1;ushort[] writeValues = new ushort[] { 10, 20, 30, 40, 50 };master.WriteMultipleRegisters(1, writeAddress, writeValues);Console.WriteLine("Written values to Holding Registers.");// 读取线圈状态bool[] coils = master.ReadCoils(1, startAddress, numRegisters);Console.WriteLine("Coils:");for (int i = 0; i < coils.Length; i++){Console.WriteLine($"Coil {startAddress + i}: {coils[i]}");}// 写入线圈状态bool[] writeCoilValues = new bool[] { true, false, true, false, true };master.WriteMultipleCoils(1, writeAddress, writeCoilValues);Console.WriteLine("Written values to Coils.");}}
}
代码解释:
-
设置服务端地址和端口:客户端将连接到之前设置的本地地址
127.0.0.1
和端口502
。 -
创建 TCP 客户端:用于与 Modbus TCP 服务端建立连接。
-
创建 Modbus 工厂:使用 NModbus4 库创建 Modbus 工厂,包含一个简单的日志记录器。
-
创建 Modbus TCP Master:创建一个主站,用于与服务端进行通讯。
-
读取保持寄存器:从地址
1
开始读取5
个保持寄存器,并打印其值。 -
读取输入寄存器:从地址
1
开始读取5
个输入寄存器,并打印其值。 -
写入保持寄存器:向地址
1
写入多个寄存器值。 -
读取线圈状态:从地址
1
开始读取5
个线圈状态,并打印其值。 -
写入线圈状态:向地址
1
写入多个线圈状态值。
运行代码:
确保服务端已经启动并在监听,然后运行客户端代码。客户端将连接到服务端,读取和写入寄存器和线圈,并打印结果。
通过这个示例,您可以看到如何使用 NModbus4 库在 C# 中实现一个基本的 Modbus TCP 客户端。您可以根据实际需求进行扩展和修改,例如处理更多的寄存器和线圈,增加错误处理等。