PDA

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



Junoka
21.06.2020, 09:48
Добрый день!

Прошу помочь советом или идеей как можно реализовать программу регистрации данных с двух датчиков, когда на третьем датчике появляется сигнал. С ПЛК я только начинаю знакомство, поэтому прошу строго не судить.
В основном использую язык 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:11
Спасибо, пока формулировал не заметил неточность.

Junoka
22.06.2020, 10:09
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 отслеживает наличие слитка в изложнице. Проверить схему смогу только на неделе. Есть ли какие то замечания, которые сразу бросаются в глаза??
49753

P.S. Попробовал подкорректировать Ваше решение на языке ST под новые условия:


IF SensPos THEN
IF SensTemp:=TRUE AND SensVol:=FALSE THEN
(* Авария, остановка *);
ELSE
(* Продолжение движения *);
END_IF;
ELSE
(* отсутствие бутылки *);
END_IF;


Во втором условном операторе оба условия будут одновременно проверяться?

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

Junoka
22.06.2020, 12:43
исходя из того что написано, достаточно


IF SensPos THEN
IF NOT SensVol THEN
(* Авария, остановка *);
ELSE
(* Продолжение движения *);
END_IF;
ELSE
(* отсутствие бутылки *);
END_IF;


А первое условие же не будет учитываться тогда?
Если "датчик 2" (температура) выше уставки, тогда если "датчик 3" (наполненность бутылки) = 0, тогда авария. Если "датчик 3" = 1, тогда норма.

Junoka
22.06.2020, 12:48
Сначала выполняется логическая операция 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;

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

Junoka
10.07.2020, 11:07
Всем спасибо за помощь. Подредактировал немного предложенные варианты и получил рабочий вариант. В итоге получился следующий код:


(*Регистрируем фронт Датчика 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

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

Junoka
18.08.2020, 14:33
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