ПРИБОР ПРИЕМНО-АДАПТЕРНЫЙ




ПОЖАРНОЙ СИГНАЛИЗАЦИИ

3.1. Описание адаптера. Принцип работы.

Для передачи состояния пожарного извещателя на расстояние с выводом информации на компьютер необходимо задействовать часть функций приемно-контрольного прибора, при этом появляются новые функции (формирование байтов кодовой посылки и передача сигналов с компьютера на ПКП), т.е. непосредственно с пожарного извещателя через адаптерный прибор осуществить передачу информационного байта нецелесообразно.

Первичное звено обработки сигнала с пожарного извещателя и опроса состояния шлейфов – это приемно-контрольный прибор; в моей работе – это ППК-2.

Прибор приемно-контрольный ППК-2 предназначен для приема сигналов тревожных извещаний от автоматических и ручных пожарных извещателей с нормально-замкнутыми и нормально-разомкнутыми контактами, а также от активных пожарных извещателей с бесконтактным выходом (см. рис.2), формирующих сигнал о пожаре в виде дискретного уменьшения электрического сопротивления выходной цепи извещателя до величины, не превышающей 450 Ом при токе 20 мА (например, РИД-6М, ДИП-2, ИПР, ДИП-3).

Пульт обеспечивает отображение поступающей с охраняемых объектов информации (сигналы ПОЖАР, НЕИСПРАВНОСТЬ) с помощью оптических индикаторов и звукового сигнализатора, трансляцию поступивших сигналов с помощью контактов реле, а также формирование адресных сигналов пуска АСП.

 

Рис. 2. Схема подключения пожарных извещателей

к сигнальной линии прибора ППК-2.

1 - извещатель с нормально замкнутыми контактами (типа ИП 104-1, ИП 105-2/1 и т.п.);

2 - извещатель ИП 212-2 (ДИП-2);

3 - извещатель ИП 101-2, ИП 212-5 (ДИП-3);

4 - извещатель с нормально разомкнутыми контактами (ПИО-017);

5 - извещатель РИД-6М;

6 - извещатель ИП 329-2 "Аметист";

7 - выносное устройство оптической сигнализации ВУОС (ТеУ5.142.004); Р1 - резистор МЛТ-0,25-11 кОм ±5%: Р2 - резистор МЛТ-0.25-4.3 кОм ±5 %; УД1-УД2 - диоды полупроводниковые КД521А.

 

Основные технические данные ППК-2

 

1. Максимальное количество шлейфов сигнализации, подключаемых

к пульту, шт. 60

2. Максимальное количество активных пожарных извещателей, включаемых

в один шлейф, шт. 20

3. Максимальное количество пожарных извещателей, включаемых

в один шлейф, с нормально-замкнутыми и с нормально-разомкнутыми контактами, шт. 40

4. Максимальное сопротивление шлейфа, Ом 500

5. Амплитуда переменного напряжения прямоугольной формы в

шлейфе, В 20+4

6. Длительность длинного полутакта напряжения в шлейфе, с 0,7+0,15

7. Длительность короткого полутакта напряжения в шлейфе, с 0,05+0,01

8. Максимально-допустимая величина тока в шлейфе в дежурном режиме

при длинном полутакте напряжения, мА 10

9. Напряжение в линии АСП при включении сигнала пуска АСП, В 24+2

10. Величина тока ограничения в линии АСП, А 0,3+0,05

11. Величина времени задержки включения реле ОПОВЕЩЕНИЕ с

момента поступления сигнала ПОЖАР, с 35

12. Максимальный ток, коммутируемый контактами реле ОПОВЕЩЕНИЕ, при напряжении до 250 В, А 2

13. Максимальная мощность, коммутируемая контактами реле ПОЖАР, НЕИСПРАВНОСТЬ при напряжении до 80 В, Вт 10

14. Напряжение источников питания:

основного – сети переменного тока частотой 50Гц, В 220+22

резервного – источника постоянного тока, В 24+2,4

15. Максимальная потребляемая мощность пульта в дежурном режиме от источника питания:

основного, В А 40

резервного, Вт 40

16. Минимальное сопротивление изоляции между сетевыми цепями пульта и другими токопроводящими элементами, МОм 20

17. Диапазон эксплуатационных температур окружающей среды

пульта, 0С 0 +40

18. Максимальная относительная влажность окружающей среды пульта при

температуре 350С, % 80

19. Максимальная масса пульта на 60 сигнальных линий, кг 25

20. Наработка на отказ пульта (в пересчете на 1 сигнальную линию) должна

быть,ч 50

21. Срок службы пульта, лет 10

 

