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

Тема: [Weintek] Сформировать звуковую сигнализацию на события в ПЛК

  1. #1

    По умолчанию [Weintek] Сформировать звуковую сигнализацию на события в ПЛК

    Доброго дня!

    Передо мной стоит задача сделать силами панели Weintek звуковое оповещение при появлении нового события - отказа оборудования - т.е. при появлении нового флага события включить звук и открыть всплывающее окно для квитирования и выключения звуковой сигнализации.

    Не использую "журнал событий (аварий)" и его визуальные элементы - т.к. они показывают только события за текущие сутки и при помощи макросов можно листать посуточно - т.е. я не разобрался, как в них показывать список последних 10 событий независимо от их даты.
    И хотелось бы квитировать не по одному сообщению, а всю активную группу.

    Из контроллера получаю битовую маску отказов (wAlarm_current), в локальных переменных LW определил переменную со значением маски на предыдущем цикле обработки (wAlarm_previous). Так же определил локальную переменную LB (bNoAcknowlege) по взведению которой открывается всплывающее окно для квитирования.
    Делаю макрос с периодом вызова 1000 мс (макрос пока не закончен - это черновой вариант с синтаксическими ошибками)
    Код:
    // получение флага добавления сигнала неисправности
    // формирование прерывистых звуковых сигналов
    macro_command main()
    
    bool			new_alarm		// флаг появления нового сигнала неисправности
    bool			no_acknowlege	// флаг отсутствия квитирования сигнала неисправности
    unsigned short	alarms_current	// текущее состояние регистра флагов неисправностей
    unsigned short	alarms_previous	// предыдущее состояние регистра флагов неисправностей
    
    	// получение актуальных данных из ПЛК и глобальных переменных
    	GetData(alarms_current, "PLC", "wAlarm_current", 1)
    	GetData(alarms_previous, "Local_HMI", "wAlarm_previous", 1)
    	GetData(no_acknowlege, "Local_HMI", "bNoAcknowlege", 1)
    
    	// если добавился новый флаг - установить флаг отсутствия квитирования
    	new_alarm = ((alarms_current & (~alarms_previous)) > 0)
    	if new_alarm then
    		no_acknowlege = 1
    	end if
    
    	// если нет квитирования - сформировать звуковую сигнализацию
    	if no_acknowlege then
    		Beep()
    	end if
    
    	// сохранить состояние в глобальных переменных
    	SetData(no_acknowlege, "Local_HMI", "bNoAcknowlege", 1)	// выставление флага отсутствия квитирования
    	SetData(alarms_current, "Local_HMI", "wAlarm_previous", 1)	// сохранение текущего регистра флагов неисправности
    end macro_command
    И появляются вопросы:

    1. Функция GetData/GetDataEx немедленно начинает опрос контроллера по Modbus со всеми недостатками опроса (продолжительность, зависание при обрыве связи). Как избежать лишнего опроса (ведь тег регистра флагов wAlarm_current и так описан в списке тегов и опрашивается)?

    2. Если лишнего опроса не избежать, то как наилучшим образом обрабатывать это чтение GetData/GetDataEx, чтобы избежать зависаний внутри макроса и уменьшить время его выполнения?

    3. Может быть есть другой способ формирования звуковой сигнализации с открытием всплывающего окна для квитирования всей активной группы событий?

  2. #2

    По умолчанию

    В разделе "Трёп (Курилка)" действует ручная премодерация перед публикацией темы.
    Конкретно для этой - премодерация длилась почти 2 недели, так что актуальности вопроса уже нет.

    Просто отпишусь, как решил.

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

    Итак.

    Задача:
    1. события от контроллера поступают в виде битовой маски из нескольких регистров (регистры флагов событий)
    2. не используется "журнал событий (аварий)" и его визуальные элементы, поэтому его свойства реакции на события также не используются
    3. при возникновении нового события (установки "нового" бита в любом из регистров флагов событий) должны: включиться звук динамика панели, появиться всплывающее окно с кнопкой квитирования (отключения звука)
    4. оператор нажимает кнопку квитирования на всплывающем окне и после этого окно закрывается, звуковая сигнализация выключается.
    5. если флаг события оказался снят до квитирования (например, кнопкой сброс со щита автоматики), то окно не закрывается, звуковая сигнализация не выключается - продолжает ожидать реакции оператора.

    Реализация:
    1. Уже существовали переменные - регистры флагов событий - принимаемые из контроллера - wMS_Common_Alarm, wMS_Pump1_Alarm, wMS_Pump2_Alarm, wMS_PumpFill_Alarm, wMS_HeatSens_Alarm, wMS_HeatPumpFill_Alarm
    2. объявил переменную bNoAcknowledge ("Local HMI" LB-100) - подтверждение (квитирование) события
    3. объявил переменные в области LW - wMS_Common_Alarm_Prev, wMS_Pump1_Alarm_Prev, wMS_Pump2_Alarm_Prev, wMS_PumpFill_Alarm_Prev, wMS_HeatSens_Alarm_Prev, wMS_HeatPumpFill_Alarm_Prev - состояния регистров флагов на предыдущем опросе
    4. объявил макрос, вызываемый однократно при инициализации - вероятно, после включения питания переменные и так обнуляются, но мне не жалко принудительно это сделать
    Код:
    // инициализация переменных, требуемых для сигнализации
    macro_command main()
    bool	init_bool_false = 0
    unsigned short init_uint16 = 0
    	// определение добавления флагов событий сигнализации для каждой подсистемы
    	init_uint16 = 0
    	SetData(init_uint16, "Local HMI", "wMS_Common_Alarm_Prev", 1)		// - общее
    	SetData(init_uint16, "Local HMI", "wMS_Pump1_Alarm_Prev", 1)		// - насос 1
    	SetData(init_uint16, "Local HMI", "wMS_Pump2_Alarm_Prev", 1)		// - насос 2
    	SetData(init_uint16, "Local HMI", "wMS_PumpFill_Alarm_Prev", 1)		// - насос заполнения
    	SetData(init_uint16, "Local HMI", "wMS_HeatSens_Alarm_Prev", 1)		// - самонагревающийся кабель нагрева датчиков
    	SetData(init_uint16, "Local HMI", "wMS_HeatPumpFill_Alarm_Prev", 1)	// - самонагревающийся кабель нагрева насосов заполнения
    	// подтверждение событий
    	SetData(init_bool_false, "Local HMI", "bNoAcknowledge", 1)
    end macro_command
    5. объявил периодически (1000 мс) вызываемый макрос для установки в true переменной bNoAcknowledge по возникновению нового события и для кратковременного включения динамика. пока не разобрался, что делать с ошибкой обмена по Modbus, поэтому переменную error не использовал
    Код:
    // получение флага добавления сигнала неисправности
    // формирование прерывистых звуковых сигналов
    macro_command main()
    
    bool			new_alarm = 0		// флаг появления нового сигнала неисправности
    bool			no_acknowledge = 0	// флаг отсутствия квитирования сигнала неисправности
    unsigned short	alarms_current = 0	// текущее состояние регистра флагов неисправностей
    unsigned short	alarms_previous	= 0	// предыдущее состояние регистра флагов неисправностей
    unsigned short	error = 0			// код ошибки (0 - ошибки нет)
    
    	// инициализация
    	GetData(no_acknowledge, "Local HMI", "bNoAcknowledge", 1)
    	new_alarm = 0
    	// определение добавления флагов событий сигнализации для каждой подсистемы
    	// регистры флагов состояния нигде кроме этого макроса не опрашиваются, поэтому
    	// опрашиваем их командами GetData/GetDataEx и не беспокоимся о избыточности количества опросов
    	// - общее
    	GetDataEx(alarms_current, "PLC", "wMS_Common_Alarm", 1)
    	GetError(error)
    	GetData(alarms_previous, "Local HMI", "wMS_Common_Alarm_Prev", 1)
    	SetData(alarms_current, "Local HMI", "wMS_Common_Alarm_Prev", 1)
    	new_alarm = new_alarm or ((alarms_current & (~alarms_previous)) > 0)
    	// - насос 1
    	GetDataEx(alarms_current, "PLC", "wMS_Pump1_Alarm", 1)
    	GetError(error)
    	GetData(alarms_previous, "Local HMI", "wMS_Pump1_Alarm_Prev", 1)
    	SetData(alarms_current, "Local HMI", "wMS_Pump1_Alarm_Prev", 1)
    	new_alarm = new_alarm or ((alarms_current & (~alarms_previous)) > 0)
    	// - насос 2
    	GetDataEx(alarms_current, "PLC", "wMS_Pump2_Alarm", 1)
    	GetError(error)
    	GetData(alarms_previous, "Local HMI", "wMS_Pump2_Alarm_Prev", 1)
    	SetData(alarms_current, "Local HMI", "wMS_Pump2_Alarm_Prev", 1)
    	new_alarm = new_alarm or ((alarms_current & (~alarms_previous)) > 0)
    	// - насос заполнения
    	GetDataEx(alarms_current, "PLC", "wMS_PumpFill_Alarm", 1)
    	GetError(error)
    	GetData(alarms_previous, "Local HMI", "wMS_PumpFill_Alarm_Prev", 1)
    	SetData(alarms_current, "Local HMI", "wMS_PumpFill_Alarm_Prev", 1)
    	new_alarm = new_alarm or ((alarms_current & (~alarms_previous)) > 0)
    	// - электрообогрев датчиков
    	GetDataEx(alarms_current, "PLC", "wMS_HeatSens_Alarm", 1)
    	GetError(error)
    	GetData(alarms_previous, "Local HMI", "wMS_HeatSens_Alarm_Prev", 1)
    	SetData(alarms_current, "Local HMI", "wMS_HeatSens_Alarm_Prev", 1)
    	new_alarm = new_alarm or ((alarms_current & (~alarms_previous)) > 0)
    	// - электрообогрев насосов заполнения
    	GetDataEx(alarms_current, "PLC", "wMS_HeatPumpFill_Alarm", 1)
    	GetError(error)
    	GetData(alarms_previous, "Local HMI", "wMS_HeatPumpFill_Alarm_Prev", 1)
    	SetData(alarms_current, "Local HMI", "wMS_HeatPumpFill_Alarm_Prev", 1)
    	new_alarm = new_alarm or ((alarms_current & (~alarms_previous)) > 0)
    
    	// если произошло новое событие, то установить требование квитирования
    	no_acknowledge = no_acknowledge or new_alarm
    
    	// если событие не квитировано, то включить звуковой сигнал
    	if no_acknowledge then
    		Beep()
    	end if
    
    	// сохранение состояния квитирования
    	SetData(no_acknowledge, "Local HMI", "bNoAcknowledge", 1)
    end macro_command
    
    //	current previous result
    //	0		0			0
    //	0		1			0
    //	1		0			1
    //	1		1			0
    6. создал небольшое всплывающее окно с элементами
    - функциональная кнопка с действием "Закрыть окно"
    - битовая кнопка с атрибутом "OFF при закрытии окна" для переменной bNoAcknowledge
    - числовой индикатор для анимации мигающего колокольчика
    7. на "4. Common Window" по центру добавил объект "Прямой вызов окна" со свойствами:
    - триггер - ON
    - № окна - моё всплывающее окно
    - Чтение устройство: Local HMI
    - Чтение адрес: bNoAcknowledge
    - вкладка Позиция - автонастройка размеров окна

    Т.е. механизм такой:
    При нормальной работе устройства переменная bNoAcknowledge равна false.
    При возникновении события контроллером устанавливается один или несколько битов регистров флагов.
    Периодически вызываемый макрос принимает регистры флагов из контроллера и при появлении нового события (установленного бита) устанавливает переменную bNoAcknowledge в true, а также включает кратковременный звук на динамике при bNoAcknowledge.
    Общее окно "4. Common Window" объектом "Прямой вызов окна" при bNoAcknowledge равном true открывает всплывающее окно.
    Оператор нажимает кнопку "Сброс звука" во всплывающем окне, после чего окно закрывается и при закрытии переменной bNoAcknowledge присваивается false - снимается условие формирования звуковой сигнализации.

    Пока разбирался с задачей, немного поднял уровень знаний по работе с макросами панелей Weintek, разобрался с работой визуальных объектов "журнала событий". Готовлю небольшую статью-памятку в своём блоге.

  3. #3
    Пользователь
    Регистрация
    04.09.2012
    Адрес
    Омск
    Сообщений
    321

    По умолчанию

    Передача данных каждые 1000 мс с ПЛК на панель. 1 - word. Вызов окна - 0 бит, он же вызов звука через триггер. В окне список аварии с указанием сработавший аварии (остальные биты) моргающим индикатором. Кнопка сброс - прямая запись в ПЛК со сбросом нулевого бита. (если регистров несколько - возможны разные вариации приведенных действий)
    Последний раз редактировалось Rask; 22.08.2026 в 14:43.

  4. #4

    По умолчанию

    Сделать все функции с квитированием аварий в плк (например том же 210 и даже 110) на st на все переменные - это строк 20 кода максимум. Зачем это все в визуализации... А если несколько панелей к одному плк как клиенты подцеплены будут? На одной квитировали, а вторая "орать" будет?

  5. #5

    По умолчанию

    Спасибо.

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

    Если задействовать объект "журнал событий", то он содержит флаги (системные биты LB) состояния и команд квитирования всех событий (кажется, даже с разделением по категориям). Думаю, что с "журналом событий" было бы удобнее использовать встроенные механизмы - квитирования и звуковой сигнализации. А окно открывать или как в моём случае (на "4. Common Window" добавить объект "Прямой вызов окна") или как Вы предлагаете (через "триггер" с событием LB=ON для существования неквитированных событий).
    Хотя и не последовал этому пути, но рассматривал его.

  6. #6

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    Сделать все функции с квитированием аварий в плк (например том же 210 и даже 110) на st на все переменные - это строк 20 кода максимум. Зачем это все в визуализации... А если несколько панелей к одному плк как клиенты подцеплены будут? На одной квитировали, а вторая "орать" будет?
    Мне кажется, это другая задача, хотя и похожая.

    Если нужно квитировать - то на каждой панели со сбросом звуковой сигнализации в пределах панели.
    Если нужен сброс отказа - то достаточно с одной из панелей (или со щита автоматики) сбросить, подав команду в ПЛК - сброс сигнализации.

    Конкретно в моём случае - используются и квитирование из всплывающего окна (заодно и сброс звуковой сигнализации) и отдельно другой кнопкой на экране выполняется сброс аварии.
    Это принципиально разные сигнализации, т.к. состояние аварии может сохраняться для части оборудования, но работа может продолжаться на оставшемся исправном резервном оборудовании.
    Т.е. сброс аварии и квитирование - разные команды с разной реакцией.

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

    По умолчанию

    Цитата Сообщение от FPavel Посмотреть сообщение
    Спасибо.

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

    Если задействовать объект "журнал событий", то он содержит флаги (системные биты LB) состояния и команд квитирования всех событий (кажется, даже с разделением по категориям). Думаю, что с "журналом событий" было бы удобнее использовать встроенные механизмы - квитирования и звуковой сигнализации. А окно открывать или как в моём случае (на "4. Common Window" добавить объект "Прямой вызов окна") или как Вы предлагаете (через "триггер" с событием LB=ON для существования неквитированных событий).
    Хотя и не последовал этому пути, но рассматривал его.
    Если использовать журнал. То там проще - есть галка уведомление (при добавления нового события). Соответственно при событие - этот бит может вызвать окно. Включить звук. Его можно отдельно сбрасывать. Во всяком случае - я обычно и использую их. При некоторых событиях вызов окна, например с предупреждением: - сброс события только дежурным электриком)). Да и все окна через "Common Window" добавить объект "Прямой вызов окна".
    Последний раз редактировалось Rask; 22.08.2026 в 16:43.

  8. #8

    По умолчанию

    Цитата Сообщение от FPavel Посмотреть сообщение
    Мне кажется, это другая задача, хотя и похожая.

    Если нужно квитировать - то на каждой панели со сбросом звуковой сигнализации в пределах панели.
    Если нужен сброс отказа - то достаточно с одной из панелей (или со щита автоматики) сбросить, подав команду в ПЛК - сброс сигнализации.

    Конкретно в моём случае - используются и квитирование из всплывающего окна (заодно и сброс звуковой сигнализации) и отдельно другой кнопкой на экране выполняется сброс аварии.
    Это принципиально разные сигнализации, т.к. состояние аварии может сохраняться для части оборудования, но работа может продолжаться на оставшемся исправном резервном оборудовании.
    Т.е. сброс аварии и квитирование - разные команды с разной реакцией.
    Ну я делаю так:
    В плк возникает авария с выводом этой аварии оператору. Она активная. При этом орёт сирена.
    Оператор открывает диагностику аварийного механизма, нажимает "подтвердить аварию", если авария до нажатия ушла, то после нажатия авария снимается, если не ушла, то авария становится подтверждённой (квитированной), но в программе эта подтверждённая авария всё равно блокирует механизм, но сирена замолкает.
    Если после подтверждения всё ок, то можно заново запускать, если авария осталась, но как квитированная, деж электрик идёт устранять. После устранения механизм встаёт в готовность автоматом, если до этого аварию сбросили, или остаётся в активной не квитированной, но устраненной, и надо просто подтвердить.

    А у вас что на это 2 функциональные кнопки? Квитирование и сброс?
    Последний раз редактировалось МихаилГл; 22.08.2026 в 20:49.

  9. #9

    По умолчанию

    Да, две кнопки. Как и на шкафах с автоматикой на релейных схемах - одна кнопка "сброс звуковой сигнализации", вторая - "сброс аварии".
    Так сделаны шкафы управления итальянскими и немецкими котлами и деаэраторами.
    Такие схемы учили в ВУЗе.

    При неисправности механизма на триггере фиксируется состояние отказа, которое в программе за пределами ФБ механизма формирует блокировку с переводом механизма в безопасное положение (например, снимает сигнал пуска).
    Триггер можно сбросить сигналом "сброс аварии" от кнопки на шкафу автоматики или кнопки на панели.
    Сброс звуковой - только отключает сирену, но не влияет на блокировку.

    По ТЗ не предусматривалась звуковая сигнализация (системы без постоянного присутствия оператора), а сейчас при доработке лучше вносить минимальные изменения - ограничится только панелью. Тем более, что в панели все изменения всё равно пришлось бы делать именно такие же, за исключением формирования запроса включения звуковой сигнализации. И ещё, панель и шкаф автоматики разнесены на сотни метров, целесообразнее не вносить изменений в ПЛК.

    Соглашусь, что в ПЛК можно было реализовать звуковую сигнализацию и её сброс (от местной и виртуальной кнопок) и по состоянию в ПЛК формировать звук на панели.
    Наверное, в следующих работах добавлю звуковую сигнализацию в ПЛК независимо от ТЗ - кода немного, а может пригодиться.

  10. #10

    По умолчанию

    Что то припоминаю стенд аппаратуры шахтного проветривания "ветер". Вроде там было квитирование тумблерами и отдельный сброс. Но то была здоровенная панель метр на метр с кучей индикаторов. А сейчас такой функциональные думаю излишен... Да, операторы жмут по инерции кнопку сброса, и если там авто восстановление готовности, то поначалу им непривычно, но для этого всё равно есть история событий. Тем более мнемосхема перед глазами. Даже если авария ушла и лень смотреть историю, то операторы по опыту определяют какой механизм конкретно остановил технологическую цепочку, благо ПТС последователен)

    Но я привык не делать. На обогатительной фабрике было около 400 механизмов, и ни у кого не вызывало трудностей использовать 1 кнопку. Ну и как говорил ранее, всё реализовано в плк, визуализация ничего не хранит и не делает, только bool тэги посылает при командах.

    https://gorex-ex.ru/wp-content/uploa...01/veter_2.gif
    Последний раз редактировалось МихаилГл; 22.08.2026 в 23:40.

Похожие темы

  1. Системные события
    от lazy в разделе СПК210, СПК1xx [М01]
    Ответов: 1
    Последнее сообщение: 13.03.2026, 12:14
  2. События объекта отсутствуют, события прибора - есть. Что не так?
    от In_Da_Cher_A в разделе Облачный сервис OwenCloud
    Ответов: 9
    Последнее сообщение: 19.10.2021, 11:41
  3. События
    от Dima1991 в разделе Master SCADA 3
    Ответов: 8
    Последнее сообщение: 06.02.2017, 14:20
  4. как реализовать сигнализацию
    от fuzzy_l в разделе Подбор Оборудования
    Ответов: 1
    Последнее сообщение: 25.03.2010, 12:29
  5. Как отключить сигнализацию на ТМП138
    от незарегистрированный в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 09.09.2008, 13:26

Ваши права

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