Показано с 1 по 10 из 15

Тема: Время цикла ПР205 и ПР225

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #6

    По умолчанию

    Цитата Сообщение от igorlisin Посмотреть сообщение
    После Ваших замечаний перепроверил код. Похоже, что все-таки основной код достаточно сложный для данного реле (т.е. дело не в инициализации, а в основном коде). Буду менять реле на ПЛК. Оптимизировать уже нечего. Проект выложить не могу
    Тогда проверьте пример, вычисление ArcTg (арк тангенса), в функции 1000 итераций, а у меня в проекте ещё и ArcSin и ArcCos имеется и везде по 1000 итераций. И это только 1 строка проекта, да у меня по вашему цикл ПР просто вечность займёт.
    Скрытый текст:
    Код:
    FUNCTION Arctg : REAL; // Автор 
    VAR_INPUT
        x: REAL;          (* Аргумент: x ∈ ℝ *)
    END_VAR
    
    VAR
        eps: REAL := 1E-6; (* Точность вычисления *)
        maxIter: UDINT := 1000; (* Макс. число итераций, тип UDINT *)
        x_abs: REAL;      (* |x| для проверки области сходимости *)
        arg: REAL;        (* Рабочий аргумент: x или 1/x *)
        n: UDINT := 0;    (* Номер итерации: n = 0, 1, 2, ... *)
        term: REAL;        (* Текущий член ряда *)
        sum: REAL := 0.0; (* Накопленная сумма ряда *)
        pi: REAL := 3.14159265358979323846; (* Число π *)
        correction: REAL := 0.0; (* Поправка для |x| > 1 *)
    END_VAR
    
    (* 1. Проверка области сходимости *)
    x_abs := ABS(x);
    
    IF x_abs > 1.0 THEN
        (* Для |x| > 1: используем тождество *)
        arg := 1.0 / x;
        IF x > 0.0 THEN
        correction :=   pi / 2.0;
        ELSIF x < 0.0 THEN
        correction := - pi / 2.0;
        ELSE correction := 0;
        END_IF
    ELSE
        (* Для |x| ≤ 1: вычисляем напрямую *)
        arg := - x;
    END_IF
    (* 2. Вычисление ряда Тейлора *)
    WHILE n < maxIter DO
        (* Вычисляем текущий член ряда: (-1)^n * arg^(2n+1) / (2n+1) *)
        term:= POW(-1.0,  udint_to_real(n)) * POW(arg,  udint_to_real(2*n + 1)) /  udint_to_real(2*n + 1);
         
        sum := sum + term;
        (* Проверяем достижение точности *)
        IF ABS(term) < eps THEN
            EXIT;
        END_IF
    
        (* Переход к следующей итерации *)
        n := n + 1;
    END_WHILE
    
    (* 3. Формируем итоговый результат *)
    Arctg := correction - sum;
    end_function

    А то может и ссылку на все функции удалить надо https://owen.ru/forum/showthread.php...l=1#post397789
    Последний раз редактировалось kondor3000; 03.02.2026 в 19:31.

Похожие темы

  1. Ответов: 11
    Последнее сообщение: 30.10.2025, 15:35
  2. Изменение логотипов ПР205 и ПР225
    от zaychenko в разделе Среда программирования OWEN Logic
    Ответов: 4
    Последнее сообщение: 19.03.2025, 09:07
  3. Время цикла в ПЛК-210-3
    от Р.Александр в разделе ПЛК2хх
    Ответов: 4
    Последнее сообщение: 13.05.2022, 14:18
  4. Еще раз про время цикла ПЛК
    от Партизан в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 06.04.2011, 11:38
  5. Ответов: 21
    Последнее сообщение: 03.03.2009, 16:27

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •