FUNCTION_BLOCK MEGGD VAR_INPUT str_d : STRING; END_VAR VAR_OUTPUT LREL : REAL; LWRD : DWORD; END_VAR VAR str : POINTER TO BYTE ; b : ARRAY[1..8]OF BYTE ; i : BYTE ; (*счет для цикла*) Nz : BYTE ; (*знаков после запятой*) Nn : BYTE ; (*нулей после запятой*) Mks : DWORD ; (*набор чисел без запятой*) Mnz : DWORD ; (*множитель*) END_VAR (***********************************************************************************************************) str := ADR(str_d); FOR i := 2 TO 8 BY 2 DO b[i] := str^; str := str+1; b[i-1] := str^; str := str+1; END_FOR (*находим число*) Mks := 0; Mnz := 10000000; Nz := 8; Nn := 0; FOR i := 1 TO 8 DO (*множитель*) Mnz := Mnz / 10 ; (*число*) IF b[i] >= 48 AND b[i] <= 57 THEN Mks := Mks + (b[i]-48) * Mnz; ELSE Mnz := Mnz * 10 ; END_IF (*запятая*) IF b[i] = 46 THEN Nz := i ; END_IF (*ноль*) IF b[i] = 0 AND Nn = 0 THEN Nn := i ; END_IF END_FOR (***************************************) (*теперь он делитель*) Mnz := 0; CASE Nz OF 0 : Mnz := 100000000; 1 : Mnz := 10000000; 2 : Mnz := 1000000; 3 : Mnz := 100000; 4 : Mnz := 10000; 5 : Mnz := 1000; 6 : Mnz := 100; 7 : Mnz := 10; 8 : Mnz := 1; ELSE Mnz := 1; END_CASE (*наконец капец*) LREL := Mks * 1.0 / Mnz; (***************************************) (*теперь он делитель*) Mnz := 0; CASE Nn OF 0 : Mnz := 1; 1 : Mnz := 100000000; 2 : Mnz := 10000000; 3 : Mnz := 1000000; 4 : Mnz := 100000; 5 : Mnz := 10000; 6 : Mnz := 1000; 7 : Mnz := 100; 8 : Mnz := 10; ELSE Mnz := 1; END_CASE (*наконец капец*) LWRD := Mks / Mnz ; (***********************************************************************************************************)