Exemplo n.º 1
0
        private byte[] Read1W(MODBUS_PACKET packetReq, MODBUS_PACKET packetAns)
        {
            // читаем свой запрос
            Read2W(packetReq);

            return(Read2W(packetAns));
        }
Exemplo n.º 2
0
 public ModbusCodes CheckCRC(MODBUS_PACKET packet)
 {
     //Проверяем, совпадает ли пришедшее CRC с вычисленным
     if (CRC16.GetCRC16(packet.DataBuffer, (byte)(packet.BufferSize - 2), (ushort)0xFFFF) != getUSHORTDataBuffer(packet))
     {
         return(ModbusCodes.CRC_ERROR); //Если нет - вернуть ошибку
     }
     return(ModbusCodes.CRC_OK);
 }
Exemplo n.º 3
0
        public void CreateMBSend(MODBUS_PACKET packet)
        {
            ushort crc;

            if (packet.BufferSize > 252)
            {
                return;
            }
            packet.DataBuffer[0] = HostID;      //первый эл-т буфера - номер хоста
            //дописываем CRC
            crc = CRC16.GetCRC16(packet.DataBuffer, packet.BufferSize - 2, 0xFFFF);
            packet.DataBuffer[packet.BufferSize - 2] = (byte)(crc & 0xFF);
            packet.DataBuffer[packet.BufferSize - 1] = (byte)(crc >> 8);
        }
Exemplo n.º 4
0
        private byte[] Read2W(MODBUS_PACKET packet)
        {
            int bytesToRead = packet.BufferSize;
            int bytesRead   = 0;

            byte[] inBuf = new byte[bytesToRead];

            while (bytesToRead > 0)
            {
                int n = comPort.Read(inBuf, bytesRead, bytesToRead);
                bytesRead   += n;
                bytesToRead -= n;
            }

            return(inBuf);
        }
Exemplo n.º 5
0
 public MODBUS_PACKET(MODBUS_PACKET packet)
 {
     this.DataBuffer = new byte[255];
     this.DataBuffer = packet.DataBuffer;
 }
Exemplo n.º 6
0
        public void ReadSingleReg(MODBUS_PACKET packetReq, MODBUS_PACKET packetAns)
        {
            Thread.Sleep(50);

            byte[] inBuf = null;
            try
            {
                inBuf = InterfType == InterfaceType.TwoWire || InterfType == InterfaceType.NotDefined ? Read2W(packetAns) : Read1W(packetReq, packetAns);
            }
            catch
            {
                throw;
            }

            if (inBuf == null)
            {
                throw new ModbusException(ModbusException.ExceptionReason.UnknownException);
            }

            int bytesRead = inBuf.Length;

            Array.Copy(inBuf, 0, packetAns.DataBuffer, 0, bytesRead);

            if (bytesRead > 3 && (packetAns.DataBuffer[1] & 0x80) != 0)
            {
                ErrorCode = packetAns.DataBuffer[2];
                if (packetAns.DataBuffer[2] == (byte)ModbusCodes.ERROR_ILLEGAL_FUNCTION)
                {
                    throw new ModbusException(ModbusException.ExceptionReason.IllegalFuncException);
                }
                if (packetAns.DataBuffer[2] == (byte)ModbusCodes.ERROR_ILLEGAL_DATA_VALUE)
                {
                    throw new ModbusException(ModbusException.ExceptionReason.IllegalValueException);
                }
                if (packetAns.DataBuffer[2] == (byte)ModbusCodes.ERROR_ILLEGAL_DATA_ADRESS)
                {
                    throw new ModbusException(ModbusException.ExceptionReason.IllegalAddrException);
                }
                throw new ModbusException(ModbusException.ExceptionReason.UnknownException);
            }

            //контроль размера полученных данных
            if (!((packetAns.BufferSize < 4) || (packetAns.BufferSize > (int)ModbusCodes.MBCLIENT_MAX_LENGHT)))
            {
                //проверяем CRC
                if (CheckCRC(packetAns) == ModbusCodes.CRC_OK)
                {
                    //проверяем, нам ли предназначен пакет

                    if (packetAns.DataBuffer[0] == HostID || HostID == 0)
                    {
                        if (HostID == 0)
                        {
                            HostID = packetAns.DataBuffer[0];
                        }
                        return;
                    }
                    ErrorCode = (int)ModbusCodes.ERROR_PACKET_HOST_ID_ERROR;
                    throw new ModbusException(ModbusException.ExceptionReason.IDException);
                }
                ErrorCode = (int)ModbusCodes.ERROR_PACKET_CRC;
                throw new ModbusException(ModbusException.ExceptionReason.CRCException);
            }
            ErrorCode = (int)ModbusCodes.ERROR_PACKET_BUFFER_SIZE;
            throw new ModbusException(ModbusException.ExceptionReason.LengthException);
        }
