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

Тема: Регистрация данных с датчиков по фронту сигнала с другого датчика

  1. #1

    По умолчанию Регистрация данных с датчиков по фронту сигнала с другого датчика

    Добрый день!

    Прошу помочь советом или идеей как можно реализовать программу регистрации данных с двух датчиков, когда на третьем датчике появляется сигнал. С ПЛК я только начинаю знакомство, поэтому прошу строго не судить.
    В основном использую язык CFC, но и с другими тоже работал.

    Недавно столкнулся с интересной задачей и пока что какого-либо элегантного решения найти не получилось. Предлагаю рассмотреть её на условном примере конвейера с бутылками.

    В общем есть установка на которой датчик 1 отслеживает положение. Этот датчик выдает дискретный сигнал через постоянные промежутки времени (условно считает бутылки на конвейере).
    Помимо него есть еще два датчика:
    1) аналоговый для измерения температуры условной бутылки (датчик 2)
    2) дискретный для отслеживания, что бутылка полная (датчик 3)

    Задача состоит в следующем: нужно реализовать регистрацию данных по фронту сигнала датчика 1 на датчиках 2 и 3. При условии, что Датчик 2 покажет температуру выше уставки и Датчик 3 покажет что бутылка полная, конвейер продолжает работу. Если Датчик 2 покажет температуру ниже уставки или Датчик 3 покажет, что бутылка пустая, то конвейер останавливается для извлечения данной бутылки. Так как движение конвейера непрерывный процесс, то в промежутках между бутылками будут регистрироваться сигналы, которые будут останавливать конвейер. Поэтому я предположил, что нужно использовать датчик 1 для получения сигнала на проведение измерения на датчиках 2 и 3.

    Я вижу два возможных варианта:

    1) Сигналы с датчиков 2 и 3 должны записываться каждый в свой блок и обновляться при получении сигнала с датчика 1.
    2) Сигналы с датчиков 2 и 3 непрерывно регистрируются и производится их проверка по сигналу с датчика 1.

    Буду благодарен за любую помощь.
    Последний раз редактировалось Junoka; 21.06.2020 в 10:10.

  2. #2

    По умолчанию

    Спасибо, пока формулировал не заметил неточность.

  3. #3

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Код:
    IF SensPos THEN
        IF SensTemp AND SensVol THEN
            (* норма *);
        ELSE
            (* остановка конвейера *);
        END_IF;
    ELSE
     (* отсутствие бутылки *);
    END_IF;
    в этом сложности?
    Спасибо! Ваш ответ помог для решения начальной задачи. Сейчас появилось еще несколько условий для отработки датчиков:
    Датчик 2 | Датчик 3 | Результат |
    0 | 0 | 0 | - Температура ниже уставки, бутылка пустая -> предупреждение, конвейер едет дальше
    0 | 1 | 0 | - Температура ниже уставки, бутылка полная -> предупреждение, конвейер едет дальше
    1 | 0 | 1 | - Температура выше уставки, бутылка пустая -> авария, конвейер останавливается
    1 | 1 | 0 | - Температура выше уставки, бутылка полная -> нормальный режим, конвейер едет дальше

    Попробовал все решить на функциональных блоках. Получилось не так локанично и прозрачно как на языке ST.
    В схеме по аналогии: бутылки - изложницы, датчик 2 измеряет температуру изложницы, датчик 3 отслеживает наличие слитка в изложнице. Проверить схему смогу только на неделе. Есть ли какие то замечания, которые сразу бросаются в глаза??
    Снимок.PNG

    P.S. Попробовал подкорректировать Ваше решение на языке ST под новые условия:
    Код:
    IF SensPos THEN
        IF SensTemp:=TRUE AND SensVol:=FALSE THEN
            (* Авария, остановка *);
        ELSE
            (* Продолжение движения *);
        END_IF;
    ELSE
     (* отсутствие бутылки *);
    END_IF;
    Во втором условном операторе оба условия будут одновременно проверяться?

  4. #4
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,033

    По умолчанию

    Во втором условном операторе оба условия будут одновременно проверяться?
    Сначала выполняется логическая операция SensTemp AND SensVol, у неё результат может быть либо TRUE, либо FALSE. Если TRUE, то выполняются действия после THEN (до ELSE), если FALSE, то действия после ELSE.

  5. #5

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    исходя из того что написано, достаточно
    Код:
    IF SensPos THEN
        IF NOT SensVol THEN
            (* Авария, остановка *);
        ELSE
            (* Продолжение движения *);
        END_IF;
    ELSE
     (* отсутствие бутылки *);
    END_IF;
    А первое условие же не будет учитываться тогда?
    Если "датчик 2" (температура) выше уставки, тогда если "датчик 3" (наполненность бутылки) = 0, тогда авария. Если "датчик 3" = 1, тогда норма.

  6. #6

    По умолчанию

    Цитата Сообщение от Sulfur Посмотреть сообщение
    Сначала выполняется логическая операция SensTemp AND SensVol, у неё результат может быть либо TRUE, либо FALSE. Если TRUE, то выполняются действия после THEN (до ELSE), если FALSE, то действия после ELSE.
    Может тогда будет правильно разнести условия в разные условные операторы?
    Код:
    IF SensPos THEN
        IF SensTemp THEN
            IF SensVol THEN
            (* Продолжение движения *);
            ELSE
            (* Авария, остановка *);
            END_IF;
        ELSE
        (*Предупреждение о низкой температуре бутылки*);
        END_IF;
     (* отсутствие бутылки *);
    END_IF;

  7. #7
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,033

    По умолчанию

    Junoka
    Я просто объяснял как работает оператор IF.
    Я в таких случаях предпочитаю использовать LD, т. к. считаю, что нагляднее.
    Вот, кстати, накидал ФБ на LD. Отсутствие ошибок не гарантирую, просто для демонстрации подхода к решению задачи.
    Bottle.png
    Вложения Вложения

  8. #8

    По умолчанию

    Всем спасибо за помощь. Подредактировал немного предложенные варианты и получил рабочий вариант. В итоге получился следующий код:
    Код:
    (*Регистрируем фронт Датчика 1*)
    RTRIGPos(CLK:= Sens_pos);
    Sens_pos_Front:= RTRIGPos.Q;
    
    (*Отрабатываем условия: Когда появился фронт, сравниваем температуру измеренную Датчиком 2 с уставкой. 
    Если температура измеренная с Датчика 2 ниже уставки, то пропуск аварии, но выдаем предупреждение. 
    В случае когда температура измеренная выше уставки проверяем второе условие. 
    Если "бутылка полная" аварии нет, предупреждения нет. Если бутылка пустая, то авария.*)
    IF Sens_pos_Front THEN
    	IF Sens_temp>T_ust THEN
    		IF Sens_exist THEN
    			Avar_vypav_slitok:=FALSE;
    			Predupr:=FALSE;
    		ELSE
    			Avar_vypav_slitok:=TRUE;
    			Predupr:=FALSE;
    		END_IF
    	ELSE
    		Avar_vypav_slitok:=FALSE;
    		Predupr:=TRUE;
    	END_IF
    END_IF
    
    (*Сброс аварии с кнопки, после устранения аварийной ситуации*)
    IF Sens_sbros THEN
    	Avar_vypav_slitok:=FALSE;
    ELSE
    	Avar_vypav_slitok:=Avar_vypav_slitok;
    END_IF

  9. #9
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,033

    По умолчанию

    Predupr сбрасывается только по условию IF Sens_temp>T. Если это не смущает, то пусть.
    --
    Не совсем понятен смысл выражения Avar_vypav_slitok:=Avar_vypav_slitok;

  10. #10

    По умолчанию

    1) Да, вызов предупреждения тоже можно сделать пока "виден" фронт сигнала Sens_pos.
    2) Строчка не нужная, появилась в виду моей усталости в тот вечер)

    Код:
    (*Регистрируем фронт Датчика 1*)
    RTRIGPos(CLK:= Sens_pos);
    Sens_pos_Front:= RTRIGPos.Q;
    
    (*Отрабатываем условия: Когда появился фронт, сравниваем температуру измеренную Датчиком 2 с уставкой. 
    Если температура измеренная с Датчика 2 ниже уставки, то пропуск аварии, но выдаем предупреждение. 
    В случае когда температура измеренная выше уставки проверяем второе условие. 
    Если "бутылка полная" аварии нет, предупреждения нет. Если бутылка пустая, то авария.*)
    IF Sens_pos_Front THEN
    	IF Sens_temp>T_ust THEN
    		IF Sens_exist THEN
    			Avar_vypav_slitok:=FALSE;
    			Predupr:=FALSE;
    		ELSE
    			Avar_vypav_slitok:=TRUE;
    			Predupr:=FALSE;
    		END_IF
    	ELSE
    		Avar_vypav_slitok:=FALSE;
    		Predupr:=TRUE;
    	END_IF
    ELSE
            Predupr:=FALSE;
    END_IF
    
    (*Сброс аварии с кнопки, после устранения аварийной ситуации*)
    IF Sens_sbros THEN
    	Avar_vypav_slitok:=FALSE;
    END_IF

Похожие темы

  1. Ответов: 11
    Последнее сообщение: 26.04.2020, 07:47
  2. Ответов: 14
    Последнее сообщение: 04.05.2018, 20:54
  3. Ответов: 21
    Последнее сообщение: 01.02.2018, 09:14
  4. Перевод сигнала с датчика в градусы
    от rylezzzzz в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 16.12.2014, 23:02
  5. Получение данных с датчиков
    от qawaq в разделе Помощь Разработчикам
    Ответов: 8
    Последнее сообщение: 13.05.2013, 18:54

Ваши права

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