К книге
Проект «Сфера-82»: Цвет и слойГлава 35 Машина для проверки
74%
Глава 35 Машина для проверки
35

Горелов расписался в журнале доступа, снял пластилиновую печать и распахнул дверь кабинета 82В. В коридоре скрипнули резиновые колеса — Иван Михайлович докатил складскую тележку до порога и тяжело выдохнул.

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

Горелов забрал накладные.

— Иван Михайлович, спасибо. И ребятам, Володе с Зоей, передай отдельную благодарность. Здорово выручили.

Михалыч коротко кивнул и покатил пустую тележку обратно к сборочной лаборатории. Чернов со Шрамовым сразу подхватили тяжелый моноблок. Горелов взялся за цветной ВКУ, а Морозов с Громовым занесли коробки с дискетами и техническими описаниями. Аппаратуру аккуратно опустили на широкий стол в центре комнаты.

Чернов не спешил тянуться к тумблеру питания. Он достал шлицевую отвертку, скрутил крышку корпуса и проверил плотность посадки текстолитовых плат в разъемах. Затем методично осмотрел сетевой шнур, проверил предохранитель на задней панели и ткнул индикаторной отверткой в розетку — внутри прозрачной ручки тускло засветился неон.

— Так, давайте распределяться, — произнес Горелов, похлопав по серому металлу кожуха. — Юра, бери на себя операторскую программу, рабочее название — «МАРШРУТ-82В». На тебе экранные формы и логика ввода. Борис, с тебя конструктив пульта. Прикинь, как вывести наружу кабели под АЦПУ и какие разъемы врезать в корпус, чтобы их не вырвали на смене. Я займусь порядком испытаний.

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

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

Морозов отодвинул стул и сел за стол. Громов выровнял стопку дискет на краю столешницы.

Шрамов кивнул на дисплей и нетерпеливо придвинул к себе массивный моноблок.

— Ну, с чего стартуем? — спросил Шрамов. — Мне прямо сейчас садиться за разметку экрана под диспетчерский бланк?

— Начинайте с дисплейного ввода, — ответил Алексей. — Архитектуру мы уже утвердили: ваша прикладная программа работает поверх МикроДОС.

Громов, понимая мысль Алексея с полуслова, шагнул к столу и постучал костяшками пальцев по серому пластику дисковода.

— Базовая система остается за нами, — сказал он. — Вся работа с памятью, печатью и дисководом. Вы пишете прикладную программу строго через системные вызовы. Напрямую в аппаратуру не лезете.

Шрамов нахмурился, чувствуя, как его оттесняют от самого интересного — от машинных кодов и контроля над железом.

— А математика? — спросил он. — Олимпиадные алгоритмы?

— Математику возьму на себя, — спокойно ответил Громов. — Я уже возился с олимпиадным алгоритмом, когда проверял прежние наработки. У меня остались черновые куски, мне банально быстрее подогнать эту логику под наши ограничения. Я вычищу все расчеты и выдам вам согласованный вызов подпрограммы. Отправите в нее свои таблицы, а обратно прилетит просчитанный путь или сигнал сбоя.

Шрамов отступил на полшага, недовольно поджав губы.

— Стоп. Если вы держите систему, и вы же пишете расчет… А мне что остается? Знакоместа по экрану гонять да поля ввода размечать?

Морозов подался вперед, опираясь локтями о колени.

— Ваш участок — пульт, Юрий Павлович, — сказал Морозов. — Женя отдаст вам готовый расчетный модуль, а ваша задача — сделать так, чтобы уставший диспетчер не повесил машину случайной опечаткой.

Шрамов недоверчиво прищурился.

— Значит, если алгоритм насчитал чушь, вопросы к Громову, — хмыкнул он. — А если диспетчер промахнулся мимо клавиши и машина встала — вопросы ко мне. Справедливо.

Горелов, до этого молча слушавший перепалку, одобрительно кивнул.

— Грамотно, — произнес Горелов. — Разделение ответственности. Но Ширяев на приемке спросит строго. Как мы докажем заказчику, что пульт обращается именно к утвержденной подпрограмме Громова, и что оператор не влезет в алгоритм напрямую?