Основной узел взаимодействия ППК-2 и адаптерного прибора – Блок приема и регистрации, включающий в себя два независимых канала обработки сигналов, поступающих с сигнальных линий. С соответствующих контуров: «Пожар», «КЗ», «Обрыв», «АУП» (прямая и обратная связь) логический уровень поступает на регистры приема адаптера, что обеспечивает селективность адаптера по виду сигнала (см. Приложение 3).

 

Информация с блока приема и регистрации с разъема ПКП поступает на входные регистры формирователя информационного байта связанного с этим ПКП, затем – на приемо-передающий контроллер, где с учетом сработавшего направления, формируется и отправляется на компьютер через последовательный порт СОМ2 байт посылки. Компьютер принимает байт (для приема и обработки информации, поступающей на порт СОМ2, в памяти резидентно находится драйвер адаптера), выдает соответствующее сообщение на экран монитора (принтер). Связь с компьютером ПАСО, охраняющего объект осуществляется по индивидуальной кабельной линии, а дальнейшее прохождение информации – по телефонной линии при помощи модема.

Специально разработанное программное обеспечение позволит оператору управлять пуском АУП и состоянием приемно-контрольного прибора того или иного объекта через адаптер от компьютера после набора пароля, при этом предполагается наличие у оператора элементарных навыков работы на компьютере. В процессе функционирования прибора по каждому событию на объекте формируется запись в банк-протокол текущих событий, где информация о событии сформирована по признаку даты (места) и содержит:

а) время возникновения события;

б) наименование сигнала;

в) установившееся состояние сигнала.

Банк протоколов текущих событий можно просмотреть на экране монитора или распечатать в виде суточной сводки.

 

Структурно адаптер состоит (рис.3) из формирователей байтов, имеющих непосредственную связь с определенным ПКП при помощи кабеля (провода) и разъемов; приемо-передающего контроллера сбора и обработки информации, передающего сообщение по интерфейсу последовательного типа на IBM-совместимый компьютер для последующей обработки и хранения информации о событиях на контролируемом объекте, а также для адресного восстановления состояния ПКП и запуска АУП по команде оператора ЭВМ.

Электрическую схему приемно-адаптерного прибора можно реализовать на дискретных элементах и ИМС, что позволит выполнить его с небольшими габаритными размерами и высокой безотказностью в работе.

 

Таким образом, при работе с адаптерным прибором имеется возможность «гибкого» управления алгоритмом работы и изменения некоторых его характеристик как за счет регулировки параметров элементной базы, так и с компьютера (программно).

 

 
 


Приемно-адаптерный прибор

       
 
   
  Приемо-передающий контроллер
 

 


ФБ N  
ФБ n  
ФБ 1
Шл.№1

         
   
 
 
   
 

 

 


Шл.№n

           
   
 
   
 
 

 


ПАСО

ШЛЧС, УМЧС
10000011 – 1 шлейф

10000011 – ПКП №1

10001001 - «КЗ»

           
   
   
 
 


стартовые биты стоповые биты

 

 


Рис. 3. Схема информационного обмена.

 

3.2 Работа с драйвером, передача информации по сети.

 

Драйвер обеспечивает расшифровку байта данных поступающего с формирователя байта адаптера, обработку информации и выдаст сообщение на экран (принтер). Алгоритм программы может быть успешно реализован на языках высокого уровня Turbo Pascal 7.0 или С++ с применением ассемблерных вставок, при этом обеспечится удобный графический интерфейс программы управления, четкость работы, рациональность алгоритма программы, автозапуск и резидентность.

Драйвер резидентно располагается в памяти компьютера, постоянно опрашивает состояние порта, осуществляет обработку информации, поступающей от адаптера и отображение ее на экране монитора. Неотъемлемым звеном работы этой системы является интерфейс RS-232-C и, в частности, порт последовательной передачи данных СОМ2 для соединения с ком. Последовательная передача данных означает, что данные пе­редаются по единственной линии. При этом биты байта данных пе­редаются по очереди с использованием одного провода. Для синх­ронизации группе битов данных обычно предшествует специальный стартовый бит, после группы битов следуют бит проверки на чет­ность и один или два стоповых бита. Иногда бит проверки на чет­ность может отсутствовать.

 

Существует три основных способа соединения с компьютером для обмена информацией:

- непосредственная связь через асинхронный порт;

- связь с использованием модема;

- связь через локальные сети.

Далее рассматриваются первые два типа соединений ­непосредственное и соединение через модем.

