Ещё одна точка стыка. Отдельные байты хорошо режутся и склеиваются в типе 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
Осталось Всё это в цикл завернуть и работу с элементами массива.
Последний раз редактировалось FireLizzard; 05.12.2022 в 13:14.
Благодарю, часть решения понятна, применил. Дочитался в хелпе, что "C# программы поддерживается только в тех версиях исполнительной системы, которые работают под ОС Windows." интересно, а как оно будет себя вести на ПЛК110 при обращении с мобильных клиентов (Телефоны)? Там же .NET и не пахло..
В общем, для задачи работы с RGB диммером допилил ФБ на ST.
Двусторонняя конвертация из формата строки rgba(255,255,255,1.0) в отдельные значения USINT, и обратно. Мне важно было оставить возможность задания цветов не только через элемент выбора цвета, но и числом через параметры.