PDA

Просмотр полной версии : поочередное включение аварий



Maximus36
18.02.2024, 19:49
Добрый вечер, господа специалисты. Помогите начинающему программисту. Задача у меня такая: есть одна лампа сигнализирующая аварию, и 4 аварийные ситуации, нужно что бы при возникновении аварии лампа моргала определенным количеством и переходила к следующей аварии и все повторялось пока не нажмешь кнопку сброс аварии.
Аварии:
"Давление газа" - 2 моргания
"Загазованность" - 3 моргание
"Температура теплоносителя" - 4 моргания
"Давление теплоносителя" - 5 морганий
Если пропадает сигнал с датчика "давление газа" то лампа должна 2 раза моргнуть и с небольшой паузой опять повторить, до тех пор пока не нажмут кнопку "сброс аварии"
Если пропадает сигнал с "давление газа" и "загазованность", то лампа должна 2 раза моргнуть и через небольшую паузу 3 раза, затем повторять пока не нажмут кнопку "сброс аварии"
И так далее. если "давление газа" и "Давление теплоносителя" то 2 раза и 5 раз.

МихаилГл
18.02.2024, 20:27
Это сложно. Проще по приоритету а не последовательно.

kondor3000
18.02.2024, 20:40
Добрый вечер, господа специалисты. Помогите начинающему программисту. Задача у меня такая: есть одна лампа сигнализирующая аварию, и 4 аварийные ситуации, нужно что бы при возникновении аварии лампа моргала определенным количеством и переходила к следующей аварии и все повторялось пока не нажмешь кнопку сброс аварии.
Аварии:
"Давление газа" - 2 моргания
"Загазованность" - 3 моргание
"Температура теплоносителя" - 4 моргания
"Давление теплоносителя" - 5 морганий
Если пропадает сигнал с датчика "давление газа" то лампа должна 2 раза моргнуть и с небольшой паузой опять повторить, до тех пор пока не нажмут кнопку "сброс аварии"
Если пропадает сигнал с "давление газа" и "загазованность", то лампа должна 2 раза моргнуть и через небольшую паузу 3 раза, затем повторять пока не нажмут кнопку "сброс аварии"
И так далее. если "давление газа" и "Давление теплоносителя" то 2 раза и 5 раз.

Все проекты, какие выложены на форуме ( мне встречались), выводятся по приоритету, начиная с первой и до последней, а не по порядку как появились аварии.
Хотя на ST наверно можно написать вывод по порядку появления аварий.

АРТ.Кар 64
18.02.2024, 21:09
Спасибо Михаилу и Кондору тоже.
День прошёл не в пустую. В системах безопасности события тоже выводятся не по "порядку",а по "приоритету"
За что спасибо ? За информацию,конечно же.
Но что-то действительно "мудрено". Даже в системах безопасности такого мудрёного светового оповещения" не предусмотрено.

Сергей0308
18.02.2024, 21:19
Вообще-то Вы неправы, было много тем где аварии выводились на экран в порядке их поступления или указывалась очерёдность их поступления! Вот одна из тем:
https://owen.ru/forum/showthread.php?t=31113&page=7
Сейчас бы я ещё "правильней" сделал!
Вот ещё тема с проектами, где можно просматривать очерёдность поступления сигналов:
https://owen.ru/forum/showthread.php?t=36452&page=3
Вот ещё тема: https://owen.ru/forum/showthread.php?t=29865&highlight=%EA%F2%EE+%EF%E5%F0%E2%FB%E9+%E2%F1%F2%E 0%EB%2C+%F2%EE%E3%EE+%F2%E0%EF%EA%E8
Другие темы сами найдёте, если вам это интересно!

Но, ТС вроде такого не заявлял, не пойму откуда появились такие требования?
Короче, вот тема с последовательным отображением номеров включённых входов, считайте аварий, была такая тема на форуме:
https://owen.ru/forum/showthread.php?t=31076&page=2&highlight=%EA%F2%EE+%EF%E5%F0%E2%FB%E9+%E2%F1%F2%E 0%EB%2C+%F2%EE%E3%EE+%F2%E0%EF%EA%E8

