240-2285 (Автоматизированное рабочее место регистрации и документирования комплекса средств автоматизации), страница 17
Описание файла
Документ из архива "Автоматизированное рабочее место регистрации и документирования комплекса средств автоматизации", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "240-2285"
Текст 17 страницы из документа "240-2285"
Объем памяти, занимаемый программой равен: V = 64 Кбайта.
В организационно-экономической части дипломного проекта было проведено планирование разработки с построением сетевого графика, расчет договорной цены разработки, обоснована экономическая целесообразность темы.
Договорная цена разработки составляет: Цд = 916 152 руб. в ценах 1998г.
В разделе “Охрана труда и техника безопасности” был выбран оптимальный режим освещенности и проведен расчет информационной нагрузки оператора.
Значение информационной нагрузки оператора АРМ РД составляет 0.6 бит/с.
В разделе “Гражданская оборона” были приведены требования по инженерной защите оператора и оборудования ПЭВМ от воздействия высоких температур при взрывах в ЧС мирного времени.
В разделе “Эргономика” была произведена оценка рабочего места оператора и разработано оптимальное рабочее место оператора.
Приложение 1
Схемы алгоритмов программ
Приложение 2
Тексты программ
// inquiry.prj
//INQUIRY\inquiry.c
// main(),initsearch(),mem_args()
// программа обработки запросов
#include
#include
#include
#include
#include
#include
#include
#include
#include "pxengine.h"
TABLEHANDLE tblh; // дескриптор таблицы
RECORDNUMBER low,high; // границы интервала поиска
int nflds; // кол-во полей в таблице
int nformat; // формат результата
int handle; // дескриптор файла
void interval(long date1,long date2,char *time1, char *time2); // определение границ интервала поиска
void search3(char *argv[],int *x); // поиск с перечислениями
void search2(char *argv[],int *x,int n); // поиск без перечислений
void search1(void); // поиск только по дате и времени
void initsearch(char *argv[],int *x,int p,int n); // выбор варианта поиска
void recprint(int nformat); // расшифровка записи БД в строку и запись этой строки в файл
char sag[7][81]={
" ДАТА ВРЕМЯ ТЕКСТ СООБЩЕНИЯ \r\n",
" ДАТА ВРЕМЯ НАПР-Е А N РР ИСТ ВС ТЕКСТ СООБЩЕНИЯ \r\n",
" ДАТА ВРЕМЯ НАПР-Е N РР ТЕКСТ СООБЩЕНИЯ \r\n",
" ДАТА ВРЕМЯ НАПР-Е К-ВО ВС 1СЛ 2СЛ 3СЛ 4СЛ ТЕКСТ СООБЩЕНИЯ \r\n",
" ДАТА ВРЕМЯ ТИП-У П ВС ТЕКСТ СООБЩЕНИЯ \r\n",
" ДАТА ВРЕМЯ КСУМ0 КСУМ1 КСУМ2 КСУМ3 \r\n",
" ДАТА ВРЕМЯ КСУП1 КСУС1 КСУП2 КСУС2 КСУП3 КСУС3 \r\n"
}; // шапки таблиц
char *inqstr; // строки запроса
/* строка аргументов функции main:
argv[1] - имя файла БД; или "!", означающий, что строка аргументов передается через память;
argv[2] - вариант поиска; 0 - поиск по всей БД, 1 - поиск в едином интервале по дате и времени, 2 - поиск в интервале времени по каждому дню интервала дат, 3 - поиск за один день в интервале времени;
argv[3] - дата;
argv[4] - время;
argv[5] и далее - искомые значения полей БД ( argv[5] - третьего поля, argv[6] - четвертого поля и т.д. ); "-" обоз-
начает любое значение данного поля; в случае нескольких искомых значений по одному полю (перечисление) они разделяются запятыми; пробелы в значениях заменены на '_'. */
void main(int argc,char *argv[])
{
int *x; // x[i] - количество искомых значений по i-му полю
int n=0; // количество полей, для которых заданы значения для поиска
int p=0; // количество полей c перечислениями
// значения x,n,p определяются без учета полей даты и времени
char *name[]={"all_inf","opi","shk","sbkdg","fk","ksum","ksum0"};
// имена баз данных
long date1,date2; // граничные значения интервала дат
int a,i,j,k;
char *c;
char **mem_args(void);
RECORDHANDLE rech;
RECORDNUMBER num;
// Получение аргументов в случае их передачи через память
if(argv[1][0]=='!')
{
argv=mem_args();
for(argc=0;argv[argc]!=NULL;++argc);
}
// определение формата записи для базы данных, к которой
// произведен запрос
for(i=0;i<=6;++i)
if(!strcmp(name[i],argv[1]) || !strcmp(name[i],argv[1]+5))
{ nformat=i;break;}
// открытие файла результатов запроса (inquiry.res) и
// запись в него строк запроса и шапки таблицы
for(i=argc-1;argv[i][0]=='-';--i) argc--;
handle=open("inquiry.res",
O_CREAT | O_TRUNC | O_WRONLY,S_IREAD | S_IWRITE );
for(i=1,j=0;i { inqstr=(char *)calloc(82,1); memset(inqstr+1,' ',79); inqstr[79]='\r'; inqstr[80]='\n'; inqstr[81]='\0'; for(c=inqstr;i { if(strlen(inqstr)+strlen(argv[i])>78+j) { if(strlen(argv[i])>50 && (strlen(inqstr)78)) { for(k=j+77-strlen(inqstr);argv[i][k]!=',';--k); strcat(c," "); strncat(c,argv[i]+j,k+1-j); j=k+1; } break; } strcat(c," "); strcat(c,argv[i]+j); j=0; } inqstr[strlen(inqstr)]=' '; _write(handle,inqstr,81); free(inqstr); } _write(handle,sag[nformat],81); // инициализация работы с БД j=coreleft()/1024-50; if(j>256) j=256; if(a=PXSetDefaults(j,1,30,MAXLOCKHANDLES,3,SortOrderAscii)) printf("\n%s",PXErrMsg(a)); if(a=PXInit()) printf("\n%s",PXErrMsg(a)); if(a=PXTblOpen(argv[1],&tblh,0,0)) printf("\n%s",PXErrMsg(a)); PXRecNFlds(tblh,&nflds); x=(int *)calloc(argc+1,sizeof(int)); // разбор аргументов запроса for(i=5;i { if(argv[i][0]=='-') continue; ++n; for(c=argv[i],j=1;*c!='\0';++c) { if(*c==',') ++j; if(*c=='_') *c=' '; } x[i-2]=j; if(j>1)++p; } // главный блок switch(argv[2][0]) { case '0': low=1;PXTblNRecs(tblh,&high); initsearch(argv,x,p,n); break; case '1': PXDateEncode(atoi(argv[3]),atoi(argv[3]+3),atoi(argv[3]+6),&date1); PXDateEncode(atoi(argv[3]+11),atoi(argv[3]+14),atoi(argv[3]+17),&date2); interval(date1,date2,argv[4],argv[4]+9); initsearch(argv,x,p,n); break; case '2': PXDateEncode(atoi(argv[3]),atoi(argv[3]+3),atoi(argv[3]+6),&date1); PXDateEncode(atoi(argv[3]+11),atoi(argv[3]+14),atoi(argv[3]+17),&date2); interval(date1,date2,argv[4],argv[4]+9); if(low==1 && !high) break; if(low==1) { PXRecBufOpen(tblh,&rech); PXRecGet(tblh,rech); PXGetDate(rech,1,&date1); PXRecBufClose(rech); } PXTblNRecs(tblh,&num); if(high==num) { PXRecBufOpen(tblh,&rech); PXRecLast(tblh); PXRecGet(tblh,rech); PXGetDate(rech,1,&date2); PXRecBufClose(rech); } for(;date1<=date2;++date1) { interval(date1,date1,argv[4],argv[4]+9); if(low>high) continue; initsearch(argv,x,p,n); } break; case '3': PXDateEncode(atoi(argv[3]),atoi(argv[3]+3),atoi(argv[3]+6),&date1); interval(date1,date1,argv[4],argv[4]+9); initsearch(argv,x,p,n); } free(x); if(a=PXTblClose(tblh)) printf("\n%s",PXErrMsg(a)); PXExit(); close(handle); } // initsearch // выбор функции поиска void initsearch(char *argv[],int *x,int p,int n) { if(low>high) return; if(p) search3(argv+5,x); else if(n) search2(argv,x,n); else search1(); } // Функция mem_args возвращает адрес строки параметров в случае ее передачи через память #include "conn_mem.h" char **mem_args() { char ***dat; dat=(char ***)conn_mem(); return dat[ARGS_OFF/4]; } // bs2_inq.prj //INQUIRY\interval.c // interval() // определение граничных номеров интервала поиска #include #include #include "pxengine.h" #include "def.h" void interval (long date1,long date2,char *time1,char *time2) { RECORDHANDLE rech; itoa(atoi(time2+6)+1,time2+6,10); PXRecBufOpen(tblh,&rech); PXPutDate(rech,1,date2); PXPutAlpha(rech,2,time2); if(PXRecInsert(tblh,rech))printf("error"); PXRecNum(tblh,&high); --high; PXRecDelete(tblh); PXPutDate(rech,1,date1); PXPutAlpha(rech,2,time1); if(PXRecInsert(tblh,rech))printf("error"); if(PXRecNum(tblh,&low))printf("error"); PXRecDelete(tblh); PXRecBufClose(rech); } // inquiry.prj //INQUIRY\recprint.c // recprint() // форматирование и запись в файл найденной строки #include #include #include #include #include "pxengine.h" #include "def.h" #include "disp.h" void recprint() { long date; int month,day,year; int format[7][7]= { {21,0,0,0,0,0,0},{21,28,30,35,38,42,46}, {21,29,34,37,0,0,0},{ 21,29,35,38,43,48,53 }, { 21,27,29,33,0,0,0 },{ 21,28,35,42,49,0,0 }, { 21,28,35,42,49,56,63 } }; static char string[82]; // результирующая строка RECORDHANDLE rech; union REGS r; int a,i; memset(string,' ',82); PXRecBufOpen(tblh,&rech); PXRecGet(tblh,rech); PXGetDate(rech,1,&date); PXDateDecode(date,&month,&day,&year); sprintf(string,"%.02d\\%.02d\\%.04d ",month,day,year); PXGetAlpha(rech,2,10,string+11); for(i=3;i<=nflds;++i) PXGetAlpha(rech,i,sizeof(string)-format[nformat][i-2], string+format[nformat][i-3]-1); for(i=0;i<=80;++i) if(string[i]=='\0') string[i]=' '; string[79]='\r'; string[80]='\n'; _write(handle,string,81); PXRecBufClose(rech); // передача управления диспетчеру // (только для передачи cимвола на принтер!) // после каждой найденной записи r.h.ah=1; int86(DISP,&r,&r); } // inquiry.prj //INQUIRY\search12.c // search1(),search2(),(search3() см в файле search3.c) // search1 - все записи в заданном интервале // search2 - задано не более одного искомого значения по каждому полю // search3 - более одного искомого значения xотя бы по одному полю /* исходные данные: int *x; ,где x[i] - количество искомых значений по i-му полю ( только для search2 ) char *argv[] - см. комментарии в inquiry.c (только для search2) RECORDNUMBER low,high; - границы интервала поиска */ #include #include "pxengine.h" #include "def.h" void search2(char *argv[],int *x,int n) { int a,i,j=0,*y; int yes; char *c,*c2; char arg[10]; RECORDHANDLE *rec; RECORDNUMBER *s,max=low; s=(long *)calloc(n,sizeof(RECORDNUMBER)); rec=(unsigned int *)calloc(n,sizeof(RECORDHANDLE)); y=(int *)calloc(n,sizeof(int)); for(i=3;j { if(!x[i]) continue; PXRecBufOpen(tblh,rec+j); PXPutAlpha(rec[j],i,argv[i+2]); y[j++]=i; } while(1) { for(i=0;i { if(max==1) { if (!(a=PXSrchFld(tblh,rec[i],y[i],SEARCHFIRST))) PXRecNum(tblh,&s[i]); } else if(s[i] { PXRecGoto(tblh,max-1); if(!(a=PXSrchFld(tblh,rec[i],y[i],SEARCHNEXT))) PXRecNum(tblh,&s[i]); } if(a||s[i]>high) { free(s);free(rec);free(y); return; } } for(i=1,yes=1,max=s[0];i { if(s[i]!=max) yes=0; if(s[i]>max) max=s[i]; } if(yes) { ++max;recprint(); } } } void search1(void) { RECORDNUMBER i; for(i=low;i<=high;++i) { recprint(); PXRecNext(tblh); } } // inquiry.prj //INQUIRY\search3.c // search3() // поиск /* исходные данные: int *x; ,где x[i] - количество искомых значений по i-му полю char *args[] - искомые значения полей БД ( args[0] - третьего поля, argv[1] - четвертого поля и т.д. ); RECORDNUMBER low,high; - границы интервала поиска */ // search1 - все записи в заданном интервале // search2 - не более одного искомого значения по каждому полю // search3 - более одного искомого значения xотя бы по одному полю #include #include #include "pxengine.h" #include "def.h" void search3(char *args[],int *x) { /* rec - массив массивов буферов для поиска,его размерность равна количеству полей в таблице. Размерность каждого из массивов rec[i] равна количеству искомых значений по i-му полю таблицы (то есть == х[i]). В каждый буфер заносится одно искомое значение ( например, в rec[3][0] - заносится первое искомое значение по 3-му полю таблицы). Каждому буферу ( rec[i][j] )соответствует элемент массива массивов z ( z[i][j] ), в котором хранится текущий номер найденной записи по данному буферу (то есть записи, в соответствующем поле которой находится значение, равное значению, занесенному в буфер). В массиве s хранятся текущие номера найденных строк по каждому полю ( s[i] минимум из всех z[i][j] по этому i). max - текущий номер записи при поиске ( то есть записи с номерами меньше max уже просмотрены ). */ RECORDHANDLE **rec; int i,j,k; int yes; char *c1,*c2; char arg[10]; RECORDNUMBER *s,**z,max=low; int a; // выделение памяти под массивы rec,z,s // и открытие буферов s=(long *)calloc(nflds,sizeof(RECORDNUMBER)); rec=(unsigned int **)calloc(nflds,sizeof(RECORDHANDLE *)); z=(long **)calloc(nflds,sizeof(RECORDNUMBER *)); for(i=3;i<=nflds;++i) if(x[i]) { rec[i]=(unsigned int *)calloc(x[i],sizeof(RECORDHANDLE)); z[i]=(long *)calloc(x[i],sizeof(RECORDNUMBER)); for(j=0;j } // заносим в буфера значения из args // ( значения для одного поля разделены в args запятыми ) for(i=3;i<=nflds;++i) { if(!x[i]) continue; if(x[i]==1) PXPutAlpha(rec[i][0],i,args[i-3]); else { c1=args[i-3]; for(k=0;k { c2=arg; while(*c1!=',' && *c1!='\0') *c2++=*c1++; *c2='\0'; ++c1; PXPutAlpha(rec[i][k],i,arg); } } } // цикл поиска while(1) { for(i=3;i<=nflds;++i) { // 1) Для каждого буфера находим запись с значением равным занесенному в этот буфер и с номером >= max. // Найденные номера заносим в соотвествующие z[i][k] // Если искомых записей по данному буферу нет, заносим в z[i][k] номер, превышающий верхнюю // границу интервала поиска if(!x[i]) continue; for(k=0;k { if(max==1) { if(PXSrchFld(tblh,rec[i][k],i,SEARCHFIRST))z[i][k]=high+1; else PXRecNum(tblh,&z[i][k]); } else if (z[i][k] { PXRecGoto(tblh,max-1); if(PXSrchFld(tblh,rec[i][k],i,SEARCHNEXT)) z[i][k]=high+1; else PXRecNum(tblh,&z[i][k]); } } // 2) Для каждого поля определяем значение s[i] // Если хотя бы по одному полю произошел выход за пределы интервала поиска, значит поиск закончен s[i]=z[i][0]; for(k=1;kz[i][k]) s[i]=z[i][k]; if(s[i]>high) { for(i=3;i<=nflds;++i) if(x[i]) { for(j=0;j free(rec[i]); free(z[i]); } free(s); free(rec); free(z); return; } } // 3), 4) // Проверяем совпадение значений s[i]. // Если значения s[i] совпадают для всех полей по которым производится поиск, значит найдена искомая // ( т.е. удовлетворяющая заданным условиям ) запись, в этом случае вызываем функцию recprint // Определяем значение max для следующей итерации, это значение равно максимуму из s[i]. for(i=3;!x[i];++i); max=s[i]; for(++i,yes=1;i { if(!x[i]) continue; if(s[i]!=max) yes=0; if(s[i]>max) max=s[i]; } if(yes) { PXRecGoto(tblh,max);++max;recprint(); } } } // bs2_inq.prj // BS2_INQ\bs2_inq.c // main() // программа обработки запросов для второй формы байтов состояний #include #include #include #include #include #include #include #include "pxengine.h" #include "devices.h" TABLEHANDLE tblh; // дескриптор таблицы RECORDNUMBER low,high; // границы интервала поиска int nflds; // кол-во полей в таблице int handle; // дескриптор файла void interval(long date1,long date2,char *time1, char *time2); // определение границ интервала поиска void search(char *type); // поиск void recprint(void); // расшифровка записи БД в строку и запись этой строки в файл char *sag; // шапкa таблицы char *sag2; // шапкa таблицы-вторая строка char *inqstr; // строка запроса int length; // длина строки в таблице /* строка аргументов функции main: argv[1] - не используется argv[2] - вариант поиска; 0 - поиск по всей БД, 1 - поиск в едином интервале по дате и времени, 2 - поиск в интервале времени по каждому дню интервала дат, 3 - поиск за один день в интервале времени; argv[3] - дата; argv[4] - время; argv[5] - тип устройства */ void main(int argc,char *argv[]) { long date1,date2; // граничные значения интервала дат int a,i; char *c; RECORDHANDLE rech; RECORDNUMBER num; // открытие файла результатов запроса (inquiry.res) и запись в него строки запроса и шапки таблицы handle=open("inquiry.res", O_CREAT | O_TRUNC | O_WRONLY,S_IREAD | S_IWRITE ); for(i=0;strcmp(devices[i].type,argv[5]) && i<20;++i); switch(i) { case 0: //ШЭ-00 case 8: //ШЭ-08 sag=(char *)calloc(81,1); strcpy(sag," ДАТА ВРЕМЯ ТИП_У П ВС СОСТОЯНИЕ_ШКАФА СЕТЬ1 СЕТЬ2 \r\n"); break; case 1: //ШП-01 case 9: //ШП-09 sag=(char *)calloc(81,1); strcpy(sag," ДАТА ВРЕМЯ ТИП_У П ВС СОСТОЯНИЕ_ШКАФА \r\n"); break; case 4: //ШК-04 case 12: //ШК-12 sag=(char *)calloc(100,1); strcpy(sag," ДАТА ВРЕМЯ ТИП_У П ВС КАНАЛЫ ЛИНИИ КНОН ФКДТ НСПД ФЗ ПИТАНИЕ Д-Ж К--Ы Б---ЫЕ К--Ы \r\n"); break; case 2: //РМ-02 sag=(char *)calloc(81,1); sag2=(char *)calloc(81,1); strcpy(sag, " ДАТА ВРЕМЯ ТИП_У П ВС БЛОКИРОВКА ЕСТЬ СВЯЗЬ С ВК \r\n"); strcpy(sag2," ПЭВМ1 по ФК по ЛС1 по ЛС3 \r\n"); break; case 10: //РМ-10 sag=(char *)calloc(81,1); sag2=(char *)calloc(81,1); strcpy(sag, " ДАТА ВРЕМЯ ТИП_У П ВС БЛОКИРОВКА ЕСТЬ_СВЯЗЬ_С_ВК \r\n"); strcpy(sag2," ПЭВМ2 по ФК по ЛС2 по ЛС4 \r\n"); break; case 5: //РМ05Г case 13: //РМ13П sag=(char *)calloc(81,1); strcpy(sag," ДАТА ВРЕМЯ ТИП_У П ВС ЛИНИИ КНОН ФКДТ НСПД ФЗ \r\n"); break; case 3: //В case 6: //КС1 case 14: //КС2 case 15: //АС sag=(char *)calloc(81,1); strcpy(sag," ДАТА ВРЕМЯ ТИП_У П ВС КАНАЛЫ ЛИНИИ ФКДТ НСПД ФЗ \r\n"); break; case 7: //ВМ sag=(char *)calloc(81,1); strcpy(sag," ДАТА ВРЕМЯ ТИП_У П ВС АВАРИЯ ПИТАНИЯ НЕИСПР КАН КАНАЛЫ \r\n"); break; case 16: //ВУ16 case 17: //ВУ17 case 18: //ВУ18 case 19: //ВУ19 sag=(char *)calloc(81,1); strcpy(sag," ДАТА ВРЕМЯ ТИП_У П ВС МАГИСТРАЛЬ ПРИЕМА КНОН \r\n"); break; } length=strlen(sag); inqstr=(char *)calloc(length+1,1); memset(inqstr+1,' ',length); for(c=inqstr,i=1;i { strcat(c," "); strcat(c,argv[i]); } inqstr[strlen(inqstr)]=' '; strcpy(inqstr+length-2,"\r\n"); _write(handle,inqstr,length); _write(handle,sag,length); _write(handle,sag2,length); // инициализация работы с БД i=coreleft()/1024-50; if(i>256) i=256; if(a=PXSetDefaults(i,1,30,MAXLOCKHANDLES,3,SortOrderAscii)) printf("\n%s",PXErrMsg(a)); if(a=PXInit()) printf("\n%s",PXErrMsg(a)); if(a=PXTblOpen("fk",&tblh,0,0)) printf("\n%s",PXErrMsg(a)); PXRecNFlds(tblh,&nflds); // главный блок if (argv[2][0]=='0') { low=1;PXTblNRecs(tblh,&high); search(argv[5]); } else if (argv[2][0]=='1') { PXDateEncode(atoi(argv[3]),atoi(argv[3]+3),atoi(argv[3]+6),&date1); PXDateEncode(atoi(argv[3]+11),atoi(argv[3]+14),atoi(argv[3]+17),&date2); interval(date1,date2,argv[4],argv[4]+9); search(argv[5]); } else if (argv[2][0]=='2') { PXDateEncode(atoi(argv[3]),atoi(argv[3]+3),atoi(argv[3]+6),&date1); PXDateEncode(atoi(argv[3]+11),atoi(argv[3]+14),atoi(argv[3]+17),&date2); interval(date1,date2,argv[4],argv[4]+9); if(low==1 && !high) if(low==1) { PXRecBufOpen(tblh,&rech); PXRecGet(tblh,rech); PXGetDate(rech,1,&date1); PXRecBufClose(rech); } PXTblNRecs(tblh,&num); if(high==num) { PXRecBufOpen(tblh,&rech); PXRecLast(tblh); PXRecGet(tblh,rech); PXGetDate(rech,1,&date2); PXRecBufClose(rech); } for(;date1<=date2;++date1) { interval(date1,date1,argv[4],argv[4]+9); if(low>high) continue; search(argv[5]); } } else if (argv[2][0]=='3') { PXDateEncode(atoi(argv[3]),atoi(argv[3]+3),atoi(argv[3]+6),&date1); interval(date1,date1,argv[4],argv[4]+9); search(argv[5]); } if(a=PXTblClose(tblh)) printf("\n%s",PXErrMsg(a)); PXExit(); close(handle); } // bs2_inq.prj // BS2_INQ\form2.c // form2() // расшифровка байтов состояния #include #include "devices.h" void form2(char *Type,char *bytes,char *text) { /* Type; тип устройства bytes; нерасшифрованные байты состояния text; буфер для расшифрованных БС */ int i; for(i=0;strcmp(devices [i].type,Type) && i<20;++i); switch(i) { case 0: // ШЭ-00 if(bytes[5]&0x04) strcpy(text,"НЕИСПРАВЕН"); else strcpy(text,"ИСПРАВЕН"); if(bytes[4]&0x02) strcpy(text+16,"CETЬ1"); break; case 8: // ШЭ-08 if(bytes[5]&0x04) strcpy(text,"НЕИСПРАВЕН"); else strcpy(text,"ИСПРАВЕН"); if(bytes[4]&0x04) strcpy(text+22,"СЕТЬ2"); break; case 1: // ШП-01 case 9: // ШП-09 if(bytes[5]&0x04) strcpy(text,"НЕИСПРАВЕН"); else strcpy(text,"ИСПРАВЕН"); break; case 4: // ШК-04 case 12: // ШК-12 if(bytes[4]&0x04) strcpy(text,"К1"); if(bytes[4]&0x02) strcpy(text+2,"К2"); if(bytes[4]&0x01) strcpy(text+4,"К3"); if(bytes[5]&0x04) strcpy(text+7,"Л1"); if(bytes[5]&0x02) strcpy(text+9,"Л2"); if(bytes[5]&0x01) strcpy(text+11,"Л3"); if(bytes[3]&0x01) strcpy(text+14,"КНОН"); if(bytes[3]&0x02) strcpy(text+19,"ФКДТ"); if(bytes[3]&0x04) strcpy(text+24,"НСПД"); if(bytes[2]&0x01) strcpy(text+29,"ФЗ"); if(bytes[12]&0x04) strcpy(text+32,"П1"); if(bytes[12]&0x02) strcpy(text+34,"П2"); if(bytes[12]&0x01) strcpy(text+36,"П3"); if(bytes[11]&0x04) strcpy(text+40,"ДК1"); if(bytes[11]&0x02) strcpy(text+43,"ДК2"); if(bytes[11]&0x01) strcpy(text+46,"ДК3"); if(bytes[10]&0x04) strcpy(text+51,"БК1"); if(bytes[10]&0x02) strcpy(text+54,"БК2"); if(bytes[10]&0x01) strcpy(text+57,"БК3"); break; case 3: // В case 6: // КС1 case 14: // КС2 if(bytes[4]&0x04) strcpy(text,"К1"); if(bytes[4]&0x02) strcpy(text+2,"К2"); if(bytes[4]&0x01) strcpy(text+4,"К3"); if(bytes[5]&0x04) strcpy(text+7,"Л1"); if(bytes[5]&0x02) strcpy(text+9,"Л2"); if(bytes[5]&0x01) strcpy(text+11,"Л3"); if(bytes[3]&0x02) strcpy(text+14,"ФКДТ"); if(bytes[3]&0x04) strcpy(text+19,"НСПД"); if(bytes[2]&0x01) strcpy(text+24,"ФЗ"); break; case 2: // РМ-02 if(bytes[5]&0x01) strcpy(text+3,"ЕСТЬ"); else strcpy(text+3,"НЕТ"); if(bytes[3]&0x04) strcpy(text+17,"НЕТ"); else strcpy(text+17,"ЕСТЬ"); if(bytes[2]&0x02) strcpy(text+24,"НЕТ"); else strcpy(text+24,"ЕСТЬ"); break; case 10: // РМ-10 if(bytes[5]&0x01) strcpy(text+3,"ЕСТЬ"); else strcpy(text+3,"НЕТ"); if(bytes[2]&0x01) strcpy(text+17,"НЕТ"); else strcpy(text+17,"ЕСТЬ"); if(bytes[2]&0x04) strcpy(text+24,"НЕТ"); else strcpy(text+24,"ЕСТЬ"); break; case 5: // РМ05Г case 13: // РМ13П if(bytes[5]&0x04) strcpy(text,"Л1"); if(bytes[5]&0x02) strcpy(text+2,"Л2"); if(bytes[5]&0x01) strcpy(text+4,"Л3"); if(bytes[3]&0x01) strcpy(text+7,"КНОН"); if(bytes[3]&0x02) strcpy(text+12,"ФКДТ"); if(bytes[3]&0x04) strcpy(text+17,"НСПД"); if(bytes[2]&0x01) strcpy(text+22,"ФЗ"); break; case 7: // ВМ if(bytes[5]&0x02) strcpy(text,"АВАРИЯ ПИТАНИЯ"); if(bytes[5]&0x04) strcpy(text+15,"НЕИСПР КАН"); if(bytes[4]&0x04) strcpy(text+26,"К1"); if(bytes[4]&0x01) strcpy(text+28,"К2"); if(bytes[4]&0x02) strcpy(text+30,"К3"); break; case 16: // ВУ16 case 17: // ВУ17 case 18: // ВУ18 case 19: // ВУ19 if(bytes[5]&0x04) strcpy(text,"НЕИСПР МАГ ПРИЕМА"); if(bytes[3]&0x01) strcpy(text+18,"КНОН"); break; case 15: // АС //Подкорректировать после согласования байта состояния if(bytes[4]&0x04) strcpy(text,"К1"); if(bytes[4]&0x02) strcpy(text+2,"К2"); if(bytes[4]&0x01) strcpy(text+4,"К3"); if(bytes[5]&0x04) strcpy(text+7,"Л1"); if(bytes[5]&0x02) strcpy(text+9,"Л2"); if(bytes[5]&0x01) strcpy(text+11,"Л3"); if(bytes[3]&0x02) strcpy(text+14,"ФКДТ"); if(bytes[3]&0x04) strcpy(text+19,"НСПД"); if(bytes[2]&0x01) strcpy(text+24,"ФЗ"); break; } } // bs2_inq.prj //BS2_INQ\interval.c // interval() // определение граничных номеров интервала поиска #include #include #include "pxengine.h" #include "def.h" void interval (long date1,long date2,char *time1,char *time2) { RECORDHANDLE rech; itoa(atoi(time2+6)+1,time2+6,10); PXRecBufOpen(tblh,&rech); PXPutDate(rech,1,date2); PXPutAlpha(rech,2,time2); if(PXRecInsert(tblh,rech))printf("error"); PXRecNum(tblh,&high); --high; PXRecDelete(tblh); PXPutDate(rech,1,date1); PXPutAlpha(rech,2,time1); if(PXRecInsert(tblh,rech))printf("error"); if(PXRecNum(tblh,&low))printf("error"); PXRecDelete(tblh); PXRecBufClose(rech); } // bs2_inq.prj // recprint.c // BS2_INQ\recprint() // форматирование и запись в файл найденной строки #include #include #include #include #include #include "pxengine.h" #include "def.h" #include "disp.h" void form2(char *,char *,char *); // расшифровка байтов состояния void recprint() { long date; // дата в формате БД int month,day,year; // расшифрованная дата char *string; // результирующая строка char *bytes; // нерасшифрованные байты состояния RECORDHANDLE rech; // дескриптор записи int a,i; union REGS r; string=(char *)calloc(length+1,1); bytes=(char *)calloc(45,1); PXRecBufOpen(tblh,&rech); PXRecGet(tblh,rech); PXGetDate(rech,1,&date); PXDateDecode(date,&month,&day,&year); sprintf(string,"%.02d\\%.02d\\%.04d ",month,day,year); PXGetAlpha(rech,2,9,string+11); //t PXGetAlpha(rech,3,6,string+20); //тип_у PXGetAlpha(rech,4,2,string+26); //п PXGetAlpha(rech,5,4,string+28); //вс PXGetAlpha(rech,6,45,bytes); //бс form2(string+20,bytes+16,string+31); for(i=0;i<=length;++i) if(string[i]=='\0') string[i]=' '; strcpy(string+length-2,"\r\n"); _write(handle,string,strlen(string)); PXRecBufClose(rech); free(bytes); free(string); // передача управления диспетчеру // (только для передачи cимвола на принтер!) // после каждой найденной записи //r.h.ah=1; // int86(DISP,&r,&r); } // bs2_inq.prj //BS2_INQ\search.c // search() // поиск #include #include "pxengine.h" #include "def.h" void search(char *type) { int a,i,y[2]; RECORDHANDLE rec[2]; RECORDNUMBER s[2],max=low; PXRecBufOpen(tblh,&rec[0]); PXRecBufOpen(tblh,&rec[1]); PXPutAlpha(rec[0],3,type); PXPutAlpha(rec[1],5,"БС "); y[0]=3;y[1]=5;s[1]=s[0]=0; while(1) { for(i=0;i<=1;++i) { if(max==1) { if (!(a=PXSrchFld(tblh,rec[i],y[i],SEARCHFIRST))) PXRecNum(tblh,&s[i]); } else if(s[i] { PXRecGoto(tblh,max-1); if(!(a=PXSrchFld(tblh,rec[i],y[i],SEARCHNEXT))) PXRecNum(tblh,&s[i]); } if(a||s[i]>high) { PXRecBufClose(rec[0]); PXRecBufClose(rec[1]); return; } } if(s[1]==s[0]) { ++max; recprint(); } else if(s[1]>s[0]) max=s[1]; else max=s[0]; } } // bs3_inq.prj // BS3_INQ\bs3_inq.c // main() // программа обработки запросов для третьей формы байтов состояния // вызывается из: // 1) main.prj, mloop2.c, bszapros() // 2) makeinq.prj, makeinq.c, makeinq() #include #include #include #include #include "pxengine.h" #include void form3(char *,char *,int); // расшифровка байтов состояния для третьей формы представления и их запись в файл результатов /* аргументы функции main : argv[1] - тип устройства */ void main(int argc,char *argv[]) { int a; int i; int handle; // дескриптор файла результатов поиска static char bytes[45]; // буфер для нерасшифрованных байтов состояния RECORDHANDLE rec; // дескриптор записи TABLEHANDLE tblh; // дескриптор таблицы // открытие файла результатов изапись в него типа устройства handle=open("inquiry.res", O_CREAT | O_TRUNC | O_WRONLY,S_IREAD | S_IWRITE ); write(handle,argv[1],strlen(argv[1])); //if(strlen(argv[1])==1) write(handle," ",2); //if(strlen(argv[1])==2) write(handle," ",1); write(handle,"\r\n",2); // поиск и обработка результатов поиска /* находится последняя по времени запись байтов состояния для данного устройства */ if(a=PXInit()) printf("\n%s",PXErrMsg(a)); if(a=PXTblOpen("fk",&tblh,0,0)) printf("\n%s",PXErrMsg(a)); PXRecBufOpen(tblh,&rec); PXPutAlpha(rec,5,"БС"); PXPutAlpha(rec,3,argv[1]); if((a=PXSrchFld(tblh,rec,3,SEARCHFIRST))!=PXSUCCESS) { if(a==PXERR_RECNOTFOUND) PXRecBufClose(rec); if(a=PXTblClose(tblh)) printf("\n%s",PXErrMsg(a)); PXExit(); close(handle); return; } else while(!(a=PXSrchFld(tblh,rec,3,SEARCHNEXT))); PXRecGet(tblh,rec); PXGetAlpha(rec,6,45,bytes); form3(argv[1],bytes+16,handle); PXRecBufClose(rec); if(a=PXTblClose(tblh)) printf("\n%s",PXErrMsg(a)); PXExit(); close(handle); } // bs3_inq.prj // BS3_INQ\form3.c // form3() // расшифровка байтов состояния #include #include #include "devices.h" #include void form3(char *Type,char *bytes,int handle) { /* Type - тип устройства bytes - нерасшифрованные байты состояния handle - дескриптор файла результатов */ int i; /* struct date d; struct time t; getdate(&d); gettime(&t); z.bd1.date[0]=d.da_mon; z.bd1.date[1]=d.da_day; z.bd1.date[2]=d.da_year; PXRecBufOpen(tblh,&rech); PXRecGet(tblh,rech); PXGetDate(rech,1,&date); PXDateDecode(date,&month,&day,&year); sprintf(string,"%.02d\\%.02d\\%.04d ",month,day,year); */ for(i=0;strcmp(devices[i].type,Type) && i switch(i) { case 0: // ШЭ-00 if(bytes[5]&0x04) write(handle," Шкаф НЕИСПРАВЕН \r\n",76); else write(handle," Шкаф ИСПРАВЕН \r\n",76); if(bytes[4]&0x02) write(handle,"НЕИСПРАВНОСТЬ первичной сети электропитания СЕТЬ 1 \r\n",76); break; case 8: // ШЭ-08 if(bytes[5]&0x04) write(handle," Шкаф НЕИСПРАВЕН \r\n",76); else write(handle," Шкаф ИСПРАВЕН \r\n",76); if(bytes[4]&0x02) write(handle,"НЕИСПРАВНОСТЬ первичной сети электропитания СЕТЬ 2 \r\n",76); break; case 1: // ШП-01 case 9: // ШП-09 if(bytes[5]&0x04) write(handle," Шкаф НЕИСПРАВЕН \r\n",76); else write(handle," Шкаф ИСПРАВЕН \r\n",76); break; case 4: // ШК-04 case 12: // ШК-12 if(bytes[0]&0x01) write(handle,"ОСНОВНОЙ - шкаф ШК-12 \r\n",76); else write(handle,"ОСНОВНОЙ - шкаф ШК-04 \r\n",76); write(handle," \r\n",76); write(handle," ТЕХНИЧЕСКОЕ СОСТОЯНИЕ ШКАФА \r\n",76); write(handle," \r\n",76); if(bytes[5]&0x01) write(handle," Шкаф РАБОТОСПОСОБЕН \r\n",76); if(bytes[5]&0x02) write(handle," Шкаф НЕИСПРАВЕН \r\n",76); if(bytes[5]&0x04) write(handle," Шкаф ЗАБЛОКИРОВАН по НСД \r\n",76); if((!(bytes[5]&0x01))&&(!(bytes[5]&0x02))&&(!(bytes[5]&0x04))) write(handle," Шкаф ИСПРАВЕН \r\n",76); write(handle," \r\n",76); if(bytes[4]&0x01) write(handle,"НЕИСПРАВЕН 1-й канал АД \r\n",76); if(bytes[4]&0x02) write(handle,"НЕИСПРАВЕН 2-й канал АД \r\n",76); if(bytes[4]&0x04) write(handle,"НЕИСПРАВЕН 3-й канал АД \r\n",76); if(bytes[3]&0x01) write(handle,"НЕИСПРАВЕН 1-й канал УХК \r\n",76); if(bytes[3]&0x02) write(handle,"НЕИСПРАВЕН 2-й канал УХК \r\n",76); if(bytes[3]&0x04) write(handle,"НЕИСПРАВЕН 3-й канал УХК \r\n",76); if(bytes[2]&0x01) write(handle,"НЕИСПРАВНОСТЬ логической части ШК \r\n",76); if(bytes[2]&0x02) {write(handle,"НЕИСПРАВЕН хотя бы один или несколько элементов ИГП \r\n",76); write(handle,"Для уточнения считай ячейку ВБШК1.ПФЗ для ШК1 или ВБШК2.ПФЗ для ШК2 \r\n",76); } if(bytes[2]&0x04) {write(handle,"НЕИСПРАВНО УХК - установлена единица в 8-ом разряде уточненого слова \r\n",76); write(handle,"состояния УХК \r\n",76); } if(bytes[1]&0x01) write(handle,"БОЗУ занято более 3-х секунд \r\n",76); if(bytes[1]&0x02) {write(handle,"НЕИСПРАВНО УХК (неправильное сочетание 3 и 10 разрядов уточненого слова \r\n",76); write(handle,"состояния УХК) \r\n",76); } if(bytes[1]&0x04) {write(handle,"УХК ЗАБЛОКИРОВАН по причине работы с носителем 83т015. Получен 9 или 11 \r\n",76); write(handle,"разряд в ИСС УХК (см. п.4.7.1. протокола инв.30337) \r\n",76); } if((!(bytes[12]&0x01))&&(!(bytes[12]&0x02))) write(handle,"ПУ-1 ИСПРАВЕН \r\n",76); if(bytes[12]&0x01) write(handle,"Нажата кнопка ОБНАРУЖЕНА НЕИСПРАВНОСТЬ на ПУ-1 \r\n",76); if(bytes[12]&0x02) write(handle,"Неисправно направление связи, соединяющее с ПУ-1 \r\n",76); if((!(bytes[12]&0x04))&&(!(bytes[11]&0x01))) write(handle,"ПУ-2 ИСПРАВЕН \r\n",76); if(bytes[12]&0x04) write(handle,"Нажата кнопка ОБНАРУЖЕНА НЕИСПРАВНОСТЬ на ПУ-2 \r\n",76); if(bytes[11]&0x01) write(handle,"Неисправно направление связи, соединяющее с ПУ-2 \r\n",76); if((!(bytes[11]&0x04))&&(!(bytes[11]&0x02))) write(handle,"ПУ-3 ИСПРАВЕН \r\n",76); if(bytes[11]&0x02) write(handle,"Нажата кнопка ОБНАРУЖЕНА НЕИСПРАВНОСТЬ на ПУ-3 \r\n",76); if(bytes[11]&0x04) write(handle,"Неисправно направление связи, соединяющее с ПУ-3 \r\n",76); if((!(bytes[10]&0x01))&&(!(bytes[10]&0x02))) write(handle,"ПУ-4 ИСПРАВЕН \r\n",76); if(bytes[10]&0x01) write(handle,"Нажата кнопка ОБНАРУЖЕНА НЕИСПРАВНОСТЬ на ПУ-4 \r\n",76); if(bytes[10]&0x02) write(handle,"Неисправно направление связи, соединяющее с ПУ-4 \r\n",76); if(bytes[10]&0x04) write(handle,"Неисправен 1-й канал схемных узлов БУ-695 \r\n",76); if(bytes[9]&0x01) write(handle,"Неисправен 2-й канал схемных узлов БУ-695 \r\n",76); if(bytes[9]&0x02) write(handle,"Неисправен 3-й канал схемных узлов БУ-695 \r\n",76); if(bytes[9]&0x04) write(handle,"Неисправен 1-й канал ПРЦ \r\n",76); if(bytes[8]&0x01) write(handle,"Неисправен 2-й канал ПРЦ \r\n",76); if(bytes[8]&0x02) write(handle,"Неисправен 3-й канал ПРЦ \r\n",76); if(bytes[8]&0x04) {write(handle,"Неисправно направление связи С1 по передаче от ВМ к ШК и/или по приему \r\n",76); write(handle,"от ШК к ВМ и/или по причине не получения от ШК кодограмм по времени. \r\n",76); write(handle,"Формирует ФК-читай слово памяти ВБШК1(2).ПФЗ \r\n",76); if(bytes[7]&0x01) write(handle,"ШК забракован функциональной задачей - читай слово памяти ВБШК1(2).ПФЗ \r\n",76); write(handle," \r\n",76); write(handle," ИНФОРМАЦИОННОЕ СОСТОЯНИЕ ШКАФА \r\n",76); write(handle," \r\n",76); if(bytes[26]&0x02) write(handle," Шкаф НЕИСПРАВЕН ПО ИНФОРМАЦИОННОМУ СОСТОЯНИЮ \r\n",76); else write(handle," Шкаф ИСПРАВЕН ПО ИНФОРМАЦИОННОМУ СОСТОЯНИЮ \r\n",76); write(handle," \r\n",76); write(handle," Состояние БХХХХХ ШХХХХХ и КХХХХ \r\n",76); write(handle," \r\n",76); write(handle," БХХХХХ ШХХХХХ 1-го массива СХХ \r\n",76); if((!(bytes[15]&0x01))&&(!(bytes[15]&0x02))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[15]&0x01)&&(bytes[15]&0x02)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[15]&0x01)&&(!(bytes[15]&0x02))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[15]&0x02)&&(!(bytes[15]&0x01))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," БХХХХХ ШХХХХХ 2-го массива СХХ \r\n",76); if((!(bytes[17]&0x04))&&(!(bytes[16]&0x01))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[17]&0x04)&&(bytes[16]&0x01)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[17]&0x04)&&(!(bytes[16]&0x01))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[16]&0x01)&&(!(bytes[17]&0x04))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," БХХХХХ КХХХХ ОХХ \r\n",76); if((!(bytes[18]&0x04))&&(!(bytes[18]&0x02))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[18]&0x04)&&(bytes[18]&0x02)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[18]&0x02)&&(!(bytes[18]&0x04))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[18]&0x04)&&(!(bytes[18]&0x02))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," БХХХХХ КХХХХ УХХ \r\n",76); if((!(bytes[19]&0x02))&&(!(bytes[19]&0x01))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[19]&0x02)&&(bytes[19]&0x01)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[19]&0x01)&&(!(bytes[19]&0x02))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[19]&0x02)&&(!(bytes[19]&0x01))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," БХХХХХ КХХХХ УХ \r\n",76); if((!(bytes[22]&0x02))&&(!(bytes[22]&0x01))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[22]&0x02)&&(bytes[22]&0x01)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[22]&0x01)&&(!(bytes[22]&0x02))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[22]&0x02)&&(!(bytes[22]&0x01))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," БХХХХХ КХХХХ РХХ \r\n",76); if((!(bytes[23]&0x01))&&(!(bytes[24]&0x04))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[23]&0x01)&&(bytes[24]&0x04)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[24]&0x04)&&(!(bytes[23]&0x01))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[23]&0x01)&&(!(bytes[24]&0x04))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," \r\n",76); write(handle," Состояние УХХХХХ ШХХХХХ и КХХХХ \r\n",76); write(handle," \r\n",76); write(handle," УХХХХХ ШХХХХХ 1-го массива СХХ \r\n",76); if((!(bytes[14]&0x01))&&(!(bytes[15]&0x04))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[14]&0x01)&&(bytes[15]&0x04)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[15]&0x04)&&(!(bytes[14]&0x01))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[14]&0x01)&&(!(bytes[15]&0x04))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," УХХХХХ ШХХХХХ 2-го массива СХХ \r\n",76); if((!(bytes[16]&0x04))&&(!(bytes[16]&0x02))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[16]&0x04)&&(bytes[16]&0x02)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[16]&0x02)&&(!(bytes[16]&0x04))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[16]&0x04)&&(!(bytes[16]&0x02))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," УХХХХХ КХХХХ ОХХ \r\n",76); if((!(bytes[17]&0x02))&&(!(bytes[17]&0x01))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[17]&0x02)&&(bytes[17]&0x01)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[17]&0x01)&&(!(bytes[17]&0x02))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[17]&0x02)&&(!(bytes[17]&0x01))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," УХХХХХ КХХХХ УХХ \r\n",76); if((!(bytes[19]&0x04))&&(!(bytes[18]&0x01))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[19]&0x04)&&(bytes[18]&0x01)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[19]&0x04)&&(!(bytes[18]&0x01))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[18]&0x01)&&(!(bytes[19]&0x04))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," УХХХХХ КХХХХ УХ \r\n",76); if((!(bytes[21]&0x01))&&(!(bytes[22]&0x04))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[21]&0x01)&&(bytes[22]&0x04)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[22]&0x04)&&(!(bytes[21]&0x01))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[21]&0x01)&&(!(bytes[22]&0x04))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," УХХХХХ КХХХХ РХХ \r\n",76); if((!(bytes[23]&0x02))&&(!(bytes[23]&0x04))) write(handle," НЕ ЗАПИСАНЫ \r\n",76); if((bytes[23]&0x02)&&(bytes[23]&0x04)) write(handle," УНИЧТОЖЕНЫ \r\n",76); if((bytes[23]&0x02)&&(!(bytes[23]&0x04))) write(handle," СОХРАНЕНЫ \r\n",76); if((bytes[23]&0x04)&&(!(bytes[23]&0x02))) write(handle," РАЗРУШЕНЫ \r\n",76); write(handle," \r\n",76); write(handle," НАВЯЗЫВАНИЕ ЛОЖНОЙ ИНФОРМАЦИИ \r\n",76); write(handle," \r\n",76); if(bytes[24]&0x02) write(handle,"Есть НЛИ по массиву N1 шххххх СХХ \r\n",76); if(bytes[24]&0x01) write(handle,"Есть НЛИ по массиву N2 шххххх СХХ \r\n",76); if(bytes[25]&0x04) write(handle,"Есть НЛИ по массиву кхххх УХХ \r\n",76); if(bytes[25]&0x01) write(handle,"Есть НЛИ по массиву кхххх УХ \r\n",76); if(bytes[26]&0x04) write(handle,"Есть НЛИ по массиву кхххх РХХ \r\n",76); if((!(bytes[24]&0x02))&&(!(bytes[24]&0x01))&&(!(bytes[25]&0x04)) &&(!(bytes[25]&0x02))&&(!(bytes[25]&0x01))&&(!(bytes[26]&0x04))) write(handle,"НЛИ ОТСУТСТВУЕТ по всем массивам \r\n",76); break; case 3: // В case 6: // КС1 case 14: // КС2 if(bytes[5]&0x04) write(handle," КС НЕИСПРАВЕН \r\n",76); else write(handle," КС ИСПРАВЕН \r\n",76); write(handle," \r\n",76); if(bytes[19]&0x01) write(handle,"Прием от АК1 трех кодограмм подряд с признаком К2 \r\n",76); if(bytes[19]&0x02) write(handle,"Прием от АК1 трех кодограмм подряд с ВПС=1010 \r\n",76); if(bytes[19]&0x04) write(handle,"Отсутствие информации от АК1 на входе ПУ более 12 сек \r\n",76); if(bytes[18]&0x01) write(handle,"Прием от АК1 трех кодограмм подряд с признаком получения УС \r\n",76); if(bytes[18]&0x02) write(handle,"Отсутствие связи в тракте от ЦКС1 до АК1 \r\n",76); if(bytes[18]&0x04) write(handle,"Отсутствие связи в тракте от ЦКС1 до ЦКС2 для АК1 \r\n",76); if(bytes[17]&0x01) write(handle,"Отсутствие связи в тракте от АК1 до ЦКС1 \r\n",76); write(handle," \r\n",76); if(bytes[23]&0x01) write(handle,"Прием от АК3 трех кодограмм подряд с признаком К2 \r\n",76); if(bytes[23]&0x02) write(handle,"Прием от АК3 трех кодограмм подряд с ВПС=1010 \r\n",76); if(bytes[23]&0x04) write(handle,"Отсутствие информации от АК3 на входе ПУ более 12 сек \r\n",76); if(bytes[22]&0x01) write(handle,"Прием от АК3 трех кодограмм подряд с признаком получения УС \r\n",76); if(bytes[22]&0x02) write(handle,"Отсутствие связи в тракте от ЦКС1 до АК3 \r\n",76); if(bytes[22]&0x04) write(handle,"Отсутствие связи в тракте от ЦКС1 до ЦКС2 для АК3 \r\n",76); if(bytes[21]&0x01) write(handle,"Отсутствие связи в тракте от АК3 до ЦКС1 \r\n",76); write(handle," \r\n",76); if(bytes[26]&0x01) write(handle,"Прием от АК6 трех кодограмм подряд с признаком К2 \r\n",76); if(bytes[26]&0x02) write(handle,"Прием от АК6 трех кодограмм подряд с ВПС=1010 \r\n",76); if(bytes[26]&0x04) write(handle,"Отсутствие информации от АК6 на входе ПУ более 12 сек \r\n",76); if(bytes[25]&0x01) write(handle,"Прием от АК6 трех кодограмм подряд с признаком получения УС \r\n",76); if(bytes[25]&0x02) write(handle,"Отсутствие связи в тракте от ЦКС1 до АК6 \r\n",76); if(bytes[25]&0x04) write(handle,"Отсутствие связи в тракте от ЦКС1 до ЦКС2 для АК6 \r\n",76); if(bytes[24]&0x01) write(handle,"Отсутствие связи в тракте от АК6 до ЦКС1 \r\n",76); write(handle," \r\n",76); if(bytes[16]&0x01) write(handle,"Прием от ВПУ трех кодограмм подряд с признаком К2 \r\n",76); if(bytes[16]&0x02) write(handle,"Прием от ВПУ трех кодограмм подряд с ВПС=1010 \r\n",76); if(bytes[16]&0x04) write(handle,"Отсутствие информации от ВПУ на входе ПУ более 12 сек \r\n",76); if(bytes[15]&0x01) write(handle,"Прием от АК6 трех кодограмм подряд с признаком получения УС \r\n",76); if(bytes[15]&0x02) write(handle,"Отсутствие связи в тракте от ЦКС1 до ВПУ \r\n",76); if(bytes[15]&0x04) write(handle,"Отсутствие связи в тракте от ЦКС1 до ЦКС2 для ВПУ \r\n",76); if(bytes[14]&0x01) write(handle,"Отсутствие связи в тракте от ВПУ до ЦКС1 \r\n",76); write(handle," \r\n",76); if(bytes[17]&0x04) write(handle,"Отсутствие связи в тракте от ЦКС1 до ПУ \r\n",76); write(handle," \r\n",76); if(bytes[10]&0x02) write(handle,"Отсутствие приема кодограмм в заданный интервал времени \r\n",76); write(handle," \r\n",76); if((bytes[12]&0x07)&&(!(bytes[11]&0x07))) write(handle,"Прием кодограмм с признаком отсутствия связи от ПУ до М486 \r\n",76); if((bytes[11]&0x07)&&(!(bytes[12]&0x07))) { write(handle,"Прием кодограмм с признаком искажения информации от ЦКС до М486 и/или \r\n",76); write(handle,"прием кодограмм с признаком отсутствия импульса БИ \r\n",76); } if((bytes[11]&0x07)&&(bytes[12]&0x07)) { write(handle,"Прием кодограмм с признаком отсутствия связи от ПУ до М486 и/или \r\n",76); write(handle,"прием кодограмм с признаком искажения информации от ЦКС до М486 и/или \r\n",76); write(handle,"прием кодограмм с признаком отсутствия импульса БИ \r\n",76); } break; case 2: // РМ-02 write(handle," \r\n",76); if(bytes[5]&0x01) write(handle,"АРМ ЗАБЛОКИРОВАНО по ФК оператором \r\n",76); write(handle," \r\n",76); if(bytes[5]&0x04) write(handle,"НЕТ СВЯЗИ МЕЖДУ ПЭВМ1 и ВК \r\n",76); if(bytes[4]&0x02) write(handle,"Нет связи с ВК по одной из линий связи ЛС1 или ЛС3 \r\n",76); if(bytes[3]&0x04) write(handle,"Нет связи с ВК по линии связи ЛС1 \r\n",76); if(bytes[2]&0x02) write(handle,"Нет связи с ВК по линии связи ЛС3 \r\n",76); break; case 10: // РМ-10 write(handle," \r\n",76); if(bytes[5]&0x01) write(handle,"АРМ ЗАБЛОКИРОВАНО по ФК оператором \r\n",76); write(handle," \r\n",76); if(bytes[5]&0x04) write(handle,"НЕТ СВЯЗИ МЕЖДУ ПЭВМ2 и ВК \r\n",76); if(bytes[4]&0x02) write(handle,"Нет связи с ВК по одной из линий связи ЛС2 или ЛС4 \r\n",76); if(bytes[2]&0x01) write(handle,"Нет связи с ВК по линии связи ЛС2 \r\n",76); if(bytes[2]&0x04) write(handle,"Нет связи с ВК по линии связи ЛС4 \r\n",76); break; case 5: // РМ05Г case 13: // РМ13П if(bytes[19]&0x01) write(handle,"ОСНОВНОЙ АРМ - РМ-13П \r\n",76); else write(handle,"ОСНОВНОЙ АРМ - РМ-05Г \r\n",76); write(handle," \r\n",76); if(bytes[5]&0x04) write(handle," АРМ НЕИСПРАВЕН \r\n",76); else write(handle," АРМ ИСПРАВЕН \r\n",76); write(handle," \r\n",76); if(bytes[16]&0x02) write(handle,"Основное АРМ ИСПРАВНО \r\n",76); if(bytes[16]&0x01) write(handle,"Основное АРМ НЕИСПРАВНО \r\n",76); if(bytes[16]&0x04) write(handle,"Основное АРМ ЗАБЛОКИРОВАНО \r\n",76); if(bytes[15]&0x01) write(handle,"Основное АРМ РАЗБЛОКИРОВАНО \r\n",76); if(bytes[19]&0x04) write(handle,"Резервное АРМ ИСПРАВНО \r\n",76); if(bytes[19]&0x02) write(handle,"Резервное АРМ НЕИСПРАВНО \r\n",76); if(bytes[18]&0x01) write(handle,"Резервное АРМ ЗАБЛОКИРОВАНО \r\n",76); if(bytes[18]&0x02) write(handle,"Резервное АРМ РАЗБЛОКИРОВАНО \r\n",76); if(bytes[5]&0x01) write(handle,"АРМ ЗАБЛОКИРОВАНО по ФК оператором \r\n",76); write(handle," \r\n",76); if(bytes[4]&0x02) write(handle,"Неисправна одна из трех линий магистрали обмена \r\n",76); else write(handle,"Все три линии магистрали обмена исправны \r\n",76); if(bytes[12]&0x04) write(handle,"Неисправна 1-я линия магистрали приема \r\n",76); if(bytes[12]&0x02) write(handle,"Неисправна 2-я линия магистрали приема \r\n",76); if(bytes[12]&0x01) write(handle,"Неисправна 3-я линия магистрали приема \r\n",76); if(bytes[10]&0x02) write(handle,"Отсутствует прием информации в ВМ от данного АРМ-1 \r\n",76); break; case 7: // ВМ if(bytes[5]&0x02) write(handle,"Авария электропитания в одном или нескольких каналах ШП-614 \r\n",76); if(bytes[4]&0x04) write(handle,"Неисправность 1 канала ШП-614 \r\n",76); if(bytes[3]&0x01) write(handle,"Неисправность 2 канала ШП-614 \r\n",76); if(bytes[3]&0x02) write(handle,"Неисправность 3 канала ШП-614 \r\n",76); if(bytes[3]&0x04) write(handle,"Произошел ПРОГРАММНЫЙ СБОЙ \r\n",76); if(bytes[2]&0x01) write(handle,"Авария питания 1 канала \r\n",76); if(bytes[2]&0x02) write(handle,"Авария питания 1 канала \r\n",76); if(bytes[2]&0x04) write(handle,"Авария питания 1 канала \r\n",76); if(bytes[0]&0x01) write(handle,"Нарушена целостность программного изделия-кассеты КП-610 - \r\n",76); write(handle,"подсчитанная контрольная сумма не совпадает с эталоном \r\n",76); break; case 16: // ВУ16 case 17: // ВУ17 case 18: // ВУ18 case 19: // ВУ19 if(bytes[5]&0x01) write(handle,"ПУ заблокировано оператором по ФК \r\n",76); if(bytes[5]&0x04) write(handle,"Нажата КНОПКА ОБНАРУЖЕНИЯ НЕИСПРАВНОСТИ \r\n",76); break; case 15: // АС //Подкорректировать после согласования //байта состояния if(bytes[5]&0x04) write(handle,"АРМ-РД НЕИСПРАВЕН - не работают обе ПЭВМ \r\n",76); if(bytes[4]&0x01) write(handle,"АРМ-РД РАБОТОСПОСОБЕН - работает одна из двух ПЭВМ \r\n",76); if(bytes[4]&0x02) write(handle,"Нет связи хотя бы по одной из линий связи ЛС1,ЛС2,ЛС3,ЛС4 \r\n",76); if(bytes[4]&0x04) write(handle,"Неисправен КСП-0 \r\n",76); if(bytes[3]&0x01) write(handle,"Неисправен КСП-1 \r\n",76); if(bytes[3]&0x02) write(handle,"Неисправен КСП-2 \r\n",76); if(bytes[3]&0x04) write(handle,"Нет связи по линии связи ЛС1 \r\n",76); if(bytes[2]&0x01) write(handle,"Нет связи по линии связи ЛС2 \r\n",76); if(bytes[2]&0x02) write(handle,"Нет связи по линии связи ЛС3 \r\n",76); if(bytes[2]&0x04) write(handle,"Нет связи по линии связи ЛС4 \r\n",76); break; } } // bs2_out.prj // bs2_out.c // main() // выдача результатов запроса по 2-й форме байтов состояния на экран // ( из файла ) или форматирование и постановка в очередь для выдачи // на принтер #include #include "cxlkey.h" #include "disp.h" extern void resScr(void); // выдача результатов запроса из файла на экран extern void resPrn(void); // выдача результатов запроса из файла на принтер void main(int argc,char *argv[]) { void z(void); setkbloop(z); if(argv[1][0]=='э') resScr(); else resPrn(); } void z(void) { union REGS r; r.h.ah=0; int86(DISP,&r,&r); } #include #include "cxlkey.h" #include "disp.h" extern void resScr(void); // выдача результатов запроса из файла на экран extern void resPrn(void); // выдача результатов запроса из файла на принтер void main(int argc,char *argv[]) { void z(void); setkbloop(z); if(argv[1][0]=='э') resScr(); else resPrn(); } void z(void) { union REGS r; r.h.ah=0; int86(DISP,&r,&r); } // inq_out.prj // INQ_OUT.C // main() // выдача результатов запроса на экран ( из файла ) // или форматирование и постановка в очередь для выдачи на принтер #include #include #include "cxlkey.h" #include "cxldef.h" extern void resScr(void); // выдача результатов запроса из файла на экран extern void resPrn(void); // выдача результатов запроса из файла на принтер void main(int argc,char *argv[]) { void z(void); setkbloop(z); if(argv[1][0]=='э') resScr(); else resPrn(); } #include #include "disp.h" void z(void) { union REGS r; r.h.ah=0; int86(DISP,&r,&r); } // inq_out.prj // res_scr.C // res_scr() // выдача результатов запроса на экран ( из файла ) #include #include #include "cxlwin.h" #include "cxlkey.h" #include "cxlvid.h" #define LEN 81 #define TXTATTR _CYAN #define UP 0x4800 #define DOWN 0x5000 #define PGUP 0x4900 #define PGDOWN 0x5100 #define ESC 0x011b void resScr(void) { FILE *f; // дескриптор файла результатов int down; // номер текущей строки в файле int ch; // код клавиши int i; char string[LEN]; int mwup; // количество строк над основным окном // вывод на экран строки запроса и шапки таблицы f=fopen("inquiry.res","r++"); fgets(string,LEN,f); for(mwup=0;strncmp(string+3,"ДАТА",4);++mwup) { wopen(mwup,0,mwup,79,5,BLUE|_LGREY,BLUE|_LGREY); wprintf("%.79s",string); fgets(string,LEN,f); } wopen(mwup,0,mwup,79,5,YELLOW|_BLUE,YELLOW|_BLUE); wprintf(" %.78s",string); // основное окно wopen(++mwup,0,25,79,5,LCYAN|_BLUE,TXTATTR); //wshadow(LGREY); // вывод результатов запроса из файла на экран for(down=mwup;down<25 && fgets(string,LEN,f)!=NULL;++down) wprints(down-mwup,1,TXTATTR,string); hidecur(); // цикл просмотра результатов while((ch=getxch())!=ESC) switch(ch) { case UP: if(down<=25) break; down--; fseek(f,(long)(down-25+mwup)*LEN,0); fgets(string,LEN,f); wscroll(1,D_DOWN); wprints(0,1,TXTATTR,string); break; case DOWN: if(fseek(f,(long)down*LEN,0)) break; if(fgets(string,LEN,f)==NULL) break; wscroll(1,D_UP); wprints(24-mwup,1,TXTATTR,string); down++; break; case PGUP: for(i=0;i<=24-mwup;++i) { if(down<=25) break; down--; fseek(f,(long)(down-25+mwup)*LEN,0); fgets(string,LEN,f); wscroll(1,D_DOWN); wprints(0,1,TXTATTR,string); } break; case PGDOWN: for(i=0;i<=24-mwup;++i) { if(fseek(f,(long)down*LEN,0)) break; if(fgets(string,LEN,f)==NULL) break; wscroll(1,D_UP); wprints(24-mwup,1,TXTATTR,string); down++; } break; } fclose(f); wcloseall(); } // bs2_out.prj // res_scr_.c // res_scr() // выдача результатов запроса по 2-й форме байтов состояния на экран // ( из файла ) #include #include #include "cxlwin.h" #include "cxlkey.h" #include "cxlvid.h" #define LEN 100 #define TXTATTR _CYAN #define UP 0x4800 #define DOWN 0x5000 #define PGUP 0x4900 #define PGDOWN 0x5100 #define RIGHT 0x4d00 #define LEFT 0x4b00 #define HOME 0x4700 #define END 0x4F00 #define ESC 0x011b FILE *f; // дескриптор файла результатов int down; // номер текущей строки в файле char string[LEN]; int length; // длина строк в файле int w1; // дескриптор окна void screen_move(int right); void resScr(void) { int right=0; // горизонтальное смещение int ch; // код клавиши int i; // вывод на экран строки запроса и шапки таблицы f=fopen("inquiry.res","r++"); wopen(0,0,0,79,5,BLUE|_LGREY,BLUE|_LGREY); fgets(string,LEN,f); wprints(0,1,BLUE|_LGREY,string); w1=wopen(1,0,1,79,5,YELLOW|_BLUE,YELLOW|_BLUE); fgets(string,LEN,f); wprints(0,1,YELLOW|_BLUE,string); length=strlen(string)+1; // основное окно wopen(2,0,25,79,5,LCYAN|_BLUE,TXTATTR); hidecur(); //wshadow(LGREY); // вывод результатов запроса из файла на экран for(down=2;down<25 && fgets(string,LEN,f)!=NULL;++down) { string[right+80]='\0'; wprints(down-2,1,TXTATTR,string); } // цикл просмотра результатов while((ch=getxch())!=ESC) switch(ch) { case UP: if(down<=25) break; down--; fseek(f,(long)(down-23)*length,0); fgets(string,LEN,f); string[right+79]='\0'; wscroll(1,D_DOWN); wprints(0,1,TXTATTR,string+right); break; case DOWN: if(fseek(f,(long)down*length,0)) break; if(fgets(string,LEN,f)==NULL) break; wscroll(1,D_UP); string[right+80]='\0'; wprintc(22,0,TXTATTR,' '); down++; break; case PGUP: for(i=0;i<=22;++i) { if(down<=25) break; down--; fseek(f,(long)(down-23)*length,0); fgets(string,LEN,f); wscroll(1,D_DOWN); string[right+80]='\0'; wprints(0,1,TXTATTR,string+right); wprintc(1,0,TXTATTR,' '); } break; case PGDOWN: for(i=0;i<=22;++i) { if(fseek(f,(long)down*length,0)) break; if(fgets(string,LEN,f)==NULL) break; wscroll(1,D_UP); string[right+80]='\0'; wprints(22,1,TXTATTR,string+right); down++; } break; case LEFT: if(right) screen_move(--right);break; case RIGHT: if(right+82 case END: if(right+82 case HOME: if(right) screen_move(right=0);break; } fclose(f); wcloseall(); } // горизонтальная прокрутка void screen_move(int right) { int i; fseek(f,length,0); fgets(string,LEN,f); string[right+80]='\0'; wwprints(w1,0,1,YELLOW|_BLUE,string+right); if(down-22>2) fseek(f,(long)(down-22)*length,0); for(i=0;i<=22 && fgets(string,length,f)!=NULL;++i) { string[right+80]='\0'; wprints(i,1,TXTATTR,string+right); } } #include #include #include "cxlwin.h" #include "cxlkey.h" #include "cxlvid.h" #define LEN 80 #define ESC 0x011b FILE *f; // дескриптор файла результатов char string[LEN]; // буфер для чтения из файла void resScr(void) { int i; int maxlen; // максимальная длина строки в файле результатов запроса int startpos; // столбец окна с которого печатается текст // открытие файла результатов запроса и // определение размера самой длинной строки в этом файле f=fopen("inquiry.res","r++"); for(maxlen=0,i=0;fgets(string,LEN,f)!=NULL;++i) if(strlen(string)>maxlen) maxlen=strlen(string); fseek(f,0,0); // черный фон wopen(0,0,24,79,5,0,0); // открытие окна wopen((20-i)/2,5,(20-i)/2+i+2,75,1,YELLOW|_BLUE,_CYAN); hidecur(); // чтение типа устройства и его использование в качестве титула окна fgets(string+1,LEN,f); string[0]=' '; for(i=2;i<=6;++i) if(string[i]=='\r' || string[i]=='\n') string[i]=' '; wtitle(string,TCENTER,_LGREY); // вывод результатов запроса из файла в окно startpos=(70-maxlen)/2; for(i=2;fgets(string,LEN,f)!=NULL;++i) { wgotoxy(i,startpos); wprintf("%s",string); } // окно находится на экране пока не будет нажато ESC while(getxch()!=ESC); fclose(f); wcloseall(); } Список литературы Глушков В. М. “Основы безбумажной информатики”, М. Наука, 1987 г.; “Человек и вычислительная техника” под ред. Глушкова В. М., М. Наука, 1971 г.; “Организационные вопросы автоматизации управления” (перевод с английского) Глушкова В. М., М. Экономика, 1972 г.; Мартин Дж. “Организация баз данных в вычислительных системах”, М. Мир, 1980 г.; Бойко В. В., Савинков В. М. “Проектирование баз данных информационных систем”, М. Финансы и статистика, 1989 г.; Шураков В. В. “Надежность программного обеспечения систем обработки данных”, М. Финансы и статистика, 1987 г.; Уинер Р. “Язык Турбо СИ”, М. Мир, 1991 г.; Paradox Engine. Документация: описание, список функций для создания и работы с БД.; “Турбо СИ. Описание редактора, стандартные и графические функции”, изд. Иститута проблем информатики, М. 1989 г.; Хьюз Дж., Мичтом Дж. “Структурный подход к программированию”. Изд. Мир, М., 1980 г.; “Выполнение организационно-экономической части дипломных проектов”. Учебное пособие, изд. МИРЭА, 1994 г.; “Выполнение организационно-экономической части дипломных проектов”. Учебное пособие, изд. МИРЭА, 1987 г.; “Сетевые графики в планировании”. Разумов И. М., Белова Л. Д., и др., М. Высшая школа, 1981 г.; “Основы финансового менеджмента. Как управлять капиталом?” Балабанов И. Т., М. “Финансы и статистика”, 1994 г.; Мотузко Ф. Я. “Охрана труда”, М. Высшая школа, 1969 г.; Самгин Э. Б. “Освещение рабочих мест”, изд. МИРЭА, 1989 г.; Сибаров Ю. Б. “Охрана труда в вычислительных центрах” и др., М. Машиностроение, 1990 г.; Методические указания по дипломному проектированию раздела “Охрана труда и окружающей среды” под ред. Мотузко Ф. Я., МИРЭА, 1980 г.; “Основы инженерной психологии” под ред. Ломова Б. Ф., М. Высшая школа, 1986 г.; Демиденко и др. “Защита объектов народного хозяйства от оружия массового поражения” Справочник, Киев "Высшая школа" 1989 г.; Методические указания по безопасности жизнедеятельности. “Особенности ведения аварийно-спасательных работ на промышленном объекте в ЧС мирного времени”, изд. МИРЭА.; Атаманюк В. Г., Ширшев Л. Г. и др. “Гражданская оборона. Учебник для ВТУЗов”, М. Высшая школа. 1987г.; “Введение в практическую эргономику. Учебное пособие.” под ред. Зинченко В. П., Моргунова Е. Б., изд. МИРЭА, 1990г. 4