Ошибка DrvCnlBasic

Просмотр 15 сообщений - с 46 по 60 (из 65 всего)
  • Автор
    Сообщения
  • #39411
    Mikhail
    Модератор

    ClearNetStream не ждёт таймаута, очищает только то, что есть на текущий момент в буфере.

    #39414
    manjey73
    Участник

    Ну вот это и не подходит, потому что в какой-то момент данных нет, а через 30 мс данные уже есть, и они потом прилетают как непрошенные гости под очередной запрос 🙁

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

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

    #41096
    manjey73
    Участник

    Ситуация аналогичная судя по всему и для режима TCP Server. На линии GSM модем, который подключается как TCP Client.

    Если очень долго от него нет ответа, происходит следующий запрос, а ответ приходит на предыдущий.

    При настройке линии на TCP Server нет возможности разорвать соединение по наличию ошибки (таймаута).

    Как обойти эту проблему при таком соединении ? Как очистить буфер и только потом посылать новый запрос?

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

    Канал связи TCP-сервер очищает буфер TCP, если драйвер устанавливает статус Ошибка для устройства. Ссылка

    #41119
    manjey73
    Участник

    ок, попробую.

    #41120
    manjey73
    Участник

    И опять блин, блин… Это только в конце сессии 🙁
    ладно, все равно не было, попробую.

    #41121
    manjey73
    Участник

    Если честно, я не уверен в результате.
    1. буфер пуст, вышел таймаут — сообщение об ошибке связи. Ок, мы почистили пустой буфер!!!!

    2. мы делаем следующий запрос и тут то нам и поступают данные от модема (только сейчас) на наш предыдущий запрос.

    мне кажется это филькина грамота будет. Нет механизма со стороны ТСР сервера закрыть порт, чтобы модем отвалился как клиент и тут же снова открыть порт?

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

    мы делаем следующий запрос и тут то нам и поступают данные от модема (только сейчас) на наш предыдущий запрос.

    Тогда возникнет ошибка и буфер очистится.

    Нет механизма со стороны ТСР сервера закрыть порт, чтобы модем отвалился как клиент и тут же снова открыть порт?

    Нет. Записал пожелание.

    #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

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

    #41136
    manjey73
    Участник

    DeviceStatus.Error — это есть и в клиенте и в сервере, мне надо, чтобы драйвер это передавал только для сервера, так как для клиента я подгрузил зависимость на CnlBasic и чищу своим кодом…

    Так наверное правильнее. По идее ошибка из-за этого возникает…

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

    Если в коде драйвера проверить конкретный тип свойства Connection, то можно определить какой канал связи используется. Это поможет решить проблему?

    #41145
    manjey73
    Участник

    Да, вероятно поможет. Как проверить? и какой тип должен быть?

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

    Попробуйте так:
    string typeName = Connection?.GetType()?.Name;
    Каким будет имя типа для разных каналов связи нужно установить экспериментально.

    #41149
    manjey73
    Участник

    Спасибо, попробую.

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