private byte[] Read1W(MODBUS_PACKET packetReq, MODBUS_PACKET packetAns) { // читаем свой запрос Read2W(packetReq); return(Read2W(packetAns)); }
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); }
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); }
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); }
public MODBUS_PACKET(MODBUS_PACKET packet) { this.DataBuffer = new byte[255]; this.DataBuffer = packet.DataBuffer; }
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); }
/*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); }
public ushort getUSHORTDataBuffer(MODBUS_PACKET packet) { return((ushort)((ushort)(packet.DataBuffer[packet.BufferSize - 2]) + ((ushort)(packet.DataBuffer[packet.BufferSize - 1]) << 8))); }