— Через контрольные суммы и строгий регламент вызовов, — ответил Громов, доставая из коробки дискету. — Подпрограмма расчета маршрутов будет лежать в выделенном блоке памяти. Прикладная программа сможет обратиться к ней только по одному конкретному адресу, передав массив исходных данных. Никакой самодеятельности.

Шрамов медленно выдохнул. Комплекс «МАРШРУТ-82В» — это то, с чем каждый день предстоит работать живому человеку за пультом.

— Принято, — кивнул он. — Тогда давайте к практике. Показывайте системный диск. На чем операторскую часть писать будем и как готовить образ для ПЗУ?

Щелкнул замок дисковода. Громов опустил флажок, фиксируя дискету, и нажал аппаратный сброс. Шаговый двигатель затрещал, выставляя магнитную головку на нулевую дорожку. Экран мигнул, очистился, и кинескоп высветил строчки приветствия «МикроДОС».

Евгений набрал команду чтения каталога. По экрану побежал ровный столбец имен файлов: текстовый редактор, макроассемблер, символьный отладчик, несколько служебных программ для работы с блоками памяти. Рабочая полка системщика.

— Спартанский набор, — хмыкнул Шрамов, вглядываясь в светящиеся буквы. — Всю прикладную программу на ассемблере писать будем? Код, конечно, выйдет компактным, но листинг разрастется так, что сопровождать замучаемся. Захочет заказчик втиснуть новую строку или сдвинуть позицию ввода — мы с ума сойдем координаты знакомест пересчитывать и ветвления править.

Громов усмехнулся.

— Не обязательно. Алексей Николаевич привез из Зеленограда компилятор языка Си. Работает прямо под МикроДОС. Он отлично справляется со структурами данных и указателями. Логику экранов и бланков на нем писать в разы быстрее, мы уже обкатали это на топологиях.

Шрамов недоверчиво прищурился.

— Си? Что за экзотика? Я его не знаю, Заказчик тем более. Если мы завяжем оборонный контур на язык, который в стране понимают полтора человека, нас первый же нормоконтроль на куски порвет. Где ГОСТы? Где методички?

— Согласен со Шрамовым, — кивнул Горелов. — Мне нужна проверяемость при сдаче. Код должен быть читаемым для комиссии.

— Нормоконтролю нужен структурный исходный текст, — возразил Морозов. — Ассемблерные простыни комиссия всё равно не поймет, а Си выглядит как нормальная понятная математика. Для логики диспетчера — самое то.

Шрамов скептически хмыкнул, взвешивая варианты.

— Ладно, посмотрю ваш Си на досуге. Но скелет начну на ассемблере, чтобы время не терять. Громов, у тебя распечатка вызовов «МикроДОС» под рукой?

Громов молча вытащил из стопки бумаг скрепленную скрепкой методичку и пододвинул по столешнице.

— Держи. Системные вызовы консоли — с первого по одиннадцатый. Базовый BIOS уже прошит, напрямую с железом возиться не придется. Опрос клавиатуры, позиционирование каретки, печать строки — все там.

— Отлично, — Шрамов бегло пролистал страницы. — Оберну эти вызовы в макросы и начну собирать экраны ввода. Сначала голый скелет, потом прикрутим расчеты.

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

Егорова подошла к столу, аккуратно сдвинула методичку и опустила ношу прямо перед клавиатурой.

— Я подготовила реальные рабочие срезы предприятия за прошлую неделю, — произнесла она. — Товарные накладные, диспетчерские журналы, сводки. Почти везде есть неполные коды, исправления карандашом поверх чернил и путаница в единицах измерения.

Она прижала ладонь к плотной обложке.

— Выходит, операторской части придется фильтровать этот поток до того, как данные уйдут в подпрограмму расчета, — произнес Шрамов. — Без строгого контроля ввода машина просто умножит ошибки.

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

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

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

