Показано с 1 по 6 из 6

Тема: ПР205 - события аналоговых входов

  1. #1

    По умолчанию ПР205 - события аналоговых входов

    Всем привет. Не сочтите меня бездарным, но вот я в поисках истины, а именно:
    1. Как или с помощью чего можно получить аварийные события аналогового входа при обрыве датчика, КЗ и тд. в ПР205, если в свойствах входа выбран один из датчиков?
    2. Как реализовать в ПР205 вывода на экран большого массива аварийных событий? (Есть пример на сайте производителя, но там на 4 события)

  2. #2
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    2,003

    По умолчанию

    Состояние входа
    01.png

    В менеджере компонентов есть такой макрос
    00.png

  3. #3

    По умолчанию

    Потребуется два массива - один для времени, другой для номера ошибки

    Строб - флаг ошибки от устройств

    FUNCTION_BLOCK FB_Array16U1
    VAR_INPUT
    inValue: UDINT; (* Входное значение (целое) *)
    reset: BOOL; (* Сигнал сброса массива *)
    strobe: BOOL; (* Стробирующий импульс: запись при фронте TRUE *)
    END_VAR

    VAR_OUTPUT
    out1: UDINT; (* Выход 1 — самое старое значение *)
    out2: UDINT;
    out3: UDINT;
    out4: UDINT;
    out5: UDINT;
    out6: UDINT;
    out7: UDINT;
    out8: UDINT;
    out9: UDINT;
    out10: UDINT;
    out11: UDINT;
    out12: UDINT;
    out13: UDINT;
    out14: UDINT;
    out15: UDINT;
    out16: UDINT; (* Выход 16 — самое новое значение *)
    END_VAR

    VAR
    arr: ARRAY [1..16] OF UDINT; (* Массив на 16 элементов *)
    idx: UDINT := 1; (* Текущий индекс записи *)
    lastStrobe: BOOL := FALSE; (* Для детектирования фронта строба *)
    END_VAR

    (* Сброс массива и состояния при входе reset *)
    IF reset THEN
    FOR idx := 1 TO 16 DO
    arr[idx] := 0;
    END_FOR
    idx := 1;
    lastStrobe := FALSE;
    ELSIF strobe AND NOT lastStrobe THEN
    (* Запись нового значения по фронту строба *)
    arr[idx] := inValue;

    (* Циклическое обновление индекса: 1..16, затем снова 1 *)
    idx := idx + 1;
    IF idx > 16 THEN
    idx := 1;
    END_IF
    END_IF

    (* Сохранение состояния строба для следующего цикла *)
    lastStrobe := strobe;

    (* Вывод значений массива на выходы *)
    out1 := arr[1];
    out2 := arr[2];
    out3 := arr[3];
    out4 := arr[4];
    out5 := arr[5];
    out6 := arr[6];
    out7 := arr[7];
    out8 := arr[8];
    out9 := arr[9];
    out10 := arr[10];
    out11 := arr[11];
    out12 := arr[12];
    out13 := arr[13];
    out14 := arr[14];
    out15 := arr[15];
    out16 := arr[16];

    END_FUNCTION_BLOCK

  4. #4

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Состояние входа
    01.png

    В менеджере компонентов есть такой макрос
    00.png
    Ё-ма-ё, смотрю в книгу вижу вижу фигу....

  5. #5

    По умолчанию

    Цитата Сообщение от Рогов Алексей Посмотреть сообщение
    Потребуется два массива - один для времени, другой для номера ошибки

    Строб - флаг ошибки от устройств

    FUNCTION_BLOCK FB_Array16U1
    VAR_INPUT
    inValue: UDINT; (* Входное значение (целое) *)
    reset: BOOL; (* Сигнал сброса массива *)
    strobe: BOOL; (* Стробирующий импульс: запись при фронте TRUE *)
    END_VAR

    VAR_OUTPUT
    out1: UDINT; (* Выход 1 — самое старое значение *)
    out2: UDINT;
    out3: UDINT;
    out4: UDINT;
    out5: UDINT;
    out6: UDINT;
    out7: UDINT;
    out8: UDINT;
    out9: UDINT;
    out10: UDINT;
    out11: UDINT;
    out12: UDINT;
    out13: UDINT;
    out14: UDINT;
    out15: UDINT;
    out16: UDINT; (* Выход 16 — самое новое значение *)
    END_VAR

    VAR
    arr: ARRAY [1..16] OF UDINT; (* Массив на 16 элементов *)
    idx: UDINT := 1; (* Текущий индекс записи *)
    lastStrobe: BOOL := FALSE; (* Для детектирования фронта строба *)
    END_VAR

    (* Сброс массива и состояния при входе reset *)
    IF reset THEN
    FOR idx := 1 TO 16 DO
    arr[idx] := 0;
    END_FOR
    idx := 1;
    lastStrobe := FALSE;
    ELSIF strobe AND NOT lastStrobe THEN
    (* Запись нового значения по фронту строба *)
    arr[idx] := inValue;

    (* Циклическое обновление индекса: 1..16, затем снова 1 *)
    idx := idx + 1;
    IF idx > 16 THEN
    idx := 1;
    END_IF
    END_IF

    (* Сохранение состояния строба для следующего цикла *)
    lastStrobe := strobe;

    (* Вывод значений массива на выходы *)
    out1 := arr[1];
    out2 := arr[2];
    out3 := arr[3];
    out4 := arr[4];
    out5 := arr[5];
    out6 := arr[6];
    out7 := arr[7];
    out8 := arr[8];
    out9 := arr[9];
    out10 := arr[10];
    out11 := arr[11];
    out12 := arr[12];
    out13 := arr[13];
    out14 := arr[14];
    out15 := arr[15];
    out16 := arr[16];

    END_FUNCTION_BLOCK
    Я так понимаю, что это функциональный блок на ST. Вот только есть малая проблемка, я не особо в структурном тексте разбираюсь... (не повкусу пришелся)

  6. #6

    По умолчанию

    Цитата Сообщение от bort992 Посмотреть сообщение
    Я так понимаю, что это функциональный блок на ST. Вот только есть малая проблемка, я не особо в структурном тексте разбираюсь... (не повкусу пришелся)
    Смотрю вы не гурман. Текстовый язык - это самая вкусная вещь. В свое время шла битва за его появление в OL.
    Последний раз редактировалось IVM; 12.02.2026 в 10:47.

Похожие темы

  1. Ответов: 52
    Последнее сообщение: 07.08.2025, 22:31
  2. ПР205 Отказ дискретных и аналоговых входов
    от zakhar81 в разделе Программируемые реле
    Ответов: 36
    Последнее сообщение: 28.04.2025, 07:10
  3. Имитация аналоговых входов
    от alexfromnn в разделе Программируемые реле
    Ответов: 2
    Последнее сообщение: 24.11.2014, 22:38
  4. Быстородействие аналоговых входов ПЛК
    от Евгений Пашигоров в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 19.08.2011, 12:29
  5. Проблема аналоговых входов
    от Vic в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 09.04.2009, 09:46

Ваши права

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