Бизнес-план разработки
Данный дипломный проект предполагает создание локальной вычислительной сети для одного из подразделений организации-заказчика и обеспечение в этой сети необходимого уровня защиты информации.
При всем многообразии на рынке программного и аппаратного обеспечения для локальных сетей, создание каждой системы специального назначения носит узкий прикладной характер и в связи с этим, как правило, возникает потребность в дополнительных разработках, обеспечивающих нестандартные свойства системы. Особенностью данной сети является высокая степень защиты информации. При этом необходимо обеспечить ее на всех стадиях работы системы, то есть при хранении, обработке и передаче информации. Эта задача реализуется как с помощью стандартных средств, так и созданными в процессе проектирования.
Внедрение проекта позволит в значительной мере ускорить обмен информацией в подразделении, снизить затраты рабочего времени на действия, напрямую не относящиеся к должностным обязанностям. При использовании для защиты информации и разграничения доступа средств операционной системы и дополнительных программно-аппаратных средств планируется в значительной мере повысить уровень безопасности информации, так как резко сокращается число людей, способных нанести ущерб информации.
Таким образом, реализация проекта позволит значительно уменьшить затраты рабочего времени на организационные вопросы, а, следовательно, повысить производительность труда и экономическую эффективность проводимых работ. При использовании для обеспечения безопасности средств сети возможно не только повысить ее уровень, но и сократить штат сотрудников, отвечающих за вопросы безопасности, что в свою очередь также ведет к повышению экономической эффективности работ.
Данный раздел проекта включает в себя расчет затрат на тему, определение договорной цены разработки и составление сетевого графика работ.
ОПРЕДЕЛЕНИЕ ЗАТРАТ НА ТЕМУ.
Для определения затрат на тему необходимо рассчитать следующие статьи расхода:
основная заработная плата персонала,
дополнительная заработная плата,
отчисления на социальные нужды,
производственные командировки,
оплата работ, выполняемых сторонними организациями,
накладные расходы,
основные материалы и покупные изделия.
Основная заработная плата определяется как произведение трудоемкости выполнения каждого этапа (вида работ) в человеко-днях, переведенных в человеко-месяцы, и величины месячного должностного оклада исполнителя.
Результаты расчета приводятся в таблице 2.1
Таблица 2.1 Основная заработная плата персонала по теме
N п/п | Наименование этапов | Исполнители | Трудоемкость, в чел. мес. | Должностной оклад, руб. | Затраты по зарплате, руб. |
1. | Проведение НИР. | Нач. Отдела Вед. инж Инж.1 кат. | 5 5 15 | 2000 1200 1000 | 10000 6000 15000 |
2. | Монтаж сети. | Монтажник Рабочий Инж.1 кат. | 5 5 2 | 700 700 1000 | 3500 3500 2000 |
3. | Наладка сети. | Вед. инж Монтаж-ник Инж.1 кат. | 2 2 7 | 1200 700 1000 | 2400 1400 7000 |
Итого | 50800 |
Таким образом, основная заработная плата персонала составляет 50800 руб.
Зосн = 50800 руб.
Дополнительная заработная плата научного и производственного персонала составляет 20% от основной.
Здоп = Зосн * 0.2 = 50800 * 0.2 = 10160 руб.
Отчисления на социальные нужды составляют 38.5% от суммы основной и дополнительной зарплат.
Зсн = 0.385 * (Зосн + Здоп) =
= 0.385 * (50800 + 10160) = 23470 руб.
Расчет затрат на материалы и покупные изделия производится на основе сводной ведомости (табл.2.2). (Цены на изделия приняты на начало октября 1998г).
Таблица 2.2. Затраты на материалы и покупные изделия
Материал, покупное изделие | Количество, ед. | Цена за ед., руб. | Сумма, руб. |
Сервер | 4 | 36000 | 144000 |
Раб. станция | 60 | 18000 | 1080000 |
Сетевое оборудование | 8 | 1260 | 100800 |
Кабель | 500 (м) | 36 | 18000 |
Итого | 1342800 |
В стоимость материальных затрат включаются также и транспортно-заготовительные расходы. Они составляют 10% от Змат.
Зтр = 0.1 * Змат
Зтр = 0.1 * 1342800 = 134280 руб.
Общая стоимость материальных затрат определяется как сумма Змат и Зтр.
Змато = Змат + Зтр
Змато = 1342800 + 134280 = 1477080 руб.
Накладные расходы составляют 250% от основной зарплаты производственного пресонала и считаются по формуле:
Зн = 2.5 * Зосн = 2ю5 * 50800 = 127000 руб.
Затраты, связанные с услугами смежных организаций составляют 20% от Зосн. В данной работе к услугам смежников не прибегают, и, следовательно, эта статья не учитывается при дальнейших расчетах калькуляции на тему.
Командировки составляют 20% от суммы основной и дополнительной заработных палат:
Зком = 0.2 * (Зосн + Здоп); Зком = 0.2 * (50800 + 10160) = 12192 руб.
Все расчеты по статьям калькуляции работы сведены в таблицу 2.3.
Таблица 2.3 Сметная калькуляция по теме.
N п/п | Статья расхода | Сумма, руб. |
1. | Основная заработная плата | 50800 |
2. | Дополнительная заработная плата | 10160 |
3. | Отчисления на социальные нужды | 23470 |
4. | Производственные командировки | 12192 |
5. | Оплата работ, выполняемых сторонними организациями | - |
6. | Накладные расходы | 127000 |
7. | Материалы и покупные изделия | 1477080 |
Итого | 1700702 |
Таким образом себестоимость разработки составляет 1700702 руб.
С = 1700702 руб.
ОПРЕДЕЛЕНИЕ ДОГОВОРНОЙ ЦЕНЫ РАЗРАБОТКИ.
С помощью рассчитанной выше себестоимостью разработки можно определить ее договорную цену. Она рассчитывается по формуле:
Цд = С + Фз. п. * Нр * К / 100, где (2.1)
С - себестоимость разработки,
Фз. п. - заработкая плата сотрудников, непосредственно участвующих в выполнении работы, руб.,
Нр - рентабельность,%,
К - коэффициент, учитывающий заработную плату обслуживающих и управленческих подразделений.
Рентабельность рассчитывается в целом по организации в процентах к общему фонду заработной платы исходя из обязательного обеспечения выплаты фиксированных платежей. Корректирующий коэффициент К также рассчитывается в целом по организации как отношение общего фонда заработной платы к фонду заработной платы подразделений, непосредственно занятых проведением НИР. Величены Нр и К принимаются по данным НИИ, где выполняется дипломный проект.
При С = 1700702 руб., Фз. п. = Зосн + Здоп = 60960 руб., Нр = 15%, К = 5
определим договорную цену на разработку:
Цд = 1700702 + 60960 * 15 * 5/100 =
= 1746422 руб.
Договорная цена разработки составила 1746422 руб.
ПЛАНИРОВАНИЕ РАБОТ ПО ТЕМЕ С ПРИМЕНЕНИЕМ СЕТЕВЫХ МЕТОДОВ.
Как правило, планирование работ по теме усложняется тем, что в работе участвуют несколько исполнителей, начало многих работ зависит от результатов других и т.д. В таких условиях наиболее удобными являются системы сетевого планирования и управления (СПУ).
Планирование НИР с применением сетевого метода ведется в следующем порядке:
составляется перечень событий и работ,
устанавливается топология сети,
строится сетевой график по теме,
определяется продолжительность работ,
рассчитываются параметры сетевого графика,
определяется продолжительность критического пути,
проводится анализ и оптимизация сетевого графика.
Перечень событий приведен в таблице 2.4, перечень работ и их продолжительности - в таблице 2.5. На основании этих перечней строится сетевой график, изображенный на рис.2.1.
Таблица 2.4 Перечень событий сетевого графика.
Код события | Событие | |
1. | ТЗ на систему разработано. | |
2. | ТЗ на систему утверждено. | |
3. | Спецификация закупаемых ТС разработана. | |
4. | Спецификация закупаемого ПО разработана. | |
5. | Спецификация закупаемых ТС утверждена. | |
6. | Спецификация закупаемого ПО утверждена. | |
7. | Входной контроль закупаемых ТС проведен. | |
8. | Входной контроль закупаемого ПО проведен. | |
9. | Стенд создан. | |
10. | Установлена и настроена сетевая ОС. | |
11. | Установлено антивирусное ПО. | |
12. | Установлены и отлажены специальные программные средства защиты информации. | |
13. | Разработана и выпущена инструкция по использованию антивирусного ПО. | |
14. | Разработана и выпущена инструкция по использованию встроенных средств защиты сетевой ОС. | |
15. | Определены требования к дополнительным программным средствам по защите информации. | |
16. | Разработана инструкция сетевому администратору по применению специальных средств защиты информации. | |
17. | Разработка рекомендаций по использованию средств защиты на ЛВС заказчика. | |
18. | Закончены работы по созданию системы защиты информации на ЛВС заказчика. | |
19. | Закончены работы по испытанию и сдаче заказчику системы. | |
20. | Оформлен протокол и акт испытаний. |
Таблица 2.5 Перечень работ сетевого графика.
i-j | Работа | tmin | tmax | to | ||
1-2 | Утверждение ТЗ на систему. | 25 | 30 | 27 | ||
2-3 | Разработка спецификации закупаемых ТС. | 5 | 7 | 6 | ||
2-4 | Разработка спецификации закупаемого ПО. | 10 | 12 | 11 | ||
3-5 | Утверждение спецификации закупаемых ТС. | 2 | 3 | 2 | ||
4-6 | Утверждение спецификации закупаемого ПО. | 3 | 4 | 3 | ||
5-7 | Проведение входного контроля закупаемых ТС. | 5 | 7 | 6 | ||
6-8 | Проведение входного контроля закупаемого ПО. | 10 | 14 | 12 | ||
7-9 | Монтаж стенда. | 10 | 15 | 12 | ||
9-10 | Наладка стенда. | 3 | 4 | 3 | ||
8-10 | Установка сетевой ОС. | 2 | 3 | 2 | ||
10-11 | Установка антивирусного ПО. | 2 | 3 | 2 | ||
10-12 | Установка специальных программных средств защиты информации. | 2 | 3 | 2 | ||
11-13 | Разработка инструкции по использованию антивирусного ПО. | 8 | 10 | 9 | ||
10-14 | Разработка инструкции по использованию встроенных средств защиты сетевой ОС. | 20 | 24 | 22 | ||
12-15 | Формирование требований к дополнительным программным средствам по защите информации. | 22 | 26 | 24 | ||
i-j | Работа | tmin | tmax | to | ||
12-16 | Разработка инструкции сетевому администратору по применению специальных средств защиты информации. | 25 | 29 | 27 | ||
13-17 | Выпуск инструкции по использованию антивирусного ПО. | 5 | 8 | 6 | ||
14-17 | Выпуск инструкции по использованию встроенных средств защиты сетевых ОС. | 7 | 9 | 8 | ||
15-17 | Выпуск инструкции по применению дополнительных программных средств защиты. | 5 | 6 | 5 | ||
16-17 | Выпуск инструкции сетевому администратору по применению специальных средств защиты. | 5 | 7 | 6 | ||
17-18 | Проведение работ по созданию системы защиты информации на ЛВС заказчика. | 35 | 42 | 38 | ||
18-19 | Проведение испытаний и сдача системы заказчику. | 24 | 30 | 27 | ||
19-20 | Оформление протокола и акта испытаний. | 4 | 6 | 5 | ||
Выполнение больщинства работ по разработке нового изделия всегда связано с элементами неоднородности. Их продолжительность зависит от многих факторов, предвидеть которые очень трудно. Поэтому в системе сетевого планирования предложено определить две вероятностные оценки времени: оптимистическую и пессимистическую. Оптимистическая оценка - максимально необходимое время для выполнения данной работы при наиболее благоприятных условиях. Пессимистическая оценка - максимально необходимое время для выполнения работы при наиболее неблагоприятных условиях. В данной работе эти оценки берутся по опыту предыдущих разработок и все времена определяются в рабочих днях. Для расчета ожидаемой продолжительности работ используется формула:
to = (3tmin + 2tmax) / 5, (2.2)
где to - ожидаемая продолжительность работ,
tmin - оптимистическая оценка,
tmax - пессимистическая оценка.
После построения графика и сбора необходимых данных рассчитывают параметры сети: сроки свершения событий, резервы времени, продолжительность критического пути.
Любая последовательность работ в сети называется путем. Путь, имеющий наибольшую продолжительность называется критическим (Tкр). В данной работе критический путь равен 161 дня и выделен на рис.2.1 жирной линией.
Для расчета сети "в терминах событий" используются следующие понятия. Ранний срок наступления события (Tpi) - минимальный срок, необходимый для выполнения всех работ, предшествующих данному событию. Ранний срок наступления события i определяется по формуле:
Tpi = max å toij. (2.3)
Поздний срок наступления события (Tni) - максимально допустимый срок наступления события i, при котором сохраняется возможность соблюдения ранних сроков наступления последующих событий. Поздний срок определяется по формуле:
Tni = Tкр - max å to. (2.4)
Все события в сети, кроме лежащих на критическом пути имеют резерв времени (Ri), который определяется по формуле:
Ri = Tni - Tpi. (2.5)
При описании сети "в терминах работ" определяются ранние и поздние сроки начала и окончания работы. Ранний срок начала - Трнij = Трi, поздний срок начала - Тпнij = Tni - tij, ранний срок окончания - Троij = Трi + tij, поздний срок окончания - Тпоij = Tnj.
Работы сетевой модели могут иметь два вида резервов: полный (Rnij) и свободный (Rcij). Полный резерв показывает, на сколько может быть увеличена продолжительность данной работы или сдвинуто ее начало так, чтобы продолжительность максимального из проходящий через нее путей не превысила критического пути. Полный резерв определяется
Rnij = Tnj - Tpi - tij. (2.6)
Свободный резерв указывает максимальное время, на которое можно увеличить продолжительность данной работы или изменить ее начало, не меняя ранних сроков начала последующих работ. Определяется в виде:
Rcij = Tpj - Tpi - Tij. (2.7)
Результаты расчета параметров сетевого графика представлены в таблице 2.6
Таблица 2.6 Временные параметры работ сетевого графика.
i-j | toij | Tрнij | Троij | Тпнij | Tпоij | Rnij | Rcij |
1-2 | 27 | 0 | 27 | 0 | 27 | 0 | 0 |
2-3 | 6 | 27 | 33 | 27 | 33 | 0 | 0 |
2-4 | 11 | 27 | 38 | 27 | 38 | 0 | 0 |
3-5 | 2 | 33 | 35 | 33 | 35 | 0 | 0 |
4-6 | 3 | 38 | 41 | 39 | 42 | 1 | 0 |
5-7 | 6 | 35 | 41 | 35 | 41 | 0 | 0 |
6-8 | 12 | 41 | 53 | 42 | 54 | 1 | 0 |
7-9 | 12 | 41 | 53 | 41 | 53 | 0 | 0 |
9-10 | 3 | 53 | 56 | 53 | 56 | 0 | 0 |
8-10 | 2 | 53 | 55 | 54 | 56 | 1 | 1 |
10-12 | 2 | 56 | 58 | 56 | 58 | 0 | 0 |
10-11 | 2 | 56 | 58 | 56 | 58 | 0 | 0 |
11-13 | 9 | 58 | 67 | 76 | 85 | 18 | 0 |
i-j | toij | Tрнij | Троij | Тпнij | Tпоij | Rnij | Rcij |
10-14 | 22 | 56 | 78 | 56 | 78 | 0 | 0 |
12-15 | 24 | 58 | 82 | 62 | 86 | 4 | 0 |
12-16 | 27 | 58 | 85 | 58 | 95 | 10 | 0 |
13-17 | 6 | 67 | 73 | 85 | 91 | 18 | 18 |
14-17 | 8 | 78 | 86 | 83 | 91 | 5 | 5 |
15-17 | 5 | 82 | 87 | 86 | 91 | 4 | 4 |
16-17 | 6 | 85 | 91 | 85 | 91 | 0 | 0 |
17-18 | 38 | 91 | 129 | 91 | 129 | 0 | 0 |
18-19 | 27 | 129 | 156 | 128 | 156 | 0 | 0 |
19-20 | 5 | 156 | 161 | 156 | 161 | 0 | 0 |
Анализ сетевого графика включает классификацию и группировку работ по величине резервов (полных и свободных), определение коэффициентов напряженности путей, расчет вероятности наступления завершающего события в заданный срок.
Коэффициент напряженности пути Кн (L) определяется по формуле
Т (L) - Т’кр (L)
Кн (L) = - ---------- - , (2.8)
Ткр - Т’кр (L)
где Т (L) - продолжительность пути, для которого определяется коэффициент напряженности,
Т’кр (L) - продолжительность работ данного пути (L), совпадающих с работами критического пути.
Коэффициенты напряженности работ данной разработки приведены в таблице 2.7
Найдем вероятность выполнения всего комплекса работ (Рк) за директивный срок 162 дня. Эта вероятность определяется с помощью аргумента нормальной функции распределения вероятностей:
Tд - Tкр
x = - ------- - , (2.9)
Ö å s tкрij
где n - число работ, лежащих на критическом пути, Тд - директивный срок, s = 0,04 (tmax - tmin) - дисперсия работы i,j критического пути (значения дисперсий приведены в таблице 2.7).
Значение Рк находим по ее аргументу х, используя таблицу интегралов Фурье.
Таблица 2.7 Параметры сетевого графика.
i-j | Кн | stкрij | i-j | Кн | stкрij |
1-2 | 1,0 | 1,0 | 10-12 | 1,0 | 0,04 |
2-3 | 1,0 | 0,16 | 10-14 | 0,2 | 0,64 |
2-4 | 0,08 | 0,16 | 11-13 | 0,1 | 0,16 |
3-5 | 1,0 | 0,04 | 12-15 | 0,23 | 0,64 |
4-6 | 0,1 | 0,04 | 12-16 | 1,0 | 0,64 |
5-7 | 1,0 | 0,16 | 13-17 | 0,16 | 0,36 |
6-8 | 0, 19 | 0,64 | 14-17 | 0,29 | 0,16 |
7-9 | 1,0 | 1,0 | 15-17 | 0,28 | 0,04 |
8-10 | 0,2 | 0,04 | 16-17 | 1,0 | 0,16 |
9-10 | 1,0 | 0,04 | 17-18 | 1,0 | 1,96 |
10-11 | 0,02 | 0,04 | 18-19 | 1,0 | 1,44 |
19-20 | 1,0 | 0,16 |
Аргумент нормальной функции распределения вероятностей равен 0,32. Используя таблицу интеграла Фурье, находим значение функции Рк = 0,63. Так как значение Рк попадает в интервал 0,35 < Рк < 0,65, то сетевой график не нуждается в оптимизации.
Приложение 1
Тексты программ
// 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 (); }
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>
#include <io. h>
#include "pxengine. h"
#include <string. h>
void form3 (char *,char *, int);
// расшифровка байтов состояния для третьей формы представления и их запись в файл результатов
/* аргументы функции main:
argv [1] - тип устройства */
void main (int argc,char *argv [])
{
int a;
int i;
int handle; // дескриптор файла результатов поиска
static char bytes [45] ; // буфер для нерасшифрованных байтов состояния
RECORDHANDLE rec; // дескриптор записи
TABLEHANDLE tblh; // дескриптор таблицы
// открытие файла результатов изапись в него типа устройства
handle=open ("inquiry. res",
O_CREAT | O_TRUNC | O_WRONLY,S_IREAD | S_IWRITE);
write (handle,argv [1],strlen (argv [1]));
// if (strlen (argv [1]) ==1) write (handle," ",2);
// if (strlen (argv [1]) ==2) write (handle," ",1);
write (handle,"\r\n",2);
// поиск и обработка результатов поиска
/* находится последняя по времени запись байтов
состояния для данного устройства */
if (a=PXInit ()) printf ("\n%s",PXErrMsg (a));
if (a=PXTblOpen ("fk",&tblh,0,0)) printf ("\n%s",PXErrMsg (a));
PXRecBufOpen (tblh,&rec);
PXPutAlpha (rec,5,"БС");
PXPutAlpha (rec,3,argv [1]);
if ( (a=PXSrchFld (tblh,rec,3,SEARCHFIRST)) ! =PXSUCCESS)
{ if (a==PXERR_RECNOTFOUND)
PXRecBufClose (rec);
if (a=PXTblClose (tblh)) printf ("\n%s",PXErrMsg (a));
PXExit ();
close (handle);
return;
}
else while (! (a=PXSrchFld (tblh,rec,3,SEARCHNEXT)));
PXRecGet (tblh,rec);
PXGetAlpha (rec,6,45,bytes);
form3 (argv [1],bytes+16,handle);
PXRecBufClose (rec);
if (a=PXTblClose (tblh)) printf ("\n%s",PXErrMsg (a));
PXExit ();
close (handle);
}
// bs3_inq. prj
// BS3_INQ\form3. c
// form3 ()
// расшифровка байтов состояния
#include <io. h>
#include <string. h>
#include "devices. h"
#include <dos. h>
void form3 (char *Type,char *bytes, int handle)
{
/* Type - тип устройства
bytes - нерасшифрованные байты состояния
handle - дескриптор файла результатов */
int i;
/*
struct date d;
struct time t;
getdate (&d);
gettime (&t);
z. bd1. date [0] =d. da_mon;
z. bd1. date [1] =d. da_day;
z. bd1. date [2] =d. da_year;
PXRecBufOpen (tblh,&rech);
PXRecGet (tblh,rech);
PXGetDate (rech,1,&date);
PXDateDecode (date,&month,&day,&year);
sprintf (string,"%.02d\\%.02d\\%.04d ",month,day,year);
*/
for (i=0; strcmp (devices [i]. type,Type) && i<CHDEV; ++i);
switch (i)
{
case 0: // ШЭ-00
if (bytes [5] &0x04)
write (handle," Шкаф НЕИСПРАВЕН \r\n",76);
else
write (handle," Шкаф ИСПРАВЕН \r\n",76);
if (bytes [4] &0x02)
write (handle,"НЕИСПРАВНОСТЬ первичной сети электропитания СЕТЬ 1 \r\n",76);
break;
case 8: // ШЭ-08
if (bytes [5] &0x04)
write (handle," Шкаф НЕИСПРАВЕН \r\n",76);
else
write (handle," Шкаф ИСПРАВЕН \r\n",76);
if (bytes [4] &0x02)
write (handle,"НЕИСПРАВНОСТЬ первичной сети электропитания СЕТЬ 2 \r\n",76);
break;
case 1: // ШП-01
case 9: // ШП-09
if (bytes [5] &0x04)
write (handle," Шкаф НЕИСПРАВЕН \r\n",76);
else
write (handle," Шкаф ИСПРАВЕН \r\n",76);
break;
case 4: // ШК-04
case 12: // ШК-12
if (bytes [0] &0x01)
write (handle,"ОСНОВНОЙ - шкаф ШК-12 \r\n",76);
else
write (handle,"ОСНОВНОЙ - шкаф ШК-04 \r\n",76);
write (handle," \r\n",76);
write (handle," ТЕХНИЧЕСКОЕ СОСТОЯНИЕ ШКАФА \r\n",76);
write (handle," \r\n",76);
if (bytes [5] &0x01)
write (handle," Шкаф РАБОТОСПОСОБЕН \r\n",76);
if (bytes [5] &0x02)
write (handle," Шкаф НЕИСПРАВЕН \r\n",76);
if (bytes [5] &0x04)
write (handle," Шкаф ЗАБЛОКИРОВАН по НСД \r\n",76);
if ( (! (bytes [5] &0x01)) && (! (bytes [5] &0x02)) && (! (bytes [5] &0x04)))
write (handle," Шкаф ИСПРАВЕН \r\n",76);
write (handle," \r\n",76);
if (bytes [4] &0x01)
write (handle,"НЕИСПРАВЕН 1-й канал АД \r\n",76);
if (bytes [4] &0x02)
write (handle,"НЕИСПРАВЕН 2-й канал АД \r\n",76);
if (bytes [4] &0x04)
write (handle,"НЕИСПРАВЕН 3-й канал АД \r\n",76);
if (bytes [3] &0x01)
write (handle,"НЕИСПРАВЕН 1-й канал УХК \r\n",76);
if (bytes [3] &0x02)
write (handle,"НЕИСПРАВЕН 2-й канал УХК \r\n",76);
if (bytes [3] &0x04)
write (handle,"НЕИСПРАВЕН 3-й канал УХК \r\n",76);
if (bytes [2] &0x01)
write (handle,"НЕИСПРАВНОСТЬ логической части ШК \r\n",76);
if (bytes [2] &0x02)
{write (handle,"НЕИСПРАВЕН хотя бы один или несколько элементов ИГП \r\n",76);
write (handle,"Для уточнения считай ячейку ВБШК1. ПФЗ для ШК1 или ВБШК2. ПФЗ для ШК2 \r\n",76);
}
if (bytes [2] &0x04)
{write (handle,"НЕИСПРАВНО УХК - установлена единица в 8-ом разряде уточненого слова \r\n",76);
write (handle,"состояния УХК \r\n",76);
}
if (bytes [1] &0x01)
write (handle,"БОЗУ занято более 3-х секунд \r\n",76);
if (bytes [1] &0x02)
{write (handle,"НЕИСПРАВНО УХК (неправильное сочетание 3 и 10 разрядов уточненого слова \r\n",76);
write (handle,"состояния УХК) \r\n",76);
}
if (bytes [1] &0x04)
{write (handle,"УХК ЗАБЛОКИРОВАН по причине работы с носителем 83т015. Получен 9 или 11 \r\n",76);
write (handle,"разряд в ИСС УХК (см. п.4.7 1. протокола инв.30337) \r\n",76);
}
if ( (! (bytes [12] &0x01)) && (! (bytes [12] &0x02)))
write (handle,"ПУ-1 ИСПРАВЕН \r\n",76);
if (bytes [12] &0x01)
write (handle,"Нажата кнопка ОБНАРУЖЕНА НЕИСПРАВНОСТЬ на ПУ-1 \r\n",76);
if (bytes [12] &0x02)
write (handle,"Неисправно направление связи, соединяющее с ПУ-1 \r\n",76);
if ( (! (bytes [12] &0x04)) && (! (bytes [11] &0x01)))
write (handle,"ПУ-2 ИСПРАВЕН \r\n",76);
if (bytes [12] &0x04)
write (handle,"Нажата кнопка ОБНАРУЖЕНА НЕИСПРАВНОСТЬ на ПУ-2 \r\n",76);
if (bytes [11] &0x01)
write (handle,"Неисправно направление связи, соединяющее с ПУ-2 \r\n",76);
if ( (! (bytes [11] &0x04)) && (! (bytes [11] &0x02)))
write (handle,"ПУ-3 ИСПРАВЕН \r\n",76);
if (bytes [11] &0x02)
write (handle,"Нажата кнопка ОБНАРУЖЕНА НЕИСПРАВНОСТЬ на ПУ-3 \r\n",76);
if (bytes [11] &0x04)
write (handle,"Неисправно направление связи, соединяющее с ПУ-3 \r\n",76);
if ( (! (bytes [10] &0x01)) && (! (bytes [10] &0x02)))
write (handle,"ПУ-4 ИСПРАВЕН \r\n",76);
if (bytes [10] &0x01)
write (handle,"Нажата кнопка ОБНАРУЖЕНА НЕИСПРАВНОСТЬ на ПУ-4 \r\n",76);
if (bytes [10] &0x02)
write (handle,"Неисправно направление связи, соединяющее с ПУ-4 \r\n",76);
if (bytes [10] &0x04)
write (handle,"Неисправен 1-й канал схемных узлов БУ-695 \r\n",76);
if (bytes [9] &0x01)
write (handle,"Неисправен 2-й канал схемных узлов БУ-695 \r\n",76);
if (bytes [9] &0x02)
write (handle,"Неисправен 3-й канал схемных узлов БУ-695 \r\n",76);
if (bytes [9] &0x04)
write (handle,"Неисправен 1-й канал ПРЦ \r\n",76);
if (bytes [8] &0x01)
write (handle,"Неисправен 2-й канал ПРЦ \r\n",76);
if (bytes [8] &0x02)
write (handle,"Неисправен 3-й канал ПРЦ \r\n",76);
if (bytes [8] &0x04)
{write (handle,"Неисправно направление связи С1 по передаче от ВМ к ШК и/или по приему \r\n",76);
write (handle,"от ШК к ВМ и/или по причине не получения от ШК кодограмм по времени. \r\n",76);
write (handle,"Формирует ФК-читай слово памяти ВБШК1 (2). ПФЗ \r\n",76);
if (bytes [7] &0x01)
write (handle,"ШК забракован функциональной задачей - читай слово памяти ВБШК1 (2). ПФЗ \r\n",76);
write (handle," \r\n",76);
write (handle," ИНФОРМАЦИОННОЕ СОСТОЯНИЕ ШКАФА \r\n",76);
write (handle," \r\n",76);
if (bytes [26] &0x02)
write (handle," Шкаф НЕИСПРАВЕН ПО ИНФОРМАЦИОННОМУ СОСТОЯНИЮ \r\n",76);
else
write (handle," Шкаф ИСПРАВЕН ПО ИНФОРМАЦИОННОМУ СОСТОЯНИЮ \r\n",76);
write (handle," \r\n",76);
write (handle," Состояние БХХХХХ ШХХХХХ и КХХХХ \r\n",76);
write (handle," \r\n",76);
write (handle," БХХХХХ ШХХХХХ 1-го массива СХХ \r\n",76);
if ( (! (bytes [15] &0x01)) && (! (bytes [15] &0x02)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [15] &0x01) && (bytes [15] &0x02))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [15] &0x01) && (! (bytes [15] &0x02)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [15] &0x02) && (! (bytes [15] &0x01)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," БХХХХХ ШХХХХХ 2-го массива СХХ \r\n",76);
if ( (! (bytes [17] &0x04)) && (! (bytes [16] &0x01)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [17] &0x04) && (bytes [16] &0x01))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [17] &0x04) && (! (bytes [16] &0x01)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [16] &0x01) && (! (bytes [17] &0x04)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," БХХХХХ КХХХХ ОХХ \r\n",76);
if ( (! (bytes [18] &0x04)) && (! (bytes [18] &0x02)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [18] &0x04) && (bytes [18] &0x02))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [18] &0x02) && (! (bytes [18] &0x04)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [18] &0x04) && (! (bytes [18] &0x02)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," БХХХХХ КХХХХ УХХ \r\n",76);
if ( (! (bytes [19] &0x02)) && (! (bytes [19] &0x01)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [19] &0x02) && (bytes [19] &0x01))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [19] &0x01) && (! (bytes [19] &0x02)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [19] &0x02) && (! (bytes [19] &0x01)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," БХХХХХ КХХХХ УХ \r\n",76);
if ( (! (bytes [22] &0x02)) && (! (bytes [22] &0x01)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [22] &0x02) && (bytes [22] &0x01))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [22] &0x01) && (! (bytes [22] &0x02)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [22] &0x02) && (! (bytes [22] &0x01)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," БХХХХХ КХХХХ РХХ \r\n",76);
if ( (! (bytes [23] &0x01)) && (! (bytes [24] &0x04)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [23] &0x01) && (bytes [24] &0x04))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [24] &0x04) && (! (bytes [23] &0x01)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [23] &0x01) && (! (bytes [24] &0x04)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," \r\n",76);
write (handle," Состояние УХХХХХ ШХХХХХ и КХХХХ \r\n",76);
write (handle," \r\n",76);
write (handle," УХХХХХ ШХХХХХ 1-го массива СХХ \r\n",76);
if ( (! (bytes [14] &0x01)) && (! (bytes [15] &0x04)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [14] &0x01) && (bytes [15] &0x04))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [15] &0x04) && (! (bytes [14] &0x01)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [14] &0x01) && (! (bytes [15] &0x04)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," УХХХХХ ШХХХХХ 2-го массива СХХ \r\n",76);
if ( (! (bytes [16] &0x04)) && (! (bytes [16] &0x02)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [16] &0x04) && (bytes [16] &0x02))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [16] &0x02) && (! (bytes [16] &0x04)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [16] &0x04) && (! (bytes [16] &0x02)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," УХХХХХ КХХХХ ОХХ \r\n",76);
if ( (! (bytes [17] &0x02)) && (! (bytes [17] &0x01)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [17] &0x02) && (bytes [17] &0x01))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [17] &0x01) && (! (bytes [17] &0x02)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [17] &0x02) && (! (bytes [17] &0x01)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," УХХХХХ КХХХХ УХХ \r\n",76);
if ( (! (bytes [19] &0x04)) && (! (bytes [18] &0x01)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [19] &0x04) && (bytes [18] &0x01))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [19] &0x04) && (! (bytes [18] &0x01)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [18] &0x01) && (! (bytes [19] &0x04)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," УХХХХХ КХХХХ УХ \r\n",76);
if ( (! (bytes [21] &0x01)) && (! (bytes [22] &0x04)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [21] &0x01) && (bytes [22] &0x04))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [22] &0x04) && (! (bytes [21] &0x01)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [21] &0x01) && (! (bytes [22] &0x04)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," УХХХХХ КХХХХ РХХ \r\n",76);
if ( (! (bytes [23] &0x02)) && (! (bytes [23] &0x04)))
write (handle," НЕ ЗАПИСАНЫ \r\n",76);
if ( (bytes [23] &0x02) && (bytes [23] &0x04))
write (handle," УНИЧТОЖЕНЫ \r\n",76);
if ( (bytes [23] &0x02) && (! (bytes [23] &0x04)))
write (handle," СОХРАНЕНЫ \r\n",76);
if ( (bytes [23] &0x04) && (! (bytes [23] &0x02)))
write (handle," РАЗРУШЕНЫ \r\n",76);
write (handle," \r\n",76);
write (handle," НАВЯЗЫВАНИЕ ЛОЖНОЙ ИНФОРМАЦИИ \r\n",76);
write (handle," \r\n",76);
if (bytes [24] &0x02)
write (handle,"Есть НЛИ по массиву N1 шххххх СХХ \r\n",76);
if (bytes [24] &0x01)
write (handle,"Есть НЛИ по массиву N2 шххххх СХХ \r\n",76);
if (bytes [25] &0x04)
write (handle,"Есть НЛИ по массиву кхххх УХХ \r\n",76);
if (bytes [25] &0x01)
write (handle,"Есть НЛИ по массиву кхххх УХ \r\n",76);
if (bytes [26] &0x04)
write (handle,"Есть НЛИ по массиву кхххх РХХ \r\n",76);
if ( (! (bytes [24] &0x02)) && (! (bytes [24] &0x01)) && (! (bytes [25] &0x04))
&& (! (bytes [25] &0x02)) && (! (bytes [25] &0x01)) && (! (bytes [26] &0x04)))
write (handle,"НЛИ ОТСУТСТВУЕТ по всем массивам \r\n",76);
break;
case 3: // В
case 6: // КС1
case 14: // КС2
if (bytes [5] &0x04)
write (handle," КС НЕИСПРАВЕН \r\n",76);
else
write (handle," КС ИСПРАВЕН \r\n",76);
write (handle," \r\n",76);
if (bytes [19] &0x01)
write (handle,"Прием от АК1 трех кодограмм подряд с признаком К2 \r\n",76);
if (bytes [19] &0x02)
write (handle,"Прием от АК1 трех кодограмм подряд с ВПС=1010 \r\n",76);
if (bytes [19] &0x04)
write (handle,"Отсутствие информации от АК1 на входе ПУ более 12 сек \r\n",76);
if (bytes [18] &0x01)
write (handle,"Прием от АК1 трех кодограмм подряд с признаком получения УС \r\n",76);
if (bytes [18] &0x02)
write (handle,"Отсутствие связи в тракте от ЦКС1 до АК1 \r\n",76);
if (bytes [18] &0x04)
write (handle,"Отсутствие связи в тракте от ЦКС1 до ЦКС2 для АК1 \r\n",76);
if (bytes [17] &0x01)
write (handle,"Отсутствие связи в тракте от АК1 до ЦКС1 \r\n",76);
write (handle," \r\n",76);
if (bytes [23] &0x01)
write (handle,"Прием от АК3 трех кодограмм подряд с признаком К2 \r\n",76);
if (bytes [23] &0x02)
write (handle,"Прием от АК3 трех кодограмм подряд с ВПС=1010 \r\n",76);
if (bytes [23] &0x04)
write (handle,"Отсутствие информации от АК3 на входе ПУ более 12 сек \r\n",76);
if (bytes [22] &0x01)
write (handle,"Прием от АК3 трех кодограмм подряд с признаком получения УС \r\n",76);
if (bytes [22] &0x02)
write (handle,"Отсутствие связи в тракте от ЦКС1 до АК3 \r\n",76);
if (bytes [22] &0x04)
write (handle,"Отсутствие связи в тракте от ЦКС1 до ЦКС2 для АК3 \r\n",76);
if (bytes [21] &0x01)
write (handle,"Отсутствие связи в тракте от АК3 до ЦКС1 \r\n",76);
write (handle," \r\n",76);
if (bytes [26] &0x01)
write (handle,"Прием от АК6 трех кодограмм подряд с признаком К2 \r\n",76);
if (bytes [26] &0x02)
write (handle,"Прием от АК6 трех кодограмм подряд с ВПС=1010 \r\n",76);
if (bytes [26] &0x04)
write (handle,"Отсутствие информации от АК6 на входе ПУ более 12 сек \r\n",76);
if (bytes [25] &0x01)
write (handle,"Прием от АК6 трех кодограмм подряд с признаком получения УС \r\n",76);
if (bytes [25] &0x02)
write (handle,"Отсутствие связи в тракте от ЦКС1 до АК6 \r\n",76);
if (bytes [25] &0x04)
write (handle,"Отсутствие связи в тракте от ЦКС1 до ЦКС2 для АК6 \r\n",76);
if (bytes [24] &0x01)
write (handle,"Отсутствие связи в тракте от АК6 до ЦКС1 \r\n",76);
write (handle," \r\n",76);
if (bytes [16] &0x01)
write (handle,"Прием от ВПУ трех кодограмм подряд с признаком К2 \r\n",76);
if (bytes [16] &0x02)
write (handle,"Прием от ВПУ трех кодограмм подряд с ВПС=1010 \r\n",76);
if (bytes [16] &0x04)
write (handle,"Отсутствие информации от ВПУ на входе ПУ более 12 сек \r\n",76);
if (bytes [15] &0x01)
write (handle,"Прием от АК6 трех кодограмм подряд с признаком получения УС \r\n",76);
if (bytes [15] &0x02)
write (handle,"Отсутствие связи в тракте от ЦКС1 до ВПУ \r\n",76);
if (bytes [15] &0x04)
write (handle,"Отсутствие связи в тракте от ЦКС1 до ЦКС2 для ВПУ \r\n",76);
if (bytes [14] &0x01)
write (handle,"Отсутствие связи в тракте от ВПУ до ЦКС1 \r\n",76);
write (handle," \r\n",76);
if (bytes [17] &0x04)
write (handle,"Отсутствие связи в тракте от ЦКС1 до ПУ \r\n",76);
write (handle," \r\n",76);
if (bytes [10] &0x02)
write (handle,"Отсутствие приема кодограмм в заданный интервал времени \r\n",76);
write (handle," \r\n",76);
if ( (bytes [12] &0x07) && (! (bytes [11] &0x07)))
write (handle,"Прием кодограмм с признаком отсутствия связи от ПУ до М486 \r\n",76);
if ( (bytes [11] &0x07) && (! (bytes [12] &0x07)))
{
write (handle,"Прием кодограмм с признаком искажения информации от ЦКС до М486 и/или \r\n",76);
write (handle,"прием кодограмм с признаком отсутствия импульса БИ \r\n",76);
}
if ( (bytes [11] &0x07) && (bytes [12] &0x07))
{
write (handle,"Прием кодограмм с признаком отсутствия связи от ПУ до М486 и/или \r\n",76);
write (handle,"прием кодограмм с признаком искажения информации от ЦКС до М486 и/или \r\n",76);
write (handle,"прием кодограмм с признаком отсутствия импульса БИ \r\n",76);
}
break;
case 2: // РМ-02
write (handle," \r\n",76);
if (bytes [5] &0x01)
write (handle,"АРМ ЗАБЛОКИРОВАНО по ФК оператором \r\n",76);
write (handle," \r\n",76);
if (bytes [5] &0x04)
write (handle,"НЕТ СВЯЗИ МЕЖДУ ПЭВМ1 и ВК \r\n",76);
if (bytes [4] &0x02)
write (handle,"Нет связи с ВК по одной из линий связи ЛС1 или ЛС3 \r\n",76);
if (bytes [3] &0x04)
write (handle,"Нет связи с ВК по линии связи ЛС1 \r\n",76);
if (bytes [2] &0x02)
write (handle,"Нет связи с ВК по линии связи ЛС3 \r\n",76);
break;
case 10: // РМ-10
write (handle," \r\n",76);
if (bytes [5] &0x01)
write (handle,"АРМ ЗАБЛОКИРОВАНО по ФК оператором \r\n",76);
write (handle," \r\n",76);
if (bytes [5] &0x04)
write (handle,"НЕТ СВЯЗИ МЕЖДУ ПЭВМ2 и ВК \r\n",76);
if (bytes [4] &0x02)
write (handle,"Нет связи с ВК по одной из линий связи ЛС2 или ЛС4 \r\n",76);
if (bytes [2] &0x01)
write (handle,"Нет связи с ВК по линии связи ЛС2 \r\n",76);
if (bytes [2] &0x04)
write (handle,"Нет связи с ВК по линии связи ЛС4 \r\n",76);
break;
case 5: // РМ05Г
case 13: // РМ13П
if (bytes [19] &0x01)
write (handle,"ОСНОВНОЙ АРМ - РМ-13П \r\n",76);
else
write (handle,"ОСНОВНОЙ АРМ - РМ-05Г \r\n",76);
write (handle," \r\n",76);
if (bytes [5] &0x04)
write (handle," АРМ НЕИСПРАВЕН \r\n",76);
else
write (handle," АРМ ИСПРАВЕН \r\n",76);
write (handle," \r\n",76);
if (bytes [16] &0x02)
write (handle,"Основное АРМ ИСПРАВНО \r\n",76);
if (bytes [16] &0x01)
write (handle,"Основное АРМ НЕИСПРАВНО \r\n",76);
if (bytes [16] &0x04)
write (handle,"Основное АРМ ЗАБЛОКИРОВАНО \r\n",76);
if (bytes [15] &0x01)
write (handle,"Основное АРМ РАЗБЛОКИРОВАНО \r\n",76);
if (bytes [19] &0x04)
write (handle,"Резервное АРМ ИСПРАВНО \r\n",76);
if (bytes [19] &0x02)
write (handle,"Резервное АРМ НЕИСПРАВНО \r\n",76);
if (bytes [18] &0x01)
write (handle,"Резервное АРМ ЗАБЛОКИРОВАНО \r\n",76);
if (bytes [18] &0x02)
write (handle,"Резервное АРМ РАЗБЛОКИРОВАНО \r\n",76);
if (bytes [5] &0x01)
write (handle,"АРМ ЗАБЛОКИРОВАНО по ФК оператором \r\n",76);
write (handle," \r\n",76);
if (bytes [4] &0x02)
write (handle,"Неисправна одна из трех линий магистрали обмена \r\n",76);
else
write (handle,"Все три линии магистрали обмена исправны \r\n",76);
if (bytes [12] &0x04)
write (handle,"Неисправна 1-я линия магистрали приема \r\n",76);
if (bytes [12] &0x02)
write (handle,"Неисправна 2-я линия магистрали приема \r\n",76);
if (bytes [12] &0x01)
write (handle,"Неисправна 3-я линия магистрали приема \r\n",76);
if (bytes [10] &0x02)
write (handle,"Отсутствует прием информации в ВМ от данного АРМ-1 \r\n",76);
break;
case 7: // ВМ
if (bytes [5] &0x02)
write (handle,"Авария электропитания в одном или нескольких каналах ШП-614 \r\n",76);
if (bytes [4] &0x04)
write (handle,"Неисправность 1 канала ШП-614 \r\n",76);
if (bytes [3] &0x01)
write (handle,"Неисправность 2 канала ШП-614 \r\n",76);
if (bytes [3] &0x02)
write (handle,"Неисправность 3 канала ШП-614 \r\n",76);
if (bytes [3] &0x04)
write (handle,"Произошел ПРОГРАММНЫЙ СБОЙ \r\n",76);
if (bytes [2] &0x01)
write (handle,"Авария питания 1 канала \r\n",76);
if (bytes [2] &0x02)
write (handle,"Авария питания 1 канала \r\n",76);
if (bytes [2] &0x04)
write (handle,"Авария питания 1 канала \r\n",76);
if (bytes [0] &0x01)
write (handle,"Нарушена целостность программного изделия-кассеты КП-610 - \r\n",76);
write (handle,"подсчитанная контрольная сумма не совпадает с эталоном \r\n",76);
break;
case 16: // ВУ16
case 17: // ВУ17
case 18: // ВУ18
case 19: // ВУ19
if (bytes [5] &0x01)
write (handle,"ПУ заблокировано оператором по ФК \r\n",76);
if (bytes [5] &0x04)
write (handle,"Нажата КНОПКА ОБНАРУЖЕНИЯ НЕИСПРАВНОСТИ \r\n",76);
break;
case 15: // АС
// Подкорректировать после согласования
// байта состояния
if (bytes [5] &0x04)
write (handle,"АРМ-РД НЕИСПРАВЕН - не работают обе ПЭВМ \r\n",76);
if (bytes [4] &0x01)
write (handle,"АРМ-РД РАБОТОСПОСОБЕН - работает одна из двух ПЭВМ \r\n",76);
if (bytes [4] &0x02)
write (handle,"Нет связи хотя бы по одной из линий связи ЛС1, ЛС2, ЛС3, ЛС4 \r\n",76);
if (bytes [4] &0x04)
write (handle,"Неисправен КСП-0 \r\n",76);
if (bytes [3] &0x01)
write (handle,"Неисправен КСП-1 \r\n",76);
if (bytes [3] &0x02)
write (handle,"Неисправен КСП-2 \r\n",76);
if (bytes [3] &0x04)
write (handle,"Нет связи по линии связи ЛС1 \r\n",76);
if (bytes [2] &0x01)
write (handle,"Нет связи по линии связи ЛС2 \r\n",76);
if (bytes [2] &0x02)
write (handle,"Нет связи по линии связи ЛС3 \r\n",76);
if (bytes [2] &0x04)
write (handle,"Нет связи по линии связи ЛС4 \r\n",76);
break;
}
}
// bs2_out. prj
// bs2_out. c
// main ()
// выдача результатов запроса по 2-й форме байтов состояния на экран
// (из файла) или форматирование и постановка в очередь для выдачи
// на принтер
#include <dos. h>
#include "cxlkey. h"
#include "disp. h"
extern void resScr (void);
// выдача результатов запроса из файла на экран
extern void resPrn (void);
// выдача результатов запроса из файла на принтер
void main (int argc,char *argv [])
{
void z (void);
setkbloop (z);
if (argv [1] [0] =='э') resScr ();
else resPrn ();
}
void z (void)
{
union REGS r;
r. h. ah=0;
int86 (DISP,&r,&r);
}
#include <dos. h>
#include "cxlkey. h"
#include "disp. h"
extern void resScr (void);
// выдача результатов запроса из файла на экран
extern void resPrn (void);
// выдача результатов запроса из файла на принтер
void main (int argc,char *argv [])
{
void z (void);
setkbloop (z);
if (argv [1] [0] =='э') resScr ();
else resPrn ();
}
void z (void)
{
union REGS r;
r. h. ah=0;
int86 (DISP,&r,&r);
}
// inq_out. prj
// INQ_OUT. C
// main ()
// выдача результатов запроса на экран (из файла)
// или форматирование и постановка в очередь для выдачи на принтер
#include <string. h>
#include <process. h>
#include "cxlkey. h"
#include "cxldef. h"
extern void resScr (void);
// выдача результатов запроса из файла на экран
extern void resPrn (void);
// выдача результатов запроса из файла на принтер
void main (int argc,char *argv [])
{
void z (void);
setkbloop (z);
if (argv [1] [0] =='э') resScr ();
else resPrn ();
}
#include <dos. h>
#include "disp. h"
void z (void)
{
union REGS r;
r. h. ah=0;
int86 (DISP,&r,&r);
}
// inq_out. prj
// res_scr. C
// res_scr ()
// выдача результатов запроса на экран (из файла)
#include <stdio. h>
#include <string. h>
#include "cxlwin. h"
#include "cxlkey. h"
#include "cxlvid. h"
#define LEN 81
#define TXTATTR _CYAN
#define UP 0x4800
#define DOWN 0x5000
#define PGUP 0x4900
#define PGDOWN 0x5100
#define ESC 0x011b
void resScr (void)
{
FILE *f; // дескриптор файла результатов
int down; // номер текущей строки в файле
int ch; // код клавиши
int i;
char string [LEN] ;
int mwup; // количество строк над основным окном
// вывод на экран строки запроса и шапки таблицы
f=fopen ("inquiry. res","r++");
fgets (string,LEN,f);
for (mwup=0; strncmp (string+3,"ДАТА",4); ++mwup)
{
wopen (mwup,0,mwup,79,5,BLUE|_LGREY,BLUE|_LGREY);
wprintf ("%.79s",string);
fgets (string,LEN,f);
}
wopen (mwup,0,mwup,79,5,YELLOW|_BLUE,YELLOW|_BLUE);
wprintf ("%.78s",string);
// основное окно
wopen (++mwup,0,25,79,5,LCYAN|_BLUE,TXTATTR);
// wshadow (LGREY);
// вывод результатов запроса из файла на экран
for (down=mwup; down<25 && fgets (string,LEN,f) ! =NULL; ++down)
wprints (down-mwup,1,TXTATTR,string);
hidecur ();
// цикл просмотра результатов
while ( (ch=getxch ()) ! =ESC)
switch (ch)
{
case UP: if (down<=25) break;
down--;
fseek (f, (long) (down-25+mwup) *LEN,0);
fgets (string,LEN,f);
wscroll (1,D_DOWN);
wprints (0,1,TXTATTR,string);
break;
case DOWN: if (fseek (f, (long) down*LEN,0)) break;
if (fgets (string,LEN,f) ==NULL) break;
wscroll (1,D_UP);
wprints (24-mwup,1,TXTATTR,string);
down++;
break;
case PGUP: for (i=0; i<=24-mwup; ++i)
{
if (down<=25) break;
down--;
fseek (f, (long) (down-25+mwup) *LEN,0);
fgets (string,LEN,f);
wscroll (1,D_DOWN);
wprints (0,1,TXTATTR,string);
}
break;
case PGDOWN: for (i=0; i<=24-mwup; ++i)
{
if (fseek (f, (long) down*LEN,0)) break;
if (fgets (string,LEN,f) ==NULL) break;
wscroll (1,D_UP);
wprints (24-mwup,1,TXTATTR,string);
down++;
}
break;
}
fclose (f);
wcloseall ();
}
// bs2_out. prj
// res_scr_. c
// res_scr ()
// выдача результатов запроса по 2-й форме байтов состояния на экран
// (из файла)
#include <stdio. h>
#include <string. h>
#include "cxlwin. h"
#include "cxlkey. h"
#include "cxlvid. h"
#define LEN 100
#define TXTATTR _CYAN
#define UP 0x4800
#define DOWN 0x5000
#define PGUP 0x4900
#define PGDOWN 0x5100
#define RIGHT 0x4d00
#define LEFT 0x4b00
#define HOME 0x4700
#define END 0x4F00
#define ESC 0x011b
FILE *f; // дескриптор файла результатов
int down; // номер текущей строки в файле
char string [LEN] ;
int length; // длина строк в файле
int w1; // дескриптор окна
void screen_move (int right);
void resScr (void)
{
int right=0; // горизонтальное смещение
int ch; // код клавиши
int i;
// вывод на экран строки запроса и шапки таблицы
f=fopen ("inquiry. res","r++");
wopen (0,0,0,79,5,BLUE|_LGREY,BLUE|_LGREY);
fgets (string,LEN,f);
wprints (0,1,BLUE|_LGREY,string);
w1=wopen (1,0,1,79,5,YELLOW|_BLUE,YELLOW|_BLUE);
fgets (string,LEN,f);
wprints (0,1,YELLOW|_BLUE,string);
length=strlen (string) +1;
// основное окно
wopen (2,0,25,79,5,LCYAN|_BLUE,TXTATTR);
hidecur ();
// wshadow (LGREY);
// вывод результатов запроса из файла на экран
for (down=2; down<25 && fgets (string,LEN,f) ! =NULL; ++down)
{
string [right+80] ='\0';
wprints (down-2,1,TXTATTR,string);
}
// цикл просмотра результатов
while ( (ch=getxch ()) ! =ESC)
switch (ch)
{
case UP: if (down<=25) break;
down--;
fseek (f, (long) (down-23) *length,0);
fgets (string,LEN,f);
string [right+79] ='\0';
wscroll (1,D_DOWN);
wprints (0,1,TXTATTR,string+right);
break;
case DOWN: if (fseek (f, (long) down*length,0)) break;
if (fgets (string,LEN,f) ==NULL) break;
wscroll (1,D_UP);
string [right+80] ='\0';
wprintc (22,0,TXTATTR,' ');
down++;
break;
case PGUP: for (i=0; i<=22; ++i)
{
if (down<=25) break;
down--;
fseek (f, (long) (down-23) *length,0);
fgets (string,LEN,f);
wscroll (1,D_DOWN);
string [right+80] ='\0';
wprints (0,1,TXTATTR,string+right);
wprintc (1,0,TXTATTR,' ');
}
break;
case PGDOWN: for (i=0; i<=22; ++i)
{
if (fseek (f, (long) down*length,0)) break;
if (fgets (string,LEN,f) ==NULL) break;
wscroll (1,D_UP);
string [right+80] ='\0';
wprints (22,1,TXTATTR,string+right);
down++;
}
break;
case LEFT: if (right) screen_move (--right); break;
case RIGHT: if (right+82<length) screen_move (++right); break;
case END: if (right+82<length) screen_move (right=length-82); break;
case HOME: if (right) screen_move (right=0); break;
}
fclose (f);
wcloseall ();
}
// горизонтальная прокрутка
void screen_move (int right)
{
int i;
fseek (f,length,0);
fgets (string,LEN,f);
string [right+80] ='\0';
wwprints (w1,0,1,YELLOW|_BLUE,string+right);
if (down-22>2) fseek (f, (long) (down-22) *length,0);
for (i=0; i<=22 && fgets (string,length,f) ! =NULL; ++i)
{
string [right+80] ='\0';
wprints (i,1,TXTATTR,string+right);
}
}
#include <stdio. h>
#include <string. h>
#include "cxlwin. h"
#include "cxlkey. h"
#include "cxlvid. h"
#define LEN 80
#define ESC 0x011b
FILE *f; // дескриптор файла результатов
char string [LEN] ; // буфер для чтения из файла
void resScr (void)
{
int i;
int maxlen; // максимальная длина строки в файле результатов запроса
int startpos; // столбец окна с которого печатается текст
// открытие файла результатов запроса и
// определение размера самой длинной строки в этом файле
f=fopen ("inquiry. res","r++");
for (maxlen=0, i=0; fgets (string,LEN,f) ! =NULL; ++i)
if (strlen (string) >maxlen) maxlen=strlen (string);
fseek (f,0,0);
// черный фон
wopen (0,0,24,79,5,0,0);
// открытие окна
wopen ( (20-i) /2,5, (20-i) /2+i+2,75,1,YELLOW|_BLUE,_CYAN);
hidecur ();
// чтение типа устройства и его использование в качестве титула окна
fgets (string+1,LEN,f);
string [0] =' ';
for (i=2; i<=6; ++i)
if (string [i] =='\r' || string [i] =='\n') string [i] =' ';
wtitle (string,TCENTER,_LGREY);
// вывод результатов запроса из файла в окно
startpos= (70-maxlen) /2;
for (i=2; fgets (string,LEN,f) ! =NULL; ++i)
{
wgotoxy (i,startpos);
wprintf ("%s",string);
}
// окно находится на экране пока не будет нажато ESC
while (getxch () ! =ESC);
fclose (f);
wcloseall ();
}
Список литературы
1. Глушков В.М. “Основы безбумажной информатики", М. Наука, 1987 г.;
2. “Человек и вычислительная техника" под ред. Глушкова В.М., М. Наука, 1971 г.;
3. “Организационные вопросы автоматизации управления” (перевод с английского) Глушкова В.М., М. Экономика, 1972 г.;
4. Мартин Дж. “Организация баз данных в вычислительных системах", М. Мир, 1980 г.;
5. Бойко В.В., Савинков В.М. “Проектирование баз данных информационных систем”, М. Финансы и статистика, 1989 г.;
6. Шураков В.В. “Надежность программного обеспечения систем обработки данных”, М. Финансы и статистика, 1987 г.;
7. Уинер Р. “Язык Турбо СИ", М. Мир, 1991 г.;
8. Paradox Engine. Документация: описание, список функций для создания и работы с БД.;
9. “Турбо СИ. Описание редактора, стандартные и графические функции”, изд. Иститута проблем информатики, М. 1989 г.;
10. Хьюз Дж., Мичтом Дж. “Структурный подход к программированию”. Изд. Мир, М., 1980 г.;
11. “Выполнение организационно-экономической части дипломных проектов". Учебное пособие, изд. МИРЭА, 1994 г.;
12. “Выполнение организационно-экономической части дипломных проектов". Учебное пособие, изд. МИРЭА, 1987 г.;
13. “Сетевые графики в планировании". Разумов И.М., Белова Л.Д., и др., М. Высшая школа, 1981 г.;
14. “Основы финансового менеджмента. Как управлять капиталом? ” Балабанов И.Т., М. “Финансы и статистика”, 1994 г.;
15. Мотузко Ф.Я. “Охрана труда", М. Высшая школа, 1969 г.;
16. Самгин Э.Б. “Освещение рабочих мест”, изд. МИРЭА, 1989 г.;
17. Сибаров Ю.Б. “Охрана труда в вычислительных центрах" и др., М. Машиностроение, 1990 г.;
18. Методические указания по дипломному проектированию раздела “Охрана труда и окружающей среды" под ред. Мотузко Ф.Я., МИРЭА, 1980 г.;
19. “Основы инженерной психологии” под ред. Ломова Б.Ф., М. Высшая школа, 1986 г.;
20. Демиденко и др. “Защита объектов народного хозяйства от оружия массового поражения" Справочник, Киев "Высшая школа" 1989 г.;
21. Методические указания по безопасности жизнедеятельности. “Особенности ведения аварийно-спасательных работ на промышленном объекте в ЧС мирного времени”, изд. МИРЭА.;
22. Атаманюк В.Г., Ширшев Л.Г. и др. “Гражданская оборона. Учебник для ВТУЗов”, М. Высшая школа. 1987г.;
23. “Введение в практическую эргономику. Учебное пособие. ” под ред. Зинченко В.П., Моргунова Е.Б., изд. МИРЭА, 1990г.
Дата: 2019-05-29, просмотров: 178.