Автор: Пользователь скрыл имя, 09 Марта 2013 в 08:54, дипломная работа
С целью обеспечения возможности взаимодействия человека с ЭВМ в интерактивном режиме появляется необходимость реализовать в рамках АСУ так называемое АРМ – автоматизированное рабочее место. АРМ представляет собой совокупность программно-аппаратных средств, обеспечивающих взаимодействие человека с ЭВМ, т.е. такие функции как:
возможность ввода информации в ЭВМ;
возможность вывода информации из ЭВМ на экран монитора, принтер или другие устройства вывода (в настоящее время этот перечень достаточно широк – графопостроители, и т.п.).
РЕФЕРАТ 4
ОСНОВНАЯ ЧАСТЬ 5
ВВЕДЕНИЕ 5
1. АНАЛИЗ КОНЦЕПЦИИ ПОСТРОЕНИЯ КОМПЛЕКСА СРЕДСТВ АВТОМАТИЗАЦИИ 8
1.1. Общая характеристика систем управления 8
1.2. Структурная схема комплекса средств автоматизации. 11
1.3. Описание функционирования АСУ комплекса средств автоматизации 13
1.4. Функциональное назначение АРМ РД 14
1.5. Требования, предъявляемые к АРМ РД 15
2. ОБОСНОВАНИЕ ВЫБОРА ТЕХНИЧЕСКИХ СРЕДСТВ АРМ РД 17
2.1. Возможность функционировать в рамках автоматизированной системы 17
2.2. Требования по обеспечению надежности 17
2.3. Требование круглосуточной работы 17
2.4. Работа в реальном масштабе времени 18
2.5. Обеспечение требований ко времени реакции системы 18
2.6. Хранение и обработка данных 18
2.7. Возможность выдачи информации на принтер и экран монитора АРМ РД 19
3. СТРУКТУРА БАЗЫ ДАННЫХ 20
3.1. Алгоритм обработки информации 20
3.2. Обоснование необходимости организации базы данных 34
3.2.1. Понятие базы данных 34
3.2.2. Достоинства интеграции данных. 35
3.2.3. Проблемы интеграции данных 37
3.2.4. Необходимость организации БД на АРМ РД 38
3.3. Логическая организация базы данных 39
3.4. Выбор СУБД 45
4. СТРУКТУРА КОМПЛЕКСА ПРОГРАММ АРМ РД 51
4.1. Обоснование структуры комплекса программ 51
4.1.1. ПО общесистемного назначения 51
4.1.2. ПО специального назначения 53
4.1.3. Требования, предъявляемые к специальному ПО АРМ РД 53
4.2. Программная реализация 54
4.3. Состав программ 59
4.4. Описание программ 61
4.5. Оценка результатов работы программ 63
ОРГАНИЗАЦИОННО-ЭКОНОМИЧЕСКАЯ ЧАСТЬ 66
ВВЕДЕНИЕ 66
1. ПЛАНИРОВАНИЕ РАЗРАБОТКИ С ИСПОЛЬЗОВАНИЕМ СЕТЕВОГО ГРАФИКА 67
2. РАСЧЕТ СТОИМОСТИ РАЗРАБОТКИ 79
2.1. Расчёт статьи “материалы, покупные изделия, полуфабрикаты” 79
2.2. Расчёт основной заработной платы по теме 80
2.3. Расчет дополнительной заработной платы 81
2.4. Расчёт отчислений на социальные нужды 82
2.5. Расчёт накладных расходов 82
2.6. Расчёт договорной цены 83
3. ЭКОНОМИЧЕСКАЯ ЭФФЕКТИВНОСТЬ РАЗРАБОТКИ 84
4. ОСНОВНЫЕ РАЗДЕЛЫ ХОЗЯЙСТВЕННОГО ДОГОВОРА 84
ЗАКЛЮЧЕНИЕ 86
ОХРАНА ТРУДА И ТЕХНИКА БЕЗОПАСНОСТИ 87
ВВЕДЕНИЕ 87
1. ХАРАКТЕРИСТИКА ПОМЕЩЕНИЯ И ФАКТОРЫ, ДЕЙСТВУЮЩИЕ НА ОПЕРАТОРА В ПРОЦЕССЕ ЕГО ТРУДА 88
2. РАСЧЁТ ОСВЕЩЕНИЯ РАБОЧЕГО МЕСТА ОПЕРАТОРА 89
3. РАСЧЁТ ИНФОРМАЦИОННОЙ НАГРУЗКИ 94
ВЫВОДЫ 95
ГРАЖДАНСКАЯ ОБОРОНА 97
ВВЕДЕНИЕ 97
1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 98
1.1. Оценка воздействия ударной волны на объект 98
1.1.1. Характеристики ударной волны 98
1.1.2. Поражающие факторы ударной волны 99
1.2. Оценка пожарной обстановки 101
1.2.1. Влияние степени огнестойкости зданий и сооружений на развитие пожарной обстановки 102
1.2.2. Влияние категорий пожароопасности производства на развитие пожарной обстановки 102
1.2.3. Влияние расстояний между зданиями на распространение пожаров 103
1.2.4. Влияние погодных условий на распространение пожаров 103
1.2.5. Оценка воздействия теплового импульса огненного шара на пожарную обстановку 103
1.2.6. Оценка воздействия вторичных поражающих факторов на пожарную обстановку 105
1.2.7. Воздействие пожара на людей и элементы объекта 105
1.3. Оценка устойчивости элементов объекта 105
2. РАСЧЕТНАЯ ЧАСТЬ 106
2.1. Исходные данные 106
2.2. Расчет 106
2.2.1. Оценка воздействия воздушной ударной волны на элементы объекта 106
2.2.2. Оценка пожарной обстановки 107
3. ПРЕДЛОЖЕНИЯ ПО ЗАЩИТЕ 109
3.1. Отнесение хранилища на безопасное расстояние от здания 109
3.2. Уменьшение массы хранимого пропана 110
3.3. Меры по предупреждению аварийной ситуации на хранилище пропана 111
3.4. Меры по защите административного здания 112
3.5. Меры по индивидуальной защите оператора 112
ЭРГОНОМИКА 113
1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 114
1.1. Базовый подход к конструированию рабочего места оператора 114
1.2. Понятие рабочего места и рабочей зоны оператора 115
1.3. Формирование типового состава рабочей зоны 115
1.3.1. Организация пространства рабочего места оператора 116
1.3.2. Условия, которым должна удовлетворять рабочая зона 116
2. РЕАЛИЗАЦИЯ ЭРГОНОМИЧЕСКОЙ ОЦЕНКИ РАБОЧЕГО МЕСТА ОПЕРАТОРА 117
2.1. Основные эргономические требования, предъявляемые к дисплею 118
2.2. Основные эргономические требования, предъявляемые к клавиатуре 120
2.3. Размещение кресла оператора в рабочей зоне 121
2.4. Размещение устройств документирования 121
2.5. Расположение рабочего места оператора в помещении 122
ЗАКЛЮЧЕНИЕ 124
ЗАКЛЮЧЕНИЕ 127
ПРИЛОЖЕНИЕ 1 128
ПРИЛОЖЕНИЕ 2 131
СПИСОК ЛИТЕРАТУРЫ 163
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],
if(low>high) continue;
initsearch(argv,x,p,n);
}
break;
case '3':
PXDateEncode(atoi(argv[3]),
interval(date1,date1,argv[4],
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,
PXRecBufOpen(tblh,&rech);
PXPutDate(rech,1,date2);
PXPutAlpha(rech,2,time2);
if(PXRecInsert(tblh,rech))
PXRecNum(tblh,&high);
--high;
PXRecDelete(tblh);
PXPutDate(rech,1,date1);
PXPutAlpha(rech,2,time1);
if(PXRecInsert(tblh,rech))
if(PXRecNum(tblh,&low))printf(
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,
{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,
sprintf(string,"%.02d\\%.02d\\
PXGetAlpha(rech,2,10,string+
for(i=3;i<=nflds;++i)
PXGetAlpha(rech,i,sizeof(
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(
rec=(unsigned int *)calloc(n,sizeof(
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[
PXRecNum(tblh,&s[i]);
}
else
if(s[i]<max)
{
PXRecGoto(tblh,max-1);
if(!(a=PXSrchFld(tblh,rec[i],
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;++
{
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(
rec=(unsigned int **)calloc(nflds,sizeof(
z=(long **)calloc(nflds,sizeof(
for(i=3;i<=nflds;++i)
if(x[i])
{
rec[i]=(unsigned int *)calloc(x[i],sizeof(
z[i]=(long *)calloc(x[i],sizeof(
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-
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,
else PXRecNum(tblh,&z[i][k]);
}
else
if (z[i][k]<max)
{
PXRecGoto(tblh,max-1);
if(PXSrchFld(tblh,rec[i][k],i,
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;
}
}
// 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].
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," ДАТА
ВРЕМЯ ТИП_У П ВС СОСТОЯНИЕ_ШКАФА
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,"
break;
case 10: //РМ-10
sag=(char *)calloc(81,1);
sag2=(char *)calloc(81,1);
strcpy(sag, " ДАТА
ВРЕМЯ ТИП_У П ВС БЛОКИРОВКА
ЕСТЬ_СВЯЗЬ_С_ВК
strcpy(sag2,"
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,
if(a=PXInit()) printf("\n%s",PXErrMsg(a));
if(a=PXTblOpen("fk",&tblh,0,0)
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]),
PXDateEncode(atoi(argv[3]+11),
interval(date1,date2,argv[4],
search(argv[5]);
}
else
if (argv[2][0]=='2')
{
PXDateEncode(atoi(argv[3]),
PXDateEncode(atoi(argv[3]+11),
interval(date1,date2,argv[4],
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],
if(low>high) continue;
search(argv[5]);
}
}
else
if (argv[2][0]=='3')
{
PXDateEncode(atoi(argv[3]),
interval(date1,date1,argv[4],
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,"НЕИСПРАВЕН");