Время ожидания или Timeout

  • В этой теме 69 ответов, 3 участника, последнее обновление 1 год назад сделано Mikhail.
Просмотр 15 сообщений - с 46 по 60 (из 70 всего)
  • Автор
    Сообщения
  • #27192
    manjey73
    Участник

    Да вам и не надо выходить из 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);
            }
    • Этот ответ был изменен 1 год, 2 месяца назад от manjey73.
    • Этот ответ был изменен 1 год, 2 месяца назад от manjey73.
    #27195
    manjey73
    Участник

    Вы считываете столько байт, сколько есть в ответе после получения первых 3-х.
    Если произойдет обрыв связи, только тогда и возникнет Timeout. Все.

    #27196
    manjey73
    Участник

    А так как вы знаете длину ответа, то возникновения Timeout-а и не происходит. Это один из вариантов, когда timeout не мешает кроме случаев отсутствия или обрыва связи

    #27197
    JurasskPark
    Участник

    То есть вы предлагаете вместо 1 запроса делать несколько? Зачем? Ради чего? Почему нельзя отправить один запрос и получить один ответ? Без всяких дополнительных.

    #27200
    Mikhail
    Модератор

    Количество полученных данных больше нуля.

    Это означает, что чтение должно быть завершено после получения 1 байта, что неверно.
    Скорее всего, сначала нужно считать то количество байт, которое всегда приходит. Затем проанализировать их и вычислить, сколько ещё байт должно прийти.

    #27201
    manjey73
    Участник

    @JurasskPark именно так реализовано в Modbus, чтение заголовка, в котором указано количество байт блока данных.

    А ваш цикл While думаете будет проще? та же песня только под другим соусом.

    #27202
    manjey73
    Участник

    @Mikhail не, если меньше нуля то штатный Timeout, если >0 то timeout уменьшается на время пары символов и так по кругу в цикле.

    Но тогда и остановка по сути всегда по таймауту и никак иначе.

    #27203
    manjey73
    Участник

    @JurasskPark запрос как был один, так и останется один, Вы чтение разбиваете на несколько этапов, в вашем случае на 2 всего. Приняли часть, быстренько проверили и принимаете вторую часть дальше, уже зная, сколько вам надо

    #27204
    manjey73
    Участник

    Как говорится вы попробуйте, у меня есть вообще остановка по нескольким массивам байт вынуждено от протокола.
    Есть реальная плавающая длина ответа в другом протоколе — вот где ваш механизм был бы кстати, но вполне справляется и с контролем остановки по массиву.

    #27527
    JurasskPark
    Участник

    Как говорится вы попробуйте, у меня есть вообще остановка по нескольким массивам байт вынуждено от протокола.
    Есть реальная плавающая длина ответа в другом протоколе — вот где ваш механизм был бы кстати, но вполне справляется и с контролем остановки по массиву.

    Попробовал. Очень медленно. Я на запрос отдаю данные через 1 миллисекунду, а ответ жду таймаут в два раза больше.

    https://www.youtube.com/watch?v=p7hb_vf8Lqk

    #27528
    manjey73
    Участник

    видео размыто, ничего не видно толком.

    Если вы ждете таймаут на каждый байт, значит что-то вы делаете неправильно.

    #27529
    manjey73
    Участник

    Если inbuf[9] > 0x80 то какого вы читаете еще 10 байт и начинаете читать с 3-его байта в буфере? вы и так уже 10-ть считали… и опять читаете 10-ть?

    #27530
    manjey73
    Участник

    Еще момент, Timeout в PollingOptions.Timeout перманентная величина, от того что вы одно и то же число выводите в лог оно никак не поменяется…

    Чтобы измерить время надо использовать
    Stopwatch stopwatch = Stopwatch.StartNew();

    и потом останавливать и выводить прошедшее время, это для 6-й версии

    #27532
    Mikhail
    Модератор

    У меня видео чётко отображается. Четкость от скорости интернета зависит, вероятно.
    Но было бы понятнее, если @jurasskpark опишет кратко текстом, в чём именно проблема — запрос такой-то в такое-то время, ответ такой-то…

    #27533
    Mikhail
    Модератор

    Да, для точного измерения времени Stopwatch — наилучшее решение.

Просмотр 15 сообщений - с 46 по 60 (из 70 всего)
  • Вы должны авторизироваться для ответа в этой теме.