Modbus TCP是一种基于以太网TCP/IP的Modbus协议变种,它允许Modbus协议在以太网网络上运行,使得设备之间可以通过IP网络交换数据。Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准,广泛应用于工业自动化领域。
#region ModBusTCP 地址解释
/* 00 01->事务标识符,随意指定
00 00->协议标识符,Modbus TCP协议标识符为0x0000
00 06->报文长度,表示后面的报文长度为6个字节
01->广播地址
03->功能码 0x01 读输出线圈
0x02 读离散输入
0x03 读保持寄存器
0x04 读输入寄存器
0x05 写单个线圈
0x06 写单个保持寄存器
0x0F 写多个线圈
0x10 写多个保持寄存器
00 64 读写地址高八位 低八位
00 01 寄存器数量
*/
using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Threading.Tasks;
namespace ModbusTcpExample
{
class Program
{
static void Main(string[] args)
{
MBTCP mBTCP = new MBTCP();
mBTCP.MDConnection("192.168.1.2", 502);
}
}
class MBTCP
{
private bool ConnectionStatus = false;
NetworkStream stream;
//ModBusTCP启动
public void MDConnection(string ipAddress, int port)
{
try
{
TcpClient client = new TcpClient(ipAddress, port);
stream = client.GetStream();
ConnectionStatus = true;
}
catch (Exception e)
{
Console.WriteLine("TCP connection failed: " + e.Message);
ConnectionStatus = false;
}
}
//读单个D寄存器
public int ReadRegister(int address)
{
if (ConnectionStatus)
{
try
{
#region ModBusTCP 地址解释
/* 00 01->事务标识符,随意指定
00 00->协议标识符,Modbus TCP协议标识符为0x0000
00 06->报文长度,表示后面的报文长度为6个字节
01->广播地址
03->功能码 0x01 读输出线圈
0x02 读离散输入
0x03 读保持寄存器
0x04 读输入寄存器
0x05 写单个线圈
0x06 写单个保持寄存器
0x0F 写多个线圈
0x10 写多个保持寄存器
00 64 读写地址高八位 低八位
00 01 寄存器数量
*/
#endregion
byte H = (byte)((address >> 8) & 0xFF);
byte L = (byte)(address & 0xFF);
byte[] request = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, H, L, 0x00, 0x01 };
stream.WriteAsync(request, 0, request.Length); // 发送请求报文
byte[] response = new byte[12]; // 根据实际情况调整长度
stream.ReadAsync(response, 0, response.Length);
int decimalValue = (response[9] << 8) | response[10];
return decimalValue;
}
catch (Exception e)
{
Console.WriteLine("TCP connection failed: " + e.Message);
ConnectionStatus = false;
return 888;
}
}
else
{
Console.WriteLine("TCP connection failed");
return 888;
}
}
//写单个D寄存器
public bool WriteRegister(int address, int Wvalue)
{
if (ConnectionStatus)
{
try
{
byte H = (byte)((address >> 8) & 0xFF);
byte L = (byte)(address & 0xFF);
byte WH = (byte)((Wvalue >> 8) & 0xFF);
byte WL = (byte)(Wvalue & 0xFF);
byte[] request = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06, H, L, WH, WL };
stream.WriteAsync(request, 0, request.Length); // 发送请求报文
byte[] response = new byte[12]; // 根据实际情况调整长度
return false;
}
catch (Exception e)
{
Console.WriteLine("TCP connection failed: " + e.Message);
ConnectionStatus = false;
return false;
}
}
else
{
Console.WriteLine("TCP connection failed");
return false;
}
}
//读多个M寄存器
public bool[] ReadMixeds(int address, int quantity)
{
bool[] MB = new bool[quantity];
if (ConnectionStatus)
{
try
{
byte H = (byte)((address >> 8) & 0xFF);
byte L = (byte)(address & 0xFF);
byte QH = (byte)((quantity >> 8) & 0xFF);
byte QL = (byte)(quantity & 0xFF);
byte[] request = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x02, H, L, QH, QL };
stream.WriteAsync(request, 0, request.Length); // 发送请求报文
byte[] response = new byte[10 + quantity / 8]; // 根据实际情况调整长度
stream.ReadAsync(response, 0, response.Length);
Console.WriteLine("Received response:");
foreach (var b in response)
{
Console.Write(b.ToString("X2") + " ");
}
//bool[] MB = new bool[quantity];
Console.WriteLine("\nMMMMReceived response:");
int MT = 0;
for (int n = 0; n < quantity / 8 + 1; n++)
{
for (int i = 0; i < 8 && MT < quantity; i++)
{
MB[MT] = ((response[9 + n] >> i) & 0x01) != 0;
//int F = MT + address;
//Console.WriteLine("M{0}.{1}", F, MB[MT]);
MT++;
}
}
return MB;
}
catch (Exception e)
{
Console.WriteLine("TCP connection failed: " + e.Message);
ConnectionStatus = false;
return MB;
}
}
else
{
Console.WriteLine("TCP connection failed");
return MB;
}
}
//写单个M寄存器
public bool WriteMixed(int address, bool Wvalue)
{
if (ConnectionStatus)
{
try
{
byte H = (byte)((address >> 8) & 0xFF);
byte L = (byte)(address & 0xFF);
byte WByte = 0x00;
if (Wvalue) { WByte = 0x01; }
byte[] request = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, H, L, 0x00, WByte };
stream.WriteAsync(request, 0, request.Length); // 发送请求报文
byte[] response = new byte[12]; // 根据实际情况调整长度
return true;
}
catch (Exception e)
{
Console.WriteLine("TCP connection failed: " + e.Message);
ConnectionStatus = false;
return false;
}
}
else
{
Console.WriteLine("TCP connection failed");
return false;
}
}
}
}