Странности поведения линии связи

Стартовая страница Форумы Ошибки в работе Ошибки Коммуникатора Странности поведения линии связи

Просмотр 15 сообщений - с 1 по 15 (из 21 всего)
  • Автор
    Сообщения
  • #11919
    manjey73
    Участник
    2019-05-24 23:35:00 Установка TCP-соединения с IP:PORT
    
    2019-05-24 23:35:00 Сеанс связи с КП 125 "Пульсар", тип: KpPulsarT, адрес: 971590
    Отправка (14): 00 97 15 90 01 0E FC 03 F8 0F B9 A7 73 8E
    Приём (78/140): 00 97 15 90 01 4E 8A F2 AE 41 7E 32 B0 41 00 FA 1F BE 00 00 00 00 70 47 51 40 79 7B 4C 43 00 00 00 00 5B A4 40 43 38 09 00 00 CF 83 4D 40 98 99 21 3D 98 99 09 3D A4 97 4A 43 D6 F4 3F 43 D8 2C 2A 41 5B A4 40 43 59 E8 70 3D B9 A7 F2 CF
    OK!
    Отправка (10): 00 97 15 90 04 0A C8 9A 92 83
    Приём (16/140): 00 97 15 90 04 10 13 05 18 17 1A 2D C8 9A FE 8B
    OK!
    Отправка (12): 00 97 15 90 0A 0C 0D 00 4A 56 0E 52
    Приём (18/140): 00 97 15 90 0A 12 00 00 00 00 00 00 00 00 4A 56 4C 24
    OK!
    
    2019-05-24 23:36:00 Сеанс связи с КП 125 "Пульсар", тип: KpPulsarT, адрес: 971590
    Отправка (14): 00 97 15 90 01 0E FC 03 F8 0F DF 15 D8 5B
    Приём (0/140): 
    Нет ответа от прибора
    Ошибка при записи данных: Не удается записать данные в транспортное соединение: Программа на вашем хост-компьютере разорвала установленное подключение.
    Приём (0/140): 
    Нет ответа от прибора
    Ошибка при записи данных: Не удается записать данные в транспортное соединение: Программа на вашем хост-компьютере разорвала установленное подключение.
    Приём (0/140): 
    Нет ответа от прибора
    
    2019-05-24 23:37:00 Установка TCP-соединения с IP:PORT
    
    2019-05-24 23:37:00 Сеанс связи с КП 125 "Пульсар", тип: KpPulsarT, адрес: 971590
    Отправка (14): 00 97 15 90 01 0E FC 03 F8 0F B6 1D F7 CD
    Приём (78/140): 00 97 15 90 01 4E 4F DE AE 41 C9 1B B0 41 00 BD 1E BE 00 00 00 00 70 47 51 40 79 7B 4C 43 00 00 00 00 5B A4 40 43 38 09 00 00 CF 83 4D 40 98 99 31 3D 98 99 01 3D A4 97 4A 43 D6 F4 3F 43 D8 2C 2A 41 5B A4 40 43 59 E8 70 3D B6 1D 3B 7E
    OK!
    Отправка (10): 00 97 15 90 04 0A 24 A6 DE 52
    Приём (16/140): 00 97 15 90 04 10 13 05 18 17 1C 2D 24 A6 B2 D2
    OK!
    Отправка (12): 00 97 15 90 0A 0C 0D 00 38 53 EA F1
    Приём (18/140): 00 97 15 90 0A 12 00 00 00 00 00 00 00 00 38 53 A8 87
    OK!
    
    2019-05-24 23:38:00 Сеанс связи с КП 125 "Пульсар", тип: KpPulsarT, адрес: 971590
    Отправка (14): 00 97 15 90 01 0E FC 03 F8 0F E1 AD C8 49
    Приём (0/140): 
    Нет ответа от прибора
    Ошибка при записи данных: Не удается записать данные в транспортное соединение: Программа на вашем хост-компьютере разорвала установленное подключение.
    Приём (0/140): 
    Нет ответа от прибора
    Ошибка при записи данных: Не удается записать данные в транспортное соединение: Программа на вашем хост-компьютере разорвала установленное подключение.
    Приём (0/140): 
    Нет ответа от прибора

    При установки галочки «Оставаться на связи» при чем независимо от периода опроса, ставил и 10 минут и 5…
    Снимаешь галку, идут ответы в каждой сессии нормально.
    Преобразователь Ethernet — RS485 Пульсар

    #11920
    manjey73
    Участник

    Интересно, с чем такое может быть связано ? Версия RS5.6.1

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

    Если галочка установлена, то Коммуникатор не разъединяется с прибором. При этом скорее всего сам прибор разъединяется по своему таймауту, поэтому при следующем сеансе опроса возникает ошибка. Тем более, что сеансы идут раз в минуту.

    #11940
    manjey73
    Участник

    В цикле было то же самое. Если я правильно помню. Надо будет еще раз протестить.

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

    От контроллеров зависит. Эта галочка как раз и была сделана, чтобы решить данную проблему.

    #12086
    manjey73
    Участник

    Напишу тут, чтобы не создавать тему ради выяснения одного момента.

    Михаил, мне кажется что функция TimeOut работает некорректно. Правда не знаю, возможно это системная реализация. Но насколько помню, Timeout должен срабатывать в случае не получения ответа от прибора. В случае же получения байт ответа должен сбрасываться по истечении паузы «тишины» после принятия последнего байта ответа.

    Сейчас получается, что если мы зададим буфер 250 байт, то Коммуникатор будет ожидать пока все 250 не придут, но если у нас в ответе всего 30 байт, то прилетев последний начинается тишина и вот после какой-то паузы Timeout должен быть сброшен.

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

    Это зависит от того, как запрограммировано в драйвере. В простом случае, если длина посылки фиксирована, то как только вы получили ожидаемое количество байт, ожидание прекращается.

    Если длина посылки указана в самой посылке, то сначала надо принять часть данных, определить оставшуюся длину и принять оставшуюся часть.

    Если буфер короче посылки, то будет ошибка. Но важна не длина буфера, а количество считываемых байт, которое задаётся в метода чтения.

    #12089
    manjey73
    Участник

    К сожалению не всегда известна длина. Сейчас я это обошел, рассчитав длину и поменяв длину ответа для тех или иных запросов.
    И опять же, если прибору что-то не понравилось, он может ответить коротким ответом, а мы указываем буфер для приема больше, чем короткий ответ.

    А можно пример как указать длину буферы из самого ответа ?
    Что-то я не понимаю, как это может выглядеть для ответов например 11 и 18 байт ?
    На один запрос. Хотя длина в ответе указывается.

    • Этот ответ был изменен 4 года, 9 месяцев назад от manjey73.
    #12110
    Mikhail
    Модератор

    Буфер имеет фиксированную длину с запасом. Принимая данные, мы указываем сколько нужно принять.

    Пример служит драйвер Модбас. В нём приём данных выполняется в 2 приёма, т.к. может быть короткий ответ в случае ошибки.

    #12114
    manjey73
    Участник

    Можно пример в коде, где указывается количество принимаемых байт ?
    А то я все время меняю размер входного буфера… по старинке 🙂

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

    Например, здесь. Приём данных в 2 чтения в этом же классе.

    #12161
    manjey73
    Участник

    InBuf = new byte[inBufSize];

    похоже это равносильно Array.Resize, и опять же надо точно знать размер принимаемых байт и создать новый буфер.
    А выставить буфер 250 байт и просто говорить прими 100 или 50 не меняя сам буфер никак ?

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

    Эта инициализация делается 1 раз при старте работы. Буфер далее не меняется.

    #12167
    manjey73
    Участник

    Хорошо, инициировали один раз буфер в 250 байт. Ответы могут быть 250, 200, 50, 20 байт. Какой из них прилетит неизвестно (иногда известно иногда нет).
    В ответе скажем в 5-м байте длина ответа на текущую ситуацию 20 байт, как имея буфер 250 байт изменить его до 20 не потеряв при этом байты ответа и не ждать пока закончится таймаут ?

    Вопрос именно в этом, как на лету остановить опрос, не дожидаясь таймаута и не потеряв байты ответа ?

    • Этот ответ был изменен 4 года, 9 месяцев назад от manjey73.
    #12170
    Mikhail
    Модератор

    В методе чтения указывается, начиная с какой позиции записывать новые полученные данные в буфер. Таким образом, начало пакета можно не затирать.

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