Практически каждый компьютер оборудован хотя бы одним последовательным асинхронным адаптером. Обычно он представляет собой отдельную плату или же расположен прямо на материнской плате компьютера. Его полное название - RS-232-C. Каждый асинх­ронный адаптер обычно содержит несколько портов, через которые к компьютеру можно подключать внешние устройства. Каждому такому порту соответствует несколько регистров, через которые прог­рамма получает к нему доступ, и определенная линия IRQ (линия запроса прерывания) для сигнализации компьютеру об изменении состояния порта. Каждому порту присваивается логическое имя (COM1,COM2,и т.д.).

Компьютер IBM PC поддерживает интерфейс RS-232-C не в пол­ной мере; скорее разъем, обозначенный на корпусе компьютера как порт последовательной передачи данных, содержит некоторые из сигналов, входящих в интерфейс RS-232-C и имеющих соответствую­щие этому стандарту уровни напряжения.

В настоящее время порт последовательной передачи данных используется очень широко. Вот далеко не полный список примене­ний:

- подключение мыши;

- подключение графопостроителей, сканеров, принтеров, ди­гитайзеров;

- связь двух компьютеров через порты последовательной пе­редачи данных с использованием специального кабеля и таких программ, как FastWire II или Norton Commander;

- подключение модемов для передачи данных по телефонным линиям;

- подключение к сети персональных компьютеров;

Последовательная передача данных означает, что данные пе­редаются по единственной линии. При этом биты байта данных пе­редаются по очереди с использованием одного провода. Для синх­ронизации группе битов данных обычно предшествует специальный стартовый бит, после группы битов следуют бит проверки на чет­ность и один или два стоповых бита. Иногда бит проверки на чет­ность может отсутствовать.

 

Компьютер может быть оснащен одним или двумя портами последовательной передачи данных. Эти порты расположены либо на материнской плате, либо на отдельной плате, вставляемой в слоты расширения материнской платы.

Бывают также платы, содержащие четыре или восемь портов последовательной передачи данных. Их часто используют для подк­лючения нескольких компьютеров или терминалов к одному, цент­ральному компьютеру. Эти платы имеют название "мультипорт".

В основе последовательного порта передачи данных лежит микросхема INTEL 8250 или ее современные аналоги - INTEL 16450,16550,16550A. Эта микросхема является универсальным асинхронным приемопередатчиком (UART - Universal Asynchronous Receiver Transmitter). Микросхема содержит несколько внутренних регистров, доступных через команды ввода/вывода.

Микросхема 8250 содержит регистры передатчика и приемника данных. При передаче байта он записывается в буферный регистр передатчика, откуда затем переписывается в сдвиговый регистр передатчика. Байт "выдвигается" из сдвигового регистра по битам.

Программа имеет доступ только к буферным регистрам, копирование информации в сдвиговые регистры и процесс сдвига выпол­няется микросхемой UART автоматически.

К внешним устройствам последовательный асинхронный порт подключается через специальный разъем. Существует два стандарта на разъемы интерфейса RS-232-C, это DB-25 и DB-9. Первый имеет 25, а второй 9 выводов. Для работы приемно-адаптерного прибора используется 25-штырьковый разъем.

ТАБЛИЦА 1.

Разводка разъема DB25

               
   
 
     
 
 
 


Номер Назначение контакта Вход или

контакта (со стороны компьютера) выход

­1 Защитное заземление (Frame Ground,FG) -

2 Передаваемые данные (Transmitted Data,TD) Выход

3 Принимаемые данные (Received Data,RD) Вход

4 Запрос для передачи (Request to send,RTS) Выход

5 Сброс для передачи (Clear to Send,CTS) Вход

6 Готовность данных (Data Set Ready,DSR) Вход

7 Сигнальное заземление (Signal Ground,SG) -

8 Детектор принимаемого с линии сигнала

(Data Carrier Detect,DCD) Вход

9-19 Не используются

20 Готовность выходных данных

(Data Terminal Ready,DTR) Выход

21 Не используется

22 Индикатор вызова (Ring Indicator,RI) Вход

23-25 Не используются

ТАБЛИЦА 2.

Разводка разъема DB9

Номер Назначение контакта Вход или

контакта (со стороны компьютера) выход

 

1 Детектор принимаемого с линии сигнала

(Data Carrier Detect, DCD) Вход

2 Принимаемые данные (Received Data, RD) Вход

3 Передаваемые данные (Transmitted Data, TD) Выход

4 Готовность выходных данных

(Data Terminal Ready, DTR) Выход

5 Сигнальное заземление (Signal Ground, SG) -

6 Готовность данных (Data Set Ready, DSR) Вход

7 Запрос для передачи (Request to send, RTS) Выход

