Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru (личка на форуме - не подходит)
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | AnyDesk
У меня при редактировании визуализаций через некоторое время перестает возможность удалять элементы. Не работает кнопка "DEL" и правая кнопка мыши не открывает контекстное меню. В меню "Правка" тоже не активен пункт "Удаление". При этом тексты в элементах могу удалять. Перемещать и менять размеру тоже можно. Лечиться перезагрузкой CS. На разных проектах пробовал. CS3.5.14. Что может быть?
В окне "Устройства" тоже правая кнопка мыши не работает, не открывает меню.
Последний раз редактировалось СергейНовосиб; 30.06.2021 в 08:04.
Это похоже сугубо ваша особенность. Я нечто подобное наблюдал при работе через Anydesk с 4к мониторами но во всех программах, возможно у вас тоже что-то подобное.
Добрый день, коллеги!
Возник следующий вопрос. В коде программы используется функциональный блок усреднения значений,который вызывается раз в секунду. После усреднения необходимо округлить значение до определенного разряда, в данном примере до одной значащей цифры после запятой. Для этого используются функция ROUND библиотеки OSCAT_BASIC. Результат округления отображается в визуализации с форматированием %s, и вроде бы всё работает как надо, но в определенный момент времени с периодичностью примерно раз в три секунды к результату округления добавляется 0.00001.Безымянный.png Первое число - выходное значение блока усреднения, второе число результат работы функции Round( где вход это выход с блока усреднения и N=1). Оба числа это Real. Почему округление иногда срабатывает некорректно и как можно решить этот вопрос?
Добрый день.
В онлайн-отладке в редакторе кода значения переменных отображаются корректно или тоже с округлением?
Для этого можно обойтись без функций - просто использовать спецификатор %.1fПосле усреднения необходимо округлить значение до определенного разряда, в данном примере до одной значащей цифры после запятой
Или нужно округлить не только для визуализации, но и для дальнейшей обработки в программе?
Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru (личка на форуме - не подходит)
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | AnyDesk
В редакторе кода отображается корректно, да округление также необходимо для дальнейших вычислений, спецификатор %.1f не совсем подходит, потому что в некоторых случаях необходимо, чтобы разряд менялся в зависимости от диапазона. Также он неудобен для визуализации потому что при большом целом числе будет отображаться 100000.0 или при %.2f 100000.00, а хотелось бы отбросить не значащие нули, если это возможно.
Ещё попробовал функцию из РП "Архивация"(стр.53) называется REAL_TO_FWSTRING, она округляет корректнее то есть без периодического появления 0.00001 , но опять же при заданном количестве значащих цифр после запятой=0, значение будет в любом случае выглядеть "X.0", то есть ноль не отбросится.
Потому что округлять Real так себе затея. Округляйте WString или в INT перекидывайте. Вот код для генерации WString с округлением:
Собственно большая его часть из OSCATPHP код:FUNCTION fRealToWString : WSTRING
VAR_INPUT
In: REAL;
iDec: INT; (*Количество знаков после запятой*)
END_VAR
VAR
diValue: DINT;
i: INT;
END_VAR
VAR CONSTANT
sDot: WSTRING(1):=".";
END_VAR
(*Значение с плавающей точкой*)
iDec:= LIMIT(0,iDec,6);
diValue:= LREAL_TO_DINT(ABS(In) * EXPT(10, iDec));
IF ABS(In) * EXPT(10, iDec) - DINT_TO_REAL(diValue) > 0.5 THEN
diValue:= diValue + 1;
END_IF
fRealToWString:= DINT_TO_WSTRING(diValue);
FOR i:= WLEN(fRealToWString) TO iDec DO
fRealToWString:= WCONCAT("0", fRealToWString);
END_FOR
IF iDec > 0 THEN
fRealToWString:= WINSERT(fRealToWString, sDot, WLEN(fRealToWString) - iDec);
END_IF
IF In < 0 THEN
fRealToWString:= WCONCAT("-", fRealToWString);
END_IF
Да, спасибо, тоже её находил, но посчитал её слишком ресурсозатратной для ПЛК при большом количестве округляемых значений (могу ошибаться, мб ощутимой разницы и нет) в сравнении например с этой.
PHP код:FUNCTION REAL_TO_FWSTRING : wstring
VAR_INPUT
rVar: REAL;
usiPrecision: USINT; //кол-во знаков после запятой
END_VAR
VAR
uliVar: ULINT;
lrVar: lreal;
END_VAR
uliVar:= LREAL_TO_ULINT((rVar)* EXPT(10,usiPrecision));
lrVar := ULINT_TO_LREAL(uliVar)/EXPT(10,usiPrecision);
REAL_TO_FWSTRING:= LREAL_TO_WSTRING(lrVar);
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Я думаю, у вас отклоение появляется при конвертации в строку (потому что %s) - не уверен, что его вообще можно избежать, это особенности типа с плавающей точкой.
Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru (личка на форуме - не подходит)
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | AnyDesk