Стартовая страница › Форумы › Взаимодействие с устройствами › Modbus › Выделить бит
- В этой теме 46 ответов, 8 участников, последнее обновление 1 год, 6 месяцев назад сделано
Andre1964.
-
АвторСообщения
-
24.09.2019 в 10:04 #13691
Sima42
УчастникДобрый день. Подскажите как по modbus в таблице данных «Holding Registers» получить значение с типом данных Boolean и получить к примеру 2 бит?
https://yadi.sk/i/16XgYUN65FFk0A
-
Эта тема была изменена 5 лет, 7 месяцев назад от
Sima42.
24.09.2019 в 10:32 #13695manjey73
УчастникВо входном канале использовать формулу GetBit(Cnl, нужный бит)
Если нужно из одной переменной много разных битов выдергивать, то лучше создать необходимое количество Дорасчетных каналов.
Использовать формулу GetBit(Val(Номер канала получения данных), нужный бит)
И так для каждого канала.
например регистр читаем в канал 100
101 — GetBit(Val(100), 0)
102 — GetBit(Val(100), 1) и так далее по нужным битам-
Этот ответ был изменен 5 лет, 7 месяцев назад от
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 если не ошибаюсь
При этом вам вроде надо взять исходное значение и в нем менять требуемый бит и потом выполнять запись
-
Этот ответ был изменен 2 года назад от
manjey73.
17.04.2023 в 10:53 #28273MVTriton
УчастникВерсия 5.5.2.2
SetBit я добавил, как вы описали выше, мне не понятные значения в SetVal. SetVal нет в справочнике формул. -
Эта тема была изменена 5 лет, 7 месяцев назад от
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.