Автоматизированное рабочее место регистрации и документирования комплекса средств автоматизации
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(); }
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
<stdio.h>
#include
<fcntl.h>
#include
<sys/stat.h>
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
|