需要先去NuGet包管理中搜索下载EasyModbus包,然后using引用。
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using EasyModbus;
namespace ModBus
{
public class EasyModbus
{
/// <summary>
/// //创建一个ModbusTCP客户端,IP地址,端口号为
/// </summary>
ModbusClient modbusClient;
/// <summary>
/// 是否初始化
/// </summary>
public bool IsInit
{
get; set;
} = false;
public string MyIp { get; set; }
/// <summary>
/// 初始化
/// </summary>
/// <param name="Ip"></param>
/// <param name="Port"></param>
public void InitModbus(string Ip,int Port)
{
try
{
modbusClient = new ModbusClient(Ip, Port);
//ModbusTCP客户端连接
modbusClient.Connect();
IsInit=true;
}
catch(Exception ex)
{
IsInit = false;
WriteLog(ex.Message);
}
}
/// <summary>
/// 读取指定地址的寄存器值
/// </summary>
/// <param name="address">要读取的寄存器地址</param>
/// <returns>寄存器值</returns>
public int ReadPlc(int address)
{
if (IsInit)
{
try
{
modbusClient.UnitIdentifier = 2; //地址
modbusClient.Baudrate = 9600; //波特率
modbusClient.Parity = Parity.None; //校验位
modbusClient.StopBits = StopBits.One; //停止位
modbusClient.ConnectionTimeout = 500;
modbusClient.Connect();
int[] result = modbusClient.ReadHoldingRegisters(address, 1); //读取指定地址的一个寄存器值
modbusClient.Disconnect();
return result[0];
}
catch (Exception ex)
{
// modbusClient.Disconnect();
WriteLog(ex.Message);
return 0; // 或者抛出异常,根据需要处理
}
}
else
{
return 0; // 或者抛出异常,根据需要处理
}
}
/// <summary>
/// 写入指定地址的寄存器
/// </summary>
/// <param name="address">要写入的寄存器地址</param>
/// <param name="value">要写入的值</param>
public void WritePlc(int address, int value)
{
if (IsInit)
{
try
{
modbusClient.UnitIdentifier = 2; //地址
modbusClient.Baudrate = 9600; //波特率
modbusClient.Parity = Parity.None; //校验位
modbusClient.StopBits = StopBits.One; //停止位
modbusClient.ConnectionTimeout = 500;
modbusClient.Connect();
modbusClient.WriteMultipleRegisters(address, new int[] { value });
modbusClient.Disconnect();
}
catch (Exception ex)
{
modbusClient.Disconnect();
WriteLog(ex.Message);
}
}
}
/// <summary>
/// 关闭连接
/// </summary>
public void ClosePlc()
{
if (!IsInit)
{
modbusClient.Disconnect();
}
}
/// <summary>
/// 日志
/// </summary>
/// <param name="LogContent"></param>
/// <param name="logType"></param>
/// <param name="fileName"></param>
public void WriteLog(string LogContent, string fileName = null)
{
try
{
string basePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
basePath = Directory.GetCurrentDirectory();
if (!Directory.Exists(basePath + "\\Log"))
{
Directory.CreateDirectory(basePath + "\\Log");
}
string dataString = DateTime.Now.ToString("yyyy-MM-dd");
if (!Directory.Exists(basePath + "\\Log\\" + dataString))
{
Directory.CreateDirectory(basePath + "\\Log\\" + dataString);
}
string[] logText = new string[] { DateTime.Now.ToString("HH:mm:ss") + ":" + ":" + LogContent };
string LogFileName = DateTime.Now.ToString("yyyy-MM-dd") + ".log";
if (!string.IsNullOrEmpty(fileName))
{
fileName = fileName + "_" + LogFileName;
}
else
{
fileName = LogFileName;
}
lock (LogContent)
{
System.IO.File.AppendAllLines(basePath + "\\Log\\" + dataString + "\\" + fileName, logText);
}
}
catch (Exception) { }
}
}
}
本文介绍了如何在C#中通过EasyModbus库实现ModbusTCP协议的客户端,包括初始化连接、读取和写入指定地址的寄存器以及断开连接的详细步骤。
832

被折叠的 条评论
为什么被折叠?



