Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 21

Тема: ПР200. Изменение состояния по изменению сетевой переменной. Как?

  1. #11
    Пользователь
    Регистрация
    09.03.2024
    Адрес
    Ярославль
    Сообщений
    13

    По умолчанию

    Ну вот поэтому я и говорю, что все всегда зависит от конкретных условий. В условиях: 1) ПР - мастер, 2) большое количество булевых состояний, 3) потенциальная вероятность увеличения кол-ва состояний, естественно без битовой маски задача не решается. У меня же условия по всем пунктам прямо противоположные. Всем большое спасибо за помощь! Все примеры интересные, возможно будут применены где-то в будущем.

    В дополнении видится еще одна потенциальная проблема с битовыми масками в таком кейсе как у меня. Дело в том, что HA через MODBUS TCP записывает значение регистра, предварительно считывая его, работает он при этом в многопоточном режиме. Думаю догадываетесь, что есть ненулевая вероятность некорректной работы в таком варианте. Сомневаюсь, что на чтение-запись регистров в HA стоят блокировки, хотя может и ошибаюсь, требует проверки.
    Последний раз редактировалось sokolov.sv; 10.03.2024 в 18:46.

  2. #12
    Пользователь
    Регистрация
    09.03.2024
    Адрес
    Ярославль
    Сообщений
    13

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    При TCP вообще смешно говорить о чем-то кроме 64 регистров сразу.
    Согласен! Но HA так не делает. Все таки дергает по одному.
    В случае "прочитать сразу 64" проблема многопоточности еще более актуальна и вероятность проблемы повышается, теряется атомарность действия как и в случае с битовой маской.

  3. #13
    Пользователь
    Регистрация
    09.03.2024
    Адрес
    Ярославль
    Сообщений
    13

    По умолчанию

    Если бы я разрабатывал HA, то я бы конечно учел и поставил блокировки и на чтение и на запись. Но, это не мой код и неправильно рассуждать в таком ключе. Опять же я не уверен, что блокировок там нет, писал ранее, что требует проверки.
    Поймите это не SCADA и возможности там более скудные по работе с MODBUS TCP, Он умеет взять последовательность регистров скажем с 100 по 110 и раскидать в однотипные переменные, но опять же это не 64 за раз, это все равно несколько опросов скажем 3-4, и это еще при условии, что переменные одного типа в ПР хранятся последовательно, а это зачастую не так. Более того в отличии от вас я в этом не вижу проблемы. 10 мс на запрос перед изменением и записью, это вообще не стоит обсуждения.

    Если HA так не может - в помойку. Ищите что-нить поприличней.
    Что например? Из альтернатив только OpenHub, но это больше вопрос предпочтений.

  4. #14
    Пользователь
    Регистрация
    09.03.2024
    Адрес
    Ярославль
    Сообщений
    13

    По умолчанию

    Причем тут шлюз? Понятно, что шлюз 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.

  5. #15
    Пользователь
    Регистрация
    09.03.2024
    Адрес
    Ярославль
    Сообщений
    13

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    опишите
    Условия такие:
    - 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 регистр, а вот при отображении текущего состояния может быть та же проблема. Надо приводить пример как она может возникнуть? Суть то та же, прочитано значение, а оно уже в регистрах изменено другим потоком.

    Цитата Сообщение от Валенок Посмотреть сообщение
    Заместо ЖД в деревню Вилабаджо построили многотелепортовый запулятор. Мэр Вилабаджо выступил с речью что теперь каждый назависимо от других может приехать и уехать. Очереди на вокзале теперь нет. Но запулятор был построен на другом берегу реки, на которой была только 1 лодка.
    Да, все именно так. Имеет право на жизнь. Как разница где будет реализован монопольный доступ к интерфейсу в устройстве или в софте/клиенте?

  6. #16
    Пользователь
    Регистрация
    09.03.2024
    Адрес
    Ярославль
    Сообщений
    13

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    про "каждые 15 секунд" забыли.
    Опуститесь ниже на пяток абзацев до букв CONFIGURATION VARIABLES и найдите про custom
    Это кастомный тип для чтения одной метрики через распаковку средствами питоновского unpack, а не распкаовка всех 64 регистров в нужные типы.
    В HA только однотипные данные можно считать последовательно и распаковать за раз через опцию slave_count/virtual_count

  7. #17
    Пользователь
    Регистрация
    09.03.2024
    Адрес
    Ярославль
    Сообщений
    13

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Ну продолжайте создавать сами себе проблемы и после про них расказывать.

    Поток1
    Вообще ничего не читает, а при небходимости посылает маску с нужными битами для Lamp1 ... Lamp16 которые нужно инвертировать.

    ПР
    текущая маска := текущая маска xor сетевая маска
    сетевая маска := 0;
    Lamp1 := текущая маска.0
    ..
    Lamp16 := текущая маска.15

    Ожидаемый результат = Реальный результат


    Действительно. Разницы никакой, зато есть потоки.
    Т.е. к формальной логике вопросов нет? Проблема все таки будет при таких вводных?
    Написали бы сразу, что с HA и подобным софтом не работали и закрыли бы вопрос. Вы же пытаетесь нафантазировать то, чего нет. Т.е. я написал вводные, а вы говорите давайте их изменим, они неправильные. Ну давайте изменим, добро пожаловать в команду HA, софт открытый, можете сделать МР и отправить, может примут. Должна быть блокировка при такой логике, есть она или нет, нужно выяснять (третий раз пишу уже). Я лишь пытался сказать, что подход 1 регистр - 1 состояние делает невозможным подобную проблему и всего-то.

  8. #18
    Пользователь
    Регистрация
    09.03.2024
    Адрес
    Ярославль
    Сообщений
    13

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Ой. Т.е. нужно попрограммировать? Не, не надо))
    Во-первых вы все таки неправильно поняли документацию в силу того, что незнакомы с 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.

  9. #19
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,248

    По умолчанию

    ну началось, вход пошли аргументы программирования, это предложение померятся?
    когда пишите
    Написали бы сразу, что с 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

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  10. #20
    Пользователь
    Регистрация
    09.03.2024
    Адрес
    Ярославль
    Сообщений
    13

    По умолчанию

    Мерятся задачи нет. Я не меряюсь в том, в чем плохо разбираюсь. Коллега вот пробует.
    Предложение хорошее с использованием Coil, но тоже требует изучения, т.к. в документации написано, что может неправильно работать с устройствами с общей памятью, т.е. в том случае когда, как я понял (поправьте если не прав), и Holding и Coll регистры используют общую память. Последний ваш скрин с документации говорит как раз об этом?
    Последний раз редактировалось sokolov.sv; 11.03.2024 в 14:37.

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Похожие темы

  1. Изменение константы сетевой переменной
    от shvitaliy в разделе Среда программирования OWEN Logic
    Ответов: 26
    Последнее сообщение: 27.12.2022, 17:43
  2. обнуление сетевой переменной при включении питания ПР200
    от ALEX_099 в разделе Программируемые реле
    Ответов: 37
    Последнее сообщение: 28.09.2019, 19:15
  3. Сброс сетевой переменной в ПР200
    от AlexVasil в разделе Программируемые реле
    Ответов: 4
    Последнее сообщение: 23.04.2019, 09:31
  4. ПР200 переход по изменению значения переменной
    от Orbes в разделе Среда программирования OWEN Logic
    Ответов: 2
    Последнее сообщение: 10.02.2017, 13:37
  5. Ответов: 10
    Последнее сообщение: 25.06.2014, 22:39

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •