Стартовая страница › Форумы › Ошибки в работе › Ошибки Коммуникатора › Ошибка DrvCnlBasic
- В этой теме 64 ответа, 2 участника, последнее обновление 7 месяцев назад сделано
Mikhail.
-
АвторСообщения
-
14.07.2025 в 14:30 #39411
MikhailМодераторClearNetStream не ждёт таймаута, очищает только то, что есть на текущий момент в буфере.
14.07.2025 в 15:34 #39414
manjey73УчастникНу вот это и не подходит, потому что в какой-то момент данных нет, а через 30 мс данные уже есть, и они потом прилетают как непрошенные гости под очередной запрос 🙁
15.07.2025 в 17:59 #39436
MikhailМодераторДа, верно. Поэтому нужно попробовать обычное чтение, у которого есть таймаут. В наличии таймаута и заключается различие методов чтения и очистки.
12.11.2025 в 10:03 #41096
manjey73УчастникСитуация аналогичная судя по всему и для режима TCP Server. На линии GSM модем, который подключается как TCP Client.
Если очень долго от него нет ответа, происходит следующий запрос, а ответ приходит на предыдущий.
При настройке линии на TCP Server нет возможности разорвать соединение по наличию ошибки (таймаута).
Как обойти эту проблему при таком соединении ? Как очистить буфер и только потом посылать новый запрос?
12.11.2025 в 14:33 #41117
MikhailМодераторКанал связи TCP-сервер очищает буфер TCP, если драйвер устанавливает статус Ошибка для устройства. Ссылка
12.11.2025 в 14:52 #41119
manjey73Участникок, попробую.
12.11.2025 в 15:07 #41120
manjey73УчастникИ опять блин, блин… Это только в конце сессии 🙁
ладно, все равно не было, попробую.12.11.2025 в 15:24 #41121
manjey73УчастникЕсли честно, я не уверен в результате.
1. буфер пуст, вышел таймаут — сообщение об ошибке связи. Ок, мы почистили пустой буфер!!!!2. мы делаем следующий запрос и тут то нам и поступают данные от модема (только сейчас) на наш предыдущий запрос.
мне кажется это филькина грамота будет. Нет механизма со стороны ТСР сервера закрыть порт, чтобы модем отвалился как клиент и тут же снова открыть порт?
13.11.2025 в 14:41 #41125
MikhailМодератормы делаем следующий запрос и тут то нам и поступают данные от модема (только сейчас) на наш предыдущий запрос.
Тогда возникнет ошибка и буфер очистится.
Нет механизма со стороны ТСР сервера закрыть порт, чтобы модем отвалился как клиент и тут же снова открыть порт?
Нет. Записал пожелание.
17.11.2025 в 16:07 #41135
manjey73Участник2025-11-17 18:00:06 Ошибка при вызове метода Session устройства [1] kv.1: Scada.ScadaException: Ошибка при считывании данных: Cannot access a disposed object. Object name: 'System.Net.Sockets.NetworkStream'. ---> System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net.Sockets.NetworkStream'. at Scada.Comm.Drivers.DrvCnlBasic.Logic.TcpConnection.Read(Byte[] buffer, Int32 offset, Int32 count, Int32 timeout, ProtocolFormat format, String& logText) --- End of inner exception stack trace ---В коде есть очистка буфера после каждого опроса, если линия TCP клиент, и добавил в конце сессии (After Session) DeviceStatus.Error
Вопрос, как разделить? чтобы драйвер понимал, клиентом мы подключены или являемся сервером. Предположу что ошибка возникает в конце сессии, потому что я почистил буфер для клиентом.
17.11.2025 в 16:27 #41136
manjey73УчастникDeviceStatus.Error — это есть и в клиенте и в сервере, мне надо, чтобы драйвер это передавал только для сервера, так как для клиента я подгрузил зависимость на CnlBasic и чищу своим кодом…
Так наверное правильнее. По идее ошибка из-за этого возникает…
18.11.2025 в 15:21 #41144
MikhailМодераторЕсли в коде драйвера проверить конкретный тип свойства Connection, то можно определить какой канал связи используется. Это поможет решить проблему?
18.11.2025 в 15:25 #41145
manjey73УчастникДа, вероятно поможет. Как проверить? и какой тип должен быть?
19.11.2025 в 13:31 #41148
MikhailМодераторПопробуйте так:
string typeName = Connection?.GetType()?.Name;
Каким будет имя типа для разных каналов связи нужно установить экспериментально.19.11.2025 в 13:38 #41149
manjey73УчастникСпасибо, попробую.
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.