— Вот ваши рабочие данные. — Ширяев ткнул пальцем в плотную стопку карточек. — Справочник узла. Перегоны, длина путей, наличие тяжелых кранов. Это постоянная база, которая пойдет в ПЗУ.

Он придвинул к себе стопку желтых телеграмм.

— А это оперативная обстановка, — Ширяев прихлопнул листки ладонью. — То, что диспетчер вводит на смене. Навалочная станция забита углем, пустых вагонов нет. Соседний перегон закрыт путейцами. С завода идет литерный состав. Программа «МАРШРУТ-82В» должна переварить эти вводные.

Егорова вытянула из пачки несколько бланков. Быстро просмотрев заполненные от руки строки, она разложила листы на потертой столешнице перед Шрамовым.

— Юрий Павлович, смотрите. Это прямое требование к вашей прикладной программе.

Она постучала обратной стороной карандаша по плотной бумаге.

— Код станции, шифр груза, номер поезда — это константы, их переведем в числа. Но взгляните, как заполняют остальное, — карандаш Егоровой сдвинулся к затертому полю. — Цифра зачеркнута, исправлено поверх. В графе веса вместо тонн указаны штуки. А в особых отметках идет чистый текст: «Сломалась стрелка» или «Ждем до утра». Ваша программа должна блокировать явный мусор при вводе, но оставлять диспетчеру возможность сохранить такие пометки и не завесить систему.

Шрамов склонился над бланками. Произвольный текст — полбеды, под него можно зарезервировать отдельную строку дисплея.

— В каком виде эти данные приходят на узел? — спросил он, потирая подбородок. — И в каком виде должны уходить?

— Исходные сводки приходят телеграммами, либо помощник пишет их на бумаге со слов дежурного по станции, — ответил Ширяев. — Ваш оператор будет переносить цифры в машину. А итоговый маршрут должен ложиться на стол начальнику смены в виде твердой копии.

— Вывод пойдет на АЦПУ или телетайп, — вмешался Морозов. — Юрий Павлович, забирайте формирование бланка на себя. Громов отдаст массив результата и номер расчета, а дальше вы сами собираете символы в строчки.

— Выдавать прямо в порт вывода? — деловито уточнил Шрамов.

— Ни в коем случае, — отрезал Морозов. — Никакой самодеятельности с железом. Используй пятый системный вызов из методички. Система сама опросит готовность и вытолкнет символ. Иначе повесите шину из-за разницы в задержках у АЦПУ и телетайпа.

Шрамов быстро сделал пометку в блокноте. Жесткие рамки профиля не оставляли места для низкоуровневых фокусов, но гарантировали предсказуемость.

— С печатью ясно. Вывод отвязан от железа, — кивнул Шрамов.

Он тяжело вздохнул, оценивая общий объем проверок и блокировок, которые ему предстояло написать для интерфейса программы «МАРШРУТ-82В». Математика не должна защищаться от опечаток оператора — это была исключительно его работа. Громов же, наоборот, выглядел заинтригованным алгоритмической сутью задачи. Он смотрел на разложенные по столу карточки, словно видел не бумагу, а взвешенные графы и матрицы смежности.

— Павел Андреевич, — обратился Громов. — А критерий оптимальности у нас какой? Что мы минимизируем? Время доставки? Стоимость? Пустой пробег вагонов?

Ширяев мрачно усмехнулся:

— Всё сразу, Евгений Александрович. И чтобы к утру.

— Так не бывает, — покачал головой Громов. — Если мы минимизируем время, придется гонять пустые локомотивы ради одного срочного вагона. Если минимизируем пустые перегоны — сорвем сроки поставки. Математика чудес не делает. На Олимпиаде мы искали кратчайший путь, но здесь это не сработает.

Морозов мысленно согласился. Полный перебор вариантов на «Сфере» займет недели, а ответ нужен диспетчеру к утру.

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

Громов нахмурился, обдумывая идею, и быстро кивнул.

— А потом перекидываем составы на соседние ветки, — подхватил он. — Если общая сумма штрафов за маршрут уменьшилась — сохраняем. Если увеличилась — откатываем назад. И так до упора.

