Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Установка значения n бита в 2-х байтовом регистре
- В этой теме 19 ответов, 4 участника, последнее обновление 5 лет, 5 месяцев назад сделано Ermakov Andrey.
-
АвторСообщения
-
13.10.2017 в 05:10 #7517StelsУчастник
Здравствуйте! Подскажите, пожалуйста, необходимо в 2-х байтовый регистр типа Holding registers в любой из битов записать либо 0, либо 1 с веб-интерфейса по команде с кнопки. На данный момент считываю значение нужного регистра во входных каналах и дорасчетными каналами считал значения текущих битов. Какая формула необходима и как правильно все это организовать, чтобы в нужный адрес Holding registers можно было в нужный бит подавать команды 0 или 1. Если можно на примере?
13.10.2017 в 08:47 #7519MikhailМодераторДобрый день!
Итак, нужны входные каналы, которые будут хранить текущее значение регистра. Для записи каждого бита потребуется отдельный канал управления. Формула для канала управления такая: 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)); } }
13.10.2017 в 09:40 #7523StelsУчастникСпасибо! Формула ошибок не выдает. Поправили только лишний пробел вот здесь: (1 < < bitNum). Подскажите, как теперь записать 0 или 1 в нужный бит по подробней. Если через веб интерфейс отправлять стандартную команду откл. отправляются какие то неопнятные значения, а через коммуникатор отправляется 0,000 либо 1,000, соответственно значение бита в регистре не изменяется.
13.10.2017 в 09:56 #7524manjey73УчастникCmd отправляет всегда double, если вы не пользуетесь формулой, но и на выходе формулы тоже должен быть double по возможности, либо Сервер сам преобразует это в double…
У вас в канале управления должна быть формула, которую привел Михаил.
Из Коммуникатора так не получится отправить, только по Откл/Вкл так как он передает значение double 0 или 1- Этот ответ был изменен 6 лет, 5 месяцев назад от manjey73.
13.10.2017 в 22:23 #7532MikhailМодераторкак теперь записать 0 или 1 в нужный бит по подробней
Сделайте, пожалуйста, скриншоты Ваших настроек и приведите логи Коммуникатора, в которых видно, что было отправлено, а также укажите, что требовалось отправить.
29.10.2017 в 04:04 #7652StelsУчастникСпасибо, разобрался с причиной почему не происходит запись в регистр Holding. В данный регистр запись возможна только командой 10, а через веб-интерфейс отправляется команда 6. Пробую через коммуникатор отправить, но тоже не выходит.
Выкладываю настройки конфигурации устройства:
Для всех регистров, созданы входные каналы, пример того регистра, на котором провожу эксперименты:
[img][/img]
В коммуникаторе, в шаблоне устройств создан новый шаблон,для которого созданы группы элементов с адресами регистров:
Также, в шаблоне устройств созданы команды:
В администраторе создан канал управления, для которого используется формула, описанная Вами выше:
Текущее значение регистра, выводимое в коммуникаторе:
Побитное разложение данного регистра в веб-интерфейсе:
Пример отправки команды через веб-интерфейс:
Пример отправки команды через коммуникатор:
Лог коммуникатора после отправки команд, первая через коммуникатор, вторая через веб-интерфейс:
29.10.2017 в 12:38 #7655manjey73УчастникКартинки лучше на обменник.
Галочку «Множественная команда» в шаблоне устанавливали ? она как раз меняет команду с 6 на 10
29.10.2017 в 15:07 #7656StelsУчастникДа галочка в шаблоне установлена
- Этот ответ был изменен 6 лет, 5 месяцев назад от Stels.
30.10.2017 в 04:14 #7658StelsУчастникЛог при отправке команды из коммуникатора:
«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
30.10.2017 в 06:33 #7659StelsУчастникСпасибо! Сам разобрался. Проблема была в самом устройстве «Ошибка устройства: [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» в указанный регистр, запись вообще не происходит ни в один бит. Можете подсказать, в чем может быть причина? В формуле?30.10.2017 в 06:37 #7660StelsУчастникМожно ли отправить команду вот в таком виде:
Адрес устройства|10H|Адрес первого регистра записи|Количество регистров|Счетчик байтов|Значения записываемых параметров|CRC-16|30.10.2017 в 08:51 #7661MikhailМодераторДобрый день!
1. Рекомендую обновить Коммуникатор. В новой версии обновлён драйвер Модбас — будет удобнее работать.
2. Проверяйте отправляемые данные команды с помощью http://modbus.rapidscada.net/
Если команда не срабатывает, то Вы будете знать, отправлена действительно та команда, которая нужна, или нет.
3. Протокол Модбас позволяет отправлять команды в определенном виде. Отправляя команду на запись register (а не coil), Вы не можете установить только один бит, а другие не трогать. Нужна формула, которая возьмёт существующее значение входного канала, переключит нужные бит и это будет отправлено на устройство. Такая формула где-то здесь на форуме уже есть — попробуйте её найти.30.10.2017 в 08:52 #7662MikhailМодераторОказывается формула в этой теме MyCmd выше )) Надо тестировать и отлаживать эту формулу. Я могу это сделать, но в качестве платной услуги.
30.10.2017 в 09:23 #7663StelsУчастникКакова стоимость? Или может вы подскажете процесс отладки?
30.10.2017 в 09:26 #7664StelsУчастникПросто на рабочем месте где происходит общение с устройством нет Интернета…
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.