C#使用 ModeBusTCP读取汇川Easy521PLC

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;
            }
        }


    }



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值