1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Помогите решить задачу

Обсуждение вопросов, не относящихся ни к одному из других подразделов

Модератор: kirillio

Ответить

Автор темы
ndk_63
здесь недавно
здесь недавно
Сообщения: 38
Зарегистрирован: 31 окт 2011, 07:46
Имя: Иван Иваныч
Страна: Россия
город/регион: Самара/63

Помогите решить задачу

Сообщение ndk_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, что то там останавливается???
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя

DelSnos
не первый раз у нас
не первый раз у нас
Сообщения: 323
Зарегистрирован: 26 сен 2010, 10:18
Имя: Artur
Страна: Russia
Поблагодарили: 2 раза

Re: Помогите решить задачу

Сообщение DelSnos »

Дмитрий, я бы посоветовал Вам создать пользовательскую программу- Add-on. В качестве входных значений блока пропишите состояния ваших 2-х взаимосвязанных датчиков, в теле блока тогда будет крутиться весь ваших алгоритм связанный с этими двумя датчиками: начальные условия, обработка и сравнение, выдача сигнала на стоп чего-то. Тут вам и объектная модель заодно- ваши же 2 датчика загазованности, скорее всего, привязаны к одной и той же технологической площадке? Получается один блок- одна тех. площадка. Весьма прозрачно, наглядно и удобно при ПНРах. Да и наверху все со структурой понятно- меньше ошибок.
А от зацикливания я бы посоветовал избавиться, если, конечно, ваши газоанализаторы не многоточка- тогда просто быстрее обрабатывать данные, но лучше ручками чуть поработать и потом меньше будет проблем. Видел такие программы, где вся обработка построена через конструкцию FOR… END_FOR – очень сложно для понимания и отладки, да и сам ПЛК по этому поводу писал major faults. Во всяком случае, такой способ должен быть, как минимум оправдан.

Владимир Кузнецов
не первый раз у нас
не первый раз у нас
Сообщения: 321
Зарегистрирован: 31 авг 2011, 22:14
Имя: Кузнецов Владимир Сергеевич
Страна: Россия
город/регион: Казань
Поблагодарили: 1 раз

Re: Помогите решить задачу

Сообщение Владимир Кузнецов »

перед блоком с проверкой порогов сбрасывать значение переменной в 0.
в блоке, при срабатывании порога увеличивать эту переменную на 1.
по выходу из блока проверить значение, если больше одного, то стоп.

Ryzhij
почётный участник форума
почётный участник форума
Сообщения: 5632
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 600 раз
Поблагодарили: 756 раз

Re: Помогите решить задачу

Сообщение Ryzhij »

А что, все сто датчиков загазованности коррелированы между собой по условиям техпроцесса?
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)

Бондарев Михаил
почётный участник форума
почётный участник форума
Сообщения: 981
Зарегистрирован: 25 июл 2008, 23:23
Имя: Бондарев Михаил Владимирович
Страна: Россия
город/регион: Магнитогорск
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Re: Помогите решить задачу

Сообщение Бондарев Михаил »

На мой взгляд, вам надо разделить задачи обработки аналоговых сигналов ( линеаризация(?), масштабирование, выделение порогов), задачи обработки событий ( фиксация сработки сигнала превышения порога (самоподхват)) и задачи логического управления ( сработка от неменее чем 2-х датчиков). Тогда и программа будет читататься и на ПНР будет проще.

Боюсь спросить, судя по сработке не менее чем двух датчиков, уж не ПАЗ ли вы делаете?
Аватара пользователя

Serex
эксперт
эксперт
Сообщения: 2085
Зарегистрирован: 15 авг 2011, 21:36
Имя: Пупков Сергей Викторович
Страна: Россия
город/регион: Москва
Благодарил (а): 134 раза
Поблагодарили: 174 раза

Re: Помогите решить задачу

Сообщение Serex »

Как я понял, нужно просто просуммировать все состояния аварий в цикле. Если результат больше 2-х, то останов чего-то там

Ryzhij
почётный участник форума
почётный участник форума
Сообщения: 5632
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 600 раз
Поблагодарили: 756 раз

Re: Помогите решить задачу

Сообщение Ryzhij »

Если показания не всей сотни датчиков коррелированы между собой, считать количество датчиков, превысивших свои пороговые показания, придётся по группам. В общем случае эти группы пересекаются между собой, и таких групп может быть до ста. Т.е. у каждого датчика может быть свой набор друзей-соседей. Рекомендую это выяснить у технологов и учесть в работе.
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)

Автор темы
ndk_63
здесь недавно
здесь недавно
Сообщения: 38
Зарегистрирован: 31 окт 2011, 07:46
Имя: Иван Иваныч
Страна: Россия
город/регион: Самара/63

Re: Помогите решить задачу

Сообщение ndk_63 »

