Приемно-адаптерный прибор пожарной сигнализации
5.
Нилов В.А. Технические средства охранно-пожарной
сигнализации.; НОУ «Такир», -М., 1998г.
6.
Панель охранно-пожарная «Control Equipment». Техническое описание.
7.
Пожарная безопасность. Специализированный каталог.
– М.: «Гротек», 2000г.
8.
Пожарная сигнализация. Современные устройства
пожарной сигнализации. Проектирование систем безопасности на основе
компьютерных технологий.; «Гротеск», -М, 1998г.
9.
Пожарно-охранный извещатель «Apollo XP95». Техническое описание.
10. Пульт приемно-контрольный ППК-2. Паспорт еу2.407.003 ПС.
11. Руководство по архитектуре IBM PC/AT. под ред. М.Л.Махрхасина.; ООО «Консул», -Мн., 1993г.
12. СНиП 2.04.09-84 Пожарная автоматика.
13. Собурь В.А. Установки автоматической пожарной сигнализации: Справочник.
Вып. 1-й – М.: Спецтехника, 1999.
14. Современные средства пожарной и пожарно-охранной сигнализации.; -М,
1990г.
15. СТБ 11.16.01-98 Системы пожарной сигнализации.
16. Юлин В.А., Булатова И.Р. Приглашение к СИ. – Мн.: Выш. Шк.,
1990.
ПРИЛОЖЕНИЕ 1
//
======================================================================
// = Базовая программа работы с
последовательным портом COMi.
// = Обмен с использованием прерываний
//
======================================================================
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <process.h>
#define COM 2 // задается номер порта
1-COMi; 2-COM2
// дальнейший код справедлив
для машин класса AT
#define INTRS 13-COM
#define m_speed 2 // множитель задает
скорость передачи
// 1-9600
// 2-19200 и т.д.
// 6-57600
// 12-115200
#define cbuf 2000 // размер буфера
данных
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
#define rgmask 16/COM //маска в регистре
маски прерываний
#define byte_sync 33
#define byte_pream 85
int IMR=0x21; // регистр маски
прерываний
int base,IER,IIR,LCR,LSR,MSR,MCR,LSB,MSB;
// регистры контроллера
//
последовательного интерфейса
char fl_d=0; // флаг устанавливается
если принят байт
// если=0 то буфер пуст
char overb=0; // флаг устанавливается
если буфер переполнен
char area[cbuf]; // буфер
данных
int head=0,teil=0; // указатели головы и
хвоста
char count0=0; // help count
char exiterr=0; //номер ошибки при приеме
// exiterr=0 -
ошибок нет
// exiterr=1 -
ошибка приема
// exiterr=2 -
ошибка по тайм-ауту
// exiterr=3 -
cбой в приеме: передано неверное
//число
байт
// exiterr=4 -
сбой при приeмe или переполнение
//буфера
char errcode=0; // код ошибки
void interrupt obrcom(__CPPARGS); /* interrupt prototype
*/
void interrupt (*oldfunc)(__CPPARGS); /* interrupt
function pointer */
void nevid(void); //делает курсор
невидимым
void initrs(void); //инициализация COM
порта
void init(void); //инициализация
переменных
void exitp(void); //!!! необходимо вызывать
перед выходом из программы
int trans(char); //передача байта через
СОМ порт
void deside(void); //обработка данных
void signal(void); //звуковой
сигнал
void outinfo(void); //вывод информации на
экран
void reseterr(void); //сброс ошибок RS232
void instvect(void); //Замена вектора
прерываний COMi
void restorevect(void); //Восстановление
старого обработчика C
void incteil(void); //Увеличение
указателя хвоста
void err(char *); //Выход по ошибке
void Transb(char); // посылка байта с сервисом
int Transb_hiden(char); // Не выдает
сообщения об ошибках
void clearbof(void); // очистка буфера
данных
void definit(void); // определяет
работоспособность с той стороны
void clearbofkey(void); // очистка буфера
клавиатуры
void pusk(void);
struct k_win // координаты окна
{ int x0,y0,x1,y1,lastx,lasty; } wmain,wmes;
//=======================
void nevid(void) //невидимый курсор
{ asm{ push cx
push ax
mov ah,01
mov ch,20H
mov cl,0
int 10H
pop ax
pop cx
}
}
// =========== инициализация переменных
====================
void init(void)
{ int i;
wmain.x0=1; wmain.y0=1; wmain.x1=80; wmain.y1=16;
wmes.x0=1; wmes.y0=wmain.y1+2; wmes.x1=80; wmes.y1=25;
wmain.lastx=wmain.lasty=wmes.lastx=wmes.lasty=1;
exiterr=0;
}
//============ инициализация
последовательного порта ===========
void initrs(void)
{
asm { push es
push bx
mov bx,COM
dec bx
shl bx,1
mov ax,40H //вычислить базовый адрес
mov es,ax
mov dx,es:[bx]
mov base,dx
pop bx
pop es
}
IER=base+1; IIR=base+2; LCR=base+3; MCR=base+4;
LSR=base+5;
MSR=base+6; LSB=base; MSB=base+1;
disable();
instvect(); // установить обработчик
outportb(IMR,(inportb(IMR)&(255-rgmask))); // разрешить прерывание
outportb(IER,5); //разрешить прерывания
по доступности данных и по ошибке
outportb(LCR,(inportb(LCR)|0x80)); //
доступ к делителю частоты
outportb(LSB,12/m_speed); //
1843200/(x*16)=y бит/c
outportb(MSB,0);
outportb(LCR,27); // установить параметры :
// длина слова обмена 8 бит +
контроль четности + DLAB=0
outportb(MCR,(8)); // ;rts=0 ;dtr=0
// сбросить условия
возникновения прерываний
//outportb(base,0);
inportb(base);
inportb(MSR);
inportb(LSR);
enable();
}
//=========== звуковой
сигнал ==================
void signal(void)
{ sound(700); delay(200); nosound();
}
// чтение LSR - сброс ошибок
void reseterr(void)
{
inportb(LSR);
}
char foi=0;
// ================= передача байта 'dm' в канал связи
==========
int trans(char dm)
{
inlsr:
asm {
mov dx,base
add dx,5
in al,dx //прочитать
LSR
test al,00011110B // ошибка
?
jnz toer
test al,1
jnz indata
test al,32 // Передатчик
освобожден ?
jz inlsr
sub dx,5
mov al,dm
out dx,al
}
return 0;
toer: reseterr(); return -1;
indata: return 1;
}
void instvect(void)
// замена вектора прерывания
{
oldfunc = _dos_getvect(INTRS);
_dos_setvect(INTRS,obrcom);
}
// восстановление старого
вектора
void restorevect(void)
{ /* restore to original interrupt routine */
_dos_setvect(INTRS,oldfunc);
}
char d;
//=========== прием данных не используя
прерываний =============
int priem(void)
{ char clt; int i=0;
do { clt=inportb(LSR);
if ((clt&30)!=0) { errcode=clt; reseterr();
return -1; }
// байт принят ?
if (clt&1) { d=inportb(base); return 0; }
i++;
}
while (i!=0);
return 1;
}
// новый обработчик прерывания
от COMi
void interrupt obrcom(__CPPARGS)
{ char p;
p=((inportb(IIR)>>1)&3);
switch (p) // определить тип прерывания
{ case 0: // изменение линии
состояния устройства с той стороны
inportb(MSR); break;
case 1: // прерывание от
передатчика
break;
case 3: // по ошибке
errcode=inportb(LSR); inportb(base);
break;
case 2: // доступность данных
{ area[head++]=inportb(base);
//записать байт в буфер
if (head==cbuf)
head=0;
if (head==teil) overb=1; // отметить если голова догнала
//
хвост
fl_d=1; // отметить
заполнение буфера
break;
};
default: // неизвестное
прерывание
errcode=128;
}
enfin: // завершить прерывание
asm { mov al,20H
out 20H,al
}
}
// очищает буфер данных
void clearbof(void)
{ while (fl_d) incteil(); }
void clearbofkey(void)
{ while (kbhit()) getch(); }
// Выход по ошибке
void err(char *mes)
{
exitp(); clearbofkey();
printf("%s\n",mes); exit(0);
}
// Увеличение указателя хвоста
void incteil(void)
{ if (teil==(cbuf-1)) teil=0; else teil++;
asm cli;
if (head==teil) fl_d=0; // если буфер пуст
asm sti;
}
// посылка байта с
ожиданием и с очищением буфера
// от байта который
был послан
void Transb(char CC)
{ int li,opf,hp;
li=1; opf=0;
do // цикл посылки и ожидания
освобождения передатчика
{ hp=trans(CC);
switch (hp)
{ case 0: opf=1; break;
case 1: li++; hp=inportb(base); break;
case -1: { printf("Ошибка при передаче\n");
reseterr(); break;}
}
if (li==0) printf("Тайм-аут
при передаче\n");
}
while (!opf);
}
// посылка байта с
ожиданием и с очищением буфера
// от байта который был
послан
// Не выдает сообщения об
ошибках
int Transb_hiden(char CC)
{ int li,opf,hp;
li=0; opf=0;
do // цикл посылки и ожидания
освобождения передатчика
{ hp=trans(CC);
switch (hp)
{ case 0:
opf=1; break;
case 1: { //доступность
данных
li++;
inportb(base);
reseterr;
break;
};
case -1: return -1; //err("Ошибка при передаче"); break;
}
if (li==100) return 1; //err("Тайм-аут при передаче");
}
while (opf==0);
// цикл ожидания приема байта
- того что был послан
li=0;
while (fl_d==0)
{
if (++li==0) return 2;
//err("Тайм-аут Не принято ни 1 символа");
}
if (area[teil]!=CC) return 3;
//err("Не принято то что послано");
incteil();
return 0;
}
void priembig(void)
{ int a;
a=priem();
switch (a)
{ case 0: printf("Принято
%d\n",d); break;
case 1: printf("Тайм-аут\n"); break;
case -1:
printf("ErorCode=%d\n",errcode); inportb(base);
}
}
#define pi 3.1416
// Возвращает главное значение ARCTAN
[0..2*pi]
double mARCTAN(double z_sin,double z_cos)
{ double ang;
if (z_sin==0)
{ if (z_cos<0) return (pi/2.0);
else return (1.5*pi);
}
ang=-atan(z_cos/z_sin);
if (z_sin<0) ang+=pi;
if (ang<0) ang+=2*pi;
return ang;
}
char getsym(void)
{ char a;
a=area[teil]; incteil();
return a;
}
//---------------------------------
void exitp(void) //!!! необходимо
вызывать перед выходом из программы
int get_size(void) // возвращает число
байт в буфере
{ int i;
if ( (i=(head-teil))<0 ) i+=cbuf;
return i;
}
//===== отобразить информацию ==================
void outinfo(void)
{ char a; char str1[40];
while ( (get_size()>=1) & (!kbhit()) )
{
printf(" %X",(int)getsym());
if (errcode!=0) {
printf("ErrCode=%d\n",errcode);
errcode=0;
}
}
}
struct dostime_t w,w1;
double at,bt;
void fix_time(void) // фиксирует системное
время во внутреней переменной
{
_dos_gettime(&w);
at=(double)(w.hour*360000+w.minute*6000+w.second*100+(double)w.hsecond);
}
double get_time(void) // возвращает время
прошедшее с момента последнего
// фиксирования
{
_dos_gettime(&w1);
bt=(double)(w1.hour*360000+w1.minute*6000+w1.second*100+(double)w1.hsecond);
bt-=at;
return bt;}
int wait(int x)
{ fix_time();
while (get_size()<x)
{ if (get_time()>(double)(x*4)) return 0;
}
return 1;}
#define Esc 27
#define sym_S 83
#define sym_W 87
#define sym_Z 90
#define sym_A 65
//====================================
void main(void)
{ char hpl,hph,ch; char mas[100];
int j,i,jh;
long li;
int cos,sin,sh,am;
double sr;
// printf("my_dt=%7.4f
\n",(mARCTAN(14927.0,-28113.0)/pi*2000));
// return ;
init(); initrs();
clrscr();
Transb(85);
Transb(6);
Transb(0);
while (!kbhit()) // { Transb(85); delay(100); }
outinfo();
me:
errcode=0;
clearbofkey();
exitp();
}
Аннотация научной работы
Девиз: "Не
отступать и не сдаваться!"
1.
Приемно-адаптерный прибор
пожарной сигнализации.
2.
УДК 614.842.4
3.
КИИ МЧС Республики
Беларусь.
4.
2000 год.
5.
Объём работы: 44 с.
6.
Количество приложений: 3
7.
Количество иллюстраций: 3
8.
Количество таблиц: 2
9.
Источников литературы: 16.
Характеристика работы.
1. Цель: Обеспечение возможности
автоматизированной компьютерной обработки информации систем
пожарной сигнализации.
2. Методы: анализ технических решений,
опытно-конструкторская проработка, программирование.
Основные результаты: разработан проект
конструкции приемно-адаптерного прибора пожарной сигнализации и программа
информационного обмена.
Наличие документа об
использовании научных результатов: да.
подпись автора ______________
СВЕДЕНИЯ
об авторе и научном руководителе работы,
представленной под девизом: «Не отступать и не
сдаваться!»
АВТОР НАУЧНЫЙ РУКОВОДИТЕЛЬ
|