Короче, надеюсь товарищ сообразит мигнуть лампочкой количество раз соответствующее номеру входа(аварии)?
Хотя это дикость(это я так считаю), в смысле, неужели нельзя хотя бы СМИ2-М поставить и написать бегущей строкой активные аварии(или их коды)?
А, лучше ИПП120, я бы этот вариант предпочёл, тем более, насколько понимаю, у вашего ПР нет экрана, в смысле, всегда найдётся применение экрану!

Sergej_
19.02.2024, 04:28
Это по ходу какая то теоретическая задачка. Сложно представить такую дичь в реале, когда возникнет несколько аварий, моргание оператор замучается "расшифровывать". Самое простое вывести по сигнальной лампе . для каждой аварии, если выходы конечно есть свободные.


А, лучше ИПП120, я бы этот вариант предпочёл, тем более, насколько понимаю, у вашего ПР нет экрана Вместо экрана это не лучше, лучше панель оператора, можно купить дешевле ИПП120 , но со всеми необходимыми функциями.

FPavel
19.02.2024, 06:58
Этот вариант индикации нештатной ситуации вполне воплощён в иностранной аппаратуре - автоматы розжига горелок Siemens RMG88, LME21/22 и другие.

Могу предположить, что выходы ПР задействованы полностью и на детализацию причин уже нет физической возможности - ошибка проектировщика.

Выходы ПР - это реле, которые быстро придут в негодность при таком способе индикации. Предлагаю поступить так же, как Siemens - при нештатной ситуации лампа просто светится, а если кто-то желает детализировать причины - кнопка "сброс" не просто нажимается, а удерживается не менее 3 секунд.

Мне кажется, вчера в "компонентах", которые можно загрузить с сервера в проект, встречал готовый генератор заданного количества импульсов.

А более правильным вариантом было бы использование ИПП120 или есть же у ОВЕН цветные 4-разрядные семисегментные индикаторы (их тоже можно рассмотреть, хотя при сопоставимой цене они менее информативны).

Sergej_
19.02.2024, 08:03
Выходы ПР бывают и транзисторные. Светодиодную лампу вывезут. Чем же ИПП120 лучше панельки, в которой можно организовать различные архивы и журналы, событий и аварий в которых можно фиксить эти события (аварии) даже кратковременно возникающие? Не говоря уж о остальных возможностях визуализации.К тому же дешевле ИПП.

EFrol
19.02.2024, 09:12
На ST вроде не сложно:


function_block Alarm //имя функционального блока.

var_input //объявление входных переменных
A1 : bool;
A2 : bool;
A3 : bool;
A4 : bool;
A5 : bool;
end_var

var_output //объявление выходных переменных
Q : bool;
end_var

var //объявление локальных переменных
curAlarm : udint;
Count : udint := 0;
Ton : SYS.TON;
Toff : SYS.TON;
Tp : SYS.TON;
end_var

