C#实现modbus通讯的实现示例
目录
- 前言
- 一、Modbus RTU通讯
- 1.C#程序编写
- 二、Modbus TCP通讯
- 1.C#程序编写
前言
这篇文章是modbus通讯的串口(RTU)、网口(TC编程P)通讯的记录,以下都是使用NModbus4第三方库实现,能进行读写数据。
一、Modbus RTU通讯
Modbus RTU通讯是一种基于串口通讯的协议。它使用串行通信接口(如RS232、RS485等)来传输数据,并且是Modbus协议的一种物理层实现方式。
1.C#程序编写
代码如下:
using Modbus.Device; using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1.Service { //modbus串口通讯 class RS485Service { //配置文件 public IniFile m_ConfigFile; //从站地址 byte slaveAddress = 1; //注:是IModbusMaster类型,不是IModbusSerialMaster类型 public IModbusMaster master; public SerialPort serialPort = null; public RS485Service() { } public void Connect() { if (serialPort == null) { try { // 配置串口连接 string portName = "COM1"; // 串口名称 int baudRate = 9600; // 波特率 Parity parity = Parity.None; // 校验位 int dataBits = 8; // 数据位 StopBits stopBits = StopBits.One; // 停止位 serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits); //serialPort.DataReceived += SerialPort_DataReceived; serialPort.Open(); if (serialPort.IsOpen) { master = ModbusSerialMaster.CreateRtu(serialPort); Console.WriteLine("串口通讯连接成功!"); } } catch (Exception ex) { Console.WriteLine("串口通讯未连接!" + ex.Message); } } } #region 地址读值 //读取单个线圈状态(功能码 0x01) public bool ReadCoil(ushort coilAddress) { bool[] coils = master.ReadCoils(slaveAddress, coilAddress, 1); return coils[0]; } //读取多个线圈状态(功能码 0x01) public bool[] ReadCoils(ushort startAddress, ushort quantity) { return master.ReadCoils(slaveAddress, startAddress, quantity); } //读取单个保持寄存器(功能码 0x03) public ushort ReadRegister(ushort registerAddress) { ushort[] registers = master.ReadHoldingRegisters(slaveAddress, registerAddress, 1); return registers[0]; } //读取多个保持寄存器(功能码 0x03) public ushort[] ReadResgisters(ushort startAddress, ushort quantity) { return master.ReadHoldingRegisters(slaveAddress, startAddress, quantity); } #endregion #region 地址写值 //写单个线圈(功能码 0x05) //如果需要控制单个 IO 点(例如一个继电器),可以使用 WriteSingleCoil 方法 public void WriteCoil(ushort coilAddress, bool value) { master.WriteSingleCoil(slaveAddress, coilAddress, value); } //写多个线圈(功能码 0x0F) //如果需要同时控制多个 IO 点,可以使用 WriteMultipleCoils 方法 public void WriteMultCoils(ushort startAddress, bool[] values) { master.WriteMultipleCoils(slaveAddress, startAddress, values); } //写单个保持寄存器(功能码 0x06) //如果需要写入单个寄存器(例如一个数字量输出),可以使用 WriteSingleRegister 方法 public void WriteRegister(ushort registerAddress, ushort value) { master.WriteSingleRegister(slaveAddress, registerAddress, value); } //写多个保持寄存器(功能码 0x10) //如果需要写入多个寄存器,可以使用 WriteMultipleRegisters 方法 public void WriteMultRegisters(ushort startAddress, ushort[] values) { master.WriteMultipleRegisters(slaveAddress, startAddress, values); } #endregion } }
二、Modbus TCP通讯
Modbus TCP是一种基于以太网的Modbus协议实现方式。它通过TCP/IP网络进行数据传输,适用于工业自动化和设备监控中的高速通信。
1.C#程序编写
代码如下:
using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace XiSi.Communications { class ModbusTCPProtocol { #region 属性 private string _ip = "127.0.0.1"; private int _port = 502; public byte slaveAddress = 1; public IModbusMaster _master; TcpClient client; #endregion public void Config(string ip, int port) { _ip = ip; _port = port; } /// <summary> /// modbus的tcp连接(网口连接) /// </summary> public void Connect() { //连接到Modbus TCP服务器(IP地址和端口) client = new TcpClient(); client.Connect(IPAddress.Parse(_ip), _port); //创建Modbus TCP主站对象 _master = ModbusIpMaster.CreateIp(client); } public void Disconnect() { _master.Dispose(); } public bool IsConnected() { return _master != null && client.Connected; } /// <summary> /// 读取线圈 /// </编程客栈summary> public bool[] ReadCoils(ushort stjavascriptartAddress, ushort count) { return _master.ReadCoils(slaveAddress, startAddress, count); php } /python// <summary> /// 写入线圈值 /// </summary> public void WriteCoil(ushort startAddress, bool value) { _master.WriteSingleCoil(slaveAddress, startAddress, value); } /// <summary> /// 读取寄存器 /// </summary> public ushort[] ReadRegisters(ushort startAdress, ushort count) { return _master.ReadHoldingRegisters(slaveAddress, startAdress, count); } /// <summary> /// 写入寄存器值 /// </summary> public void WriteRegisters(ushort startAddress, ushort[] data) { _master.WriteMultipleRegisters(slaveAddress, startAddress, data); } } }
到此这篇关于C#实现modbus通讯的实现示例的文章就介绍到这了,更多相关C# modbus通讯内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望
精彩评论