Ну вот и первая ласточка в разделе посвященном S-12.
Кто из вас не сталкивался с такой ситуацией (ответ: те, у кого есть ночные смены!), приходишь с утра на станцию, а там куча DURO и MLCU скопилось за ночь. И вот рабочий день начинается с удаления аварий. Но меня это в последнее время не волнует, так как раньше. Ну разве, что маленько "прифигеешь" с этих абонентов, когда DUROшки на один экран не помещаются, отметишь про себя, что некоторые люди получают гораздо больше тебя. И выдаешь в ответ на эту несправедливость заветные три буквы. Нет, нет! Это не те буквы, что вы подумали, вот эти буквы: DA:. Как видите все в рамках приличия!
Как вы поняли, справляться с утренним трудовым стрессом нашему коллективу помогает маленький, незаметный, шустрый макрос. Впрочем, он продолжает помогать и в течении всего остального рабочего дня. Например, вышла пресловутая DUROшка, вам бы надо побежать в кросс (ну, может вам и не надо, а нам в обязательном порядке), проверить канал на безотбойность. Ну, да это просто: скажите станции DA: и идите контролировать канал!
И так, макрос!
Идея создания макроса возникла у меня, когда я прочитал в DP 0019 о отом, что ММС команда DISPLAY-ACTIVE-ALARMS выводит содержимое отношения R_ALRECE. Почему бы не написать макрос, который просматривает содержимое этого отношения и выполняет команду DELETE-ALARM? И макрос был написан, сегодняшний свой вид, макрос приобрел в ходе постоянных модификаций в течении двух последних лет. С помощью макроса удаляются только два типа аварий DURO и MLCU до остальных аварий ему нет дела!
Трепанация
REM MAC DA Если макрос уже в памяти - убираем его
DEF MAC DA и определяем новый макрос (собственно, начало тела макроса)
INI C Активируем P&L
FET REL 173B Получаем информацию о R_ALRECE для дальнейшей работы
ADD.MOU,.DAY,.HOUR,.MIN,.SEC,.J=1,.OPR,.OFS,.POS Объявляем переменные
ADD.RIAP=DS:SI+(WOR ES:DI+6) Получаем адрес Relation Information Area
ADD.I=DS:SI Абсолютный адрес primary area
COU WOR DS:RDX+8 Будем искать только до последнего занятого тюпла
IF BYT.I=84 OR BYT.I=70 Тип аварии M_ALMT_MLCU или M_ALMT_DURO_CHARG?
.OFS=(.J-1)/8 Если да, то начинается определение
.POS=.J-.OFS*8 используется этот тюпл на данный момент
.OPR=100 или нет, это связано с тем, что при удалении аварии, т.е.
COU .POS удалении тюпла из отношения, не происходит обнуления.
.OPR=.OPR/2 Т.о. что бы не пытаться удалить уже удаленную аварию нужно
ENDC просмотреть Tuple Status Info.
IF (BYT(.RIAP+20T+.OFS)AND.OPR)=0 Ага! Тюпл используется!
.MOU=BYT .I+16T Присваиваем переменным значения
.DAY=BYT .I+17T для дальнейшего использования в команде
.HOUR=BYT .I+18T
.MIN=BYT .I+19T
.SEC=BYT .I+20T
BAS=T Это так. На всякий случай.
<1189:1=0&%(.MOU)&%(.DAY)&%(.HOUR)&%(.MIN)&%(.SEC) ; Наконец-то выполняем команду
ENDIF
ENDIF
.J=.J+1
.I=.I+1E Выполняем приращение переменных, используемых в цикле
END конец которого, вот он!
DAC Деактивируем P&L
EM Вот и макросу конец...
Заключение
Спасибо тем людям, которые откликнулись на мое сообщение в форуме, и выслали мне макросы для удаления аварий. Спасибо им за то, что я теперь с чистой совестью могу сказать, что этот макрос по большинству параметров лучше тех, которые я видел. При написании макроса использовались "Datastructures R7 EC7.XP" и "MPTMON USER MANUAL". К ним и отсылаю читателей, заинтересованных в более глубоком изучении, приемов использованных в этом макросе.
Максим Осташов
Размещено на www.s12most.mailru.com 11 апреля 2001
Есть вопросы или дополнения, конструктивная критика? Пишите!