8 Сброс для передачи (Clear to Send, CTS) Вход

9 Индикатор вызова (Ring Indicator,RI) Вход

 

Компьютер является терминальным устройством. Модем (адаптер ПС) является устройством связи.

Стандарт RS-232-C определяет возможность управления потоком только для полудуплексного соединения, при котором в каждый момент времени данные могут передаваться только в одну сторону.

 

Технические параметры интерфейса RS-232-C

При передаче данных на большие расстояния без использова­ния специальной аппаратуры из-за помех, наводимых электромаг­нитными полями, возможно возникновение ошибок. Вследствие этого накладываются ограничения на длину соединительного кабеля между устройствами DTR-DTR и DTR-DCE.

Официальное ограничение по длине для соединительного кабе­ля по стандарту RS-232-C составляет 15,24 метра. Однако на практике это расстояние может быть значительно больше. Оно не­посредственно зависит от скорости передачи данных.

110бод - 1524м / 914,4м

300бод - 1524м / 914,4м 1200бод - 914,4м / 914,4м 2400бод - 304,8м / 152,4м 4800бод - 304,8м / 76,2м 9600бод - 76,2м / 76,2м

Уровни напряжения на линиях разъема составляют для логи­ческого нуля -15..-3 вольта, для логической единицы +3..+15 вольт. Промежуток от -3 до +3 вольт соответствует неопределен­ному значению.

 

Порты асинхронного адаптера

На этапе инициализации системы, модуль POST BIOS тестиру­ет имеющиеся асинхронные порты RS-232-C и инициализирует их. В зависимости от версии BIOS инициализируются первые два или че­тыре порта. Их базовые адреса располагаются в области данных BIOS, начиная с адреса 0000:0400h.

Первый адаптер COM1 имеет базовый адрес 3F8h и занимает диапазон адресов от 3F8h до 3FFh. Второй адаптер COM2 имеет ба­зовый адрес 2F8h и занимает адреса 2F8h..2FFh.

Асинхронные адаптеры могут вырабатывать прерывания:

COM1, COM3 - IRQ4

COM2, COM4 - IRQ3

Имеется 7 основных регистров для управления портами:

а) Регистр данных

Регистр данных расположен непосредственно по базовому ад­ресу порта RS-232-C и используется для обмена данными и для за­дания скорости обмена.

Для передачи данных в этот регистр необходимо записать пе­редаваемый байт данных. После приема данных от внешнего уст­ройства принятый байт можно прочитать из этого же регистра (см. Приложение 1).

В зависимости от состояния старшего бита управляющего ре­гистра (расположенного по адресу base_adr+3, где base_adr соответствует базовому адресу порта RS-232-C),назначение этого регистра может изменяться. Если старший бит равен нулю, регистр

используется для записи передаваемых данных. Если же старший бит равен единице, регистр используется для ввода значения младшего байта делителя частоты тактового генератора. Изменяя содержимое делителя, можно изменять скорость передачи данных. Старший байт делителя записывается в регистр управления преры­ваниями по адресу base_adr+1.

Максимальная скорость обмена информацией, которую можно достичь при использовании асинхронного адаптера, достигает 115200 бод, что примерно соответствует 14 Кбайт в секунду.

б) Регистр управления прерываниями

Этот регистр используется либо для управления прерываниями от асинхронного адаптера, либо (после вывода в управляющий ре­гистр байта с установленным в 1 старшим битом) для вывода зна­чения старшего байта делителя частоты тактового генератора.

в) Регистр идентификации прерывания

Считывая его содержимое, программа может определить причи­ну прерывания

г) Управляющий регистр

Управляющий регистр доступен по записи и чтению. Этот ре­гистр управляет различными характеристиками UART: скоростью передачи данных, контролем четности, передачей сигнала BREAK, длиной передаваемых слов (символов).

д) Регистр управления модемом

Регистр управления модемом управляет состоянием выходных линий DTR, RTS и линий, специфических для модемов - OUT1 и OUT2, а также запуском диагностики при соединенных вместе входе и выходе асинхронного адаптера.

е) Регистр состояния линии

Регистр состояния линии определяет причину ошибок, которые могут возникнуть при передаче данных между компьютером и мик­росхемой UART.

ж) Регистр состояния модема

Регистр состояния модема определяет состояние управляющих сигналов, передаваемых модемом асинхронному порту компьютера.

 

Инициализация асинхронного адаптера

Первое, что должна сделать программа, работающая с асинх­ронным адаптером - установить формат и скорость передачи дан­ных. После загрузки операционной системы для асинхронных адап­теров устанавливается скорость 2400 бод, не выполняется провер­ка на четность, используются один стоповый и восьмибитовая дли­на передаваемого символа. Можно изменить этот режим командой MS-DOS MODE.

