Остановка опроса по массиву байт или байту

Стартовая страница Форумы Разработка и интеграция Остановка опроса по массиву байт или байту

В этой теме 11 ответов, 2 участника, последнее обновление Аватар manjey73 19 час. назад.

Просмотр 12 сообщений - с 1 по 12 (из 12 всего)
  • Автор
    Сообщения
  • #13118
    Аватар
    manjey73
    Участник

    Михаил, интересует, есть ли возможность сделать остановку по массиву байт, проверяя 2 или 3 комбинации ?

    Мы указываем массив байт для переменной stopCond для единичного случая.
    А можно ли сделать остановку в одном запросе по массивам mass_a, mass_b, mass_c ?

    И если это можно сделать то как ?

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

    • Тема изменена 2 нед., 2 дн. назад пользователем Аватар manjey73.
    #13139
    Mikhail
    Mikhail
    Модератор

    Как именно устроен протокол для прибора? Можете привести выдержку из документа?

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

    #13140
    Аватар
    manjey73
    Участник

    Идет запрос, на который может прийти полноценный ответ с массивом байт остановки 0x10 0x03 + байт или 2 контрольной суммы.
    Либо прибор может ответить другим ответом с двумя байтами 0x10 0x04 — типа я не готов выдать полный ответ. В этом случае надо перезапросить прибор. Но я то жду массив ответа куда длиннее чем эти 2 байта.

    з.ы. делать запрос двух байт, проверять их на 0х10 0х04 и потом делать дальнейший опрос уже с остановкой по массиву если байты не равны этим ?

    Просто именно в этом случае срабатывает тайм аут и ответ ожидается долго.

    • Ответ изменён 2 нед., 1 день назад пользователем Аватар manjey73.
    #13148
    Mikhail
    Mikhail
    Модератор

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

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

    В общем решение такое:
    Нужно внутри своего класса KpLogic создать вложенный класс, унаследованный от BinStopCondition. В своём классе реализовать нужную логику проверки окончания пакета. Затем в методе чтения данных использовать свой класс.

    private class MyStopCondition: Connection.BinStopCondition
    {
      public override bool CheckCondition(byte[] buffer, int index)
      {
        // ваша логика проверки
      }
    }

    Только мне потребуется сделать метод CheckCondition виртуальным. Если нужно, то я сделаю и пришлю обновление ScadaCommCommon.dll

    #13166
    Аватар
    manjey73
    Участник

    Если с виртуальным методом получится в своем коде проверять по 2-3 массивам одновременно, то есть смысл сделать. Если не пострадает работа старых драйверов, где была остановка по одному байту. Если пострадает, то наверное лучше не надо.

    То есть если не придется переписывать то, что уже есть.

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

    Работа старых драйверов пострадать не должна. Возможно, потребуется повторно откомпилировать, но код менять не придётся.
    На следующей неделе пришлю dll на пробу.

    #13171
    Аватар
    manjey73
    Участник

    Где то в исходниках уже можно посмотреть как вы реализовывали остановку по массиву ? чтобы хоть пример был как и чего…

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

    Обновлённая ScadaCommCommon.dll
    Остановка по массиву байт находится в ветке develop, ссылка.

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

    Напишите, заработают ли старые драйвера с этой dll?

    #13375
    Аватар
    manjey73
    Участник

    Да, работает нормально с остановкой по массиву. Буду разбираться как сделать для двойных проверок.

    #13378
    Аватар
    manjey73
    Участник
    private class MyStopCondition: Connection.BinStopCondition
    {
      public override bool CheckCondition(byte[] buffer, int index)
      {
        // ваша логика проверки
      }
    }

    Мне бы пример как этим пользоваться? Сейчас ругается на MyStopCondition нужен пустой конструктор или что-то типа. Ну и на CheckCondition потому что нет возвращаемого значения, это понятно. Но вот в нем только один буфер CheckCondition(byte[] buffer, …. а мне надо 2 или 3 буфера для контроля

    Какой нибудь простенький пример на пару двухбайтовых буферов и принцип организации проверки..

Просмотр 12 сообщений - с 1 по 12 (из 12 всего)

Для ответа в этой теме необходимо авторизоваться.