Exemplo n.º 7
0
        /*public void Read(MODBUS_PACKET packetReq, MODBUS_PACKET packetAns)
         * {
         *  // просто пропускаем время
         *  // скорее всего ответ уже придет
         *  Thread.Sleep(250);
         *
         *  // максимальный размер для чтения из порта
         *  // если работаеи по двупроводному интерфейсу, читаем только ответ девайса
         *  // если работаем по однопроводному интерфейсу, читаем свой запрос и ответ девайса
         *  int totalBytesToRead = packetReq.BufferSize + packetAns.BufferSize;
         *  // счетчик прочитанных байт
         *  int bytesRead = 0;
         *
         *  byte[] inBuf = new byte[totalBytesToRead];
         *  // флаг принятого ответа
         *  bool gotReq = false;
         *
         *  try
         *  {
         *      while (totalBytesToRead > 0)
         *      {
         *          int b = comPort.ReadByte();
         *          inBuf[bytesRead++] = (byte)b;
         *          totalBytesToRead--;
         *
         *          // если приняли количество байт, равное длине запроса
         *          // нужно проверить не приняли ли мы свой запрос
         *          if (bytesRead == packetReq.BufferSize && !gotReq)
         *          {
         *              gotReq = true;
         *
         *              // проверяем массивы на равенство
         *              for (int i = 0; i < packetReq.BufferSize; i++)
         *              {
         *                  if (packetReq.DataBuffer[i] != inBuf[i])
         *                  {
         *                      gotReq = false;
         *                      break;
         *                  }
         *              }
         *
         *              // массивы равны, значит приняли свой запрос
         *              if (gotReq)
         *              {
         *                  InterfType = InterfaceType.OneWire;
         *
         *                  // сбрасываем счетчик принятого
         *                  bytesRead = 0;
         *                  // осталось принять только ответ
         *                  totalBytesToRead = packetAns.BufferSize;
         *              }
         *              // запроса нет
         *              // все, что мы приняли - это кусок ответа
         *              // нужно дочитать ответ
         *              else
         *              {
         *                  totalBytesToRead = packetAns.BufferSize - bytesRead;
         *              }
         *          }
         *
         *          // закончились байты в порте
         *          // такое может слущиться по трем причинам
         *          // - просто прочитали все, что надо
         *          // - длина ответа меньше длины запроса
         *          // - ошибка в девайсе и возвращен код ошибки
         *          if (comPort.BytesToRead == 0)
         *          {
         *              // просто выходим и смотрим пакет
         *              break;
         *          }
         *      }
         *  }
         *  catch (TimeoutException)
         *  {
         *      throw;
         *  }
         *
         *  Array.Copy(inBuf, 0, packetAns.DataBuffer, 0, bytesRead);
         *
         *  if (bytesRead > 3 && (packetAns.DataBuffer[1] & 0x80) != 0)
         *  {
         *      ErrorCode = packetAns.DataBuffer[2];
         *      if (packetAns.DataBuffer[2] == (byte)ModbusCodes.ERROR_ILLEGAL_FUNCTION)
         *          throw new ModbusException(ModbusException.ExceptionReason.IllegalFuncException);
         *      if (packetAns.DataBuffer[2] == (byte)ModbusCodes.ERROR_ILLEGAL_DATA_VALUE)
         *          throw new ModbusException(ModbusException.ExceptionReason.IllegalValueException);
         *      if (packetAns.DataBuffer[2] == (byte)ModbusCodes.ERROR_ILLEGAL_DATA_ADRESS)
         *          throw new ModbusException(ModbusException.ExceptionReason.IllegalAddrException);
         *      throw new ModbusException(ModbusException.ExceptionReason.UnknownException);
         *  }
         *
         *  //контроль размера полученных данных
         *  if (!((packetAns.BufferSize < 4) || (packetAns.BufferSize > (int)ModbusCodes.MBCLIENT_MAX_LENGHT)))
         *  {
         *      //проверяем CRC
         *      if (CheckCRC(packetAns) == ModbusCodes.CRC_OK)
         *      {
         *          //проверяем, нам ли предназначен пакет
         *
         *          if (packetAns.DataBuffer[0] == HostID || HostID == 0)
         *          {
         *              if (HostID == 0) HostID = packetAns.DataBuffer[0];
         *              return;
         *          }
         *          ErrorCode = (int)ModbusCodes.ERROR_PACKET_HOST_ID_ERROR;
         *          throw new ModbusException(ModbusException.ExceptionReason.IDException);
         *      }
         *      ErrorCode = (int)ModbusCodes.ERROR_PACKET_CRC;
         *      throw new ModbusException(ModbusException.ExceptionReason.CRCException);
         *  }
         *  ErrorCode = (int)ModbusCodes.ERROR_PACKET_BUFFER_SIZE;
         *  throw new ModbusException(ModbusException.ExceptionReason.LengthException);
         * }*/

        public void Read(MODBUS_PACKET packetReq, MODBUS_PACKET packetAns)
        {
            // просто пропускаем время
            // скорее всего ответ уже придет
            Thread.Sleep(50);

            // разиер первой порции
            int toRead = packetReq.BufferSize > packetAns.BufferSize ? packetAns.BufferSize : packetReq.BufferSize;
            // счетчик прочитанных байт
            int bytesRead = 0;
            // количество байт для пропуска после первого этапа
            int toSkip = 0;

            byte[] inBuf = new byte[packetAns.BufferSize + packetReq.BufferSize];
            try
            {
                while (toRead-- > 0)
                {
                    int b = comPort.ReadByte();
                    inBuf[bytesRead++] = (byte)b;
                }

                // приняли некорое количество байт
                // проверим наличие запроса
                bool isReq = true;
                for (int i = 0; i < bytesRead; i++)
                {
                    if (packetReq.DataBuffer[i] != inBuf[i])
                    {
                        isReq = false;
                        break;
                    }
                }

                InterfType = isReq ? InterfaceType.OneWire : InterfaceType.TwoWire;

                if (isReq)
                {
                    // приняли свой запрос

                    // если запрос длинее, чем ответ, то мы не дочитали его
                    // и должны пропустить несколько байт, прежде чем читать
                    // сам ответ
                    if (packetReq.BufferSize > packetAns.BufferSize)
                    {
                        toSkip = packetReq.BufferSize - bytesRead;
                    }

                    bytesRead = 0;
                    toRead    = packetAns.BufferSize;
                }
                else
                {
                    // не приняли свой запрос
                    // просто дочитываем ответ
                    toRead = packetAns.BufferSize - bytesRead;
                }

                // пропускаем недочитанный запрос
                while (toSkip-- > 0)
                {
                    comPort.ReadByte();
                }

                // дочитываем ответ
                while (toRead > 0)
                {
                    int n = comPort.Read(inBuf, bytesRead, toRead);
                    bytesRead += n;
                    toRead    -= n;
                }
            }
            catch (TimeoutException)
            {
                throw;
            }

            Array.Copy(inBuf, 0, packetAns.DataBuffer, 0, bytesRead);

            if (bytesRead > 3 && (packetAns.DataBuffer[1] & 0x80) != 0)
            {
                ErrorCode = packetAns.DataBuffer[2];
                if (packetAns.DataBuffer[2] == (byte)ModbusCodes.ERROR_ILLEGAL_FUNCTION)
                {
                    throw new ModbusException(ModbusException.ExceptionReason.IllegalFuncException);
                }
                if (packetAns.DataBuffer[2] == (byte)ModbusCodes.ERROR_ILLEGAL_DATA_VALUE)
                {
                    throw new ModbusException(ModbusException.ExceptionReason.IllegalValueException);
                }
                if (packetAns.DataBuffer[2] == (byte)ModbusCodes.ERROR_ILLEGAL_DATA_ADRESS)
                {
                    throw new ModbusException(ModbusException.ExceptionReason.IllegalAddrException);
                }
                throw new ModbusException(ModbusException.ExceptionReason.UnknownException);
            }

            //контроль размера полученных данных
            if (!((packetAns.BufferSize < 4) || (packetAns.BufferSize > (int)ModbusCodes.MBCLIENT_MAX_LENGHT)))
            {
                //проверяем CRC
                if (CheckCRC(packetAns) == ModbusCodes.CRC_OK)
                {
                    //проверяем, нам ли предназначен пакет

                    if (packetAns.DataBuffer[0] == HostID || HostID == 0)
                    {
                        if (HostID == 0)
                        {
                            HostID = packetAns.DataBuffer[0];
                        }
                        return;
                    }
                    ErrorCode = (int)ModbusCodes.ERROR_PACKET_HOST_ID_ERROR;
                    throw new ModbusException(ModbusException.ExceptionReason.IDException);
                }
                ErrorCode = (int)ModbusCodes.ERROR_PACKET_CRC;
                throw new ModbusException(ModbusException.ExceptionReason.CRCException);
            }
            ErrorCode = (int)ModbusCodes.ERROR_PACKET_BUFFER_SIZE;
            throw new ModbusException(ModbusException.ExceptionReason.LengthException);
        }
Exemplo n.º 8
0
 public ushort getUSHORTDataBuffer(MODBUS_PACKET packet)
 {
     return((ushort)((ushort)(packet.DataBuffer[packet.BufferSize - 2]) + ((ushort)(packet.DataBuffer[packet.BufferSize - 1]) << 8)));
 }