Пример #1
0
        /// <summary>
        /// 通过构造函数重载来区别是读命令还是写命令
        /// </summary>
        /// <param name="address">通信地址</param>
        /// <param name="highAdr">寄存器起始地址高位</param>
        /// <param name="lowAdr">寄存器起始地址地位</param>
        /// <param name="num">寄存器个数</param>
        //public Command(byte address, byte highAdr, byte lowAdr, short num)
        //{
        //    byte[] sendb = new byte[8];
        //    sendb[0] = address;
        //    sendb[1] = 0x03;
        //    sendb[2] = highAdr;
        //    sendb[3] = lowAdr;
        //    byte[] bb2 = BitConverter.GetBytes(num);
        //    Array.Reverse(bb2);
        //    Array.Copy(bb2, 0, sendb, 4, 2);
        //    Array.Copy(CRC.GetCRC(sendb), 0, sendb, 6, 2);

        //    ResultLength = 5 + 2 * num;
        //    SendByte = sendb;
        //}
        //public Command(byte address, byte highAdr, byte lowAdr,byte[] content)
        //{

        //    byte[] sendb = new byte[9+content.Length];
        //    sendb[0] = address;
        //    sendb[1] = 0x10;
        //    sendb[2] = highAdr;
        //    sendb[3] = lowAdr;

        //    byte[] num = BitConverter.GetBytes(Convert.ToInt16(content.Length / 2));
        //    Array.Reverse(num);
        //    Array.Copy(num, 0, sendb, 4, 2);
        //    sendb[6] = Convert.ToByte(content.Length);
        //    Array.Copy(content, 0, sendb, 7, content.Length);
        //    Array.Copy(CRC.GetCRC(sendb), 0, sendb, sendb.Length-2, 2);

        //    ResultLength = 8;
        //    SendByte = sendb;
        //}
        //   byte relayNum = 4;
        public Command(byte address, short Adr, short num)
        {
            byte[] sendb = new byte[10];
            sendb[0] = 0xaa;
            if (address == 6 | address == 7 | address == 9 | address == 10 | address == 12)
            {
                sendb[1] = 0x04;
            }
            else if (address == 3)
            {
                sendb[1] = 0x02;
            }
            else if (address == 8)
            {
                sendb[1] = 0x03;
            }
            else if (address == 1 | address == 2 | address == 4 | address == 5 | address == 11)
            {
                sendb[1] = 0x01;
            }
            else if (address >= 13 && address <= 29)
            {
                sendb[1] = 0x06;
            }
            byte[] sendb2 = new byte[8];
            sendb2[0] = address;
            sendb2[1] = 0x03;
            byte[] bb1 = BitConverter.GetBytes(Adr);
            Array.Reverse(bb1);
            Array.Copy(bb1, 0, sendb2, 2, 2);

            byte[] bb2 = BitConverter.GetBytes(num);
            Array.Reverse(bb2);
            Array.Copy(bb2, 0, sendb2, 4, 2);
            Array.Copy(CRC.GetCRC(sendb2), 0, sendb2, 6, 2);

            Array.Copy(sendb2, 0, sendb, 2, 8);
            ResultLength = 5 + 2 * num;
            SendByte     = sendb;
        }
Пример #2
0
        public Command(byte address, short Adr, byte[] content)
        {
            byte[] sendb = new byte[9 + content.Length];
            sendb[0] = address;
            sendb[1] = 0x10;
            //sendb[2] = highAdr;
            //sendb[3] = lowAdr;

            byte[] bb1 = BitConverter.GetBytes(Adr);
            Array.Reverse(bb1);
            Array.Copy(bb1, 0, sendb, 2, 2);

            byte[] num = BitConverter.GetBytes(Convert.ToInt16(content.Length / 2));
            Array.Reverse(num);
            Array.Copy(num, 0, sendb, 4, 2);
            sendb[6] = Convert.ToByte(content.Length);
            Array.Copy(content, 0, sendb, 7, content.Length);
            Array.Copy(CRC.GetCRC(sendb), 0, sendb, sendb.Length - 2, 2);

            ResultLength = 8;
            SendByte     = sendb;
        }
Пример #3
0
        private static byte[] TryReadBytes(byte address, int backCount)
        {
            List <byte> result = new List <byte>();

            for (int i = 0; i < (delay / 50); i++)
            {
                Thread.Sleep(50);

                int    count  = serialport.BytesToRead;
                byte[] rbytes = new byte[count];
                serialport.Read(rbytes, 0, count);
                result.AddRange(rbytes);

                int    allCount = result.Count;
                byte[] allbytes = result.ToArray();
                // 错误码
                if (allCount == 5)
                {
                    byte[] crcByte = CRC.GetCRC(allbytes);
                    if (BitConverter.ToString(crcByte) == BitConverter.ToString(allbytes, allCount - 2))
                    {
                        CommandUnits.IsCommandding = false;
                        if (allbytes[0] != address)
                        {
                            throw new CommandException("从机地址不匹配");
                        }

                        if (allbytes[1] != 0x90 && allbytes[1] != 0x83)
                        {
                            throw new CommandException("未知异常");
                        }

                        switch (allbytes[2])
                        {
                        case 0x01:
                            throw new CommandException("功能码错位");

                        case 0x02:
                            throw new CommandException("寄存器地址错位");

                        case 0x03:
                            throw new CommandException("寄存器数量错误");

                        case 0x04:
                            throw new CommandException("寄存器写入错误");

                        default:
                            throw new CommandException("未知异常");
                        }
                    }
                }
                else if (allCount == backCount)
                {
                    break;
                }
            }

            byte[] rrr = result.ToArray();
            if (result.Count < 5)
            {
                CommandUnits.IsCommandding = false;
                throw new CommandException("命令超时");
            }
            else
            {
                byte[] crcByte = CRC.GetCRC(rrr);
                if (BitConverter.ToString(crcByte) != BitConverter.ToString(rrr, rrr.Length - 2))
                {
                    CommandUnits.IsCommandding = false;
                    throw new CommandException("CRC校验异常");
                }
            }
            return(result.ToArray());
        }
