Modbus 分 ACSII 模式和RTU模式
你要的是那种。namespace Modbus_ASCII
{
    public class ASCII_Data
    {
        #region 通讯字段定义
        byte Heading;
        byte SlaveAdd_Hi;
        byte SlaveAdd_Lo;
        byte Function_Hi;
        byte Function_Lo;
        byte ByteCountHi;
        byte ByteCountLo;
        public byte[] Data;
        byte StartAddHI_Hi;
        byte StartAddHI_Lo;
        byte StartAddLO_Hi;
        byte StartAddLO_Lo;
        byte NumOfPointHI_Hi;
        byte NumOfPointHI_Lo;
        byte NumOfPointLO_Hi;
        byte NumOfPointLO_Lo;
        public  byte LRC_Hi;
        public  byte LRC_Lo;
        byte End_Hi;
        byte End_Lo;
        public int DataLength;
        #endregion
        public ASCII_Data(string cmd,string Add,string Num)
        {
            Heading = (byte)':';
            SlaveAdd_Hi = (byte)'0';
            SlaveAdd_Lo = (byte)'1';
            End_Hi = 0x0D;
            End_Lo = 0x0A;
            //switch (cmd)
            //{
            //    case "":            //}
            
            char[] AddChar = new char[4];
            AddChar = Add.ToCharArray();
            StartAddHI_Hi = (byte)AddChar[0];
            StartAddHI_Lo = (byte)AddChar[1];
            StartAddLO_Hi = (byte)AddChar[2];
            StartAddLO_Lo = (byte)AddChar[3];
            char[] NumChar = new char[4];
            NumChar = Num.ToCharArray();
            NumOfPointHI_Hi = (byte)NumChar[0];
            NumOfPointHI_Lo = (byte)NumChar[1];
            NumOfPointLO_Hi = (byte)NumChar[2];
            NumOfPointLO_Lo = (byte)NumChar[3];
        }
        public ASCII_Data(string Add)
        {
            try
            {
                Heading = (byte)':';
                SlaveAdd_Hi = (byte)'0';
                SlaveAdd_Lo = (byte)'1';
                End_Hi = 0x0D;
                End_Lo = 0x0A;
                //switch (cmd)
                //{
                //    case "":                //}
                //char[] FunctionChar = new char[2];
                //FunctionChar = 
                Function_Hi = (byte)'0';
                Function_Lo = (byte)'3';
                char[] AddChar = new char[4];
                if (Add.ToCharArray().Length > 4)
                {
                    throw new IndexOutOfRangeException();
                }
                   
                AddChar = Add.ToCharArray();
                StartAddHI_Hi = (byte)AddChar[0];
                StartAddHI_Lo = (byte)AddChar[1];
                StartAddLO_Hi = (byte)AddChar[2];
                StartAddLO_Lo = (byte)AddChar[3];                NumOfPointHI_Hi = (byte)'0';
                NumOfPointHI_Lo = (byte)'0';
                NumOfPointLO_Hi = (byte)'0';
                NumOfPointLO_Lo = (byte)'1';
                CheckLRC();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        public ASCII_Data(byte[] dataRecv)
        {
             int startNum =0;
            foreach (byte start in dataRecv)
            {
                if(dataRecv[startNum]!= (byte)':')
                    startNum++;
                else
                    break;
            }
            if (dataRecv[startNum] != 0x7E)
            {
                throw new Exception("错误帧");
                
            }
            Heading = dataRecv[startNum++];
            SlaveAdd_Hi = dataRecv[startNum++];
            SlaveAdd_Lo = dataRecv[startNum++];
            Function_Hi = dataRecv[startNum++];
            Function_Lo = dataRecv[startNum++];
            ByteCountHi = dataRecv[startNum++];
            ByteCountLo = dataRecv[startNum++];
            byte[] ByteCount = new byte[] { ByteCountHi, ByteCountLo };
            DataLength = Convert.ToUInt16(Encoding.ASCII.GetString(ByteCount));
            dataRecv = new byte[DataLength * 2];
            for (int index = 0; index < (DataLength * 2); index++)
            {
                Data[index] = dataRecv[startNum++];
 
            }
            if (dataRecv[startNum] == 0x0D)
                End_Hi = dataRecv[startNum++];
            else
                throw new Exception("错误帧");
            if (dataRecv[startNum] == 0x0A)
                End_Lo = dataRecv[startNum];
            else
                throw new Exception("错误帧");
        }        public void CheckLRC()
        {
            string SumString ="";
            try
            {
                if (Data == null)
                {
                    byte[] SlaveAdd = new byte[] { SlaveAdd_Hi, SlaveAdd_Lo };
                    byte[] Function = new byte[] { Function_Hi, Function_Lo };
                    byte[] StartAddHi = new byte[] { StartAddHI_Hi, StartAddHI_Lo };
                    byte[] StartAddLo = new byte[] { StartAddLO_Hi, StartAddLO_Lo };
                    byte[] NumOfPointHi = new byte[] { NumOfPointHI_Hi, NumOfPointHI_Lo };
                    byte[] NumOfPointLo = new byte[] { NumOfPointLO_Hi, NumOfPointLO_Lo };
                    byte Sum = (byte)(Convert.ToUInt16(Encoding.ASCII.GetString(SlaveAdd), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(Function), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(StartAddHi), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(StartAddLo), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(NumOfPointHi), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(NumOfPointLo), 16));
                    Sum = (byte)(~Sum + 1);
                    SumString = Convert.ToString(Sum, 16);
                    if (Sum < 0x10)
                    {
                        SumString = "0" + SumString;
                    }
                    char[] LRC = SumString.ToCharArray();                    LRC_Hi = (byte)LRC[0];
                    LRC_Lo = (byte)LRC[1];                }
                else
                {
                    //string DataString;
                    int index = 0;
                    byte tempByte = 0 ;
                    byte Sum = 0;
                    byte[] SlaveAdd = new byte[] { SlaveAdd_Hi, SlaveAdd_Lo };
                    byte[] Function = new byte[] { Function_Hi, Function_Lo };
                    foreach (byte dataByte in Data)
                    {
                        if (index == 0)
                        {
                            tempByte = dataByte;
                            index++;
                        }
                        else
                        {
                            byte[] tempByteArray = new byte[] { tempByte, dataByte };
                            Sum += (byte)(Convert.ToUInt16(Encoding.ASCII.GetString(tempByteArray), 16));
                            index = 0;
                        }
                    }
                    Sum = (byte)(~Sum + 1);
                    SumString = Convert.ToString(Sum, 16);
                    if (Sum < 0x10)
                    {
                        SumString = "0" + SumString;
                    }
                    char[] LRC = SumString.ToCharArray();                    LRC_Hi = (byte)LRC[0];
                    LRC_Lo = (byte)LRC[1];                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);            }
        }
        public byte[] GetBytes()
        {
            if (Data == null)
            {
                byte[] dataSend = new byte[17];
                Buffer.BlockCopy(BitConverter.GetBytes(Heading), 0, dataSend, 0, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(SlaveAdd_Hi), 0, dataSend, 1, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(SlaveAdd_Lo), 0, dataSend, 2, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(Function_Hi), 0, dataSend, 3, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(Function_Lo), 0, dataSend, 4, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(StartAddHI_Hi), 0, dataSend, 5, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(StartAddHI_Lo), 0, dataSend, 6, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(StartAddLO_Hi), 0, dataSend, 7, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(StartAddLO_Lo), 0, dataSend, 8, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointHI_Hi), 0, dataSend, 9, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointHI_Lo), 0, dataSend, 10, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointLO_Hi), 0, dataSend, 11, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointLO_Lo), 0, dataSend, 12, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(LRC_Hi), 0, dataSend, 13, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(LRC_Lo), 0, dataSend, 14, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(End_Hi), 0, dataSend, 15, 1);
                Buffer.BlockCopy(BitConverter.GetBytes(End_Lo), 0, dataSend, 16, 1);
                return dataSend;            }
            else
            {
                return null;
            }
        }
    
    }
}这个是我关于ASCII版本的代码。
ASCII_Data SendData = new ACSII_Data("你要的地址Add");socket.send(SendData.GetBytes());你参考下自己写吧。