Цитата Сообщение от 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(10iDec));
IF 
ABS(In) * EXPT(10iDec) - DINT_TO_REAL(diValue) > 0.5 THEN
    diValue
:= diValue 1;        
END_IF
    
fRealToWString
:= DINT_TO_WSTRING(diValue);
    
FOR 
i:= WLEN(fRealToWStringTO iDec DO
     
fRealToWString:= WCONCAT("0"fRealToWString);
END_FOR
    
IF iDec 0 THEN
    fRealToWString
:= WINSERT(fRealToWStringsDotWLEN(fRealToWString) - iDec);
END_IF

IF In 0 THEN
    fRealToWString
:= WCONCAT("-"fRealToWString);
END_IF 
Собственно большая его часть из OSCAT
Да, спасибо, тоже её находил, но посчитал её слишком ресурсозатратной для ПЛК при большом количестве округляемых значений (могу ошибаться, мб ощутимой разницы и нет) в сравнении например с этой.
PHP код:
FUNCTION REAL_TO_FWSTRING wstring
VAR_INPUT
    rVar
REAL
    
usiPrecisionUSINT//кол-во знаков после запятой
    
END_VAR
VAR
    
uliVarULINT;
    
lrVarlreal;
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);