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

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

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

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

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

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

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

    • Эта тема была изменена 4 года, 7 месяцев назад от manjey73.
    #13139
    Mikhail
    Модератор

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

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

    #13140
    manjey73
    Участник

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

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

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

    • Этот ответ был изменен 4 года, 7 месяцев назад от manjey73.
    #13148
    Mikhail
    Модератор

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

    #13165
    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
    Модератор

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

    #13171
    manjey73
    Участник

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

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

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

    #13181
    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 буфера для контроля

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

    #13389
    Mikhail
    Модератор
    private class MyStopCondition: Connection.BinStopCondition
    {
      public MyStopCondition() : base()
      {
      }
    
      public override bool CheckCondition(byte[] buffer, int index)
      {
        return base.CheckCondition(buffer, index);
      }
    }

    Так будет ругаться?

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

    buffer в параметрах метода — это те данные, которые реально считаны.
    3 буфера для проверки нужно передать в объект при его инициализации. Они будут постоянны для объекта.

    #13400
    manjey73
    Участник

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

Просмотр 15 сообщений - с 1 по 15 (из 50 всего)
  • Вы должны авторизироваться для ответа в этой теме.