Вы эти линии в режиме исполнения хотите рисовать? или только в RT цвет менять?
Вид для печати
Вы эти линии в режиме исполнения хотите рисовать? или только в RT цвет менять?
непонятно в чем вопрос, чем это будет отличаться от примера из справки. СОздаете окно, там рисуете из набора линий фигуру как вам нужно. МОжет быть имеет смысл взять одну линию, а не отдельные и нарисовать произвольную геометрию, добавить в клемник параметр, задинамизировать по нему цвет или одной линии, или всех линий. И вставить это окно как контрол. Параметр из клемника будет как параметр этого окна, которые вы связываете с элементом.
Вот именно что не фигуру в окне из кучи линий нарисовать, а каждая линия это отдельный элемент. Мне нужно 300 таких линий, в разных окнах, которые имеют свой размер и угол поворота в пространстве, и у каждой линии свой параметр, который отвечает за динамизацию цвета конкретной линии.
Если каждую линию нужно прорисовывать отдельно (они все у вас уникальны)- вы их и рисуете отдельно через контрол Линия и у каждой динамизируете цвет и задаете другие настройки длины и координаты каждой линии.
Если линии чем-то похожи и большинство настроек у них общие, то можно сделать типовую линию, в библиотеке на клеммник добавить два параметра например, цвет и угол поворота. Связать их со свойствами линии. Получится типовое окно. ПОтом это окно вставляете в другое окно, как обычный элемент и задаете настройки угла поворота и динамизируете цвет уже не через свойства линии, а через параметры окна, которые будут видны ка свойства. Скоро выйдет лайфхак на 'ютьюб канале MasterSCADA. Может будет понятнее, что я имею в виду.
Общее у этих линий это формула динамизации цвета. Задавать вручную каждой линии угол поворота - весьма неудобная история (там не будет ровных значений 45, 90 и т.д.). Значит придётся каждую линию рисовать вручную и забивать динамизацию вручную.
В любом случае спасибо за информацию.
Добрый вечер.
Для управления RGB диммером в интерфейсе добавил элемент UI "Выбор цвета". На выход он отдаёт значение вида #FFCCAA00, в представлении RGBA, по байту на каждый цвет. А диммер, подключаемый по modbus, принимает значения вида 0-255 на каждый из каналов R, G, B.
Разбираю и собираю RGBA строку с помощью BYTE_OF_DWORD() и DWORD_OF_BYTE(), с последующим преобразованием, эта часть вроде работает.
А как явно перевести представление переменной из DEC в HEX и обратно? То есть, чтобы получив на входе CC она отдала 204, и наоборот?
Если получили byte цвета 0xCC то еще проще, (int)byteR, (int)byteG, (int)byteB и обратно ваше число, которое не превышает 0-255 потом в байт (byte)collorR и т.д.
Ещё одна точка стыка. Отдельные байты хорошо режутся и склеиваются в типе STRING. А Графический элемент выдаёт тип HMI.SolidColorType, вида rgba(255,255,255,1.0). Как преобразовать этот тип в string без скобок и прочих лишних элементов? Информации по работе с этим типом данных очень мало, всё сваливается к прямой передаче из цвета одного элемента в цвет другого. А как бы его разобрать/собрать в понятный базовый тип STRING, которым все вычисления гораздо проще?
Думал на тему работы с указателями, но компилятор ругается на конструкции вида
VAR
pt : POINTER TO BYTE; (* Указатель на символ *)
END_VAR
IF pt^ = CHR THEN ..
Ну это не совсем ко мне, просто прочитал, что вам байтами оперировать надо в C# В вашей строке видимо еще какой-то параметр и он уже фактически double.
А так, поймать скобки, и в массив строк, первые 3 (0-2) ячейки массива целые числа, последнее double, после обработки все обратно и в строку.
и это можно сделать средствами скрипта C# не прибегая еще и к ST или на чем вы там последнее написали.
Идею понял, но пока мои познания C# невелики, горожу костыли на ST )). Эх, без посимвольного парсинга не обойтись. Задача облегчается тем, что формат стабильный, можно сразу отрезать постоянную начальную и конечную часть строки 'rgba(' и ')' ,а затем расклеивать оставшееся по признаку запятой. В таком случае и преобразование в HEX не потребуется, оно там в десятичном представлении.
Всё было бы гораздо проще, если бы в MasterScada 4D библиотеку OSCAT.BASIC реализовали в полном объёме, а не избирательно.
Не нужен вам посимвольный парсинг, вам нужно для C#
1. работа со строками, чтобы взять в строку то, что между скобками
2. забрать в строковой массив данные, они у вас разделены ,
3 обработать как вам надо (первые три ячейки парсинг в int, последню парсинг в double)
4. вырезать из исходной то, что между скобками
5. свой массив в строку и сделать инсерт в исходную между скобками
Работает, только вот RedOUT где-то подвисает посередине.. Хотя, вроде всё по фен-шую, и следующие строки находятся нормально, а вот первая почему-то хромает.
sRGBA := OBJECT_TO_STRING(RGBA_IN);
IF LEN(sRGBA) > 0 AND FIND(IN1:= sRGBA, IN2:= 'rgba') > 0 THEN
sRGBA := DELETE(IN:= sRGBA, L:= 5, P:= 1);
sRed := LEFT(IN:= sRGBA, L:= (FIND(IN1:= sRGBA, IN2:= ',')-1));
RedOUT := STRING_TO_USINT(sRed);
sRGBA := DELETE(IN:= sRGBA, L:= FIND(IN1:= sRGBA, IN2:= ','), P:= 1);
sGreen := LEFT(IN:= sRGBA, L:= (FIND(IN1:= sRGBA, IN2:= ',')-1));
GreenOUT := STRING_TO_USINT(sGreen);
sRGBA := DELETE(IN:= sRGBA, L:= FIND(IN1:= sRGBA, IN2:= ','), P:= 1);
sBlue := LEFT(IN:= sRGBA, L:= (FIND(IN1:= sRGBA, IN2:= ',')-1));
BlueOUT := STRING_TO_USINT(sBlue);
sRGBA := DELETE(IN:= sRGBA, L:= FIND(IN1:= sRGBA, IN2:= ','), P:= 1);
sAlpha := LEFT(IN:= sRGBA, L:= (FIND(IN1:= sRGBA, IN2:= ')')-1));
AlphaOUT := REAL_TO_USINT(TRUNC(STRING_TO_REAL(sAlpha)*255));
END_IF
Осталось Всё это в цикл завернуть и работу с элементами массива.
Благодарю, часть решения понятна, применил. Дочитался в хелпе, что "C# программы поддерживается только в тех версиях исполнительной системы, которые работают под ОС Windows." интересно, а как оно будет себя вести на ПЛК110 при обращении с мобильных клиентов (Телефоны)? Там же .NET и не пахло..
В общем, для задачи работы с RGB диммером допилил ФБ на ST.
Двусторонняя конвертация из формата строки rgba(255,255,255,1.0) в отдельные значения USINT, и обратно. Мне важно было оставить возможность задания цветов не только через элемент выбора цвета, но и числом через параметры.
Здравствуйте!
В MS 3 работали с OPC-серверами,но в связи с переходом на Linux(исп система)
использование OPC под вопросом.
Пытался перетянуть тэги из OPC в модуль Modbus TCP,но как указать что
Bool тэг это бит слова Holding register(в OPC это "Извлечение бита из данных" и "Номер бита данных",
а в модуль Modbus TCP пока не нашёл(в настройках модуль Modbus TCP указываю IP адрес,затем добавляю канал(или DI) и указываю адрес ячейки 1002,тип значения "Целый", Тип ячейки "Регистр хранения" а где указать номер бита ? Если указать тип значения "Логический" то настройки Номер бита тоже нет)?
Здравствуйте!
Как перейти из окна "Ошибки проекта" к конкретной ошибке в проекте,
ни щелчок, ни двойной не помогают. И что значит идентификатор, например, CS1001,
в начале строки "Сообщение" этого окна.
Спасибо.
Word те же самые байты, смещенные на 8 битов, чем дальше байт, тем больше смещение... SHR используйте перед тем как подавать на byte_to_bits очередного байта из Word
Открываю окно из другого (стартового) окна и каждый раз спрашивает пароль(логинится) , хотя надо
чтобы пароль спрашивался один раз при загрузке стартового окна?
И ещё -если закрыть стартовое окно то окно открытое из стартового тоже закрывается(открываю как новое окно)
а мне нужно чтобы осталось открытым.
Спасибо
Почему не используете всплывающее окно? Каждая вкладка, каждое новое окно клиента - отдельная сессия (всплывающие окна не считаются). Когда не считается несколько запущенных клиентов, как отдельная сессия - когда идет работа в многомониторном режиме, тогда и авторизация будет проходить только на одном мониторе
Коллеги, доброго дня.
Может кто-то знает регулируется ли где-то шрифт всплывающих подсказок при отображении в клиенте визуализации? А то в самой среде разработки подсказки миниатюрные и четкие, а в клиенте - монструозные. (может, Мария знает?:rolleyes:)
Здравствуйте!
Не могу понять где я допускаю ошибку, может кто-то уже сталкивался и сможет подсказать.
Вложение 64492
Нарисованы две группы фигур (линии и прямоугольники). Отличия в том что в нижней группе фигур (конкретно к линиям) назначено событие по клику мышки открыть всплывающее окно, а на верхнем ничего не привязано. Для удобства выделения всем фигурам добавлены всплывающие подсказки с названиями.
Проблема в том что если линиям назначить всплывающие окна, то их зона захвата мышки живет совершенно своей жизнью (при наведении на прямоугольник или на зону рядом с линией выделяется линия), и некоторые прямоугольники либо доступны частично, либо выделить совершенно невозможно.
Есть идеи как это побороть?
Попробуйте заменить жирные линии на прямоугольники. С большой долей вероятности при построении линии (x1,y1 to x2,y2) интерпретатор расценивает координаты концов линии как угловые точки прямоугольника с такими же координатами.
Либо поиграться с Z порядком фигур, вытащив прямоугольники на передний план
Здравствуйте, подскажите почему при выставлении логарифмической шкалы на элементе "тренд", ось значений превращается в infinity во всех точках? При том что у передаваемого в перо параметра точно нет нулевых значений в архиве и в текущий момент.
Доброго времени суток.
На ST не могу никак разобраться с применением перечислений для формирования индекса массива структур.
В примерах на CodeSys 3.5 тип перечисление EleventType: (eElement1, eElement2, .. ,eElement10)
определялся между тегами TYPE, после чего в VAR спокойно можно было объявить массив вида:
Massive: ARRAY[EleventType.eElement1..EleventType.eElement10] OF StructureType;
MS4D на теги TYPE начинает ругаться, мол, "Не вижу объявления функционального блока". Пробовал добавить тип данных Перечисление в структуру программы через перетаскивание в дерево, в Локальные параметры программы - не видит определяемого перечисления, и не хочет использовать его в качестве индекса массива.
Хорошо бы было пример кода определения перечисления на чистом ST без внешних коннекторов, и пример обращения к элементу массива с такой индексацией.