Пример #4
0
        public static bool GetResult(Command cd)
        {
            bool result = false;

            //bool isError = false;
            PLAASerialPort.GetInstance().Write(cd.SendByte);
            for (int i = 0; i < (delay / 1000); i++)
            {
                if (cd.SendByte[2] == 6 | cd.SendByte[2] == 7 | cd.SendByte[2] == 9 | cd.SendByte[2] == 10 | cd.SendByte[2] == 12)
                {
                    Thread.Sleep(1600);//一个中继器来回400ms,4个中00继
                }
                else if (cd.SendByte[2] == 3 | cd.SendByte[2] == 13 | cd.SendByte[2] == 14 | cd.SendByte[2] == 15 | (cd.SendByte[2] >= 25 && cd.SendByte[2] <= 29))
                {
                    Thread.Sleep(800);
                }
                else if (cd.SendByte[2] == 8 | (cd.SendByte[2] >= 16 && cd.SendByte[2] <= 22))
                {
                    Thread.Sleep(1200);
                }
                else if (cd.SendByte[2] == 1 | cd.SendByte[2] == 2 | cd.SendByte[2] == 4 | cd.SendByte[2] == 5 | cd.SendByte[2] == 11)
                {
                    Thread.Sleep(400);
                }
                else if (cd.SendByte[2] == 23 | cd.SendByte[2] == 24)
                {
                    Thread.Sleep(1000);
                }
                Thread.Sleep(delay2);
                // 错误码
                if (PLAASerialPort.GetInstance().DataBufferList.Count == 5)
                {
                    byte[] ebyte   = PLAASerialPort.GetInstance().DataBufferList.ToArray();
                    byte[] crcByte = CRC.GetCRC(ebyte);
                    if (BitConverter.ToString(crcByte) == BitConverter.ToString(ebyte, ebyte.Length - 2))
                    {
                        cd.ErrorByte = PLAASerialPort.GetInstance().DataBufferList.ToArray();

                        LogLib.Log.GetLogger("CommandResult").Warn(string.Format("错误命令:{0},发送命令:{1}", PLAASerialPort.byteToHexStr(cd.ErrorByte), PLAASerialPort.byteToHexStr(cd.SendByte)));
                        return(false);
                    }
                }
                else if (PLAASerialPort.GetInstance().DataBufferList.Count >= cd.ResultLength)
                {
                    //for (int a = 0; a < 2; a++)
                    //{
                    byte[] tbyte = PLAASerialPort.GetInstance().DataBufferList.ToArray();

                    for (int ii = 0; ii < tbyte.Length; ii++)
                    {
                        if (tbyte[ii] != 0xaa)
                        {
                            continue;
                        }
                        try
                        {
                            if (tbyte[ii + 1] == (cd.SendByte[1] - 1) && tbyte[ii + 2] == cd.SendByte[2] && tbyte[ii + 3] == cd.SendByte[3] && tbyte[ii + 4] == 0x06)
                            {
                                byte[] mbyte = new byte[tbyte.Length - ii - 2];
                                Array.Copy(tbyte, ii + 2, mbyte, 0, tbyte.Length - ii - 2);
                                //byte[] mbyte = new byte[tbyte.Length - ii];
                                //Array.Copy(tbyte, ii, mbyte, 0, tbyte.Length - ii);
                                if (mbyte.Length >= cd.ResultLength)
                                {
                                    byte[] ybyte = new byte[cd.ResultLength];
                                    Array.Copy(mbyte, 0, ybyte, 0, cd.ResultLength);
                                    cd.ResultByte = ybyte;
                                    // cd.ResultByte = PLAASerialPort.GetInstance().DataBufferList.ToArray();

                                    return(true);
                                }
                            }
                        }
                        catch
                        {
                            break;
                        }
                    }
                    // }
                    //if (tbyte[0] == 0xaa && tbyte[1] == (cd.SendByte[1] - 1) && tbyte[2] == cd.SendByte[2] && tbyte[3] == cd.SendByte[3])
                    //{
                    //    cd.ResultByte = PLAASerialPort.GetInstance().DataBufferList.ToArray();
                    //    return true;
                    //}
                }
            }
            LogLib.Log.GetLogger("CommandResult").Warn(string.Format("命令超时:{0}", PLAASerialPort.byteToHexStr(cd.SendByte)));
            Trace.WriteLine("超时");
            return(result);
        }