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