Добрый день!

Алиса и с синусом готова помочь:

FUNCTION SinTaylorReal : REAL;
VAR_INPUT
x : REAL; (* Угол в радианах *)
tolerance: REAL; (* Точность, например, 1E-6 *)
END_VAR
VAR
result : REAL := 0.0; (* Текущая сумма ряда *)
term : REAL := 0.0; (* Текущий член ряда *)
x_power : REAL := 0.0; (* x^(2n+1) *)
factorial: REAL := 1.0; (* (2n+1)! *)
n : UDINT := 0; (* Номер члена ряда (целочисленный счётчик) *)
sign : REAL := 1.0; (* Знак члена: +1 или -1 *)
two_n_plus_1: UDINT; (* 2n + 1 *)
i, j : UDINT;
END_VAR

(* Нормализация угла: приводим x к [-2π, 2π] *)
WHILE ABS(x) > 2.0 * 3.1415926535 DO
IF x > 0.0 THEN
x := x - 2.0 * 3.1415926535;
ELSE
x := x + 2.0 * 3.1415926535;
END_IF
END_WHILE

(* Вычисление ряда Тейлора до достижения точности *)
WHILE TRUE DO
(* Вычисляем 2n + 1 *)
two_n_plus_1 := 2 * n + 1;

(* Вычисляем x^(2n+1) *)
x_power := 1.0;
FOR i := 1 TO two_n_plus_1 BY 1 DO
x_power := x_power * x;
END_FOR

(* Вычисляем (2n+1)! *)
factorial := 1.0;
FOR j := 1 TO two_n_plus_1 BY 1 DO
factorial := factorial * udint_to_real(j); (* Приводим UDINT к REAL *)
END_FOR

(* Текущий член ряда: (-1)^n * x^(2n+1) / (2n+1)! *)
term := sign * x_power / factorial;

(* Добавляем к результату *)
result := result + term;

(* Проверяем точность: если модуль члена < tolerance, завершаем *)
IF ABS(term) < tolerance THEN
EXIT;
END_IF

(* Переходим к следующему члену: n = n + 1, меняем знак *)
n := n + 1;
sign := -sign;
END_WHILE

SinTaylorReal := result;
END_FUNCTION