— Штраф? — переспросил Ширяев. — Какой еще штраф?

— Математический, — пояснил Громов. — Мы не зашиваем критерии жестко в код. Мы делаем таблицу весов. Опоздание на час — штраф сто очков. Пустой пробег километра — десять очков. Задержка литерного груза — миллион очков. Алгоритм просто ищет вариант с наименьшей суммой штрафов.

— Вот! — Морозов указал на Громова. — И мы можем менять поведение системы, просто исправляя цифры в этой таблице. Не переписывая саму расчетную подпрограмму.

Егорова оторвалась от своих карточек и посмотрела на программистов поверх очков.

— Звучит красиво, — сказала она. — Но я вам не верю.

Громов поперхнулся. Морозов удивленно поднял брови.

— Вы сделаете алгоритм, он выдаст какой-то ответ, и вы скажете, что он оптимальный, — пояснила Егорова. — А как мы это проверим? Вы сами сказали, что идеального ответа нет.

Она вытащила из папки чистый лист и положила перед Громовым.

— Евгений Александрович, вы напишете не один алгоритм. Вы напишете три. Быстрый грубый подбор. Вариант с гигантским штрафом за пустой пробег. И вариант с абсолютным приоритетом сроков. А я подготовлю вам такие контрольные срезы данных, где эти три варианта гарантированно должны дать разные маршруты. Если ваша программа на разных настройках погонит поезда по одному и тому же пути — значит, ваша математика не работает, и вы просто подгоняете результат.

Громов посмотрел на женщину с нескрываемым уважением. Она не просто проверяла бумаги, а переводила бюрократическую рутину в строгие условия машинного теста.

— Договорились, Тамара Николаевна, — Громов забрал чистый лист. — Три варианта. И таблица штрафов вынесена в отдельный блок памяти. Юрий Павлович, — он повернулся к Шрамову. — Я дам тебе фиксированный адрес в памяти, по которому будет лежать структура с результатами. Код ошибки, номер маршрута, расчетное время. Как ты это будешь рисовать на экране — твоя забота.

* * *

Чернов, который всё это время молча стоял у окна и слушал монотонное гудение силового трансформатора в моноблоке, наконец подал голос.

— Вы тут всё память делите, адреса раздаете, — пробасил он. — Но ПЗУ-82В, как мы договаривались, жестко зашито. А операторская часть и справочники будут требовать обновлений.

Горелов предупреждающе поднял руку:

— Сразу говорю: никаких дискет в рабочей зоне диспетчера. Дискета — это грязь, пыль, магнитные поля и человеческий фактор. На узле будет работать только аппаратный блок.

— Поэтому в ПЗУ пойдет только окончательная версия, — подтвердил Морозов. — Аппаратно зашьем весь комплекс: операторскую часть, расчетную подпрограмму и базовые справочники станций.

Шрамов постучал костяшками по глухому кожуху машины.

— Прикладная программа будет меняться каждый день. А на предприятии? Контролер попросит сдвинуть колонку в печатном бланке — мне прикажете микросхему перепаивать?

— Оставим возможность загрузки с дискеты для отладочного режима, — пояснил Морозов. — На этапе доводки и во время выезда на предприятие программа крутится с дисковода. Нашли нестыковку — быстро поправили код на месте. Когда логика стабилизируется, готовим мастер-ПЗУ и ставим в штатную машину.

Чернов шагнул к столу и очертил пальцем воображаемый квадрат на задней стенке моноблока.

— Для замены ПЗУ паяльник вообще не понадобится. Сделаем аккуратный лючок. Микросхемы посадим в цанговые панельки, ключи выставим несимметрично, чтобы никто ноги не перепутал. Вынул старую, вставил новую. Сверху притянули металлической крышкой и опечатали.

— Нам понадобится инструмент для подготовки этих микросхем, — вернул разговор в рабочее русло Морозов. — Потребуется свой программатор.

— У нас же в лаборатории макет на столе валяется, мы на нем стартовый монитор прошивали, — напомнил Громов.

