Стартовая страница › Форумы › Разработка и интеграция › Остановка опроса по массиву байт или байту
- В этой теме 49 ответов, 2 участника, последнее обновление 4 года, 5 месяцев назад сделано Mikhail.
-
АвторСообщения
-
06.08.2019 в 17:50 #13118manjey73Участник
Михаил, интересует, есть ли возможность сделать остановку по массиву байт, проверяя 2 или 3 комбинации ?
Мы указываем массив байт для переменной stopCond для единичного случая.
А можно ли сделать остановку в одном запросе по массивам mass_a, mass_b, mass_c ?И если это можно сделать то как ?
После остановки соответственно проверить по какому из массивов произошла остановка и выполнить соответствующий код.
- Эта тема была изменена 4 года, 7 месяцев назад от manjey73.
07.08.2019 в 18:01 #13139MikhailМодераторКак именно устроен протокол для прибора? Можете привести выдержку из документа?
Не хотелось бы добавлять такую узкоспецифичную проверку в общие классы. Надо что-то придумать. Кроме того, это ресурсоёмко — при получении каждого нового байта проверять все массивы.
07.08.2019 в 18:05 #13140manjey73УчастникИдет запрос, на который может прийти полноценный ответ с массивом байт остановки 0x10 0x03 + байт или 2 контрольной суммы.
Либо прибор может ответить другим ответом с двумя байтами 0x10 0x04 — типа я не готов выдать полный ответ. В этом случае надо перезапросить прибор. Но я то жду массив ответа куда длиннее чем эти 2 байта.з.ы. делать запрос двух байт, проверять их на 0х10 0х04 и потом делать дальнейший опрос уже с остановкой по массиву если байты не равны этим ?
Просто именно в этом случае срабатывает тайм аут и ответ ожидается долго.
- Этот ответ был изменен 4 года, 7 месяцев назад от manjey73.
08.08.2019 в 16:40 #13148MikhailМодераторДа, разработчики приборов сами драйвера не пишут…
Подумаю и напишу в эту тему несколько позже.09.08.2019 в 17:49 #13165MikhailМодераторВ общем решение такое:
Нужно внутри своего класса KpLogic создать вложенный класс, унаследованный от BinStopCondition. В своём классе реализовать нужную логику проверки окончания пакета. Затем в методе чтения данных использовать свой класс.private class MyStopCondition: Connection.BinStopCondition { public override bool CheckCondition(byte[] buffer, int index) { // ваша логика проверки } }
Только мне потребуется сделать метод CheckCondition виртуальным. Если нужно, то я сделаю и пришлю обновление ScadaCommCommon.dll
09.08.2019 в 20:28 #13166manjey73УчастникЕсли с виртуальным методом получится в своем коде проверять по 2-3 массивам одновременно, то есть смысл сделать. Если не пострадает работа старых драйверов, где была остановка по одному байту. Если пострадает, то наверное лучше не надо.
То есть если не придется переписывать то, что уже есть.
10.08.2019 в 12:15 #13169MikhailМодераторРабота старых драйверов пострадать не должна. Возможно, потребуется повторно откомпилировать, но код менять не придётся.
На следующей неделе пришлю dll на пробу.10.08.2019 в 21:38 #13171manjey73УчастникГде то в исходниках уже можно посмотреть как вы реализовывали остановку по массиву ? чтобы хоть пример был как и чего…
12.08.2019 в 09:26 #13180MikhailМодераторОбновлённая ScadaCommCommon.dll
Остановка по массиву байт находится в ветке develop, ссылка.12.08.2019 в 09:26 #13181MikhailМодераторНапишите, заработают ли старые драйвера с этой dll?
22.08.2019 в 17:59 #13375manjey73УчастникДа, работает нормально с остановкой по массиву. Буду разбираться как сделать для двойных проверок.
22.08.2019 в 19:46 #13378manjey73Участникprivate class MyStopCondition: Connection.BinStopCondition { public override bool CheckCondition(byte[] buffer, int index) { // ваша логика проверки } }
Мне бы пример как этим пользоваться? Сейчас ругается на MyStopCondition нужен пустой конструктор или что-то типа. Ну и на CheckCondition потому что нет возвращаемого значения, это понятно. Но вот в нем только один буфер CheckCondition(byte[] buffer, …. а мне надо 2 или 3 буфера для контроля
Какой нибудь простенький пример на пару двухбайтовых буферов и принцип организации проверки..
23.08.2019 в 17:12 #13389MikhailМодераторprivate class MyStopCondition: Connection.BinStopCondition { public MyStopCondition() : base() { } public override bool CheckCondition(byte[] buffer, int index) { return base.CheckCondition(buffer, index); } }
Так будет ругаться?
23.08.2019 в 17:14 #13390MikhailМодераторbuffer в параметрах метода — это те данные, которые реально считаны.
3 буфера для проверки нужно передать в объект при его инициализации. Они будут постоянны для объекта.23.08.2019 в 21:28 #13400manjey73УчастникПроверю позже, будет ругаться или нет. на следующей неделе в командировке буду, не знаю, будет время или нет.
А как передать буферы сравнения ?, и что в данном случае индекс ? -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.