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

Как узнать, что есть новые неквитированные тревоги

Модератор: Глоб.модераторы

Ответить

Автор темы
Mike-D
здесь недавно
здесь недавно
Сообщения: 3
Зарегистрирован: 21 окт 2020, 00:25
Имя: Михаил
Благодарил (а): 2 раза

Как узнать, что есть новые неквитированные тревоги

Сообщение Mike-D »

Не могу вспомнить, как в WinCC 7.4 sp1 можно отловить факт появления новой тревоги, что бы уже потом, например, сделать видимым AlarmControl на экране. И можно ли отобразить количество тревог (всего и не заквитированных). Вроде эта инфа содержится в статус баре AlarmControl , но как ее из него вытащить!?
Подскажите, кто знает, пожалуйста

Автор темы
Mike-D
здесь недавно
здесь недавно
Сообщения: 3
Зарегистрирован: 21 окт 2020, 00:25
Имя: Михаил
Благодарил (а): 2 раза

Как узнать, что есть новые неквитированные тревоги

Сообщение Mike-D »

Неужели это такой сложный вопрос, мне казалось, что еще в версии 5.1 это реализовывалось? Или я ошибаюсь и в WinCC нет такого механизма? Это будет очень странно, данный функционал реализован во всех остальных, известных мне скадах?

makesstr
освоился
освоился
Сообщения: 222
Зарегистрирован: 19 сен 2019, 10:09
Имя: Макс
Страна: Россия
город/регион: Славянск-на-Кубани
Благодарил (а): 5 раз
Поблагодарили: 38 раз

Как узнать, что есть новые неквитированные тревоги

Сообщение makesstr »

Можно отловить факт появления тревоги ч/з ПЛК, любая тревога поднимает бит, сброс сигнализации сбрасывает бит.
Видимость AlarmControl привязать к этому же биту. Как сделать это ч/з WinCC не знаю, наверное никак. Можно попробовать ч/з скрипты, может что-то и получится.
Квитированные/активные/неактивные/неквитированные/итд содержатся в разных журналах, переключаться между ними можно изменяя MessageListType.
WinCC 7.4 SP1 Upd15, Step5.6

LexSL
освоился
освоился
Сообщения: 208
Зарегистрирован: 16 дек 2011, 15:13
Имя: Алексей
Страна: Россия
Благодарил (а): 67 раз
Поблагодарили: 53 раза

Как узнать, что есть новые неквитированные тревоги

Сообщение LexSL »

в AlarmLogging каждому классу сообщений WinCC создает групповое сообщение, куда включаются все сообщения этого класса. В настройках группового сообщения есть поля для назначения тегов: тег состояния, тег блокировки, тег квитирования, тег скрытия.
Групповое сообщение может иметь два состояния:
1) Состояния activated/deactivated (включено/отключено) указывают соответствующее состояние одного из вложенных сообщений.
2) Состояние квитирования указывает, требуется ли для инициирующего одиночного сообщения, включенного в групповое сообщение, квитирование и прошло ли уже это сообщение квитирование.
Так вот, если в поле для тега состояния задать тег (причем надо знать какого типа: например 8-bit, 16-bit, 32 bit) 32 битное целое и указать бит состояния 0, то:
0-вой бит этого тега будет показывать - появилось какое -то сообщение этого класса
16-бит этого тега будет показывать - содержится ли в групповом сообщении сообщение, требующее квитирования, которое еще не прошло квитирование.
tmpAlarmsWinCC.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Автор темы
Mike-D
здесь недавно
здесь недавно
Сообщения: 3
Зарегистрирован: 21 окт 2020, 00:25
Имя: Михаил
Благодарил (а): 2 раза

Как узнать, что есть новые неквитированные тревоги

Сообщение Mike-D »

makesstr писал(а): 06 ноя 2020, 13:22 Можно отловить факт появления тревоги ч/з ПЛК, любая тревога поднимает бит, сброс сигнализации сбрасывает бит.
Видимость AlarmControl привязать к этому же биту. Как сделать это ч/з WinCC не знаю, наверное никак. Можно попробовать ч/з скрипты, может что-то и получится.
Квитированные/активные/неактивные/неквитированные/итд содержатся в разных журналах, переключаться между ними можно изменяя MessageListType.
Спасибо, но через ПЛК не комильфо ))), тем более когда их много

Отправлено спустя 3 минуты 10 секунд:
LexSL писал(а): 06 ноя 2020, 14:10 в AlarmLogging каждому классу сообщений WinCC создает групповое сообщение, куда включаются все сообщения этого класса. В настройках группового сообщения есть поля для назначения тегов: тег состояния, тег блокировки, тег квитирования, тег скрытия.
Групповое сообщение может иметь два состояния:
1) Состояния activated/deactivated (включено/отключено) указывают соответствующее состояние одного из вложенных сообщений.
2) Состояние квитирования указывает, требуется ли для инициирующего одиночного сообщения, включенного в групповое сообщение, квитирование и прошло ли уже это сообщение квитирование.
Так вот, если в поле для тега состояния задать тег (причем надо знать какого типа: например 8-bit, 16-bit, 32 bit) 32 битное целое и указать бит состояния 0, то:
0-вой бит этого тега будет показывать - появилось какое -то сообщение этого класса
16-бит этого тега будет показывать - содержится ли в групповом сообщении сообщение, требующее квитирования, которое еще не прошло квитирование.

tmpAlarmsWinCC.png
А вот это интересно! Спасибо огромное...

Отправлено спустя 25 минут 57 секунд:
LexSL, я правильно понимаю, что достаточно в AlarmLogging для всех сообщений одного класса в поле Status tag указывать один и тот же 32 битный внутренний тег? Или же это надо сделать один раз для группового сообщения, а в AlarmLogging указывать только это групповое сообщение в поле Message Group для всех одноклассников, поле же Status tag, при этом, у сообщений остается пустым? Заранее спасибо

LexSL
освоился
освоился
Сообщения: 208
Зарегистрирован: 16 дек 2011, 15:13
Имя: Алексей
Страна: Россия
Благодарил (а): 67 раз
Поблагодарили: 53 раза

Как узнать, что есть новые неквитированные тревоги

Сообщение LexSL »

Mike-D писал(а): 10 ноя 2020, 16:39 LexSL, я правильно понимаю, что достаточно в AlarmLogging для всех сообщений одного класса в поле Status tag указывать один и тот же 32 битный внутренний тег? Или же это надо сделать один раз для группового сообщения,
Именно так..., еще надо номер бита указывать
Т.е, например: у Вас два класса сообщений: Тревоги и Ошибки.
В групповом сообщении и того и другого класса указываете 32 битный тег (один и тот же), НО номер бита для Тревог, например = 0,
а для Ошибок = 1.
В 0 бите для Тревог - активно/неактивно, 0 + 16 = 16 - в 16 бите - все квитированы\какая-то не квитирована тревога.
В 1 бите для Ошибок - активно/неактивно, 1 + 16 = 17 - в 17 бите - все квитированы\какая-то не квитирована ошибка
Mike-D писал(а): 10 ноя 2020, 16:39 а в AlarmLogging указывать только это групповое сообщение в поле Message Group для всех одноклассников
Не знаю...
Mike-D писал(а): 10 ноя 2020, 16:39 поле же Status tag, при этом, у сообщений остается пустым? Заранее спасибо
Это если хотите - можете поймать конкретное сообщение и как то на него отреагировать...типа feedback от AlarmLogging на каждое сообщение
Подход тут такой же, как и для группового сообщения.
Найдите руководство по алармам для WinCC - там это расписано.

iceman
здесь недавно
здесь недавно
Сообщения: 28
Зарегистрирован: 15 фев 2018, 07:17
Имя: Александр
Страна: Россия
город/регион: Новокузнецк
Поблагодарили: 9 раз

Как узнать, что есть новые неквитированные тревоги

Сообщение iceman »

Через ODK функции.
1. Вывод количества тревог

Код: Выделить всё

CMN_ERROR wccError;
DWORD dwCount=0;
if ( MSRTGetMsgActual(&dwCount, &wccError) )
  printf("Actual messages = %d\r\n",dwCount);
else
  printf("MSRTGetMsgActual fail\r\n");
