Стартовая страница › Форумы › Разработка и интеграция › Время ожидания или Timeout
- В этой теме 69 ответов, 3 участника, последнее обновление 1 год назад сделано Mikhail.
-
АвторСообщения
-
24.01.2023 в 15:32 #27192manjey73Участник
Да вам и не надо выходить из While — у вас его ПРОСТО не будет…
buf_in = new byte[300]; readCnt1 = Connection.Read(buf_in, 0, 3, PollingOptions.Timeout, ProtocolFormat.Hex, out logText); //считать значение из порта if (buf_in[1] > 0x80) { // Ошибка, взвести флаг ошибки для дальнейшей обработки readcnt2 = Connection.Read(buf_in, 3, 3, PollingOptions.Timeout, ProtocolFormat.Hex, out logText); //считать значение из порта } else { readcnt2 = Connection.Read(buf_in, 3, buf_in[2]+2, PollingOptions.Timeout, ProtocolFormat.Hex, out logText); } readCnt = readCnt1+readCnt2; // Дальше ваш буфер в Билдер лога его Log.WriteLine(BuildReadLogText(buf_in, 0, readCnt, ProtocolFormat.HEX)); /// <summary> /// Builds a log text about reading data. /// </summary> protected static string BuildReadLogText(byte[] buffer, int offset, int readCnt, ProtocolFormat format) { return $"{CommPhrases.ReceiveNotation} ({readCnt}): " + ScadaUtils.BytesToString(buffer, offset, readCnt, format == ProtocolFormat.Hex); }
24.01.2023 в 15:34 #27195manjey73УчастникВы считываете столько байт, сколько есть в ответе после получения первых 3-х.
Если произойдет обрыв связи, только тогда и возникнет Timeout. Все.24.01.2023 в 15:36 #27196manjey73УчастникА так как вы знаете длину ответа, то возникновения Timeout-а и не происходит. Это один из вариантов, когда timeout не мешает кроме случаев отсутствия или обрыва связи
24.01.2023 в 15:45 #27197JurasskParkУчастникТо есть вы предлагаете вместо 1 запроса делать несколько? Зачем? Ради чего? Почему нельзя отправить один запрос и получить один ответ? Без всяких дополнительных.
24.01.2023 в 15:56 #27200MikhailМодераторКоличество полученных данных больше нуля.
Это означает, что чтение должно быть завершено после получения 1 байта, что неверно.
Скорее всего, сначала нужно считать то количество байт, которое всегда приходит. Затем проанализировать их и вычислить, сколько ещё байт должно прийти.24.01.2023 в 15:58 #27201manjey73Участник@JurasskPark именно так реализовано в Modbus, чтение заголовка, в котором указано количество байт блока данных.
А ваш цикл While думаете будет проще? та же песня только под другим соусом.
24.01.2023 в 16:00 #27202manjey73Участник@Mikhail не, если меньше нуля то штатный Timeout, если >0 то timeout уменьшается на время пары символов и так по кругу в цикле.
Но тогда и остановка по сути всегда по таймауту и никак иначе.
24.01.2023 в 16:02 #27203manjey73Участник@JurasskPark запрос как был один, так и останется один, Вы чтение разбиваете на несколько этапов, в вашем случае на 2 всего. Приняли часть, быстренько проверили и принимаете вторую часть дальше, уже зная, сколько вам надо
24.01.2023 в 16:04 #27204manjey73УчастникКак говорится вы попробуйте, у меня есть вообще остановка по нескольким массивам байт вынуждено от протокола.
Есть реальная плавающая длина ответа в другом протоколе — вот где ваш механизм был бы кстати, но вполне справляется и с контролем остановки по массиву.26.02.2023 в 13:10 #27527JurasskParkУчастникКак говорится вы попробуйте, у меня есть вообще остановка по нескольким массивам байт вынуждено от протокола.
Есть реальная плавающая длина ответа в другом протоколе — вот где ваш механизм был бы кстати, но вполне справляется и с контролем остановки по массиву.Попробовал. Очень медленно. Я на запрос отдаю данные через 1 миллисекунду, а ответ жду таймаут в два раза больше.
26.02.2023 в 21:40 #27528manjey73Участниквидео размыто, ничего не видно толком.
Если вы ждете таймаут на каждый байт, значит что-то вы делаете неправильно.
26.02.2023 в 21:43 #27529manjey73УчастникЕсли inbuf[9] > 0x80 то какого вы читаете еще 10 байт и начинаете читать с 3-его байта в буфере? вы и так уже 10-ть считали… и опять читаете 10-ть?
26.02.2023 в 21:54 #27530manjey73УчастникЕще момент, Timeout в PollingOptions.Timeout перманентная величина, от того что вы одно и то же число выводите в лог оно никак не поменяется…
Чтобы измерить время надо использовать
Stopwatch stopwatch = Stopwatch.StartNew();и потом останавливать и выводить прошедшее время, это для 6-й версии
27.02.2023 в 11:22 #27532MikhailМодераторУ меня видео чётко отображается. Четкость от скорости интернета зависит, вероятно.
Но было бы понятнее, если @jurasskpark опишет кратко текстом, в чём именно проблема — запрос такой-то в такое-то время, ответ такой-то…27.02.2023 в 11:23 #27533MikhailМодераторДа, для точного измерения времени Stopwatch — наилучшее решение.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.