Не могу вспомнить, как в WinCC 7.4 sp1 можно отловить факт появления новой тревоги, что бы уже потом, например, сделать видимым AlarmControl на экране. И можно ли отобразить количество тревог (всего и не заквитированных). Вроде эта инфа содержится в статус баре AlarmControl , но как ее из него вытащить!?
Подскажите, кто знает, пожалуйста
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Как узнать, что есть новые неквитированные тревоги
Модератор: Глоб.модераторы
-
- здесь недавно
- Сообщения: 3
- Зарегистрирован: 21 окт 2020, 00:25
- Имя: Михаил
- Благодарил (а): 2 раза
Как узнать, что есть новые неквитированные тревоги
Неужели это такой сложный вопрос, мне казалось, что еще в версии 5.1 это реализовывалось? Или я ошибаюсь и в WinCC нет такого механизма? Это будет очень странно, данный функционал реализован во всех остальных, известных мне скадах?
-
- освоился
- Сообщения: 222
- Зарегистрирован: 19 сен 2019, 10:09
- Имя: Макс
- Страна: Россия
- город/регион: Славянск-на-Кубани
- Благодарил (а): 5 раз
- Поблагодарили: 38 раз
Как узнать, что есть новые неквитированные тревоги
Можно отловить факт появления тревоги ч/з ПЛК, любая тревога поднимает бит, сброс сигнализации сбрасывает бит.
Видимость AlarmControl привязать к этому же биту. Как сделать это ч/з WinCC не знаю, наверное никак. Можно попробовать ч/з скрипты, может что-то и получится.
Квитированные/активные/неактивные/неквитированные/итд содержатся в разных журналах, переключаться между ними можно изменяя MessageListType.
Видимость AlarmControl привязать к этому же биту. Как сделать это ч/з WinCC не знаю, наверное никак. Можно попробовать ч/з скрипты, может что-то и получится.
Квитированные/активные/неактивные/неквитированные/итд содержатся в разных журналах, переключаться между ними можно изменяя MessageListType.
WinCC 7.4 SP1 Upd15, Step5.6
-
- освоился
- Сообщения: 208
- Зарегистрирован: 16 дек 2011, 15:13
- Имя: Алексей
- Страна: Россия
- Благодарил (а): 67 раз
- Поблагодарили: 53 раза
Как узнать, что есть новые неквитированные тревоги
в AlarmLogging каждому классу сообщений WinCC создает групповое сообщение, куда включаются все сообщения этого класса. В настройках группового сообщения есть поля для назначения тегов: тег состояния, тег блокировки, тег квитирования, тег скрытия.
Групповое сообщение может иметь два состояния:
1) Состояния activated/deactivated (включено/отключено) указывают соответствующее состояние одного из вложенных сообщений.
2) Состояние квитирования указывает, требуется ли для инициирующего одиночного сообщения, включенного в групповое сообщение, квитирование и прошло ли уже это сообщение квитирование.
Так вот, если в поле для тега состояния задать тег (причем надо знать какого типа: например 8-bit, 16-bit, 32 bit) 32 битное целое и указать бит состояния 0, то:
0-вой бит этого тега будет показывать - появилось какое -то сообщение этого класса
16-бит этого тега будет показывать - содержится ли в групповом сообщении сообщение, требующее квитирования, которое еще не прошло квитирование.
Групповое сообщение может иметь два состояния:
1) Состояния activated/deactivated (включено/отключено) указывают соответствующее состояние одного из вложенных сообщений.
2) Состояние квитирования указывает, требуется ли для инициирующего одиночного сообщения, включенного в групповое сообщение, квитирование и прошло ли уже это сообщение квитирование.
Так вот, если в поле для тега состояния задать тег (причем надо знать какого типа: например 8-bit, 16-bit, 32 bit) 32 битное целое и указать бит состояния 0, то:
0-вой бит этого тега будет показывать - появилось какое -то сообщение этого класса
16-бит этого тега будет показывать - содержится ли в групповом сообщении сообщение, требующее квитирования, которое еще не прошло квитирование.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- здесь недавно
- Сообщения: 3
- Зарегистрирован: 21 окт 2020, 00:25
- Имя: Михаил
- Благодарил (а): 2 раза
Как узнать, что есть новые неквитированные тревоги
Спасибо, но через ПЛК не комильфо ))), тем более когда их много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, при этом, у сообщений остается пустым? Заранее спасибо
-
- освоился
- Сообщения: 208
- Зарегистрирован: 16 дек 2011, 15:13
- Имя: Алексей
- Страна: Россия
- Благодарил (а): 67 раз
- Поблагодарили: 53 раза
Как узнать, что есть новые неквитированные тревоги
Именно так..., еще надо номер бита указывать
Т.е, например: у Вас два класса сообщений: Тревоги и Ошибки.
В групповом сообщении и того и другого класса указываете 32 битный тег (один и тот же), НО номер бита для Тревог, например = 0,
а для Ошибок = 1.
В 0 бите для Тревог - активно/неактивно, 0 + 16 = 16 - в 16 бите - все квитированы\какая-то не квитирована тревога.
В 1 бите для Ошибок - активно/неактивно, 1 + 16 = 17 - в 17 бите - все квитированы\какая-то не квитирована ошибка
Не знаю...
Это если хотите - можете поймать конкретное сообщение и как то на него отреагировать...типа feedback от AlarmLogging на каждое сообщение
Подход тут такой же, как и для группового сообщения.
Найдите руководство по алармам для WinCC - там это расписано.
-
- здесь недавно
- Сообщения: 28
- Зарегистрирован: 15 фев 2018, 07:17
- Имя: Александр
- Страна: Россия
- город/регион: Новокузнецк
- Поблагодарили: 9 раз
Как узнать, что есть новые неквитированные тревоги
Через ODK функции.
1. Вывод количества тревог
2. Найти актуальные сообщения
Основная функция
Callback функция myMSG_SERVICE_NOTIFY_PROC
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");
Основная функция
Код: Выделить всё
#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 );
Код: Выделить всё
#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;