Выполнив ввод из управляющего регистра, программа может получить текущий режим адаптера. Для установки нового режима измените нужные вам поля и запишите новый байт режима обратно в управляющий регистр.

Если вам надо задать новое значение скорости обмена данны­ми, перед записью байта режима установите старший бит этого байта в 1, при этом регистр данных и управляющий регистр используются для задания скорости обмена. Затем последовательно двумя командами ввода загрузите делитель частоты тактового ге­нератора. Младший байт запишите в регистр данных, а старший - в регистр управления прерываниями.

Перед началом работы необходимо также проинициализировать регистр управления прерываниями, даже если в вашей программе не используются прерывания от асинхронного адаптера (см. Приложение 1). Для этого сначала надо перевести регистр данных и регистр управления пре­рываниями в обычный режим, записав ноль в старший бит управляющего регистра. Затем можно устанавливать регистр управления прерываниями. Если прерывания вам не нужны, запишите в этот порт нулевое значение.

 

Электронная почта

Большой интерес представляет использование приемно-адаптерного прибора в локальной сети АСУ МЧС как средства обработки и дальнейшего анализа информации. Одной из возможностей сети является организация электронной почты. Если компьютер подклю­чен к сети, и вы имеете специальное программное обеспечение для обмена почтой, имеется возможность отправлять через сеть письма (сообщения) другим пользователям сети (рис. 3).

Само письмо представляет собой обычный файл, содержащий текст письма и специальный заголовок, в котором указано, от ко­го письмо направлено, кому предназначено, какая тема письма и дата отправления. Автоматизировать данный процесс несложно при наличии программного обеспечения обмена данными по сети на компьютерах.

ЗАКЛЮЧЕНИЕ

В результате разработки приемно-адаптерного прибора пожарной мною проанализирован отечественный и зарубежный опыт раннего обнаружения пожара при помощи автоматических систем пожарной сигнализации, основные технические решения в этой области, перспективы развития, пути оптимизации и повышения надежности работы систем пожарной сигнализации. В данной работе в качестве одного из вариантов решения проблемы раннего обнаружения пожара в рамках концепции создания АСУ МЧС Беларуси предложен проект приемно-адаптерного прибора пожарной сигнализации.

При его использовании достигается:

1). Повышение эффективности использования установок автоматического пожаротушения и сигнализации;

2). Сокращение времени реагирования оперативного персонала на экстремальную информацию;

3). Ведение бланка протоколов событий;

4). Улучшение социальных условий труда.

На программном уровне обеспечивается документирование информации о загораниях и техническом состоянии системы пожарной сигнализации, ведется банк протоколов текущих событий, осуществляется дистанционное управление приемно-контрольным прибором, и пуском АУП. Возможна автоматизация контроля состояния установок автоматического пожаротушения. Адаптер прост и удобен в эксплуатации, в определенной степени сможет составить конкуренцию зарубежным приборам. Необходимо глубже проработать вопрос об универсальности подключения прибора к различным типам ПКП.

Несомненно, его применение на объектах хозяйствования даст положительный эффект в улучшении информативности в системе МЧС, а следовательно и повышении пожарной безопасности. Массовое внедрение системы в жилых домах, квартирах, дачах, общежитиях, гостиницах, промышленных предприятиях и других помещениях с постоянным проживанием людей и пребыванием персонала позволит существенно сократить число погибающих (уменьшение времени обнаружения, прибытия), а в сочетании с комплексом других профилактических мер либо исключить их, либо свести к минимуму.

ЛИТЕРАТУРА

1. ГОСТ 12.1.004-91. Пожарная безопасность. Общие требования.

2. ГОСТ 12.3.046 Установки пожаротушения автоматические. Общие требования.

3. Касаткин А.И. Профессиональное программирование на языке СИ. Управление ресурсами: Справочное пособие. – Мн.: Выш. Шк., 1992.

4. Малешин В.Г. Аппаратно-программные комплексы систем автоматического контроля и управления процессами пожаротушения, пожарной сигнализации//Пожарная безопасность. Материалы первой республиканской научно-практической конференции, -Мн.; 1994г.

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) //!!! необходимо вызывать перед выходом из программы

{

disable();

reseterr();

outportb(MCR,8); //rts=0 out2=1

restorevect(); // восстановить обработчик

outportb(IMR,(inportb(IMR)|rgmask)); // запретить прерывание

enable();

}

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();

}

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-08-04 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: