Можно ли как-то упаковать дискретные сигналы от 12 одинаковых дискретных датчиков в одну переменную, по модбасу передать ее в скаду, а там распаковать так, чтобы можно было определить срабатывание каждого датчика? Не хватает всего 3 тегов.
Вид для печати
Можно ли как-то упаковать дискретные сигналы от 12 одинаковых дискретных датчиков в одну переменную, по модбасу передать ее в скаду, а там распаковать так, чтобы можно было определить срабатывание каждого датчика? Не хватает всего 3 тегов.
w: WORD;
w.0 := di1;
w.1 := di2;
w.2 := di3;
...
На той стороне вопросы к скаде (которую вы не назвали). В общем случае w AND (1 SHL i) > 0, чтобы вытащить i-й бит из целого w.
А скада, (у меня Masterskada) не распознает, что ее таким образом пытаются обмануть?
Я думал пойти примерно таким путем: Логической 1 каждого датчика присвоить определенное число,1,10,100 и.т.д., а логическому нулю-число 0. Затем числа просуммировать и эту сумму передавать. Тогда, например, если скада получает число 89-то значит 0,0,1.. ?
Участковому настучит - глазом моргнуть не успеете. Если серьёзно, то вряд ли. Вопрос лишь в том, насколько удобно с этим будет в скаде работать; есть ли возможность не создавая тегов доставать разряды (я не работал с мастерскадой).Цитата:
А скада, (у меня Masterskada) не распознает, что ее таким образом пытаются обмануть?
Вы придумали десятиколёсный велосипед, хотя я вам уже предложил двухколёсный. В смысле вы зачем-то хотите переходить в десятичную систему, дёргать разряды в ней и переходить обратно, когда проще и эффективнее делать это в двоичной.Цитата:
Я думал пойти примерно таким путем
В том-то и дело, что я где-то на форуме видел инфу, что такие попытки скада пресекает. Только не могу найти где. А то бы милое дело-все сигналы упаковать в пару тегов и лицензия не надо!
а слова разработчика не придают уверенности? http://www.owen.ru/forum/showthread....l=1#post117305
Передавать можно и стоит именно сборку. В MasterSCADA есть блок распаковать.
Вот только SCADA это действительно отслеживает, и посчитает точки не только из OPC, но и этого распаковывающего блока :)
Николаев Андрей! Сборка-это то, о чем говорит capzap ? Так есть ли выход?
Странно, когда-то писали что тегом является входящая переменная, а теперь уже даже расчетные стали ?
Все-таки должен же быть какой-то алгоритм, с помощью которого можно двоичное число закодировать в десятичное и наоборот.
Типа,как я уже писал выше: Имеется 12 датчиков. Каждому при логической 1 присваиваем десятичное число по возрастающей.(1,10,100,1000,10000...)
Тогда на выходе вычисляем разность между полной суммой этих чисел и действующей и вычисляем нулевые позиции. Только вот для 12 чисел сильно громоздко. Возможно надо разделить по 6, а еще лучше по 4. Все-таки сэкономлю.
Да нет, МастерСкада считает только количество внешних тэгов, что с ними делается дальше уже не учитывается. И на форуме и в документации (и на сайте также вроде видел) это прописано. Спокойно можно упаковывать в ПЛК сигналы в DWORD, а на стороне Скады применить блок "Распаковка 32-битного аналогового сигнала" (или как то похоже называется). Соответственно 32 дискретных сигнала умещаются в один тэг, т.е. в бесплатной сборке на 32 тэга можно уместить 1024 дискретных значения.
Вам же Yegor уже дал решение в http://www.owen.ru/forum/showthread....l=1#post216045
Если вам нужно больше 16 сигналов упаковать, то пакуете не в WORD, а в DWORD:
Соответственно, на стороне скады этот тэг привязываете к ФБ "Распаковка 32 битного..." в настройках указываете сколько битов распаковывать и выходы блока уже привязываете к конкретным тэгам скадыКод:dw: WORD;
dw.0 := di1;
dw.1 := di2;
dw.2 := di3;
...
dw.25 := di24;
...
Вам же уже предложили, двоичную систему
Каждому при логической 1 присваиваем ДВОИЧНОЕ число по возрастающей.(1,2,4,8,16...)
И просто с помощью операций сдвига определять 0/1 в соответствующем разряде
В кодесисе, так как написал Егор
В Вашей скаде тоже небось что-то похожее должно бытьЦитата:
w AND (1 SHL i) > 0, чтобы вытащить i-й бит из целого w
в общем так иногда делают, только используют ряд степеней двойки )) 1 2 4 8 16 ...
Чтож, попробую в двоичной системе, если скада пропустит.
В некоторых системах можно делать И между числами, не знаю как в MasterScada это реализовано и можно ли.
Например надо проверить 7 бит числа на наличия 1, к нам прилетает число 35746, сделать с этим числом & 128 (128 десятичное или 0х80 шестнадцатиричное)
Если на выходе получаем равенство 128, значит 7-й бит в единице. Ну и так далее с остальными числами.
з.ы. это если не заморачиваться со сдвигом бита.
Ну можно функцию на C сделать, но вряд ли у вас демо версия с поддержкой C, хотя можете запросить и такой вариант у Мастер Скада.
Вопрос снят. Действительно Masterscada пропустила вариант с простой распаковкой аналогового тега в 32-бит.
А что-же ни кто не сказал про ФБ "PACK" как раз для упаковки битов в ворд. Тема похожая уже поднималась.
http://www.owen.ru/forum/showthread....highlight=Pack
А уже Мастерскаде распаковывать до битов.
А это что ?
Во первых PACK упаковывает только в 8 бит в один байт.
Во вторых можно безо всяких Паков http://www.owen.ru/forum/showthread....l=1#post187668
Т.е. подправить файл hardware.cfg для таргета и получить в конфигурации "развернутые" 2byte или даже 4byte,
т.е. с возможностью доступа к любому биту как в модуле 8bits
Вложение 25629
https://www.youtube.com/watch?v=pz4q38naDzg
ЗЫ. Если "портить" оригинальный hardware.cfg не хочется, то просто в конфигурации слейва заменить модуль 2 byte, в котором и есть Ваш WORD, на два модуля 8bits, скада об этом даже и не узнает. Соответственно в программе паковать ничего не надо, просто использовать в ней отдельные биты этих 8bits.
Позвольте внести свои 5 копеек относительно ФБ упаковки :) . Если я правильно понял, то уже поднималось в этой теме: пользователь capzap в сообщении № 8 упомянул о биб-ке oscat и функции BYTE_TO_BITS. Однако BYTE_TO_BITS применима к 8-ми булевым переменным (автору темы для решения задачи необходимо минимум 12). Можно по аналогии забацать ФБ WORD_OF_BIT на ST:
Исходник:
Дальше в конфигураторе добавить Modbus-slave и переменную 2byte. Адресу этой переменой присвоить имя выхода ФБ, описанного выше.
Ну либо так же по аналогии для типа DWORD (32 переменных). Использую подобный ФБ в задаче по контролю концевых выключателей задвижек. Если есть неточности, гуру, поправьте.
_Mikhail, если проект написан на CFC, то алгоритм наглядным получается. Ну и по-битно обращаться к переменной через точку (как Вы указали) вроде можно только в ST (если я конечно не упустил что-то в матчасти :) ). Ну и это так сказать одно из решений (как по-мне, так удобное).
В CFC все тоже самоеВложение 25663
вот эт лестницы :) . Но ФБ или функция уже стала делом привычки :) . Спасибо за совет, будем осваивать и применять.
Так же в Util.lib есть блоки Pack и Unpack.
Тоже самое предлагал в #18, но Им хочется более изощренным методом с выкрутасами, правками, переправками. Ну, хозяин- Барин. Что хочет то и выбирает.
Паралельно еще одна ветка на эту-же тему. http://www.owen.ru/forum/showthread.php?t=24918
Случайно попалась картинка, для извращений:
Вложение 25680
я просто записывал в теле программы в temp.x биты а в конце цикла (программы) делал temp -> peremennaya_modbus в конфигураторе.
В начале программы соответственно peremennaya_mobus -> temp и в нужных местах программы использовал temp.x