If Count = 0 then
Tp(I:=true, T:=T#1s); // Выдерживаем паузу
if Tp.Q then
case curAlarm of // Определяем кол-во моргушек по текущей аварии
0: if A1 then Count:=2; end_if
1: if A2 then Count:=3; end_if
2: if A3 then Count:=4; end_if
3: if A4 then Count:=5; end_if
4: if A5 then Count:=6; end_if
end_case
curAlarm := curAlarm + 1; // Переходим к следующей аварии
if curAlarm >= 5 then // И так по кругу
curAlarm := 0;
end_if
Tp(I:=false);
end_if
else
Ton(I:=true, T:=T#500ms); // Зажигаем лампочку
if Ton.Q then
Toff(I:=true, T:=T#500ms); // Выключаем лампочку
end_if
if Toff.Q then
Ton(I:=false); Toff(I:=false); Count := Count - 1; // Минус одна моргушка
end_if

Q:=Ton.Q and not Toff.Q; // Состояние лампочки на выход
end_if

end_function_block

МихаилГл
19.02.2024, 09:19
Короче оператору надо сначала пройти курсы морзянки...

Было у нас на разрезе такое, но только индикатор показывал одну аварию. Всего типов аварии было 3: постоянно горит (потеря связи), постоянно мигает (авария привода толкателя) и мигает 2 раза с паузой 4 секунды (авария тормозов толкателя). И то операторы говорили при любой аварии - потеря связи. Всем наплевать на руководства оператора и прочее. Им лишь бы смену отсидеть.

Приходишь, смотришь, а там авария тормозов. Говоришь, пусть машинист компрессор запустит. Они глаза выпучат, а что это со связью поможет. Им говоришь, какая связь, вы свою инструкцию по работе читали вообще...

melky
19.02.2024, 09:35
Как говорит Сергей0308 темы были. Тот же petera делал по приоритету (вес бита аварии) и т.д. Такой способ показывать аварии вполне допустим, если применяется ПР без экрана или панели.
И опять же, всегда можно еще код аварии передать по сети, где каждый бит, означает свою аварию.

Maximus36
19.02.2024, 09:48
Да, у меня осталось всего два свободных выхода. А задействовать я хотел светодиод на панеле самого ПР100. Ну если это сложно, тогда подумаю насчет покупки ипп.

melky
19.02.2024, 09:50
Maximus36 это не так сложно, как пытаются представить. я на Logo! делал когда автоматику запуска генератора себе дома мастырил что-то похожее по количеству вспышек ламы.

Sergej_
19.02.2024, 11:08
Да, у меня осталось всего два свободных выхода. А задействовать я хотел светодиод на панеле самого ПР100. Ну если это сложно, тогда подумаю насчет покупки ипп.

На два выхода можно повесить три аварии, с помощью простенького дешифратора на релюшках. Четвертую на светодиод. Так себе конечно решение. Но почти даром.

melky
19.02.2024, 11:18
Так даром и на красный светодиод. На выход просто любую аварию зажигаем лампу на щите, а светодиодом уже моргаем что именно + табличку на дверь щита для непонятливых и не читающих инструкцию :)

Sergej_
19.02.2024, 11:38
Две релюшки, одна с одним перекидным, вторая с двумя. Со второй, условно со 2-4 контакт включительно на лампочки, соответствующие трем авариям. Номер аварии в двоичном на катушки реле.
Если аварий несколько одновременно, по очереди. Лампы так же поочередно будут гореть. Четвертую уже в этом варианте только на светодиод. Вариант не очень, спору нет, но лучше чем морзянка.

.....самого ПР100. Ну если это сложно, тогда подумаю насчет покупки ипп. По хорошему надо было уж на ПР 200 делать, и выходов побольше и хоть какой никакой экранчик. К ПР100 докупать ИПП120? Докупить уж в этом случае панельку не дорогую, в районе 8000 р 7".
.Или поменяйте на ПР200. А ПР100 пригодиться.

Maximus36
19.02.2024, 14:05
Решили поменять на ПР200, но чисто для себя хотел бы разобраться с этой задачей. Возможно пригодится в другом месте.

EFrol
19.02.2024, 14:08
Решили поменять на ПР200, но чисто для себя хотел бы разобраться с этой задачей. Возможно пригодится в другом месте.
Т.е. этот вариант Вас не устраивает:
https://owen.ru/forum/showthread.php?t=39169&p=429732&viewfull=1#post429732

Maximus36
19.02.2024, 14:48
Не, конечно попробую. Только , как новичок в этом, я не знаю пока как это вставить в свой проект)))

Dimensy
19.02.2024, 14:49
Лень искать темы, но можно объединить эти два алгоритма

kondor3000
19.02.2024, 15:18
Не, конечно попробую. Только , как новичок в этом, я не знаю пока как это вставить в свой проект)))

Нажимаете создать ФБ, вставляете в него скопированный текст, выносите на холст и подключаете ножки как у макроса 73680
Код для ФБ выложил EFrol https://owen.ru/forum/showthread.php?t=39169&p=429732&viewfull=1#post429732

Maximus36
19.02.2024, 18:45
kondor3000 огромное вам спасибо. то что надо.

Maximus36
19.02.2024, 18:47
Этот макрос я не могу отредактировать в будущем? или вы тот текст на ST сохранили в макрос?

