Стартовая страница › Форумы › Взаимодействие с устройствами › Modbus › Выделить бит
- В этой теме 46 ответов, 8 участников, последнее обновление 1 год, 1 месяц назад сделано Andre1964.
-
АвторСообщения
-
17.04.2023 в 10:57 #28274manjey73Участник
SetVal это встроенная формула ядра. Ее не требуется заносить в формулы.
Смотрите Документацию — Использование формул. Использование формул, Существующие формулыЭто формула записи значения в канал.
17.04.2023 в 11:01 #28275manjey73УчастникSetVal(Номер канала для изменения, SetBit(Val(сперва берется значение канала, который вы меняете), Номер бита, true или false в зависимости от установки или снятия бита))
Соответственно если вы выполняете установку бита через вызов окна команды, вам надо конвертировать в boolen Cmd.
А вот если вы хотите инвертировать значение быта и выполнить команду сразу, например подвесив на кнопку. Тогда вместо Convert.ToBoolean(Cmd) вам надо будет использовать другую формулу для этого, так как при Отправить сразу всегда будет отправляться 0- Этот ответ был изменен 1 год, 7 месяцев назад от manjey73.
17.04.2023 в 11:03 #28277manjey73УчастникЕсли разносить по кнопкам — поставить, снять бит. Можно вместо Convert.ToBoolean(Cmd) просто прописать true или false
17.04.2023 в 16:05 #28281MikhailМодераторВ 6-й версии необходимые расчётные каналы создаются автоматически.
Для 5-й версии, @mvtriton, сделайте скриншоты настроек, если не заработает.03.07.2023 в 10:39 #29093MVTritonУчастникДобры день! С 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
Попробовал разные вариации, результат тот же.
03.07.2023 в 10:42 #29094MVTritonУчастникПри изменении формулы 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.
03.07.2023 в 12:00 #29098manjey73УчастникПотому что у вас 115-й канал является входным и выходным и настроена взаимосвязь с прибором. Вы же делаете дорасчетный канал, который не имеет взаимосвязи с прибором, так чего же вы хотели?
03.07.2023 в 12:12 #29100MVTritonУчастникТак как тогда передать данные бита в 115й канал. У меня 116й ссылается на 115й, а 115й имеет связь с прибором. Цепочка такова. Да в и большинстве тем, именно так строится связь по передаче данных в прибор. 116й дорасчетный, берёт значение 115го, считывает его, дальше выходная команда, для записи значения в 115й канал.
03.07.2023 в 12:14 #29101MVTritonУчастникЗначение записывается в 115й, меняется, но не передаётся, а если руками записать в 115й не бит, а всё число, то данные передаются и всё работает.
03.07.2023 в 12:28 #29102manjey73УчастникВероятно потому, что тег сигнала не совпадает.
Создайте дополнительную команду в шаблоне драйвера на тот же регистр, чтобы тег команды соответствовал каналу 116-ть, и возможно измените формулу, чтобы 116-й канал хранил в себе все значение 115-го, а выходная формула меняла бит в полном числе.Потому что 115-й канал имеет взаимосвязь с прибором по имени тега, потому команда и передается.
Вероятно дело в этом. Так как вы пытаетесь изменить 116-й канал, его кода тега нет в шаблоне и команда только меняет значение 115-го канала, но сам 115-й канал при непрямом управлении не передает свой код тега в драйвер.03.07.2023 в 12:32 #29104manjey73УчастникВходную формулу сделайте Val(115) вместо GetBit
А выходную по идее можно и оставить, хотя без разницы, если вы бит меняете все равно в полном числе 115-ого канала…Команду дополнительно в шаблоне добавьте для 116-ого который так же будет писать значение в регистр, связанный со 115-м каналом и все по идее
03.07.2023 в 13:38 #29111MVTritonУчастник<Команду дополнительно в шаблоне добавьте для 116-ого который так же будет писать значение в регистр, связанный со 115-м каналом и все по идее >
Не совсем понял о каком шаблоне идёт речь? если о шаблоне настроек самого устройства как подписка на OPC, то тут есть 2 нюанса:
OPC имеет возможность самостоятельно выделять бить нужного регистра, т.о. образом можно получить тег, его будет можно и читать и записывать. Честно этот вариант не пробовал.
Цель использования возможностей скады, это сокращение количества тегов, из за плохой связи, а так же сокращение обращений между скадой и ОРС, т.к. есть некие предубеждения на счет скорости работы данной связки, поэтому их взаимодействие и тэгов хотелось бы уменьшить, и при этом оставить функционал без изменений.03.07.2023 в 14:40 #29112MVTritonУчастникПопробовал сделать как я написал выше, в OPC сервере создал 4 переменных, ссылающиеся на регистр в ПР200. Каждая переменная берет бит с 0го по 3й.
В скаде в шаблон добавил подписки, Создал входноую/выходную запись. Тип записи вкл/откл, формула выходная: SetVal(120, Cmd). Всё работает. Вкл. и отклюсчатся отределённый выход ПР200. Но все же хочется релиазовать череp SetBit. Подозреваю, что загвозка в типах данных.03.07.2023 в 14:57 #29113manjey73УчастникИзвините, с OPC такое наверное не прокатит. Речь о драйвере Modbus
Вообще использовать OPC при встроенных возможностях работы с Modbus напрямую это полное извращение
- Этот ответ был изменен 1 год, 5 месяцев назад от manjey73.
03.07.2023 в 15:01 #29115manjey73УчастникЕсли плохая связь с GPRS то стоит просто увеличить время таймаута. Аналогичная ерунда происходит со всякими преобразователями через радиосигнал и т.д.. когда связь медленная за счет этого. GPRS тут не исключение.
Если ответ придет раньше таймаута, то ожидание будет остановлено. ничего страшного, зато ошибок будет меньше. -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.