ЖУРНАЛ СТА №1/1999
в АСУ ТП уже несколько лет и давно перешел в разряд системных вещей. Второй и третий способы передачи — обычные Send и Reply, весь протокол которых сводится лишь к формату дан- ных (Send и Reply — функции WATCOM C, обеспечивающие синхронную пере- дачу данных между задачами в ОС QNX). А вот передача каналов клиентам применена нами впервые именно в Сервисе АИС, посему о ней несколько подробней. Передача Сервисклиент Каналы информации пронумерова- ны, и каждому соответствует некий би- товый флаг. В общей памяти размещена матрица обмена (пример 1), строки ко- торой соответствуют каналам инфор- мации, а столбцы — клиентам. Модуль, обновляющий данные того или иного канала, расписывает единицей соответ- ствующую строку матрицы (пример 2). Первым делом клиент делает запрос на регистрацию. Сервис выделяет сво- бодный столбец матрицы и возвращает его номер клиенту в качестве подтверж- дения регистрации. При запросе дан- ных клиент присылает присвоенный ему номер и две битовые маски, соот- ветствующие каналам. В нашем случае маска имеет размерность long, то есть рассчитана на 32 канала (по числу би- тов). Первая маска содержит флаги тех каналов, которые вообще интересуют клиента, а вторая — флаги тех каналов, которые необходимо передать, незави- симо от того, обновлялись ли они со времени последнего сеанса или нет (при самом первом запросе, например, обе эти маски совпадают). Сервис при обработке этого запроса (пример 3), ориентируясь на присланные маски и соответствующий клиенту столбецмат- рицы обмена, собирает в пакет и отсы- лает клиенту только те из интересую- щих его каналов, которые либо запро- шены, так сказать, принудительно, либо обновлены с момента последнего сеан- са, после чего столбец матрицы обнуля- ется. Сервис отключает клиента либопо его запросу, либопотайм-ауту. Вприме- ре 4 приведен фрагмент программы клиента, обеспечивающий запрос и по- лучение данных по описанной схеме. Клиенты Сервиса Самые главные клиенты Сервиса — операторские станции. Конечно же, они могут выдавать в Сервис и управ- ляющие воздействия, но львиную до- лю времени все же заняты простым отоб- ражением информации. В базовом ва- рианте на операторской станции этим занимается проект RTWin (рис. 6). ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ МЕТАЛЛУРГИЯ 77 1/99 main() { struct COMMON_AIS *shmem; //Указатель на общий сегмент памяти short num; //Номер датчика short stat; //Статус датчика ... shmem->chan_dat.status[num]=stat; memset(&shmem->matrix[CHAN_DAT][0],1,CLIENTS); ... } Пример 2. Модуль Сервиса, изменяющий данные информационного канала Драйвер очередей Агент сообщений Администратор базы Sybase SQL Anywhere Узел сервиса АИС Произвольный узел Узел базы данных Рис. 5. Путь передачи сообщения в базу данных main() { struct COMMON_AIS *shmem; pid_t pid; /* идентификатор процесса сервиса */ int off,size,i; long flag; struct bsend B; while( 1 ) { pid=Receive(0,&B,sizeof(struct bsend)); switch(B.head.type) { case I_AM_CLIENT: /* Запрос Клиента */ size=sizeof(struct d_head); switch(B.head.subtype) { case CLIENT_DATA: /* Запрос данных каналов */ off=0; /* Установить флаги "поспевших" каналов */ flag=0L; for(i=0; i<CHANS; i++) /* см. пример 1. */ { if(&shmem�>matrix[i][B.head.client]) flag|=(0x00000001<<i); } /* Оставить только интересующие клиента */ flag&=B.head.maska; /* и приформировать безусловно запрашиваемые */ B.head.flags¦=flag; //Флаги в выходной буфер клиенту /* Заполнение выходного буфера данными каналов */ if(flag&F_CHAN_TIME) { memmove(&B.data[off],&shmem->chan_time,sizeof(struct chan_TIME)); off+=sizeof(struct chan_TIME); shmem->matrix[CHAN_TIME][B.head.client]=0; } if(flag&F_CHAN_DAT) { memmove(&B.data[off],&shmem->chan_dat,sizeof(struct chan_DAT)); off+=sizeof(struct chan_DAT); shmem->matrix[CHAN_DAT][B.head.client]=0; } size=sizeof(struct d_head)+off; Reply(pid,&B,size); /* Отправить Клиенту */ break; ... default: break; Reply(pid,NULL,0); /* Ответ на неопределенный запрос клиента */ } ... default: Reply(pid,NULL,0); /* Ответ на неопределенный запрос */ break; } } } Пример 3. Передача группы каналов по запросу клиента
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy