Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 14

Тема: Можно ли из таблицы тревог получить ID последней аварии?

  1. #1
    Пользователь Аватар для Солнечный заяц
    Регистрация
    16.08.2009
    Адрес
    г. Рыбинск, Яр.обл.
    Сообщений
    209

    По умолчанию Можно ли из таблицы тревог получить ID последней аварии?

    Есть задача отправлять СМС с текстом аварийных сообщений. Можно ли из таблицы тревог, например, вытащить ID последней тревоги?

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,066

    По умолчанию

    Цитата Сообщение от Солнечный заяц Посмотреть сообщение
    Есть задача отправлять СМС с текстом аварийных сообщений. Можно ли из таблицы тревог, например, вытащить ID последней тревоги?
    А зачем вообще привязываться к таблице тревог в данном случае?
    Вы же знаете условия возникновения тревог - по ним и формируйте/отправляйте смс.

  3. #3

    По умолчанию

    Я правильно понимаю, что задача стоит следующая:
    1) оповестить персонал в момент возникновения аварии;
    2) текст оповещения должен содержать описание возникшей аварии?
    OSCAT.ru читать стандарты и статьи по автоматизации на русском без регистрации и СМС

  4. #4
    Пользователь Аватар для Солнечный заяц
    Регистрация
    16.08.2009
    Адрес
    г. Рыбинск, Яр.обл.
    Сообщений
    209

    По умолчанию

    Цитата Сообщение от Осинский Алексей Посмотреть сообщение
    Я правильно понимаю, что задача стоит следующая:
    1) оповестить персонал в момент возникновения аварии;
    2) текст оповещения должен содержать описание возникшей аварии?
    1. Да.
    2. Да, при возникновении аварии, должно быть отправлено смс с текстом аварии. При этом, квитирование аварии не предусматривается.

  5. #5

    По умолчанию

    Цитата Сообщение от Солнечный заяц Посмотреть сообщение
    1. Да.
    2. Да, при возникновении аварии, должно быть отправлено смс с текстом аварии. При этом, квитирование аварии не предусматривается.
    Спасибо за быстрый ответ.
    Дайте нам время до завтра, мы подготовим подробное описание возможных вариантов решения задачи.
    OSCAT.ru читать стандарты и статьи по автоматизации на русском без регистрации и СМС

  6. #6
    Пользователь Аватар для Солнечный заяц
    Регистрация
    16.08.2009
    Адрес
    г. Рыбинск, Яр.обл.
    Сообщений
    209

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    А зачем вообще привязываться к таблице тревог в данном случае?
    Вы же знаете условия возникновения тревог - по ним и формируйте/отправляйте смс.
    Получается нужно дублировать все проверки тревог, которые я задал в группе тревог. А если придется что-то добавить, или изменить? Это может привести к ошибкам.
    Получается правильней будет формировать код ошибки в программе и отправлять **** а в группе тревог просто проверять коды ошибок, и выдавать нужный текст в таблицу.

  7. #7
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,066

    По умолчанию

    Цитата Сообщение от Солнечный заяц Посмотреть сообщение
    Получается нужно дублировать все проверки тревог, которые я задал в группе тревог. А если придется что-то добавить, или изменить? Это может привести к ошибкам.
    Получается правильней будет формировать код ошибки в программе и отправлять **** а в группе тревог просто проверять коды ошибок, и выдавать нужный текст в таблицу.
    Именно это я и подразумевал (формирование бит в программе и использование их в менеджере тревог).

  8. #8
    Пользователь Аватар для Солнечный заяц
    Регистрация
    16.08.2009
    Адрес
    г. Рыбинск, Яр.обл.
    Сообщений
    209

    По умолчанию

    Цитата Сообщение от Осинский Алексей Посмотреть сообщение
    Спасибо за быстрый ответ.
    Дайте нам время до завтра, мы подготовим подробное описание возможных вариантов решения задачи.
    Ого. Спасибо за интерес к моему вопросу. Приятно удивлен

  9. #9

    По умолчанию

    На текущий момент вырисовывается 2 варианта отправки СМС по активации тревоги.
    Каждый со своими плюсами и минусами. Опишу оба варианта, а Вы используйте тот, который Вам больше подойдет.

    Допустим есть 2 параметра, которые могут послужить причиной тревог:
    1. Температура в комнате (допустимый диапазон от 21 до 35 °С);
    2. Температура на улице (допустимый диапазон от 10 до 25 °С);


    Вариант 1: Обработка аварий в коде.
    Идея этого способа заключается в том, что мы объявим для каждой тревоги переменную типа BOOL.
    Будем менять ее значение в коде, а в AlarmManager'e добавим тревоги типа "Дискретный".

    Плюсы:
    1. легкий для понимания и адаптации под Ваши задачи.


    Минусы:
    1. Необходимость писать вручную много кода;
    2. Небольшое дублирование кода (текст сообщения в таблице тревог и текст СМС).


    Я приложил архив проекта с этим вариантом реализации к сообщению.

    Пример кода:

    В PLC_PRG объявляем константы минимальных, максимальных температур и сообщений, которые будут отправлены при срабатывании аварии
    Код:
    VAR CONSTANT
    	m_c_rMinRoomTemperature				: REAL			:= 21.0;
    	m_c_rMaxRoomTemperature				: REAL			:= 35.0;
    	m_c_rMinTemperatureOutside			: REAL			:= 10.0;
    	m_c_rMaxTemperatureOutside			: REAL			:= 25.0;
    	m_c_wsRoomAlarmMessage				: WSTRING		:= 
    		"Недопустимая температура в комнате";
    	m_c_wsOutsideAlarmMessage			: WSTRING		:= 
    		"Недопустимая температура на улице";
    END_VAR
    Объявляем переменные
    Код:
    VAR
    	// Текущая температура в комнате
    	rCurrentRoomTemperature				: REAL			:= 0.0;
    	// Текущая температура на улице
    	rCurrentTemperatureOutside			: REAL			:= 15.0;
    	// Текстовое описание последней возникшей аварии
    	wsLastAlarmMessage				: WSTRING		:= "";
    	// Текущее состояние тревоги комнатной температуры
    	m_xIsRoomTempAlarmActive			: BOOL			:= FALSE;
    	// Состояние тревоги комнатной температуры в предыдущем цикле
    	m_xWasRoomTempAlarmActive			: BOOL			:= FALSE;
    	// Текущее состояние тревоги уличной температуры
    	m_xIsOutsideTempAlarmActive			: BOOL			:= FALSE;
    	// Состояние тревоги уличной температуры в предыдущем цикле
    	m_xWasOutsideTempAlarmActive			: BOOL			:= FALSE;
    END_VAR
    Обрабатывем аварии в теле PLC_PRG (для примера температура в комнате. Температура на улице обрабатывается аналогично)
    Код:
    // Если температура в комнате вышла за диапазон - активировать тревогу
    IF rCurrentRoomTemperature < m_c_rMinRoomTemperature OR
    	rCurrentRoomTemperature > m_c_rMaxRoomTemperature THEN
    	m_xIsRoomTempAlarmActive := TRUE;
    	
    	// Если тревога не была активна - отправить СМС
    	IF NOT m_xWasRoomTempAlarmActive THEN
    		wsLastAlarmMessage := m_c_wsRoomAlarmMessage;
    		// Тут начните отправку СМС
    	END_IF
    ELSE
    	m_xIsRoomTempAlarmActive := FALSE;
    END_IF
    
    m_xWasRoomTempAlarmActive := m_xIsRoomTempAlarmActive;
    В AlarmManager добавляем группу тревог и конфигурируем ее следующим образом:
    LastAlarmMessage_AdditionalCode_AlarmConfig.png


    Вариант №2 опишу отдельным сообщением.
    Вложения Вложения
    OSCAT.ru читать стандарты и статьи по автоматизации на русском без регистрации и СМС

  10. #10

    По умолчанию

    Условия для варианта 2 те же, что и раньше:

    Цитата Сообщение от Осинский Алексей Посмотреть сообщение
    Допустим есть 2 параметра, которые могут послужить причиной тревог:
    1. Температура в комнате (допустимый диапазон от 21 до 35 °С);
    2. Температура на улице (допустимый диапазон от 10 до 25 °С);
    Вариант 2: AlarmManager сообщает нам о изменении списка активных тревог

    Плюсы:
    1. минимум вспомогательного кода;
    2. конфигурация тревог производится полностью через интерфейс AlarmManager'а;
    3. отсутствует дублирование кода;
    4. для использования в проекте Вам достаточно перенести к себе в проект часть примера (редактировать не придется);


    Минусы:
    1. Для людей не знакомых с ООП разобраться как это работает будет сложно;


    Я приложил архив проекта с этим вариантом реализации к сообщению.

    Для интеграции примера в Ваш проект:
    1. перенесите директорию LastAlarmMessage в свой проект;
    2. добавьте библиотеку Alarm Manager Interfaces (Intern) в свой проект;
    3. в PLC_PRG объявите экземпляр ФБ
      Код:
      VAR
      	m_fb_LastAlarmMessage				: GetLastAlarmMessage;
      END_VAR
      и добавьте вызов ФБ в теле
      Код:
      m_fb_LastAlarmMessage();
    4. отправляйте СМС примерно так:
      Код:
      // xNewAlarmActivated будет равен TRUE в течение 1 цикла ПЛК с момента активации новой тревоги.
      IF m_fb_LastAlarmMessage.xNewAlarmActivated THEN
      	// Отправляйте СМС с текстом m_fb_LastAlarmMessage.wsMessage
      	;
      END_IF
    5. AlarmManager настройте по вкусу. ФБ все равно узнает текст последней возникшей тревоги.
      Для наших условий настройка выглядит так:
      LastAlarmMessage_Listener_AlarmConfig.png


    Много скучного описания о том, как это вообще устроено:

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


    Собственно описание:
    Получение информации от AlarmManager'a основано на использовании поведения Издатель-Подписчик.
    Где издатель (AlarmManager) автоматически информирует подписчика о своих событиях (например, сообщает о активации-деактивации тревоги).
    Для того, чтобы это стало возможным понадобится создать функциональный блок - обработчик активных аварий
    Код:
    FUNCTION_BLOCK LastAlarmMessageClient IMPLEMENTS 
    	AlarmManager.IAlarmManagerClient
    У этого ФБ должны быть следующие методы:
    Код:
    (*
    Метод вызывается AlarmManager'ом каждый раз после того, как обновился
    список активных тревог.
    *)
    METHOD ActiveAlarmsChanged
    VAR
    	_iActiveAlarmsCount 	: INT;
    	_paitfActiveAlarms		: POINTER TO ARRAY[0..0] OF AlarmManager.IAlarm	
    		:= 0;
    END_VAR

    Код:
    (*
    Метод вызывается AlarmManager'ом каждый раз после того, как в архив тревог
    добавлена новая тревога, или изменена уже присутствующая в архиве тревога
    *)
    METHOD AlarmStorageModified
    VAR
    	udiResult : UDINT;
    END_VAR
    Код:
    (*
    Возвращает критерий по которому AlarmManager определит о каких тревогах
    необходимо уведомлять этого подписчика
    *)
    METHOD GetFilterCriteria : AlarmManager_Interfaces.IAlarmFilterCriteria
    AlarmManager'у необходимо дать знать о нашем подписчике. Сделать это можно разными способами.
    Я использую метод FB_Init.
    Этот метод вызывается во время "Создания" экземпляра ФБ. (В общем случае - в момент загрузки программы в ПЛК или после перезагрузки ПЛК).

    Метод должен иметь следующий интерфейс
    Код:
    (*
    Конструктор. Вызывается при создании экземпляра ФБ
    *)
    METHOD PUBLIC FB_Init  : BOOL
    VAR_INPUT
    	bInitRetains	: BOOL; // TRUE: the Retain-variables are initialized (reset warm / reset cold)
    	bInCopyCode		: BOOL; // TRUE  the instance will be copied to the copy-code afterward (online change)
    END_VAR
    Наполнение метода следующее:
    Код:
    // Подписываюсь на события AlarmManager'а
    AlarmManager.g_AlarmHandler.RegisterClient (THIS^, 0, 0);
    где
    THIS^ - сообщает AlarmManager'у, что подписчиком необходимо добавить этот экземпляр ФБ,
    0, 0 - в данном примере не используется (описывают где и сколько AlarmManager может хранить тревог при чтении архива тревог).


    Кроме этого подписчик должен сообщить AlarmManager'у какие именно тревоги ему интересны.
    Это реализовано в ФБ ShowAllAlarms. Добавил максимум комментариев. Дублировать сюда не буду.

    Итак, с созданием подписчика закончили.
    Приступим к обработке тревог. Нас интересует метод ActiveAlarmsChanged, который AlarmManager будет вызывать каждый раз при активации-деактивации тревоги.

    Получить перечень активных тревог можно выполнив следующий код:
    Код:
    // Получаем список активных тревог
    AlarmManager.g_AlarmHandler.GetActiveAlarms(
    	itfAlarmManagerClient	:= THIS^,
    	iCountActiveAlarms		=> _iActiveAlarmsCount,
    	parritfActiveAlarms		=> _paitfActiveAlarms);
    В переменную _iActiveAlarmsCount будет записано количество активных тревог, а
    в _paitfActiveAlarms - указатель на массив активных тревог.
    В этом массиве тревоги отсортированы по возрастанию ID, поэтому нам нужно будет найти тревогу, которая активировалась последней.
    В примере это выполняет метод prv_getLastAlarmMessage, я добавил в него комментарии, поэтому не буду дублировать сюда.



    Если у Вас появились вопросы\замечания - пишите, мы поможем.
    Вложения Вложения
    Последний раз редактировалось Осинский Алексей; 15.03.2018 в 11:50.
    OSCAT.ru читать стандарты и статьи по автоматизации на русском без регистрации и СМС

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Заполнение таблицы
    от dmitriyv в разделе СПК2хх
    Ответов: 8
    Последнее сообщение: 23.05.2016, 00:20
  2. Отображение таблицы из файла.
    от super100 в разделе Master SCADA 3
    Ответов: 5
    Последнее сообщение: 12.03.2015, 15:11
  3. Изменение стилей Таблицы и Баннера тревог
    от Андрей Косоротов в разделе СПК2хх
    Ответов: 0
    Последнее сообщение: 01.10.2014, 09:42
  4. Графики и таблицы !
    от Maxidancer в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 17.06.2008, 14:04

Ваши права

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