— Для закрытого контура самоделка на соплях не пойдет, — отрезал Горелов. — Нам нужно устройство, которое не просто прожигает биты, а гарантирует идентичность.

Морозов придвинул к себе блокнот и начал набрасывать схему.

— Нужен нормальный аппаратный программатор. Подключение через порт расширения «Сферы». И обязательный контроль напряжения прожига, чтобы биты потом не «поплыли».

Чернов заглянул через плечо Морозова и одобрительно хмыкнул.

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

— А в конце программатор выдает на телетайп строку протокола: версия, дата, сумма, — завершил мысль Горелов. — Отрезаем, вклеиваем в журнал. А на саму микросхему — бумажную бирку с номером под лак. Без совпадения номера с журналом ПЗУ недействительно. Вот вам и аппаратный контроль.

Шрамов потер переносицу. Программы пока не было — ни единой строчки. Но она уже обрастала колодками, пломбами, контрольными суммами и бирками под слоем лака. Гибкий код превращался в жесткую физическую деталь.

Громов перехватил его взгляд и понимающе усмехнулся.

* * *

Низкий гул силового трансформатора «Сферы» сливался с тихим звоном люминесцентных ламп на потолке. Разговор стих.

Шрамов не стал тянуться к клавиатуре. Вместо этого он взял со стола лист миллиметровки, подвинул к себе карандаш и начал чертить.

На бумаге вырисовывалась геометрия будущего экрана.

— Так, — бормотал он себе под нос, проводя жирную линию сверху. — Здесь у нас будет статусная строка. Время, текущая дата, номер смены. Ниже — блок постоянных данных.

Он нарисовал несколько прямоугольников.

— Станция отправления. Станция назначения. Код груза. Тоннаж.

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

— Вводите, Юрий Павлович, — тихо сказала она.

Шрамов сдвинул брови, разбирая торопливые каракули. В графе станции назначения значилось: «7А-бис».

— Тамара Николаевна, у нас по справочнику числовые индексы. Откуда буква? И что за «бис»?

— Диспетчер на сортировке так привык, — спокойно отозвалась Егорова. — Это реальная карточка за прошлый четверг. Запасной путь седьмой шахты. В вашем массиве такого кода нет. Что делает программа?

Шрамов быстро прикинул по клеткам миллиметровки знакоместа. Карандаш уверенно обвел прямоугольник ввода, отрезая ему путь дальше.

— Блокирую курсор, — ответил он. — В двадцать четвертой строке вывожу текст: «Код не найден. Повторите ввод».

— Текст в запарке никто не читает, — покачал головой Ширяев. — У вас ночная смена. Оператор будет смотреть на бумажную накладную, а не на экран. Набьет цифры вслепую и нажмет ввод. Нужно, чтобы при сбое был резкий сигнал.

— Ошибка должна бить по всем каналам, — Горелов постучал пальцем по корпусу дисплея. — Врубайте красный бордюр экрана. А по звуку — Чернов, заноси в Журнал отклонений малогабаритный звуковой излучатель. Повесим на свободный порт. Любая аппаратная врезка в базовую «Сферу» идет как архитектурное отклонение, с обоснованием.

Громов со своего места добавил:

— А пока математика считает — желтый бордюр. Чтобы диспетчер не дергался.

— Синяя — при выдаче на АЦПУ или телетайп, — подхватил логику Шрамов. Он уже делал быстрые пометки на полях бумажного макета. — Штатный режим ожидания ввода — черная. Обычная, не отвлекает.

— Вот так операторскую часть и собирайте, — кивнул Горелов. — И испытания начинаем с плохих данных. Тамара Николаевна, подготовьте контрольный набор с ошибочными кодами, пусть начинают проверку прямо с этого. Евгений Александрович, — он повернулся к Громову, — запуск расчетной подпрограммы пока отложим. Сначала отстраиваем строгий контроль ввода.

Громов примирительно поднял ладони.

— Договорились. Я пока пойду алгоритмы гонять. Мне еще таблицу штрафов балансировать.

Предыдущая главаГлава 35 из 47Следующая глава