Стартовая страница › Форумы › Взаимодействие с устройствами › Modbus › Выделить бит
- В этой теме 46 ответов, 8 участников, последнее обновление 1 год, 1 месяц назад сделано Andre1964.
-
АвторСообщения
-
24.09.2019 в 10:04 #13691Sima42Участник
Добрый день. Подскажите как по modbus в таблице данных «Holding Registers» получить значение с типом данных Boolean и получить к примеру 2 бит?
https://yadi.sk/i/16XgYUN65FFk0A
- Эта тема была изменена 5 лет, 2 месяца назад от Sima42.
24.09.2019 в 10:32 #13695manjey73УчастникВо входном канале использовать формулу GetBit(Cnl, нужный бит)
Если нужно из одной переменной много разных битов выдергивать, то лучше создать необходимое количество Дорасчетных каналов.
Использовать формулу GetBit(Val(Номер канала получения данных), нужный бит)
И так для каждого канала.
например регистр читаем в канал 100
101 — GetBit(Val(100), 0)
102 — GetBit(Val(100), 1) и так далее по нужным битам- Этот ответ был изменен 5 лет, 2 месяца назад от manjey73.
24.09.2019 в 10:37 #13697Sima42УчастникКак обычно все элементарно) Спасибо
24.09.2019 в 10:40 #1370024.09.2019 в 10:52 #13701Sima42УчастникДокументацию я читал. Там такой функции GetBit нету. Где мне можно найти все функции? И есть такая функция но записи?
24.09.2019 в 11:16 #13702manjey73УчастникПо записи нет. Открываете базу в Администраторе — Справочники — Формулы.
Все, что идет по умолчанию.
На счет записи надо делать свою формулу, так как при записи регистра необходимо взять полученное число, изменить нужный бит и только тогда отправить команду.
24.09.2019 в 11:21 #13703manjey73УчастникСама по себе функция установки бита в числе на C# для int выглядит так
public static int SetBit(int n, int index, bool value)
{
return value ? n | (1 << index) : n & ~(1 << index);
}Для формул надо адаптировать под double наверное, ну и думать как и когда читать полное число. Честно говоря пока не стояло такой задачи, не до этого, но формула установки битов была бы полезна из коробки.
24.09.2019 в 12:06 #13705manjey73УчастникНу вот протестировал простую формулу.
Добавил в Справочник Формулыpublic double SetBit(double n, int index, bool value) { long nn = Convert.ToInt64(n); return value ? nn | (1 << index) : nn & ~(1 << index); }
24.09.2019 в 12:09 #13706manjey73УчастникСоздал тестовый канал 9 с формулой Val(9), канал управления указал 454 (у меня такой)
Создал тестовый канал управления 454 с формулойSetVal(9, SetBit(Val(9), 1, Convert.ToBoolean(Cmd))) // тут в качестве команды конвертирование значения команды Откл — Вкл (0 или 1) конвертируется в false или true
Значение команды указал «Откл — Вкл»
Результате выставляю или сбрасываю 1-й бит…
25.09.2019 в 07:51 #13712Sima42УчастникСпасибо, разобрался
21.10.2020 в 18:59 #17416stark74УчастникКоллеги, добрый вечер.
Раньше со скадами дела вообще не имел, поэтому нуждаюсь в помощи.
Необходимо тоже самое, читать Канал и выбирать определенные биты.
Исходные данные, которые выдает железка при опросе:
+———+———————————————+——————+——-+
| Сигнал | Наименование | Значение | Канал |
+———+———————————————+——————+——-+
+———+———————————————+——————+——-+
| 16 | Отсутствует напряжение питания 600В | — | 1151 |
+———+———————————————+——————+——-+
и т.д.Из документации на железку:
4.2 Отсутствует напряжение питания 600В 10 F2 (чтение) 1/8 BOOL 0 — нет 1 — да Нет
Где,
10 — Адрес регистра
F2 — функция ModBus
1/8 — Количество байт
BOOL — Тип данных
0 — нет 1 — да Нет — диапазон значенийсоздал канал Телеизмерение 1151
Создал канал 1152 — дорасчетный ТИGetBit(Val(1151),10) (Если правильно понял, что считывать надо именно 10 bit)
Формула в Админитратор — формулы есть
После внесения конфигурации на сервер получаю ошибку:
Строка 514, колонка 58: error CS0103: The name ‘Getbit’ does not exist in the current context
Для ознакомления с исходным кодом см. файл C:\SCADA\ScadaServer\Log\CalcEngine.cs
2020-10-21 18:39:01 <DPC-SCADA-SERV><SYSTEM><ERR> Нормальная работа программы невозможна
Я понимаю, что явно что-то не то сделал, но без вашей помощи не получается21.10.2020 в 20:46 #17417a80808УчастникФормулы чувствительны к регистру — GetBit() и Getbit() — это разные формулы. Видимо у вас формула написана как Getbit(), а такой действительно нет….
Сам на эти грабли не раз наступал в основном на SetVal() 🙂17.04.2023 в 09:29 #28268MVTritonУчастникДобрый день!
Пытаюсь повторить всё выше описанное. В наличии модуль МК110 8вх/4 выхода.
Работаю со состоянием выходов. Там есть битовая маска. Её считываю, дорасчётом определяют бит и всё отлично работает.
А вот с установлением определенного бита не выходит.
Создал в справочнике формулу SetBit как в сообщении #13705/
Далее пытаюсь по #13706, но там уже появляется SetVal, такой формулы нет.Так же возможно запутался в SetVal(9, SetBit(Val(9), 1, Convert.ToBoolean(Cmd)))
Что в скобках, что есть, что 1 — это номер устанавливаемого бита, Convert понятно 0- False,
Что есть 9 и SetBit (значение какого параметра?)
И сама формула SetVal ?17.04.2023 в 09:32 #28269manjey73Участникв 6-й версии уже есть SetBit если не ошибаюсь
При этом вам вроде надо взять исходное значение и в нем менять требуемый бит и потом выполнять запись
- Этот ответ был изменен 1 год, 7 месяцев назад от manjey73.
17.04.2023 в 10:53 #28273MVTritonУчастникВерсия 5.5.2.2
SetBit я добавил, как вы описали выше, мне не понятные значения в SetVal. SetVal нет в справочнике формул. -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.