Стартовая страница › Форумы › Ошибки в работе › Ошибки Коммуникатора › Странности поведения линии связи
- В этой теме 20 ответов, 2 участника, последнее обновление 4 года, 9 месяцев назад сделано Mikhail.
-
АвторСообщения
-
24.05.2019 в 23:52 #11919manjey73Участник
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 Пульсар24.05.2019 в 23:54 #11920manjey73УчастникИнтересно, с чем такое может быть связано ? Версия RS5.6.1
27.05.2019 в 10:22 #11939MikhailМодераторЕсли галочка установлена, то Коммуникатор не разъединяется с прибором. При этом скорее всего сам прибор разъединяется по своему таймауту, поэтому при следующем сеансе опроса возникает ошибка. Тем более, что сеансы идут раз в минуту.
27.05.2019 в 10:24 #11940manjey73УчастникВ цикле было то же самое. Если я правильно помню. Надо будет еще раз протестить.
27.05.2019 в 17:39 #11959MikhailМодераторОт контроллеров зависит. Эта галочка как раз и была сделана, чтобы решить данную проблему.
04.06.2019 в 10:49 #12086manjey73УчастникНапишу тут, чтобы не создавать тему ради выяснения одного момента.
Михаил, мне кажется что функция TimeOut работает некорректно. Правда не знаю, возможно это системная реализация. Но насколько помню, Timeout должен срабатывать в случае не получения ответа от прибора. В случае же получения байт ответа должен сбрасываться по истечении паузы «тишины» после принятия последнего байта ответа.
Сейчас получается, что если мы зададим буфер 250 байт, то Коммуникатор будет ожидать пока все 250 не придут, но если у нас в ответе всего 30 байт, то прилетев последний начинается тишина и вот после какой-то паузы Timeout должен быть сброшен.
04.06.2019 в 15:42 #12087MikhailМодераторЭто зависит от того, как запрограммировано в драйвере. В простом случае, если длина посылки фиксирована, то как только вы получили ожидаемое количество байт, ожидание прекращается.
Если длина посылки указана в самой посылке, то сначала надо принять часть данных, определить оставшуюся длину и принять оставшуюся часть.
Если буфер короче посылки, то будет ошибка. Но важна не длина буфера, а количество считываемых байт, которое задаётся в метода чтения.
04.06.2019 в 20:18 #12089manjey73УчастникК сожалению не всегда известна длина. Сейчас я это обошел, рассчитав длину и поменяв длину ответа для тех или иных запросов.
И опять же, если прибору что-то не понравилось, он может ответить коротким ответом, а мы указываем буфер для приема больше, чем короткий ответ.А можно пример как указать длину буферы из самого ответа ?
Что-то я не понимаю, как это может выглядеть для ответов например 11 и 18 байт ?
На один запрос. Хотя длина в ответе указывается.- Этот ответ был изменен 4 года, 9 месяцев назад от manjey73.
05.06.2019 в 19:11 #12110MikhailМодераторБуфер имеет фиксированную длину с запасом. Принимая данные, мы указываем сколько нужно принять.
Пример служит драйвер Модбас. В нём приём данных выполняется в 2 приёма, т.к. может быть короткий ответ в случае ошибки.
05.06.2019 в 22:50 #12114manjey73УчастникМожно пример в коде, где указывается количество принимаемых байт ?
А то я все время меняю размер входного буфера… по старинке 🙂06.06.2019 в 09:55 #1212306.06.2019 в 20:58 #12161manjey73УчастникInBuf = new byte[inBufSize];
похоже это равносильно Array.Resize, и опять же надо точно знать размер принимаемых байт и создать новый буфер.
А выставить буфер 250 байт и просто говорить прими 100 или 50 не меняя сам буфер никак ?07.06.2019 в 11:50 #12164MikhailМодераторЭта инициализация делается 1 раз при старте работы. Буфер далее не меняется.
07.06.2019 в 12:58 #12167manjey73УчастникХорошо, инициировали один раз буфер в 250 байт. Ответы могут быть 250, 200, 50, 20 байт. Какой из них прилетит неизвестно (иногда известно иногда нет).
В ответе скажем в 5-м байте длина ответа на текущую ситуацию 20 байт, как имея буфер 250 байт изменить его до 20 не потеряв при этом байты ответа и не ждать пока закончится таймаут ?Вопрос именно в этом, как на лету остановить опрос, не дожидаясь таймаута и не потеряв байты ответа ?
- Этот ответ был изменен 4 года, 9 месяцев назад от manjey73.
07.06.2019 в 16:11 #12170MikhailМодераторВ методе чтения указывается, начиная с какой позиции записывать новые полученные данные в буфер. Таким образом, начало пакета можно не затирать.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.