Выделить бит

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

    Добрый день. Подскажите как по modbus в таблице данных «Holding Registers» получить значение с типом данных Boolean и получить к примеру 2 бит?

    https://yadi.sk/i/16XgYUN65FFk0A

    • Эта тема была изменена 5 лет, 2 месяца назад от Sima42.
    #13695
    manjey73
    Участник

    Во входном канале использовать формулу GetBit(Cnl, нужный бит)

    Если нужно из одной переменной много разных битов выдергивать, то лучше создать необходимое количество Дорасчетных каналов.
    Использовать формулу GetBit(Val(Номер канала получения данных), нужный бит)
    И так для каждого канала.
    например регистр читаем в канал 100
    101 — GetBit(Val(100), 0)
    102 — GetBit(Val(100), 1) и так далее по нужным битам

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

    Как обычно все элементарно) Спасибо

    #13700
    manjey73
    Участник
    #13701
    Sima42
    Участник

    Документацию я читал. Там такой функции GetBit нету. Где мне можно найти все функции? И есть такая функция но записи?

    #13702
    manjey73
    Участник

    По записи нет. Открываете базу в Администраторе — Справочники — Формулы.

    Все, что идет по умолчанию.

    На счет записи надо делать свою формулу, так как при записи регистра необходимо взять полученное число, изменить нужный бит и только тогда отправить команду.

    #13703
    manjey73
    Участник

    Сама по себе функция установки бита в числе на C# для int выглядит так

    public static int SetBit(int n, int index, bool value)
    {
    return value ? n | (1 << index) : n & ~(1 << index);
    }

    Для формул надо адаптировать под double наверное, ну и думать как и когда читать полное число. Честно говоря пока не стояло такой задачи, не до этого, но формула установки битов была бы полезна из коробки.

    #13705
    manjey73
    Участник

    Ну вот протестировал простую формулу.
    Добавил в Справочник Формулы

    public double SetBit(double n, int index, bool value)
    {
    long nn = Convert.ToInt64(n);
    return value ? nn | (1 << index) : nn & ~(1 << index);
    }
    #13706
    manjey73
    Участник

    Создал тестовый канал 9 с формулой Val(9), канал управления указал 454 (у меня такой)
    Создал тестовый канал управления 454 с формулой

    SetVal(9, SetBit(Val(9), 1, Convert.ToBoolean(Cmd))) // тут в качестве команды конвертирование значения команды Откл — Вкл (0 или 1) конвертируется в false или true

    Значение команды указал «Откл — Вкл»

    Результате выставляю или сбрасываю 1-й бит…

    #13712
    Sima42
    Участник

    Спасибо, разобрался

    #17416
    stark74
    Участник

    Коллеги, добрый вечер.
    Раньше со скадами дела вообще не имел, поэтому нуждаюсь в помощи.
    Необходимо тоже самое, читать Канал и выбирать определенные биты.
    Исходные данные, которые выдает железка при опросе:
    +———+———————————————+——————+——-+
    | Сигнал | Наименование | Значение | Канал |
    +———+———————————————+——————+——-+
    +———+———————————————+——————+——-+
    | 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> Нормальная работа программы невозможна
    Я понимаю, что явно что-то не то сделал, но без вашей помощи не получается

    #17417
    a80808
    Участник

    Формулы чувствительны к регистру — GetBit() и Getbit() — это разные формулы. Видимо у вас формула написана как Getbit(), а такой действительно нет….
    Сам на эти грабли не раз наступал в основном на SetVal() 🙂

    #28268
    MVTriton
    Участник

    Добрый день!
    Пытаюсь повторить всё выше описанное. В наличии модуль МК110 8вх/4 выхода.
    Работаю со состоянием выходов. Там есть битовая маска. Её считываю, дорасчётом определяют бит и всё отлично работает.
    А вот с установлением определенного бита не выходит.
    Создал в справочнике формулу SetBit как в сообщении #13705/
    Далее пытаюсь по #13706, но там уже появляется SetVal, такой формулы нет.

    Так же возможно запутался в SetVal(9, SetBit(Val(9), 1, Convert.ToBoolean(Cmd)))
    Что в скобках, что есть, что 1 — это номер устанавливаемого бита, Convert понятно 0- False,
    Что есть 9 и SetBit (значение какого параметра?)
    И сама формула SetVal ?

    #28269
    manjey73
    Участник

    в 6-й версии уже есть SetBit если не ошибаюсь

    При этом вам вроде надо взять исходное значение и в нем менять требуемый бит и потом выполнять запись

    • Этот ответ был изменен 1 год, 7 месяцев назад от manjey73.
    #28273
    MVTriton
    Участник

    Версия 5.5.2.2
    SetBit я добавил, как вы описали выше, мне не понятные значения в SetVal. SetVal нет в справочнике формул.

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