DelSnos писал(а): 1.я бы посоветовал Вам создать пользовательскую программу- Add-on.
2.Тут вам и объектная модель заодно- ваши же 2 датчика загазованности, скорее всего, привязаны к одной и той же технологической площадке?
3.Во всяком случае, такой способ должен быть, как минимум оправдан.
1. По началу хотел сделать через Аддоны, но получилось бы еще неудобнее.
2.Эти два датчика привязаны к одному объекту. При срабатывании не менее двух датчиков установка будет переходить в определенный режим.
3.Способ оправдан- позиций очень много
Ryzhij писал(а):А что, все сто датчиков загазованности коррелированы между собой по условиям техпроцесса?
Да, еще раз повторюсь:- Эти датчики привязаны к одному объекту. При срабатывании не менее двух датчиков установка будет переходить в определенный режим, это условие заказчика.
Бондарев Михаил писал(а):Боюсь спросить, судя по сработке не менее чем двух датчиков, уж не ПАЗ ли вы делаете?
Да, именно, что то не так?
Владимир Кузнецов писал(а):перед блоком с проверкой порогов сбрасывать значение переменной в 0.
в блоке, при срабатывании порога увеличивать эту переменную на 1.
по выходу из блока проверить значение, если больше одного, то стоп.
Ну хоть кто то постарался помочь)))) Да мысль хорошая, но вот как описать это - вопрос.
Если в тело цикла добавить строки :If qt.AVAR_ZAGAZ:=1 then N:=N+1
(где N тэг тип dint,который и будет в начале равен 0 а как только пройдет авария по любому датчику N=1 и т.д.),но произойдет слудующее при сработки порога, N будет увеличиваться, нужен тригер.
Пробовал идентифицировать аварию по индексу массива i, если авария возникла то запиши в тег номер датчика(это работает) а вот как быть в случае возникновения 2-ой,3-ей,4-ой аварии этот тег перезаписывается и все?????

Автор темы
ndk_63
здесь недавно
здесь недавно
Сообщения: 38
Зарегистрирован: 31 окт 2011, 07:46
Имя: Иван Иваныч
Страна: Россия
город/регион: Самара/63

Re: Помогите решить задачу

Сообщение ndk_63 »

Serex писал(а):Как я понял, нужно просто просуммировать все состояния аварий в цикле. Если результат больше 2-х, то останов чего-то там
Ага
Аватара пользователя

Serex
эксперт
эксперт
Сообщения: 2085
Зарегистрирован: 15 авг 2011, 21:36
Имя: Пупков Сергей Викторович
Страна: Россия
город/регион: Москва
Благодарил (а): 134 раза
Поблагодарили: 174 раза

Re: Помогите решить задачу

Сообщение Serex »

ndk_63 писал(а): Пробовал идентифицировать аварию по индексу массива i, если авария возникла то запиши в тег номер датчика(это работает) а вот как быть в случае возникновения 2-ой,3-ей,4-ой аварии этот тег перезаписывается и все?????
Что-то не понял. У вас же под каждый датчик свой пользовательский тип. Т.е. обработка какие датчики сработали - это уже другая история. Вам нужно установить факт срабатывания сигнализации. Если такой факт устанавливается, то формируем сообщение на АРМ (СКАДА, что там..).
Сообщение в виде строки, к которой в цикле плюсуем номера сработавших датчиков.
С данной средой незнаком, но на других платформах у меня это не вызывает проблем.

Автор темы
ndk_63
здесь недавно
здесь недавно
Сообщения: 38
Зарегистрирован: 31 окт 2011, 07:46
Имя: Иван Иваныч
Страна: Россия
город/регион: Самара/63

Re: Помогите решить задачу

Сообщение ndk_63 »

На все датчики один и тот же пользовательский тип
ndk_63 писал(а):Создал пользовательский тип данных :qt._1-первый порог;qt._2-Второй порог;qt.Block-блокировка датчика;qt.AVAR_ZAGAZ-этот бит выставляется после сработки второго порога и отработки таймера;qt.timer-таймер проверки дребезга.

i - индекс массива который иднтифицирует номер датчика. В принципе если получится идентифицировать номера всех датчиков по которым авария сработала-задача будет решена.
Аватара пользователя

DelSnos
не первый раз у нас
не первый раз у нас
Сообщения: 323
Зарегистрирован: 26 сен 2010, 10:18
Имя: Artur
Страна: Russia
Поблагодарили: 2 раза

Re: Помогите решить задачу

Сообщение DelSnos »

Если всё же через циклы хотите то, однако, все равно придется ручками в теле цикла писать соответствие датчиков друг-другу, там же сравнивать и выдавать выходной сигнал в случае, если сработали два аварийных порога. Никуда от этой работы не деться, если же, конечно, положения этих двух датчиков в массиве не n и n+1, т.е. связанны между собой постоянным инкрементом. А если нет, то желанию вам не запутаться в соответствие элементов массива- наглядности то нету :)
Ответить

Вернуться в «Общие вопросы»