РУБРИКИ |
Автоматизированное рабочее место регистрации и документирования комплекса средств автоматизации |
РЕКЛАМА |
|
Автоматизированное рабочее место регистрации и документирования комплекса средств автоматизацииЭкран монитора должен размещаться на столе или на подставке так, чтобы расстояние наблюдения информации на его экране не превышало 700мм, оптимальное расстояние – 450-500мм. Экран дисплея по высоте должен быть расположен на столе или подставке так, так, чтобы угол между нормалью к центру экрана и горизонтальной линией взора составлял 20 градусов. Зрительный комфорт в основном определяется следующими факторами: · размерами знаков; · расстояние между знаками по горизонтали: 0,25 высоты знака; · расстояние между строками: 0,5-1,0 высоты знака; · количеством знаков в строке: 4-80; · максимально допустимым количеством строк для цветного изображения: не более 25. Схема размещения алфавитно-цифрового дисплея (АЦД) приведена на рисунке 1.
Угол наблюдения экрана, а также других средств отображения в горизонтальной плоскости (угол разворота блока отображения АЦД относительно оператора) в общем случае не должен превышать 60 градусов. При наличии трех и более дисплеев в рабочей зоне допускается увеличение этого угла, но он не должен превышать 90 градусов. При этом должно использоваться вращающееся кресло. 2.2. Основные эргономические требования, предъявляемые к клавиатуре Пульт дисплея должен быть размещен на столе или подставке так, чтобы высота клавиатуры пульта по отношению к полу составляла 650-720 мм. При размещении пульта на стандартном столе высотой 750 мм необходимо использовать кресло с регулируемой высотой сиденья и подставку под ноги. Пульт рекомендуется размещать прямо перед оператором или левее, если предполагается работа оператора с документами и ведение записей. Для оператора ввода данных документ (бланк) рекомендуется располагать на расстоянии 450-500 мм от глаз оператора, преимущественно слева, при этом угол между экраном АЦД и документом в горизонтальной плоскости не должен превышать 30-40 градусов. Клавиатуру, манипулятор “мышь” следует располагать в оптимальной зоне – части пространства рабочего места, ограниченного дугами, описываемыми предплечьями при движении в локтевых суставах с опорой в точке локтя и с относительно неподвижным плечом. Эта зона составляет не более 300 - 400мм от точки опоры локтя оператора [23]. 2.3. Размещение кресла оператора в рабочей зоне Кресло оператора должно быть устойчивым. Его конструкция, размеры, форма, наклон сиденья и спинки должны позволять сидеть, выпрямившись, поддерживая тяжесть верхней части туловища не напряжением мышц спины, а путем опоры на спинку. Лучшей является квадратная форма сиденья со сторонами равными 400 мм, и с выемкой, соответствующей форме бедра. Сиденье должно иметь некоторый наклон назад (на 5-6 градусов), обеспечивающий устойчивость позы, высота сиденья кресла от поля 400-450 мм. Если по условиям работы сиденье расположено выше, необходимо иметь подставку для ног. Спинка кресла должна иметь вогнутую форму. Рекомендуемая ширина спинки 300 мм. Угол наклона спинки следует выбирать в зависимости от назначения кресла. Для оператора, работающего за пультом с ЗПТ, оптимальным является наклон 5-10 градусов. При длительной работе за пультом (более 6 часов), если во время работы необходим отдых, целесообразно иметь возможность изменить по желанию оператора угол наклона спинки стула, но не более чем на 45 градусов. 2.4. Размещение устройств документирования Устройства документирования, ввода-вывода информации рекомендуется располагать справа от оператора в зоне максимальной досягаемости. Шумящие устройства следует выносить за пределы рабочей зоны. 2.5. Расположение рабочего места оператора в помещении Во время работы часто возникают ситуации, в которых оператор ЭВМ должен за короткий срок принять правильное решение. Для успешного труда в таких условиях необходима рационально организованная окружающая среда. В ВЦ, как правило, применяют одностороннее естественное боковое освещение, причем светопроемы с целью уменьшения солнечной инсоляции устраивают с северной, северо-восточной или северо-западной ориентацией. В машинных залах рабочие места операторов, работающих с дисплеями, располагают подальше от окон и таким образом, чтобы оконные проемы находились сбоку. Если экран дисплея обращен к оконному проему, необходимы специальные экранирующие устройства (рис.2). Окна рекомендуется снабжать светорассеивающими шторами, регулируемыми жалюзи или солнцезащитной пленкой с металлизированным покрытием [17].
Экран АЦД, документы, клавиатура пульта должны быть расположены так, чтобы перепад яркостей их поверхностей, зависящий от их расположения относительно источников света, не превышал 1:10 при рекомендуемом значении 1:3. При яркости изображения на экране 50-100 кд/м (номинальное значение) освещенность документа должна составлять 300-500 лк. Должны быть исключены слепящие яркости, блики и отображения от стекла экрана. Для исключения засветки экранов дисплеев прямыми световыми потоками светильники общего освещения располагают сбоку от рабочего места, параллельно линии зрения оператора и стене с окнами. Также размещение светильников позволяет производить их последовательное включение в зависимости от величины естественной освещенности и исключает раздражение глаз чередующимися полосами света и тени, возникающее при поперечном расположении светильников. [17]. Для обеспечения оптимальных условий работы операторов дисплейных устройств необходима определенная цветовая отделка помещений. Так, при использовании экранов красновато-желтого цвета с яркостью свечения до 15кд/м2 стену, противоположную экранам, окрашивают в насыщенный темно-коричневый цвет с коэффициентом отражения =0.2, а остальные стены - в красно-коричневый цвет с =0.35. При восприятии информации на экране зеленого цвета целесообразно окрашивать стену, на которую направлен взгляд оператора, в оливково-зеленый цвет с =0.4. Окраске поверхностей следует придавать матовую фактуру [17]. Итак, при эргономической оценке рабочего места оператора в качестве основных эргономических требований были выбраны следующие: 1) особенности конструктивного выполнения и расположения технических средств и аппаратуры; 2) длительность работы с данной аппаратурой; 3) точность и эффективность приема информации.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Элементы рабочего места оператора |
Технические характеристики, предъявляемые к элементу рабочего места оператора |
На какое требование влияет данная характеристика |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Экран монитора |
Оптимальное расстояние наблюдения информации на экране монитора – 450-500мм. |
2 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Расстояние между знаками по горизонтали: 0,25 высоты знака; расстояние между строками: 0,5-1,0 высоты знака; количество знаков в строке: 4-80; максимально допустимое количество строк для цветного изображения: не более 25. |
2, 3 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Угол наблюдения экрана не должен превышать 60 градусов. При наличии трех и более дисплеев в рабочей зоне допускается увеличение этого угла, но он не должен превышать 90 градусов. |
2 |
Продолжение табл. 1
Элементы рабочего места оператора
Технические характеристики, предъявляемые к элементу рабочего места оператора
На какое требование влияет данная характеристика
Клавиатура
Клавиатура должна быть размещена на столе или подставке так, чтобы высота клавиатуры пульта по отношению к полу составляла 650-720мм. При размещении пульта на стандартном столе высотой 750мм необходимо использовать кресло с регулируемой высотой сиденья и подставку под ноги.
Клавиатуру, манипулятор “мышь” следует располагать в оптимальной зоне –не более 300 - 400мм от точки опоры локтя оператора.
1, 2
Бланк данных
Для оператора ввода данных документ (бланк) рекомендуется располагать на расстоянии 450-500 мм от глаз оператора, преимущественно слева, при этом угол между экраном АЦД и документом в горизонтальной плоскости не должен превышать 30-40 градусов.
2, 3
Кресло оператора
Конструкция кресла оператора должна позволять сидеть, поддерживая тяжесть верхней части туловища не напряжением мышц спины, а путем опоры на спинку. Форма сиденья - квадратная со сторонами 400 мм, и с выемкой, по форме бедра. Наклон сиденья назад - 5-6 градусов, высота сиденья кресла от пола 400-450 мм. Если сиденье расположено выше, необходимо иметь подставку для ног. Спинка кресла должна иметь вогнутую форму, ширина спинки - 300 мм. Угол наклона спинки 5-10 градусов. При работе более 6ч на время отдыха угол наклона спинки можно изменить, но не более чем на 45 градусов.
1, 2
Устройства документи-
Рования
Устройства документирования информации рекомендуется располагать справа от оператора в зоне максимальной досягаемости, шумящие выносить за пределы рабочей зоны.
1, 3
Продолжение табл. 1
Элементы рабочего места оператора
Технические характеристики, предъявляемые к элементу рабочего места оператора
На какое требование влияет данная характеристика
Окружаю-щее помещение
Экран АЦД, документы, клавиатура пульта должны быть расположены так, чтобы перепад яркостей их поверхностей, зависящий от их расположения относительно источников света, не превышал 1:10 при рекомендуемом значении 1:3. При яркости изображения на экране 50-100 кд/м (номинальное значение) освещенность документа должна составлять 300-500 лк. Должны быть исключены слепящие яркости, блики и отображения от стекла экрана.
При использовании экранов красновато-желтого цвета с яркостью свечения до 15кд/м2 стену, противоположную экранам, окрашивают в насыщенный темно-коричневый цвет с коэффициентом отражения =0.2, а остальные стены - в красно-коричневый цвет с =0.35. При восприятии информации на экране зеленого цвета стену, на которую направлен взгляд оператора, окрашивают в оливково-зеленый цвет с =0.4. Окраске поверхностей следует придавать матовую фактуру.
1, 2, 3
Результатом данного дипломного проекта является разработка программ формирования и обработки запросов. Программы разработаны для технических средств АРМ РД и функционируют совместно с остальным ПО АРМ РД.
В процессе разработки программ выполнены требования к функциональным характеристикам, условия эксплуатации и требования к операционной и программной совместимости. В заключительной части дипломного проекта была дана оценка результатов работы программ и даны рекомендации оператору АРМ РД.
Объем памяти, занимаемый программой равен: V = 64 Кбайта.
В организационно-экономической части дипломного проекта было проведено планирование разработки с построением сетевого графика, расчет договорной цены разработки, обоснована экономическая целесообразность темы.
Договорная цена разработки составляет: Цд = 916 152 руб. в ценах 1998г.
В разделе “Охрана труда и техника безопасности” был выбран оптимальный режим освещенности и проведен расчет информационной нагрузки оператора.
Значение информационной нагрузки оператора АРМ РД составляет 0.6 бит/с.
В разделе “Гражданская оборона” были приведены требования по инженерной защите оператора и оборудования ПЭВМ от воздействия высоких температур при взрывах в ЧС мирного времени.
В разделе “Эргономика” была произведена оценка рабочего места оператора и разработано оптимальное рабочее место оператора.
Схемы алгоритмов программ
Тексты программ
// inquiry.prj
//INQUIRY\inquiry.c
// main(),initsearch(),mem_args()
// программа обработки запросов
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <io.h>
#include <dos.h>
#include <alloc.h>
#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<argc;)
{
inqstr=(char *)calloc(82,1);
memset(inqstr+1,' ',79);
inqstr[79]='\r';
inqstr[80]='\n';
inqstr[81]='\0';
for(c=inqstr;i<argc;++i)
{
if(strlen(inqstr)+strlen(argv[i])>78+j)
{
if(strlen(argv[i])>50 && (strlen(inqstr)<70 || strlen(argv[i])>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<argc;++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 <stdio.h>
#include <stdlib.h>
#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 <stdio.h>
#include <mem.h>
#include <io.h>
#include <dos.h>
#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 <stdlib.h>
#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<n;++i)
{
if(!x[i]) continue;
PXRecBufOpen(tblh,rec+j);
PXPutAlpha(rec[j],i,argv[i+2]);
y[j++]=i;
}
while(1)
{
for(i=0;i<n;++i)
{
if(max==1)
{
if (!(a=PXSrchFld(tblh,rec[i],y[i],SEARCHFIRST)))
PXRecNum(tblh,&s[i]);
}
else
if(s[i]<max)
{
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<n;++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 <stdlib.h>
#include <stdio.h>
#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<x[i];++j) PXRecBufOpen(tblh,rec[i]+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<x[i];++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<x[i];++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]<max)
{
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;k<x[i];++k) if(s[i]>z[i][k]) s[i]=z[i][k];
if(s[i]>high)
{
for(i=3;i<=nflds;++i)
if(x[i])
{
for(j=0;j<x[i];++j) PXRecBufClose(rec[i][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<nflds;++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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <io.h>
#include <alloc.h>
#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<argc;++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 <string.h>
#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 <stdio.h>
#include <stdlib.h>
#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 <stdio.h>
#include <io.h>
#include <string.h>
#include <stdlib.h>
#include <dos.h>
#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 <stdlib.h>
#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]<max)
{
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(); }
|
© 2000 |
|