Выделить бит

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

    SetVal это встроенная формула ядра. Ее не требуется заносить в формулы.
    Смотрите Документацию — Использование формул. Использование формул, Существующие формулы

    Это формула записи значения в канал.

    #28275
    manjey73
    Участник

    SetVal(Номер канала для изменения, SetBit(Val(сперва берется значение канала, который вы меняете), Номер бита, true или false в зависимости от установки или снятия бита))

    Соответственно если вы выполняете установку бита через вызов окна команды, вам надо конвертировать в boolen Cmd.
    А вот если вы хотите инвертировать значение быта и выполнить команду сразу, например подвесив на кнопку. Тогда вместо Convert.ToBoolean(Cmd) вам надо будет использовать другую формулу для этого, так как при Отправить сразу всегда будет отправляться 0

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

    Если разносить по кнопкам — поставить, снять бит. Можно вместо Convert.ToBoolean(Cmd) просто прописать true или false

    #28281
    Mikhail
    Модератор

    В 6-й версии необходимые расчётные каналы создаются автоматически.
    Для 5-й версии, @mvtriton, сделайте скриншоты настроек, если не заработает.

    #29093
    MVTriton
    Участник

    Добры день! С 5й версией так ничего и не получилось. Продолжил тестировать на 6й версии, но немного на другом оборудовании.
    Вкратце обрисую ситуацию. Есть ПР200 в скаду передает число типа Int — 10 бит, это маска выходов ПР200 8DI+2Светодиода. ПР200 связывается сервером по RS485 — GPRS модем.
    Если описать подключать на прямую как протокол модбас, то связь со скадой и ПР200 есть, но очень много потерь и ошибка CRC, связываю это с плохим сигналом GPRS. Решил попробовать все сделать тоже самое через OPC сервер InSat ModbusOPC. Работает, связь более стабильная, но потери так же есть, задержка по сигналам есть, но работает, данные считываются. Это была предыстория использования OPC, а не напрямую Modbus из Скады.
    Так вот Маску выходов я считываю. Например, что бы включить все выходы надо оправить число 1023, что бы отключить 0, число от 0 до 1023 это уже комбинация отдельных выходов.
    Что бы управлять конкретным выходом надо соответственно записать бит в нужной позиции числа.
    Создан 115й канал типа Входной/Выходной, где читается маска выходов, тут же можно и записать значение, реле переключаются.
    Что бы записать 0й бит в 115й канал, создал 116 дорасчетный канал типа Расчётный/Выходной,
    Входная формула GetBit(Val(115), 0)
    Выходная формула SetVal(115, SetBit(Val(115), 0, Convert.ToBoolean(Cmd))) Тип команды Включит/Отключить

    В скриптах забита формула SetBit
    public double SetBit(double n, int index, bool value)
    {
    long nn = Convert.ToInt64(n);
    return value ? nn | (1 << index) : nn & ~(1 << index);
    }

    В общем при выполнении команды для 116 переменной, значение и 116й и 115й меняется как нужно, только значение это на ПР200 не передается, т.е. значение меняется, но будто не передается во вне, а просто меняется 115я переменная внутри самой скады, а вот если перезаписать саму 115ю переменную, то значение отправляется на ПР200 и реле переключается. В чем может быть проблема? перечитал всю тему https://forum.rapidscada.ru/?topic=%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B8%D1%82%D0%B5-%D1%80%D0%B0%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D1%8C%D1%81%D1%8F-%D1%81-%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%D0%BE%D0%BC-beck

    Попробовал разные вариации, результат тот же.

    #29094
    MVTriton
    Участник

    При изменении формулы SetBit
    public double SetBit(double n, int index, double value)
    {
    long nn = Convert.ToInt64(n);
    return value > 0 ? nn | (1 << index) : nn & ~(1 << index);
    }
    Попробуйте так. Задавайте в команде 0 или 1
    Сообщение #19585
    Scada вообще перестаёт запускаться. Кстати в 6й версии формулы SetBit не было, её добавлял вручную. GetBit была.

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

    Потому что у вас 115-й канал является входным и выходным и настроена взаимосвязь с прибором. Вы же делаете дорасчетный канал, который не имеет взаимосвязи с прибором, так чего же вы хотели?

    #29100
    MVTriton
    Участник

    Так как тогда передать данные бита в 115й канал. У меня 116й ссылается на 115й, а 115й имеет связь с прибором. Цепочка такова. Да в и большинстве тем, именно так строится связь по передаче данных в прибор. 116й дорасчетный, берёт значение 115го, считывает его, дальше выходная команда, для записи значения в 115й канал.

    #29101
    MVTriton
    Участник

    Значение записывается в 115й, меняется, но не передаётся, а если руками записать в 115й не бит, а всё число, то данные передаются и всё работает.

    #29102
    manjey73
    Участник

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

    Потому что 115-й канал имеет взаимосвязь с прибором по имени тега, потому команда и передается.
    Вероятно дело в этом. Так как вы пытаетесь изменить 116-й канал, его кода тега нет в шаблоне и команда только меняет значение 115-го канала, но сам 115-й канал при непрямом управлении не передает свой код тега в драйвер.

    #29104
    manjey73
    Участник

    Входную формулу сделайте Val(115) вместо GetBit
    А выходную по идее можно и оставить, хотя без разницы, если вы бит меняете все равно в полном числе 115-ого канала…

    Команду дополнительно в шаблоне добавьте для 116-ого который так же будет писать значение в регистр, связанный со 115-м каналом и все по идее

    #29111
    MVTriton
    Участник

    <Команду дополнительно в шаблоне добавьте для 116-ого который так же будет писать значение в регистр, связанный со 115-м каналом и все по идее >

    Не совсем понял о каком шаблоне идёт речь? если о шаблоне настроек самого устройства как подписка на OPC, то тут есть 2 нюанса:
    OPC имеет возможность самостоятельно выделять бить нужного регистра, т.о. образом можно получить тег, его будет можно и читать и записывать. Честно этот вариант не пробовал.
    Цель использования возможностей скады, это сокращение количества тегов, из за плохой связи, а так же сокращение обращений между скадой и ОРС, т.к. есть некие предубеждения на счет скорости работы данной связки, поэтому их взаимодействие и тэгов хотелось бы уменьшить, и при этом оставить функционал без изменений.

    #29112
    MVTriton
    Участник

    Попробовал сделать как я написал выше, в OPC сервере создал 4 переменных, ссылающиеся на регистр в ПР200. Каждая переменная берет бит с 0го по 3й.
    В скаде в шаблон добавил подписки, Создал входноую/выходную запись. Тип записи вкл/откл, формула выходная: SetVal(120, Cmd). Всё работает. Вкл. и отклюсчатся отределённый выход ПР200. Но все же хочется релиазовать череp SetBit. Подозреваю, что загвозка в типах данных.

    #29113
    manjey73
    Участник

    Извините, с OPC такое наверное не прокатит. Речь о драйвере Modbus

    Вообще использовать OPC при встроенных возможностях работы с Modbus напрямую это полное извращение

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

    Если плохая связь с GPRS то стоит просто увеличить время таймаута. Аналогичная ерунда происходит со всякими преобразователями через радиосигнал и т.д.. когда связь медленная за счет этого. GPRS тут не исключение.
    Если ответ придет раньше таймаута, то ожидание будет остановлено. ничего страшного, зато ошибок будет меньше.

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