if ( MSRTGetMsgQuit(&dwCount, &wccError) )
  printf("Need ack messages = %d\r\n",dwCount);
else
  printf("MSRTGetMsgQuit fail\r\n");
2. Найти актуальные сообщения
Основная функция

Код: Выделить всё

#include "apdefap.h"
void Get_Notify_mess()
{
CMN_ERROR Error;
DWORD dwMsgService = 0;
BOOL ret1, ret2;
char szText[255];
MSG_FILTER_STRUCT MsgFilter;
DWORD dwNotifyMask = MSG_NOTIFY_MASK_MSGLIST:
		// 0 - Connect without callback
                // MSG_NOTIFY_MASK_MSGLIST // Single notify messages
                // MSG_NOTIFY_MASK_LOCK // Locked notify messages
                // MSG_NOTIFY_MASK_ARCHIV // Archive notify messages
                // MSG_NOTIFY_MASK_DATA // Data requests
                // MSG_NOTIFY_MASK_ALL // All types of notify messages

memset(&Error,0,sizeof(CMN_ERROR));
memset(&MsgFilter,0,sizeof(MSG_FILTER_STRUCT));

MsgFilter.dwFilter = MSG_FILTER_NR;
MsgFilter.dwMsgNr[0] = 500; //nr_from
MsgFilter.dwMsgNr[1] = 525; //nr_to
//MsgFilter.dwFilter = MSG_FILTER_CLASS;
//MsgFilter.dwMsgClass = 0x100;
//MsgFilter.dwMsgType[10] = 145;

ret1 = MSRTStartMsgService( &dwMsgService, myMSG_SERVICE_NOTIFY_PROC, &MsgFilter, dwNotifyMask, NULL, &Error);
if(FALSE == ret1)
    {
        sprintf(szText, "Error in MSRTStartMsgService: E1= 0x%08lx ; E2= 0x%08lx ; %s",  Error.dwError1, Error.dwError2, Error.szErrorText);
    }
    else
    {
       printf("MSRTStartMsgService - %i\r\n", ret1);
	ret2 = MSRTEnumMsgRTData(dwMsgService, &Error);
	if(FALSE == ret2)
      {
        sprintf(szText, "Error in MSRTEnumMsgRTData: E1= 0x%08lx ; E2= 0x%08lx ; %s",  Error.dwError1, Error.dwError2, Error.szErrorText);
      }
      else
      {
	  printf("MSRTEnumMsgRTData - %i\r\n", ret2);
      }
    }
if(dwMsgService != 0)
  MSRTStopMsgService( dwMsgService, NULL );
Callback функция myMSG_SERVICE_NOTIFY_PROC

Код: Выделить всё

#include "msrtapi.h"
#include "apdefap.h"
BOOL myMSG_SERVICE_NOTIFY_PROC(DWORD dwNotify, BYTE* lpbyData, DWORD dwItems, void* lpvUser )
{
MSG_RTDATA_INSTANCE_STRUCT* pMsgRtData;
DWORD i;
TCHAR szText[255];
DWORD count;
S_MESSINFO* p_mess;
MSG_TEXTVAL_STRUCT textval;
memset(&textval, 0, sizeof(MSG_TEXTVAL_STRUCT));
switch (dwNotify)
    {
    case MSG_NOTIFY_MSGENUM:
        {	
            pMsgRtData = (MSG_RTDATA_INSTANCE_STRUCT*)lpbyData;
            for(i=0; i < dwItems; i++)
            {
              if(pMsgRtData)
              {         
                   //textval = (MSG_TEXTVAL_STRUCT)pMsgRtData[i].mtTextValue;         
                   //sprintf(szText,"..MSGENUM : MsgState= %x; MsgNr = %d; MsgText= %s", pMsgRtData[i].dwMsgState, pMsgRtData[i].dwMsgNr, textval.szText);	          
			//сам текст сообщения в читаемом виде получить не получилось.
			//Пришлось лезть в БД wincc и получать текст по номеру (dbo.MSMsgs, dbo.CC_Alg_VarList)
              }
            }
            break;
        }
        default:
            break;
}
return TRUE;
Ответить

Вернуться в «WinCC»