/// <summary>
        /// 从PLC指定地址读取多个字:整型
        /// </summary>
        /// <param name="mr">PLC内存类型</param>
        /// <param name="ch">内存地址</param>
        /// <param name="cnt">整型的个数</param>
        /// <param name="reData">读取的数据</param>
        /// <returns></returns>
        public short ReadWords(PlcMemory mr, short ch, short cnt, out short[] reData)
        {
            reData = new short[cnt];
            int num = 30 + (cnt * 2);

            byte[] rd = new byte[num];
            if (BasicClass.SendData(FinsClass.FinsCmd(RorW.Read, mr, MemoryType.Word, ch, 0, cnt)) == 0)
            {
                if (BasicClass.ReceiveData(rd) == 0)
                {
                    bool flag = true;
                    if (rd[11] == 3)
                    {
                        flag = ErrorCode.CheckHeadError(rd[15]);
                    }
                    if (!flag)
                    {
                        return(-1);
                    }
                    if (ErrorCode.CheckEndCode(rd[0x1c], rd[0x1d]))
                    {
                        for (int i = 0; i < cnt; i++)
                        {
                            byte[] buffer3 = new byte[] { rd[(30 + (i * 2)) + 1], rd[30 + (i * 2)] };
                            reData[i] = BitConverter.ToInt16(buffer3, 0);
                        }
                        return(0);
                    }
                }
                return(-1);
            }
            return(-1);
        }
        /// <summary>
        /// 读取Bit位值
        /// </summary>
        /// <param name="mr">PLC 内存类型</param>
        /// <param name="ch"></param>
        /// <param name="bs"></param>
        /// <returns></returns>
        public short GetBitState(PlcMemory mr, string ch, out short bs)
        {
            bs = 0;
            byte[] rd     = new byte[0x1f];
            short  num    = short.Parse(ch.Split(new char[] { '.' })[0]);
            short  offset = short.Parse(ch.Split(new char[] { '.' })[1]);

            if (BasicClass.SendData(FinsClass.FinsCmd(RorW.Read, mr, MemoryType.Bit, num, offset, 1)) == 0)
            {
                if (BasicClass.ReceiveData(rd) == 0)
                {
                    bool flag = true;
                    if (rd[11] == 3)
                    {
                        flag = ErrorCode.CheckHeadError(rd[15]);
                    }
                    if (flag)
                    {
                        if (ErrorCode.CheckEndCode(rd[0x1c], rd[0x1d]))
                        {
                            bs = rd[30];
                            return(0);
                        }
                        return(-1);
                    }
                }
                return(-1);
            }
            return(-1);
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="rIP"></param>
 /// <param name="rPort"></param>
 /// <param name="timeOut"></param>
 /// <returns></returns>
 public short Link(string rIP, short rPort, short timeOut = 0xbb8)
 {
     if (BasicClass.PingCheck(rIP, timeOut))
     {
         BasicClass.Client.Connect(rIP, rPort);
         BasicClass.Stream = BasicClass.Client.GetStream();
         Thread.Sleep(10);
         if (BasicClass.SendData(FinsClass.HandShake()) != 0)
         {
             return(-1);
         }
         byte[] rd = new byte[0x18];
         if (BasicClass.ReceiveData(rd) != 0)
         {
             return(-1);
         }
         if (rd[15] != 0)
         {
             return(-1);
         }
         BasicClass.pcNode  = rd[0x13];
         BasicClass.plcNode = rd[0x17];
         return(0);
     }
     return(-1);
 }
        /// <summary>
        /// 从PLC指定地址读取Real类型数据值:浮点型
        /// </summary>
        /// <param name="mr">PLC内存类型</param>
        /// <param name="ch">内存地址</param>
        /// <param name="reData">读取的数据</param>
        /// <returns></returns>
        public short ReadReal(PlcMemory mr, short ch, out float reData)
        {
            reData = 0f;
            int num = 34;

            byte[] rd = new byte[num];
            if (BasicClass.SendData(FinsClass.FinsCmd(RorW.Read, mr, MemoryType.Word, ch, 0, 2)) == 0)
            {
                if (BasicClass.ReceiveData(rd) == 0)
                {
                    bool flag = true;
                    if (rd[11] == 3)
                    {
                        flag = ErrorCode.CheckHeadError(rd[15]);
                    }
                    if (flag)
                    {
                        if (ErrorCode.CheckEndCode(rd[0x1c], rd[0x1d]))
                        {
                            byte[] buffer3 = new byte[] { rd[31], rd[30], rd[33], rd[32] };
                            reData = BitConverter.ToSingle(buffer3, 0);
                            return(0);
                        }
                        return(-1);
                    }
                }
                return(-1);
            }
            return(-1);
        }
        /// <summary>
        /// 写Bit位值
        /// </summary>
        /// <param name="mr"></param>
        /// <param name="ch"></param>
        /// <param name="bs"></param>
        /// <returns></returns>
        public short SetBitState(PlcMemory mr, string ch, BitState bs)
        {
            byte[] rd     = new byte[30];
            short  num    = short.Parse(ch.Split(new char[] { '.' })[0]);
            short  offset = short.Parse(ch.Split(new char[] { '.' })[1]);

            byte[] buffer2 = FinsClass.FinsCmd(RorW.Write, mr, MemoryType.Bit, num, offset, 1);
            byte[] array   = new byte[0x23];
            buffer2.CopyTo(array, 0);
            array[0x22] = (byte)bs;
            if (BasicClass.SendData(array) == 0)
            {
                if (BasicClass.ReceiveData(rd) == 0)
                {
                    bool flag = true;
                    if (rd[11] == 3)
                    {
                        flag = ErrorCode.CheckHeadError(rd[15]);
                    }
                    if (flag)
                    {
                        if (ErrorCode.CheckEndCode(rd[0x1c], rd[0x1d]))
                        {
                            return(0);
                        }
                        return(-1);
                    }
                }
                return(-1);
            }
            return(-1);
        }
        /// <summary>
        /// 向PLC指定地址写Real类型数据:浮点型
        /// </summary>
        /// <param name="mr">PLC内存类型</param>
        /// <param name="ch">内存地址</param>
        /// <param name="inData">要写入的数据</param>
        /// <returns></returns>
        public short WriteReal(PlcMemory mr, short ch, float inData)
        {
            byte[] rd      = new byte[30];
            byte[] buffer2 = FinsClass.FinsCmd(RorW.Write, mr, MemoryType.Word, ch, 0, 2);
            byte[] buffer3 = new byte[4];

            byte[] bytes = BitConverter.GetBytes(inData);
            buffer3[0] = bytes[1];
            buffer3[1] = bytes[0];
            buffer3[2] = bytes[3];
            buffer3[3] = bytes[2];

            byte[] array = new byte[4 + 0x22];
            buffer2.CopyTo(array, 0);
            buffer3.CopyTo(array, 0x22);
            if (BasicClass.SendData(array) == 0)
            {
                if (BasicClass.ReceiveData(rd) == 0)
                {
                    bool flag = true;
                    if (rd[11] == 3)
                    {
                        flag = ErrorCode.CheckHeadError(rd[15]);
                    }
                    if (flag)
                    {
                        if (ErrorCode.CheckEndCode(rd[0x1c], rd[0x1d]))
                        {
                            return(0);
                        }
                        return(-1);
                    }
                }
                return(-1);
            }
            return(-1);
        }
 /// <summary>
 /// 向PLC指定地址写入多个字:整型
 /// </summary>
 /// <param name="mr">PLC内存类型</param>
 /// <param name="ch">内存起始地址</param>
 /// <param name="cnt">整型个数</param>
 /// <param name="inData">要写入的整型数据</param>
 /// <returns></returns>
 public short WriteWords(PlcMemory mr, short ch, short cnt, short[] inData)
 {
     byte[] rd      = new byte[30];
     byte[] buffer2 = FinsClass.FinsCmd(RorW.Write, mr, MemoryType.Word, ch, 0, cnt);
     byte[] buffer3 = new byte[cnt * 2];
     for (int i = 0; i < cnt; i++)
     {
         byte[] bytes = BitConverter.GetBytes(inData[i]);
         buffer3[i * 2]       = bytes[1];
         buffer3[(i * 2) + 1] = bytes[0];
     }
     byte[] array = new byte[(cnt * 2) + 0x22];
     buffer2.CopyTo(array, 0);
     buffer3.CopyTo(array, 0x22);
     if (BasicClass.SendData(array) == 0)
     {
         if (BasicClass.ReceiveData(rd) == 0)
         {
             bool flag = true;
             if (rd[11] == 3)
             {
                 flag = ErrorCode.CheckHeadError(rd[15]);
             }
             if (flag)
             {
                 if (ErrorCode.CheckEndCode(rd[0x1c], rd[0x1d]))
                 {
                     return(0);
                 }
                 return(-1);
             }
         }
         return(-1);
     }
     return(-1);
 }