
Сообщение от
RV9WFJ
Потому что округлять Real так себе затея. Округляйте WString или в INT перекидывайте. Вот код для генерации WString с округлением:
PHP код:
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
Собственно большая его часть из OSCAT
Да, спасибо, тоже её находил, но посчитал её слишком ресурсозатратной для ПЛК при большом количестве округляемых значений (могу ошибаться, мб ощутимой разницы и нет) в сравнении например с этой.
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);