private dynamic Send(byte[] data) { dynamic answer = new ExpandoObject(); answer.success = false; answer.error = string.Empty; answer.errorcode = DeviceError.NO_ERROR; byte[] buffer = null; //var attempts_total = (packagesSent > 0) ? SEND_ATTEMPTS_COUNT : 1; // непонятный оператор 04.03.2019 var attempts_total = SEND_ATTEMPTS_COUNT; for (var attempts = 0; (attempts < attempts_total) && (answer.success == false); attempts++) { var timeout = TIMEOUT_TIME_MIN * (attempts + 1); buffer = SendSimple(data, timeout); if (buffer.Length == 0) { answer.error = "Нет ответа"; answer.errorcode = DeviceError.NO_ANSWER; } else { if (buffer.Length < 5) { answer.errorcode = DeviceError.TOO_SHORT_ANSWER; answer.error = "в кадре ответа не может содержаться менее 5 байт"; } else if (!Crc.CheckReverse(buffer, new Crc16Modbus())) { answer.errorcode = DeviceError.CRC_ERROR; answer.error = "контрольная сумма кадра не сошлась"; answer = xOAxOD(buffer); if (answer.success) { buffer = answer.buffer; } } else { answer.success = true; answer.error = string.Empty; answer.errorcode = DeviceError.NO_ERROR; } } } if (answer.success) { var offset = 0; answer.NetworkAddress = buffer[0]; if (answer.NetworkAddress == 251) { offset = 12; } answer.Function = buffer.Skip(offset + 1).FirstOrDefault(); answer.Body = buffer.Skip(offset + 2).Take(buffer.Length - (offset + 2 + 2)).ToArray(); //modbus error if (answer.Function > 0x80)//0xc1) { answer.errorcode = DeviceError.DEVICE_EXCEPTION; answer.success = false; answer.exceptionCode = buffer.Skip(offset + 2).FirstOrDefault(); string exceptionMessage = deviceExceptionMessage.ContainsKey(answer.exceptionCode) ? deviceExceptionMessage[answer.exceptionCode] : ""; answer.error = $"устройство вернуло ошибку: {answer.exceptionCode} {exceptionMessage}"; } } mid++; return(answer); }