Установка значения n бита в 2-х байтовом регистре

Стартовая страница Форумы Понять, как работает ПО Использование формул Установка значения n бита в 2-х байтовом регистре

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

    Здравствуйте! Подскажите, пожалуйста, необходимо в 2-х байтовый регистр типа Holding registers в любой из битов записать либо 0, либо 1 с веб-интерфейса по команде с кнопки. На данный момент считываю значение нужного регистра во входных каналах и дорасчетными каналами считал значения текущих битов. Какая формула необходима и как правильно все это организовать, чтобы в нужный адрес Holding registers можно было в нужный бит подавать команды 0 или 1. Если можно на примере?

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

    Добрый день!
    Итак, нужны входные каналы, которые будут хранить текущее значение регистра. Для записи каждого бита потребуется отдельный канал управления. Формула для канала управления такая: MyCmd(101, 5)
    где 101 — входной канал, который хранит значение регистра,
    5 — номер бита, считая с 0

    В таблице формул нужно создать новую формулу (на форуме формулы не тестирую):

    double MyCmd(int cnlNum, int bitNum)
    {
      if (Cmd > 0)
      {
        return (ushort)Val(cnlNum) | (1 << bitNum);
      }
      else
      {
        return (ushort)Val(cnlNum) & (~(1 << bitNum));
      }
    }
    
    #7523
    Stels
    Участник

    Спасибо! Формула ошибок не выдает. Поправили только лишний пробел вот здесь: (1 < < bitNum). Подскажите, как теперь записать 0 или 1 в нужный бит по подробней. Если через веб интерфейс отправлять стандартную команду откл. отправляются какие то неопнятные значения, а через коммуникатор отправляется 0,000 либо 1,000, соответственно значение бита в регистре не изменяется.

    #7524
    manjey73
    Участник

    Cmd отправляет всегда double, если вы не пользуетесь формулой, но и на выходе формулы тоже должен быть double по возможности, либо Сервер сам преобразует это в double…

    У вас в канале управления должна быть формула, которую привел Михаил.
    Из Коммуникатора так не получится отправить, только по Откл/Вкл так как он передает значение double 0 или 1

    • Этот ответ был изменен 6 лет, 5 месяцев назад от manjey73.
    #7532
    Mikhail
    Модератор

    как теперь записать 0 или 1 в нужный бит по подробней

    Сделайте, пожалуйста, скриншоты Ваших настроек и приведите логи Коммуникатора, в которых видно, что было отправлено, а также укажите, что требовалось отправить.

    #7652
    Stels
    Участник

    Спасибо, разобрался с причиной почему не происходит запись в регистр Holding. В данный регистр запись возможна только командой 10, а через веб-интерфейс отправляется команда 6. Пробую через коммуникатор отправить, но тоже не выходит.
    Выкладываю настройки конфигурации устройства:
    Для всех регистров, созданы входные каналы, пример того регистра, на котором провожу эксперименты:
    [img]Входные каналы для Modbus RTU (администратор)[/img]
    В коммуникаторе, в шаблоне устройств создан новый шаблон,для которого созданы группы элементов с адресами регистров:
    Группа элементов в коммуникаторе(шаблон устройств)
    Также, в шаблоне устройств созданы команды:
    Команда в коммуникаторе(шаблон устройств)
    В администраторе создан канал управления, для которого используется формула, описанная Вами выше:
    Канал управления для Modbus RTU (администратор)
    Текущее значение регистра, выводимое в коммуникаторе:
    Текущее значение регистра в коммуникаторе
    Побитное разложение данного регистра в веб-интерфейсе:
    побитовое представление в таблице веб-интерфейса
    Пример отправки команды через веб-интерфейс:
    Пример отправки команды через веб-интерфейс
    Пример отправки команды через коммуникатор:
    Пример отправки команды через коммуникатор
    Лог коммуникатора после отправки команд, первая через коммуникатор, вторая через веб-интерфейс:
    Значения команд в коммуникаторе

    • Этот ответ был изменен 6 лет, 5 месяцев назад от Stels.
    • Этот ответ был изменен 6 лет, 5 месяцев назад от Stels.
    #7655
    manjey73
    Участник

    Картинки лучше на обменник.

    Галочку «Множественная команда» в шаблоне устанавливали ? она как раз меняет команду с 6 на 10

    #7656
    Stels
    Участник

    Да галочка в шаблоне установлена

    • Этот ответ был изменен 6 лет, 5 месяцев назад от Stels.
    #7658
    Stels
    Участник

    Лог при отправке команды из коммуникатора:
    «2017-10-30 11:03:08 Команда КП 101 «ModbusDevice1», тип:

    KpModbus, адрес: 1
    Команда «звук кнопок»
    Отправка (13): 01 10 00 03 00 02 04 00 00 00 00 B3 BA
    Приём (5/5): 01 90 03 0C 01
    Ошибка устройства: [03] ILLEGAL DATA VALUE!
    Команда «звук кнопок»
    Отправка (13): 01 10 00 03 00 02 04 00 00 00 00 B3 BA
    Приём (5/5): 01 90 03 0C 01
    Ошибка устройства: [03] ILLEGAL DATA VALUE!
    Команда «звук кнопок»
    Отправка (13): 01 10 00 03 00 02 04 00 00 00 00 B3 BA
    Приём (5/5): 01 90 03 0C 01
    Ошибка устройства: [03] ILLEGAL DATA VALUE!»

    Лог, при отправке команды из веб-интерфейса:
    2017-10-30 11:05:48 <NOUTE_PC><система><ACT> Проверка имени

    и пароля пользователя admin. Результат: верно
    2017-10-30 11:05:48 <NOUTE_PC><система><ACT> Получена

    команда 0x06 (команда ТУ) от клиента 127.0.0.1
    2017-10-30 11:05:48 <NOUTE_PC><система><ACT> Команда ТУ:

    канал упр. = 1114, ид. польз. = 11

    #7659
    Stels
    Участник

    Спасибо! Сам разобрался. Проблема была в самом устройстве «Ошибка устройства: [03] ILLEGAL DATA VALUE!» стояла блокировка на запись в регистры.
    Теперь появилась другая проблема, отправляю команду на запись в регистр с адресом «4» значение равное «0»:
    «Отправка (11): 01 10 00 03 00 01 02 00 00 A6 63»
    В ответ приходит:
    «Приём (5/5): 01 10 00 03 00
    Приём (3/3): 01 F1 C9
    OK!»
    Соответственно, запись происходит успешно, но все биты в регистре ставятся в ноль, а не только тот который мне нужен, прописанный в формуле в канале управления. При попытке записать значение «1» в указанный регистр, запись вообще не происходит ни в один бит. Можете подсказать, в чем может быть причина? В формуле?

    #7660
    Stels
    Участник

    Можно ли отправить команду вот в таком виде:
    Адрес устройства|10H|Адрес первого регистра записи|Количество регистров|Счетчик байтов|Значения записываемых параметров|CRC-16|

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

    Добрый день!
    1. Рекомендую обновить Коммуникатор. В новой версии обновлён драйвер Модбас — будет удобнее работать.
    2. Проверяйте отправляемые данные команды с помощью http://modbus.rapidscada.net/
    Если команда не срабатывает, то Вы будете знать, отправлена действительно та команда, которая нужна, или нет.
    3. Протокол Модбас позволяет отправлять команды в определенном виде. Отправляя команду на запись register (а не coil), Вы не можете установить только один бит, а другие не трогать. Нужна формула, которая возьмёт существующее значение входного канала, переключит нужные бит и это будет отправлено на устройство. Такая формула где-то здесь на форуме уже есть — попробуйте её найти.

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

    Оказывается формула в этой теме MyCmd выше )) Надо тестировать и отлаживать эту формулу. Я могу это сделать, но в качестве платной услуги.

    #7663
    Stels
    Участник

    Какова стоимость? Или может вы подскажете процесс отладки?

    #7664
    Stels
    Участник

    Просто на рабочем месте где происходит общение с устройством нет Интернета…

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