kondor3000
19.02.2024, 19:01
Этот макрос я не могу отредактировать в будущем? или вы тот текст на ST сохранили в макрос?

Выше всё написал, текст скопировал в ФБ на языке ST, это аналог макроса. Текст можно редактировать, главное без ошибок.

Maximus36
19.02.2024, 19:07
Все, разобрался. Работаеееееет!!!!!

Сергей0308
19.02.2024, 23:47
Тогда и мой вариант с миганиями:

73691

73690

Короче, если тенденция сохранится, боюсь завтра придётся делать свой вариант механического выпрямителя переменного тока!

Dimensy
20.02.2024, 13:07
Ну, и еще один вариант

Maximus36
29.02.2024, 21:00
Спасибо, завтра попробую

Maximus36
29.02.2024, 21:32
Каналы "А" Я понял как работают, а "Е" как прописаны?

Dimensy
01.03.2024, 05:48
Каналы "А" Я понял как работают, а "Е" как прописаны?

Как вы и хотели - две вспышки, небольшая пауза и код

grenz
15.03.2024, 14:44
Уважаемые специалисты, столкнулся при написании своей первой "посерьезнее" программы с подобной задачей. Отличие только в том, что вместо "моргушки" нужно открыть определенное окно на панели. Панели пока нет, поэтому просто сетевая переменная на выходе блока. Кратко сформулирую задачу: при определенной конфигурации входов, выдать число в сетевую переменную на выходе. Делаю с помощью конструкции CASE.
До этого написал ФБ с CASE на 23 ступени, в симуляции работает, как часы. Этот же блок не работает в симуляции, хоть убей! Что я не так делаю?

1exan
15.03.2024, 14:52
Уважаемые специалисты, столкнулся при написании своей первой "посерьезнее" программы с подобной задачей. Отличие только в том, что вместо "моргушки" нужно открыть определенное окно на панели. Панели пока нет, поэтому просто сетевая переменная на выходе блока. Кратко сформулирую задачу: при определенной конфигурации входов, выдать число в сетевую переменную на выходе. Делаю с помощью конструкции CASE.
До этого написал ФБ с CASE на 23 ступени, в симуляции работает, как часы. Этот же блок не работает в симуляции, хоть убей! Что я не так делаю?

Ну хоть опишите, в чём проблема

kondor3000
15.03.2024, 15:09
Уважаемые специалисты, столкнулся при написании своей первой "посерьезнее" программы с подобной задачей. Отличие только в том, что вместо "моргушки" нужно открыть определенное окно на панели. Панели пока нет, поэтому просто сетевая переменная на выходе блока. Кратко сформулирую задачу: при определенной конфигурации входов, выдать число в сетевую переменную на выходе. Делаю с помощью конструкции CASE.
До этого написал ФБ с CASE на 23 ступени, в симуляции работает, как часы. Этот же блок не работает в симуляции, хоть убей! Что я не так делаю?

И входы подпишите, что где должно быть

Dimensy
15.03.2024, 15:19
Уважаемые специалисты, столкнулся при написании своей первой "посерьезнее" программы с подобной задачей. Отличие только в том, что вместо "моргушки" нужно открыть определенное окно на панели. Панели пока нет, поэтому просто сетевая переменная на выходе блока. Кратко сформулирую задачу: при определенной конфигурации входов, выдать число в сетевую переменную на выходе. Делаю с помощью конструкции CASE.
До этого написал ФБ с CASE на 23 ступени, в симуляции работает, как часы. Этот же блок не работает в симуляции, хоть убей! Что я не так делаю?

Недоглядели
74401

попробуйте заменить кусок

if IN then
Window:=Alarm;
return;
else

case iStep of

0:
if not Auto then //Переключатель "Автоматика" выключен
NWindow:=36;
else iStep:=10;
end_if

10:
if HP then
if Y11 then
NWindow:=34; //Дверь закрывается
else
NWindow:=35; //Дверь открывается
end_if
else iStep:=20;
end_if

20:
if GaskVac then //Отсос уплотнения
NWindow:=37;
else iStep:=30;
end_if

