Выделить бит

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

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

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

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

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

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

    • Этот ответ был изменен 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() 🙂

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