- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Помогите решить задачу
Модератор: kirillio
-
- здесь недавно
- Сообщения: 38
- Зарегистрирован: 31 окт 2011, 07:46
- Имя: Иван Иваныч
- Страна: Россия
- город/регион: Самара/63
Помогите решить задачу
Есть такая задачка- Дано 100 датчиков загазованности
Необходимо обработать с них сигналы, снять 1-порог и 2-порог.
А также по сигналу 2-ого порога необходимо выдать аварийный сигнал и остановить некоторое обоорудование.
Так вот все бы ничего, но необходимо что бы оборудование останавливалось по сигналу загазованности 2-ого порога не менее чем от 2-ух датчиков загазованности???
Для обработки использую цикл:
FOR i := 1 TO 100 do if qt.timer.DN and not qt.Block then qt.AVAR_ZAGAZ:=1;
elsif qt.timer.DN and qt.Block then qt.AVAR_ZAGAZ:=0;
end_if;
END_FOR;
ТONR(qt[1].timer);
qt[1].timer.TimerEnable:= qt[1]._2;
TONR(qt[2].timer);
qt[2].timer.TimerEnable:= qt[2]._2;
TONR(qt[3].timer);
qt[3].timer.TimerEnable:= qt[3]._2;
Создал пользовательский тип данных для описания каждого датчика:qt._1-первый порог;qt._2-Второй порог;qt.Block-блокировка датчика;qt.AVAR_ZAGAZ-этот бит выставляется после сработки второго порога и отработки таймера;qt[i].timer-таймер проверки дребезга.
Необходимо добавить условие что если не менее у двух датчиков бит qt[].AVAR_ZAGAZ=1, что то там останавливается???
Необходимо обработать с них сигналы, снять 1-порог и 2-порог.
А также по сигналу 2-ого порога необходимо выдать аварийный сигнал и остановить некоторое обоорудование.
Так вот все бы ничего, но необходимо что бы оборудование останавливалось по сигналу загазованности 2-ого порога не менее чем от 2-ух датчиков загазованности???
Для обработки использую цикл:
FOR i := 1 TO 100 do if qt.timer.DN and not qt.Block then qt.AVAR_ZAGAZ:=1;
elsif qt.timer.DN and qt.Block then qt.AVAR_ZAGAZ:=0;
end_if;
END_FOR;
ТONR(qt[1].timer);
qt[1].timer.TimerEnable:= qt[1]._2;
TONR(qt[2].timer);
qt[2].timer.TimerEnable:= qt[2]._2;
TONR(qt[3].timer);
qt[3].timer.TimerEnable:= qt[3]._2;
Создал пользовательский тип данных для описания каждого датчика:qt._1-первый порог;qt._2-Второй порог;qt.Block-блокировка датчика;qt.AVAR_ZAGAZ-этот бит выставляется после сработки второго порога и отработки таймера;qt[i].timer-таймер проверки дребезга.
Необходимо добавить условие что если не менее у двух датчиков бит qt[].AVAR_ZAGAZ=1, что то там останавливается???
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- не первый раз у нас
- Сообщения: 323
- Зарегистрирован: 26 сен 2010, 10:18
- Имя: Artur
- Страна: Russia
- Поблагодарили: 2 раза
Re: Помогите решить задачу
Дмитрий, я бы посоветовал Вам создать пользовательскую программу- Add-on. В качестве входных значений блока пропишите состояния ваших 2-х взаимосвязанных датчиков, в теле блока тогда будет крутиться весь ваших алгоритм связанный с этими двумя датчиками: начальные условия, обработка и сравнение, выдача сигнала на стоп чего-то. Тут вам и объектная модель заодно- ваши же 2 датчика загазованности, скорее всего, привязаны к одной и той же технологической площадке? Получается один блок- одна тех. площадка. Весьма прозрачно, наглядно и удобно при ПНРах. Да и наверху все со структурой понятно- меньше ошибок.
А от зацикливания я бы посоветовал избавиться, если, конечно, ваши газоанализаторы не многоточка- тогда просто быстрее обрабатывать данные, но лучше ручками чуть поработать и потом меньше будет проблем. Видел такие программы, где вся обработка построена через конструкцию FOR… END_FOR – очень сложно для понимания и отладки, да и сам ПЛК по этому поводу писал major faults. Во всяком случае, такой способ должен быть, как минимум оправдан.
А от зацикливания я бы посоветовал избавиться, если, конечно, ваши газоанализаторы не многоточка- тогда просто быстрее обрабатывать данные, но лучше ручками чуть поработать и потом меньше будет проблем. Видел такие программы, где вся обработка построена через конструкцию FOR… END_FOR – очень сложно для понимания и отладки, да и сам ПЛК по этому поводу писал major faults. Во всяком случае, такой способ должен быть, как минимум оправдан.
-
- не первый раз у нас
- Сообщения: 321
- Зарегистрирован: 31 авг 2011, 22:14
- Имя: Кузнецов Владимир Сергеевич
- Страна: Россия
- город/регион: Казань
- Поблагодарили: 1 раз
Re: Помогите решить задачу
перед блоком с проверкой порогов сбрасывать значение переменной в 0.
в блоке, при срабатывании порога увеличивать эту переменную на 1.
по выходу из блока проверить значение, если больше одного, то стоп.
в блоке, при срабатывании порога увеличивать эту переменную на 1.
по выходу из блока проверить значение, если больше одного, то стоп.
-
- почётный участник форума
- Сообщения: 5632
- Зарегистрирован: 07 окт 2011, 09:12
- Имя: Гаско Вячеслав Эриевич
- Страна: Россия
- город/регион: Рязань
- Благодарил (а): 600 раз
- Поблагодарили: 756 раз
Re: Помогите решить задачу
А что, все сто датчиков загазованности коррелированы между собой по условиям техпроцесса?
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
-
- почётный участник форума
- Сообщения: 981
- Зарегистрирован: 25 июл 2008, 23:23
- Имя: Бондарев Михаил Владимирович
- Страна: Россия
- город/регион: Магнитогорск
- Благодарил (а): 6 раз
- Поблагодарили: 3 раза
Re: Помогите решить задачу
На мой взгляд, вам надо разделить задачи обработки аналоговых сигналов ( линеаризация(?), масштабирование, выделение порогов), задачи обработки событий ( фиксация сработки сигнала превышения порога (самоподхват)) и задачи логического управления ( сработка от неменее чем 2-х датчиков). Тогда и программа будет читататься и на ПНР будет проще.
Боюсь спросить, судя по сработке не менее чем двух датчиков, уж не ПАЗ ли вы делаете?
Боюсь спросить, судя по сработке не менее чем двух датчиков, уж не ПАЗ ли вы делаете?
-
- эксперт
- Сообщения: 2085
- Зарегистрирован: 15 авг 2011, 21:36
- Имя: Пупков Сергей Викторович
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 134 раза
- Поблагодарили: 174 раза
Re: Помогите решить задачу
Как я понял, нужно просто просуммировать все состояния аварий в цикле. Если результат больше 2-х, то останов чего-то там
-
- почётный участник форума
- Сообщения: 5632
- Зарегистрирован: 07 окт 2011, 09:12
- Имя: Гаско Вячеслав Эриевич
- Страна: Россия
- город/регион: Рязань
- Благодарил (а): 600 раз
- Поблагодарили: 756 раз
Re: Помогите решить задачу
Если показания не всей сотни датчиков коррелированы между собой, считать количество датчиков, превысивших свои пороговые показания, придётся по группам. В общем случае эти группы пересекаются между собой, и таких групп может быть до ста. Т.е. у каждого датчика может быть свой набор друзей-соседей. Рекомендую это выяснить у технологов и учесть в работе.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
-
- здесь недавно
- Сообщения: 38
- Зарегистрирован: 31 окт 2011, 07:46
- Имя: Иван Иваныч
- Страна: Россия
- город/регион: Самара/63
Re: Помогите решить задачу
1. По началу хотел сделать через Аддоны, но получилось бы еще неудобнее.DelSnos писал(а): 1.я бы посоветовал Вам создать пользовательскую программу- Add-on.
2.Тут вам и объектная модель заодно- ваши же 2 датчика загазованности, скорее всего, привязаны к одной и той же технологической площадке?
3.Во всяком случае, такой способ должен быть, как минимум оправдан.
2.Эти два датчика привязаны к одному объекту. При срабатывании не менее двух датчиков установка будет переходить в определенный режим.
3.Способ оправдан- позиций очень много
Да, еще раз повторюсь:- Эти датчики привязаны к одному объекту. При срабатывании не менее двух датчиков установка будет переходить в определенный режим, это условие заказчика.Ryzhij писал(а):А что, все сто датчиков загазованности коррелированы между собой по условиям техпроцесса?
Да, именно, что то не так?Бондарев Михаил писал(а):Боюсь спросить, судя по сработке не менее чем двух датчиков, уж не ПАЗ ли вы делаете?
Ну хоть кто то постарался помочь)))) Да мысль хорошая, но вот как описать это - вопрос.Владимир Кузнецов писал(а):перед блоком с проверкой порогов сбрасывать значение переменной в 0.
в блоке, при срабатывании порога увеличивать эту переменную на 1.
по выходу из блока проверить значение, если больше одного, то стоп.
Если в тело цикла добавить строки :If qt.AVAR_ZAGAZ:=1 then N:=N+1
(где N тэг тип dint,который и будет в начале равен 0 а как только пройдет авария по любому датчику N=1 и т.д.),но произойдет слудующее при сработки порога, N будет увеличиваться, нужен тригер.
Пробовал идентифицировать аварию по индексу массива i, если авария возникла то запиши в тег номер датчика(это работает) а вот как быть в случае возникновения 2-ой,3-ей,4-ой аварии этот тег перезаписывается и все?????
-
- здесь недавно
- Сообщения: 38
- Зарегистрирован: 31 окт 2011, 07:46
- Имя: Иван Иваныч
- Страна: Россия
- город/регион: Самара/63
Re: Помогите решить задачу
АгаSerex писал(а):Как я понял, нужно просто просуммировать все состояния аварий в цикле. Если результат больше 2-х, то останов чего-то там
-
- эксперт
- Сообщения: 2085
- Зарегистрирован: 15 авг 2011, 21:36
- Имя: Пупков Сергей Викторович
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 134 раза
- Поблагодарили: 174 раза
Re: Помогите решить задачу
Что-то не понял. У вас же под каждый датчик свой пользовательский тип. Т.е. обработка какие датчики сработали - это уже другая история. Вам нужно установить факт срабатывания сигнализации. Если такой факт устанавливается, то формируем сообщение на АРМ (СКАДА, что там..).ndk_63 писал(а): Пробовал идентифицировать аварию по индексу массива i, если авария возникла то запиши в тег номер датчика(это работает) а вот как быть в случае возникновения 2-ой,3-ей,4-ой аварии этот тег перезаписывается и все?????
Сообщение в виде строки, к которой в цикле плюсуем номера сработавших датчиков.
С данной средой незнаком, но на других платформах у меня это не вызывает проблем.
-
- здесь недавно
- Сообщения: 38
- Зарегистрирован: 31 окт 2011, 07:46
- Имя: Иван Иваныч
- Страна: Россия
- город/регион: Самара/63
Re: Помогите решить задачу
На все датчики один и тот же пользовательский тип
i - индекс массива который иднтифицирует номер датчика. В принципе если получится идентифицировать номера всех датчиков по которым авария сработала-задача будет решена.
ndk_63 писал(а):Создал пользовательский тип данных :qt._1-первый порог;qt._2-Второй порог;qt.Block-блокировка датчика;qt.AVAR_ZAGAZ-этот бит выставляется после сработки второго порога и отработки таймера;qt.timer-таймер проверки дребезга.
i - индекс массива который иднтифицирует номер датчика. В принципе если получится идентифицировать номера всех датчиков по которым авария сработала-задача будет решена.
-
- не первый раз у нас
- Сообщения: 323
- Зарегистрирован: 26 сен 2010, 10:18
- Имя: Artur
- Страна: Russia
- Поблагодарили: 2 раза
Re: Помогите решить задачу
Если всё же через циклы хотите то, однако, все равно придется ручками в теле цикла писать соответствие датчиков друг-другу, там же сравнивать и выдавать выходной сигнал в случае, если сработали два аварийных порога. Никуда от этой работы не деться, если же, конечно, положения этих двух датчиков в массиве не n и n+1, т.е. связанны между собой постоянным инкрементом. А если нет, то желанию вам не запутаться в соответствие элементов массива- наглядности то нету :)