30:
RTRIG1(I:=Start);// Подтвердите выбранную программу повторным нажатием кнопки "Старт"
if RTRIG1.Q then
Flag:=true;
end_if

if Start then
if Flag then
Flag:=false;
elsif not Flag then
NWindow:=38;
end_if
end_if

if not Start and not Flag then
iStep:=40;
end_if

40:
NWindow:=10;
iStep:=0;

end_case
Window:=NWindow;
end_if
end_function_block

grenz
15.03.2024, 16:02
Недоглядели
74401

попробуйте заменить кусок

if IN then
Window:=Alarm;
return;
else

case iStep of

0:
if not Auto then //Переключатель "Автоматика" выключен
NWindow:=36;
else iStep:=10;
end_if

10:
if HP then
if Y11 then
NWindow:=34; //Дверь закрывается
else
NWindow:=35; //Дверь открывается
end_if
else iStep:=20;
end_if

20:
if GaskVac then //Отсос уплотнения
NWindow:=37;
else iStep:=30;
end_if

30:
RTRIG1(I:=Start);// Подтвердите выбранную программу повторным нажатием кнопки "Старт"
if RTRIG1.Q then
Flag:=true;
end_if

if Start then
if Flag then
Flag:=false;
elsif not Flag then
NWindow:=38;
end_if
end_if

if not Start and not Flag then
iStep:=40;
end_if

40:
NWindow:=10;
iStep:=0;

end_case
Window:=NWindow;
end_if
end_function_block

Спасибо, попробую. Отвечу обязательно после пробы.

grenz
15.03.2024, 18:20
Недоглядели
74401

попробуйте заменить кусок

if IN then
Window:=Alarm;
return;
else

case iStep of

0:
if not Auto then //Переключатель "Автоматика" выключен
NWindow:=36;
else iStep:=10;
end_if

10:
if HP then
if Y11 then
NWindow:=34; //Дверь закрывается
else
NWindow:=35; //Дверь открывается
end_if
else iStep:=20;
end_if

20:
if GaskVac then //Отсос уплотнения
NWindow:=37;
else iStep:=30;
end_if

30:
RTRIG1(I:=Start);// Подтвердите выбранную программу повторным нажатием кнопки "Старт"
if RTRIG1.Q then
Flag:=true;
end_if

if Start then
if Flag then
Flag:=false;
elsif not Flag then
NWindow:=38;
end_if
end_if

if not Start and not Flag then
iStep:=40;
end_if

40:
NWindow:=10;
iStep:=0;

end_case
Window:=NWindow;
end_if
end_function_block

Магия! Работает! Спасибо Вам, Dimensy, добрый человек!
Вы правы, конструкцию CASE я пока не до конца понимаю. Я вообще пока ST плохо понимаю. У меня просто мало опыта. Программу пишу не в коммерческих целях, а для своего оборудования. В шаге 30, например, флаг не взводится. Цель этого флага, - чтобы при нажатии кнопки "Старт" выход блока стал 38, а при повторном нажатии "Старт", флаг должен обнулиться и CASE продолжил проверку шагов.
Спасибо Вам еще раз!

kondor3000
15.03.2024, 18:26
Магия! Работает! Спасибо Вам, Dimensy, добрый человек!
Вы правы, конструкцию CASE я пока не до конца понимаю. Я вообще пока ST плохо понимаю. У меня просто мало опыта. Программу пишу не в коммерческих целях, а для своего оборудования. В шаге 30, например, флаг не взводится. Цель этого флага, - чтобы при нажатии кнопки "Старт" выход блока стал 38, а при повторном нажатии "Старт", флаг должен обнулиться и CASE продолжил проверку шагов.
Спасибо Вам еще раз!

Советую поставить Codesys 2.3, там можно ФБ внутри смотреть прямо в работе, для отладки кода на ST прям красота.
Есть небольшая разница в оформлении ФБ, но в общем почти тоже самое.

grenz
15.03.2024, 18:31
Советую поставить Codesys 2.3, там можно ФБ внутри смотреть прямо в работе, для отладки кода на ST прям красота.
Есть небольшая разница в оформлении ФБ, но в общем почти тоже самое.

Спасибо! Установлю.