Ну вот поэтому я и говорю, что все всегда зависит от конкретных условий. В условиях: 1) ПР - мастер, 2) большое количество булевых состояний, 3) потенциальная вероятность увеличения кол-ва состояний, естественно без битовой маски задача не решается. У меня же условия по всем пунктам прямо противоположные. Всем большое спасибо за помощь! Все примеры интересные, возможно будут применены где-то в будущем.
В дополнении видится еще одна потенциальная проблема с битовыми масками в таком кейсе как у меня. Дело в том, что HA через MODBUS TCP записывает значение регистра, предварительно считывая его, работает он при этом в многопоточном режиме. Думаю догадываетесь, что есть ненулевая вероятность некорректной работы в таком варианте. Сомневаюсь, что на чтение-запись регистров в HA стоят блокировки, хотя может и ошибаюсь, требует проверки.
Последний раз редактировалось sokolov.sv; 10.03.2024 в 18:46.
Если бы я разрабатывал HA, то я бы конечно учел и поставил блокировки и на чтение и на запись. Но, это не мой код и неправильно рассуждать в таком ключе. Опять же я не уверен, что блокировок там нет, писал ранее, что требует проверки.
Поймите это не SCADA и возможности там более скудные по работе с MODBUS TCP, Он умеет взять последовательность регистров скажем с 100 по 110 и раскидать в однотипные переменные, но опять же это не 64 за раз, это все равно несколько опросов скажем 3-4, и это еще при условии, что переменные одного типа в ПР хранятся последовательно, а это зачастую не так. Более того в отличии от вас я в этом не вижу проблемы. 10 мс на запрос перед изменением и записью, это вообще не стоит обсуждения.
Что например? Из альтернатив только OpenHub, но это больше вопрос предпочтений.Если HA так не может - в помойку. Ищите что-нить поприличней.
Причем тут шлюз? Понятно, что шлюз MODBUS TCP <-> MODBUS RTU работает в однопоточном (блокирующем) режиме. А приложение которое работает с шлюзом не может работать в многопоточном!? Если не понимаете где тут проблема, могу пошагово описать чего стоит ждать.
P.S.: На будущее, подобного класса шлюзы бывают более умные и умеют очередь внутри! Конкретно в моем случае он недорогой и этого функционала не имеет.
P.S.S.: Может непонятно что такое HA? Это вот https://www.home-assistant.io конкретно про модуль Modbus мастера в нем вот https://www.home-assistant.io/integrations/modbus/
Последний раз редактировалось sokolov.sv; 10.03.2024 в 23:10.
Во-первых вы все таки неправильно поняли документацию в силу того, что незнакомы с HA. Я же написал конкретно, что распаковать 64 за раз не получится (второй раз пишу)! Частный случай - это когда все данные одного типа, регистры идут без пропусков - в таком варианте получится за раз.
С такими параметрами:
data_type: int16
slave_count: 64
Получу на выходе 64 значения int16 с которыми дальше можно работать.
Или:
data_type: custom
structure: ">f"
slave_count: 32
Получу на выходе 32 значения float big-endian
Догадались, что нужно будет сделать если в регистрах значения не одного типа?
Вот такой вариант, к сожалению невозможен. Думаете в таком варианте получите float и int? Нет! Это просто не заработает.
data_type: custom
structure: ">fi"
Хотя в самом Python допустима любой pack/unpack, примеры: https://docs.python.org/3/library/struct.html#examples
Во-вторых невнимательно читали топик, писал ранее, что программировал на императивных языках всю сознательную жизнь (более 20 лет) и видимо пропустил за это время когда это "задать аргументы для unpack" стало называться программированием? Может еще и regexp, pcre к программированию относите? )
Последний раз редактировалось sokolov.sv; 11.03.2024 в 04:38.
ну началось, вход пошли аргументы программирования, это предложение померятся?
когда пишитеА Вы что то предоставили наглядное или все должны верить Вашим фантазиям?Написали бы сразу, что с HA и подобным софтом не работали и закрыли бы вопрос. Вы же пытаетесь нафантазировать то, чего нет.
Почему в качестве примера берете data_type в котором нет типа вроде coil, взяли бы адекватную конфигурацию и вот действительно бы вопросы отпали, а то рассказываете здесь что пока достаточно одного регистра на один дискретный сигнал
Например Configuring switch entities чем не пример , документация ПР200 позволяет реализовать управление битами а читать регистр Screenshot 2024-03-11 084634.png и Screenshot 2024-03-11 084800.png
Последний раз редактировалось Тимур Назарбоев; 11.03.2024 в 10:06.
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Мерятся задачи нет. Я не меряюсь в том, в чем плохо разбираюсь. Коллега вот пробует.
Предложение хорошее с использованием Coil, но тоже требует изучения, т.к. в документации написано, что может неправильно работать с устройствами с общей памятью, т.е. в том случае когда, как я понял (поправьте если не прав), и Holding и Coll регистры используют общую память. Последний ваш скрин с документации говорит как раз об этом?
Последний раз редактировалось sokolov.sv; 11.03.2024 в 14:37.
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Условия такие:
- HA всегда перед тем как изменить значение регистра запрашивает его актуальное значение
- начальное состояние регистра с битовой маской: 0x0000 - все выключено
- За состояние Lamp1 отвечает бит 0
- За состояние Lamp2 отвечает бит 1
Поток1
HA - читает регистр, чтобы узнать состояние Lamp1 (прочитал 0x0000)
Поток 2
HA - читает регистр, чтобы узнать состояние Lamp2 (прочитал 0x0000)
Поток1
HA - изменеят текущее состояние бита 0 так, чтобы включить Lamp1 (0x0001)
Поток2
HA - изменеят текущее состояние бита 1 так, чтобы включить Lamp2 (0x0002)
Ожидаемый результат:
Lamp1 и Lamp2 включены
Реальный результат:
Включен только Lamp2, т.к Lamp1 на последней операции будет выключен.
Если брать случай с "хранить состояние в отдельных регистрах и читать 64 регистра за раз", то при записи будет все хорошо, т.к. пишем всегда 1 регистр, а вот при отображении текущего состояния может быть та же проблема. Надо приводить пример как она может возникнуть? Суть то та же, прочитано значение, а оно уже в регистрах изменено другим потоком.
Да, все именно так. Имеет право на жизнь. Как разница где будет реализован монопольный доступ к интерфейсу в устройстве или в софте/клиенте?