Просмотр полной версии : Упаковать дискретные сигналы для экономии тегов.
KRUPSKIY
26.07.2016, 21:53
Можно ли как-то упаковать дискретные сигналы от 12 одинаковых дискретных датчиков в одну переменную, по модбасу передать ее в скаду, а там распаковать так, чтобы можно было определить срабатывание каждого датчика? Не хватает всего 3 тегов.
w: WORD;
w.0 := di1;
w.1 := di2;
w.2 := di3;
...
На той стороне вопросы к скаде (которую вы не назвали). В общем случае w AND (1 SHL i) > 0, чтобы вытащить i-й бит из целого w.
KRUPSKIY
27.07.2016, 05:33
А скада, (у меня Masterskada) не распознает, что ее таким образом пытаются обмануть?
Я думал пойти примерно таким путем: Логической 1 каждого датчика присвоить определенное число,1,10,100 и.т.д., а логическому нулю-число 0. Затем числа просуммировать и эту сумму передавать. Тогда, например, если скада получает число 89-то значит 0,0,1.. ?
А скада, (у меня Masterskada) не распознает, что ее таким образом пытаются обмануть?Участковому настучит - глазом моргнуть не успеете. Если серьёзно, то вряд ли. Вопрос лишь в том, насколько удобно с этим будет в скаде работать; есть ли возможность не создавая тегов доставать разряды (я не работал с мастерскадой).
Я думал пойти примерно таким путемВы придумали десятиколёсный велосипед, хотя я вам уже предложил двухколёсный. В смысле вы зачем-то хотите переходить в десятичную систему, дёргать разряды в ней и переходить обратно, когда проще и эффективнее делать это в двоичной.
KRUPSKIY
27.07.2016, 06:52
В том-то и дело, что я где-то на форуме видел инфу, что такие попытки скада пресекает. Только не могу найти где. А то бы милое дело-все сигналы упаковать в пару тегов и лицензия не надо!
В том-то и дело, что я где-то на форуме видел инфу, что такие попытки скада пресекает. Только не могу найти где. А то бы милое дело-все сигналы упаковать в пару тегов и лицензия не надо!
а слова разработчика не придают уверенности? http://www.owen.ru/forum/showthread.php?t=15679&p=117305&viewfull=1#post117305
Николаев Андрей
27.07.2016, 08:55
Передавать можно и стоит именно сборку. В MasterSCADA есть блок распаковать.
Вот только SCADA это действительно отслеживает, и посчитает точки не только из OPC, но и этого распаковывающего блока :)
KRUPSKIY
27.07.2016, 10:35
Николаев Андрей! Сборка-это то, о чем говорит capzap ? Так есть ли выход?
Странно, когда-то писали что тегом является входящая переменная, а теперь уже даже расчетные стали ?
KRUPSKIY
27.07.2016, 15:14
Все-таки должен же быть какой-то алгоритм, с помощью которого можно двоичное число закодировать в десятичное и наоборот.
Типа,как я уже писал выше: Имеется 12 датчиков. Каждому при логической 1 присваиваем десятичное число по возрастающей.(1,10,100,1000,10000...)
Тогда на выходе вычисляем разность между полной суммой этих чисел и действующей и вычисляем нулевые позиции. Только вот для 12 чисел сильно громоздко. Возможно надо разделить по 6, а еще лучше по 4. Все-таки сэкономлю.
Передавать можно и стоит именно сборку. В MasterSCADA есть блок распаковать.
Вот только SCADA это действительно отслеживает, и посчитает точки не только из OPC, но и этого распаковывающего блока :)
Да нет, МастерСкада считает только количество внешних тэгов, что с ними делается дальше уже не учитывается. И на форуме и в документации (и на сайте также вроде видел) это прописано. Спокойно можно упаковывать в ПЛК сигналы в DWORD, а на стороне Скады применить блок "Распаковка 32-битного аналогового сигнала" (или как то похоже называется). Соответственно 32 дискретных сигнала умещаются в один тэг, т.е. в бесплатной сборке на 32 тэга можно уместить 1024 дискретных значения.
Все-таки должен же быть какой-то алгоритм, с помощью которого можно двоичное число закодировать в десятичное и наоборот.
Типа,как я уже писал выше: Имеется 12 датчиков. Каждому при логической 1 присваиваем десятичное число по возрастающей.(1,10,100,1000,10000...)
Тогда на выходе вычисляем разность между полной суммой этих чисел и действующей и вычисляем нулевые позиции. Только вот для 12 чисел сильно громоздко. Возможно надо разделить по 6, а еще лучше по 4. Все-таки сэкономлю.
Вам же Yegor уже дал решение в http://www.owen.ru/forum/showthread.php?t=24876&p=216045&viewfull=1#post216045
Если вам нужно больше 16 сигналов упаковать, то пакуете не в WORD, а в DWORD:
dw: WORD;
dw.0 := di1;
dw.1 := di2;
dw.2 := di3;
...
dw.25 := di24;
...
Соответственно, на стороне скады этот тэг привязываете к ФБ "Распаковка 32 битного..." в настройках указываете сколько битов распаковывать и выходы блока уже привязываете к конкретным тэгам скады
Все-таки должен же быть какой-то алгоритм, с помощью которого можно двоичное число закодировать в десятичное и наоборот.
Типа,как я уже писал выше: Имеется 12 датчиков. Каждому при логической 1 присваиваем десятичное число по возрастающей.(1,10,100,1000,10000...)
Тогда на выходе вычисляем разность между полной суммой этих чисел и действующей и вычисляем нулевые позиции. Только вот для 12 чисел сильно громоздко. Возможно надо разделить по 6, а еще лучше по 4. Все-таки сэкономлю.
Вам же уже предложили, двоичную систему
Каждому при логической 1 присваиваем ДВОИЧНОЕ число по возрастающей.(1,2,4,8,16...)
И просто с помощью операций сдвига определять 0/1 в соответствующем разряде
В кодесисе, так как написал Егор
w AND (1 SHL i) > 0, чтобы вытащить i-й бит из целого w
В Вашей скаде тоже небось что-то похожее должно быть
Дмитрий Артюховский
27.07.2016, 16:44
в общем так иногда делают, только используют ряд степеней двойки )) 1 2 4 8 16 ...
KRUPSKIY
28.07.2016, 05:54
Чтож, попробую в двоичной системе, если скада пропустит.
В некоторых системах можно делать И между числами, не знаю как в MasterScada это реализовано и можно ли.
Например надо проверить 7 бит числа на наличия 1, к нам прилетает число 35746, сделать с этим числом & 128 (128 десятичное или 0х80 шестнадцатиричное)
Если на выходе получаем равенство 128, значит 7-й бит в единице. Ну и так далее с остальными числами.
з.ы. это если не заморачиваться со сдвигом бита.
Ну можно функцию на C сделать, но вряд ли у вас демо версия с поддержкой C, хотя можете запросить и такой вариант у Мастер Скада.
KRUPSKIY
29.07.2016, 12:47
Вопрос снят. Действительно Masterscada пропустила вариант с простой распаковкой аналогового тега в 32-бит.
Сергей Мих
29.07.2016, 14:16
А что-же ни кто не сказал про ФБ "PACK" как раз для упаковки битов в ворд. Тема похожая уже поднималась.
http://www.owen.ru/forum/showthread.php?t=21525&highlight=Pack
А уже Мастерскаде распаковывать до битов.
KRUPSKIY
29.07.2016, 14:17
А это что ?
А что-же ни кто не сказал про ФБ "PACK" как раз для упаковки битов в ворд. Тема похожая уже поднималась.
http://www.owen.ru/forum/showthread.php?t=21525&highlight=Pack
А уже Мастерскаде распаковывать до битов.
Во первых PACK упаковывает только в 8 бит в один байт.
Во вторых можно безо всяких Паков http://www.owen.ru/forum/showthread.php?t=22749&p=187668&viewfull=1#post187668
Т.е. подправить файл hardware.cfg для таргета и получить в конфигурации "развернутые" 2byte или даже 4byte,
т.е. с возможностью доступа к любому биту как в модуле 8bits
25629
https://www.youtube.com/watch?v=pz4q38naDzg
ЗЫ. Если "портить" оригинальный hardware.cfg не хочется, то просто в конфигурации слейва заменить модуль 2 byte, в котором и есть Ваш WORD, на два модуля 8bits, скада об этом даже и не узнает. Соответственно в программе паковать ничего не надо, просто использовать в ней отдельные биты этих 8bits.
Cool-russian
01.08.2016, 11:57
Позвольте внести свои 5 копеек относительно ФБ упаковки :) . Если я правильно понял, то уже поднималось в этой теме (http://www.owen.ru/forum/showthread.php?t=12784): пользователь capzap в сообщении № 8 (http://www.owen.ru/forum/showthread.php?t=12784&p=84209&viewfull=1#post84209) упомянул о биб-ке oscat и функции BYTE_TO_BITS. Однако BYTE_TO_BITS применима к 8-ми булевым переменным (автору темы для решения задачи необходимо минимум 12). Можно по аналогии забацать ФБ WORD_OF_BIT на ST:
FUNCTION_BLOCK WORD_OF_BIT
VAR_INPUT
B0: BOOL; B1: BOOL;
B2: BOOL; B3: BOOL;
B4: BOOL; B5: BOOL;
B6: BOOL; B7: BOOL;
B8: BOOL; B9: BOOL;
B10: BOOL; B11: BOOL;
B12: BOOL; B13: BOOL;
B14: BOOL; B15: BOOL;
END_VAR
VAR_OUTPUT
out: WORD;
END_VAR
VAR
END_VAR
Тело ФБ:
out:=SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (BOOL_TO_WORD(B15), 1) OR BOOL_TO_WORD(B14), 1) OR BOOL_TO_WORD(B13), 1) OR BOOL_TO_WORD(B12), 1) OR BOOL_TO_WORD(B11), 1) OR BOOL_TO_WORD(B10), 1) OR BOOL_TO_WORD(B9), 1) OR BOOL_TO_WORD(B8), 1) OR BOOL_TO_WORD(B7), 1) OR BOOL_TO_WORD(B6), 1) OR BOOL_TO_WORD(B5), 1) OR BOOL_TO_WORD(B4), 1) OR BOOL_TO_WORD(B3), 1) OR BOOL_TO_WORD(B2), 1) OR BOOL_TO_WORD(B2), 1) OR BOOL_TO_WORD(B0);
Дальше в конфигураторе добавить Modbus-slave и переменную 2byte. Адресу этой переменой присвоить имя выхода ФБ, описанного выше.
Ну либо так же по аналогии для типа DWORD (32 переменных). Использую подобный ФБ в задаче по контролю концевых выключателей задвижек. Если есть неточности, гуру, поправьте.
_Mikhail
01.08.2016, 12:35
Позвольте внести свои 5 копеек относительно ФБ упаковки :) . Если я правильно понял, то уже поднималось в этой теме (http://www.owen.ru/forum/showthread.php?t=12784): пользователь capzap в сообщении № 8 (http://www.owen.ru/forum/showthread.php?t=12784&p=84209&viewfull=1#post84209) упомянул о биб-ке oscat и функции BYTE_TO_BITS. Однако BYTE_TO_BITS применима к 8-ми булевым переменным (автору темы для решения задачи необходимо минимум 12). Можно по аналогии забацать ФБ WORD_OF_BIT на ST:
FUNCTION_BLOCK WORD_OF_BIT
VAR_INPUT
B0: BOOL; B1: BOOL;
B2: BOOL; B3: BOOL;
B4: BOOL; B5: BOOL;
B6: BOOL; B7: BOOL;
B8: BOOL; B9: BOOL;
B10: BOOL; B11: BOOL;
B12: BOOL; B13: BOOL;
B14: BOOL; B15: BOOL;
END_VAR
VAR_OUTPUT
out: WORD;
END_VAR
VAR
END_VAR
Тело ФБ:
out:=SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (SHL (BOOL_TO_WORD(B15), 1) OR BOOL_TO_WORD(B14), 1) OR BOOL_TO_WORD(B13), 1) OR BOOL_TO_WORD(B12), 1) OR BOOL_TO_WORD(B11), 1) OR BOOL_TO_WORD(B10), 1) OR BOOL_TO_WORD(B9), 1) OR BOOL_TO_WORD(B8), 1) OR BOOL_TO_WORD(B7), 1) OR BOOL_TO_WORD(B6), 1) OR BOOL_TO_WORD(B5), 1) OR BOOL_TO_WORD(B4), 1) OR BOOL_TO_WORD(B3), 1) OR BOOL_TO_WORD(B2), 1) OR BOOL_TO_WORD(B2), 1) OR BOOL_TO_WORD(B0);
Дальше в конфигураторе добавить Modbus-slave и переменную 2byte. Адресу этой переменой присвоить имя выхода ФБ, описанного выше.
Ну либо так же по аналогии для типа DWORD (32 переменных). Использую подобный ФБ в задаче по контролю концевых выключателей задвижек. Если есть неточности, гуру, поправьте.
А зачем так сложно. Ведь можно гораздо проще.
применительно к Вашему варианту:
out.0:=B0;
out.1:=B1;
out.2:=B2;
.............
out.15:=B15;
Cool-russian
01.08.2016, 13:28
А зачем так сложно. Ведь можно гораздо проще.
применительно к Вашему варианту:
out.0:=B0;
out.1:=B1;
out.2:=B2;
.............
out.15:=B15;
_Mikhail, если проект написан на CFC, то алгоритм наглядным получается. Ну и по-битно обращаться к переменной через точку (как Вы указали) вроде можно только в ST (если я конечно не упустил что-то в матчасти :) ). Ну и это так сказать одно из решений (как по-мне, так удобное).
_Mikhail
01.08.2016, 13:46
_Mikhail, если проект написан на CFC, то алгоритм наглядным получается. Ну и по-битно обращаться к переменной через точку (как Вы указали) вроде можно только в ST (если я конечно не упустил что-то в матчасти :) ). Ну и это так сказать одно из решений (как по-мне, так удобное).
В CFC все тоже самое25663
Cool-russian
01.08.2016, 13:51
вот эт лестницы :) . Но ФБ или функция уже стала делом привычки :) . Спасибо за совет, будем осваивать и применять.
Николаев Андрей
02.08.2016, 12:09
Так же в Util.lib есть блоки Pack и Unpack.
Сергей Мих
02.08.2016, 23:01
Тоже самое предлагал в #18, но Им хочется более изощренным методом с выкрутасами, правками, переправками. Ну, хозяин- Барин. Что хочет то и выбирает.
Паралельно еще одна ветка на эту-же тему. http://www.owen.ru/forum/showthread.php?t=24918
Сергей0308
02.08.2016, 23:20
Случайно попалась картинка, для извращений:
25680
я просто записывал в теле программы в temp.x биты а в конце цикла (программы) делал temp -> peremennaya_modbus в конфигураторе.
В начале программы соответственно peremennaya_mobus -> temp и в нужных местах программы использовал temp.x
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot