— Запускай, — кивнул Кравец, открывая лабораторный журнал.
Липатов придвинул табурет ближе и развернул чистый лист, чтобы сразу переводить результаты опытов в пункты будущей инструкции. В лаборатории стало тесно, но расходиться никто не планировал.
На столе, расчищенном от паяльных станций и коробок с радиодеталями, выстроились три машины опытной партии. Посередине тяжело гудел дисковод ИЗОТ ведущей «Сферы-82». Слева и справа от нее стояли две бездисковые сестры со снятыми верхними крышками корпусов. Внутри, жестко закрепленные на латунных стойках и монтажных планках, вертикально возвышались макетные платы сетевых узлов. Их связывала гирлянда тонкого розового МГТФ, небрежно перекинутая через столешницу.
Птицын сидел перед центральной машиной. Пальцы замерли над клавишей ввода. На темном экране мерцало системное приглашение и набранная строка запуска тестовой программы.
— Ну, с Богом, поехали, — негромко сказал он.
Кравец, стоявший по ту сторону стола, поморщился и постучал костяшками пальцев по серому корпусу.
— Теологию оставим гуманитариям, Птицын. Запускай. И давай сразу договоримся: слово «сеть» мы пока вслух не произносим. От него у начальства начинаются галлюцинации про автоматизацию целых заводов. У нас сейчас настольная проверка — короткое кольцо на три машины, физический стык.
Липатов, устроившийся на краю соседнего стола, аккуратно провел линию по линейке в общей тетради.
— Вадим Сергеевич, давайте для протокола определим терминологию, — он стряхнул с бумаги грифельную пыль. — Я не могу написать в инструкции «физический стык». Мне нужно существительное, которое поймет условный техник в Челябинске. Что именно мы сейчас отправляем? Массив? Файл?
Кравец отвлекся от проводов и посмотрел на Липатова.
— Блок, Сергей Дмитриевич. Или пакет, если вам так больше нравится. Мы берем сто двадцать восемь байт из оперативной памяти ведущей машины, лепим к ним заголовок, адрес получателя и пинком отправляем в кабель.
— Пакет, — Липатов сделал аккуратную запись. — Принято. Номер передачи фиксируется?
— В первом байте. Иначе принимающая сторона не поймет, это новый пакет пришел, или мы старый повторяем из-за сбоя. Давай, Саша. Жми.
Птицын ударил по клавише.
ИЗОТ утробно хрюкнул шаговым двигателем, считывая программу в память. На долю секунды светодиоды на вертикальных макетных платах вспыхнули красным.
На экранах обеих бездисковых машин почти синхронно отпечаталась строка: «ПРИЕМ ОК. БЛОК 01. СУММА СОВПАЛА».
Саша шумно выдохнул и откинулся на спинку стула, победно глядя на Кравца.
— Прошло. Идеально прошло. А вы говорили — временные провода, наводки… Код всё вытягивает.
Кравец даже не улыбнулся. Он обошел стол, наклонился над правой машиной и потрогал пальцем розовый пучок МГТФ.
— Один удачный блок, Птицын, доказывает только то, что у нас есть контакт, — сухо произнес он. — Заряди цикл на тысячу пакетов. Подряд. Без пауз. И вот этот провод… — он подцепил ногтем петлю кабеля, — сдвинь ближе к блоку питания.
— Зачем искусственно ухудшать условия? — возмутился Саша, но руки уже потянулись к клавиатуре.
— Потому что идеальных условий не бывает. Там рядом с твоим кабелем пустят силовую шину или включат сварочный аппарат. Поехали.
Липатов тем временем расчертил страницу на ровные колонки.
— Вадим Сергеевич, я готовлю лист испытаний. Диктуйте графы.
— Номер попытки, длина линии, тип кабеля, результат, код ошибки. И оставьте широкое поле для примечаний. Нам туда писать придется больше, чем в основные графы.
Птицын запустил циклический тест. На центральном экране замелькали цифры отправленных пакетов: десять, двадцать, пятьдесят. Бездисковые машины ритмично выплевывали строки подтверждения. Светодиоды на платах слились в непрерывное красное свечение.
Двести. Триста.
На отметке триста сорок семь правая машина внезапно запнулась. Бег строк на ее экране замер. Затем дисплей моргнул и выдал: «ОШИБКА ПРИЕМА. КОД 04. СУММА НЕ СОВПАЛА». Левая машина продолжала исправно глотать пакеты, уйдя за четырехсотый номер.
Саша нахмурился, быстро прервал цикл комбинацией клавиш и придвинул к себе распечатку листинга.
— Код ноль четыре… Это потеря байта в теле пакета. Наверное, я неправильно инициализировал счетчик цикла приема. Регистр переполняется, и мы теряем байт. Сейчас поправлю, тут делов на две минуты.
Он потянулся к клавиатуре, чтобы внести правки, но Кравец мягко и непреклонно перехватил запястье Саши.
— Руки от клавиатуры.
— Я знаю, где ошибка! — горячо возразил Птицын. — Это мой код.
— Код тут ни при чем, Саша. Это физика.
Кравец повернул голову в сторону дальнего угла лаборатории, где за стеллажами с массивными приборами обитали аналоговики из бывшего КБ-2.
— Петр Иванович! — позвал он. — Будьте добры, принесите вашего зеленого друга. У нас тут цифровая гордость ушиблась о реальный мир.
Из-за стеллажей показался Петр Иванович. Он толкал перед собой приборную тележку, на которой громоздился массивный двухлучевой С1–64. Аппарат монотонно гудел, а по прямоугольному экрану с вытравленной координатной сеткой скользила тонкая зеленая линия развертки.
— Опять ваши нолики с единичками поссорились? — пробасил Петр Иванович. Он подкатил тележку вплотную к столу, вытянул из гнезда толстый коаксиальный щуп и привычным жестом прицепил земляной «крокодил» к латунной стойке правой машины.
— Саша винит программу, — хмыкнул Кравец.
Петр Иванович ничего не ответил. Он аккуратно коснулся щупом входного контакта на сетевой плате. На зеленом экране заметалась светящаяся линия. Ветеран покрутил ручки синхронизации и развертки. Линия стабилизировалась, превратившись в последовательность прямоугольных импульсов.
— Ну, смотри, программист, — Петр Иванович ткнул толстым, мозолистым пальцем в стекло осциллографа. — Видишь свой сигнал?
Птицын прищурился. Прямоугольники на экране выглядели странно. Их передние фронты завалились, превратившись в пологие скаты. А на верхней полке каждого импульса плясала мелкая, противная бахрома.
— Что это за мусор? — спросил Саша, забыв про код.
— Это, юноша, емкость кабеля, — наставительно произнес Петр Иванович. Он переложил щуп на левую машину, которая работала без сбоев. Импульсы там оказались чуть ровнее, а бахрома — меньше. — МГТФ — прекрасный провод. Для внутриблочного монтажа. А когда вы кидаете его соплей на три метра в неэкранированном виде, он работает как антенна. Плюс, вы положили петлю рядом с блоком питания. Трансформатор фонит. Наводка бьет по фронту сигнала, триггер на входе вашей платы не понимает, это единица или ноль, и перекидывается ложно. Вот тебе и потерянный байт.
Кравец коротко кивнул, ожидая именно такого вывода.
— Понимаешь, Саша? — он оперся руками о стол. — Ты сейчас полезешь в код, начнешь крутить задержки, добавишь лишние паузы, чтобы обойти программно то, что сломалось аппаратно. Код станет кривым, зависимым от тактовой частоты, а проблема никуда не денется. Завтра уборщица сдвинет кабель на десять сантиметров, и твоя программа снова даст сбой.
Липатов поднял голову от тетради.
— Отличный пример для инструкции, — отметил он, поправляя очки. — Симптом: несовпадение контрольной суммы. Действие техника?
— Проверить разъем и заменить линию связи, — отозвался Кравец. — В программу лезть в последнюю очередь.
Саша хмуро разглядывал экран осциллографа. Зеленый луч вычерчивал смазанный, дрожащий фронт.
Кравец вытащил из нагрудного кармана карандаш и покрутил его в пальцах.
— На станкостроительном в семьдесят восьмом случай был, — заговорил он. — Линия ЧПУ. От шкафа управления до станка метров пять кабеля. Ночная смена, станок ни с того ни с сего встает: ошибка концевика. Программисты там трое суток вокруг стойки плясали. Переписали алгоритм опроса, программные фильтры накрутили, задержки в циклы добавили. Запускают — час режет металл и снова сброс. Знаешь, что в итоге оказалось?
Птицын покачал головой.
— В соседнем пролете сварщик дядя Вася дугу зажигал, — Кравец усмехнулся. — Масса плохая была. Ток шел по металлоконструкциям цеха, наводил ЭДС на экран кабеля. Экран заземлили с двух сторон, получилась земляная петля. Импульс пробивал на сигнальную жилу, и контроллер видел ложное срабатывание концевика. А ребята код правили.
Петр Иванович одобрительно крякнул.
— Физику не обманешь, Вадим. Против лома нет приема. Если земля гуляет, никакая контрольная сумма не спасет.
— Контрольная сумма спасет от записи мусора на диск, — парировал Кравец. — Она скажет: пакет битый, бросай его. Но она не доставит данные. Поэтому, Петр Иванович, давайте менять физику. МГТФ в мусорку. Что у нас есть нормального?
Аналоговик неторопливо вытер руки ветошью.
— Есть витая пара. Сами скрутим из того же монтажного. Есть коаксиал, РК-75. И есть экранированная двужилка от старых микрофонов.
— Тащите двужилку, — решил Кравец. — Липатов, пишите: Опыт номер два. Тот же код. Тот же блок питания. Кабель — экранированный, экран заземлен на корпус ведущей машины.
Пока Петр Иванович ходил в свои владения за проводом, Птицын задумчиво листал распечатку.
— Вадим Сергеевич, — позвал он, не поднимая глаз. — Если мы признаем, что кабель может ловить помехи, значит, ошибка «04» будет всегда. Рано или поздно. Каким бы толстым ни был экран.
— Обязательно будет, — согласился Кравец.
— Тогда моя обработка битой суммы никуда не годится. По таймеру у нас повторы работают, а при неверной контрольной сумме программа останавливается при первой же ошибке, хотя связь обрываться не должна.
Кравец перестал крутить карандаш. Он внимательно посмотрел на младшего инженера.
— Дошло наконец. Вот теперь ты переходишь к настоящему промышленному обмену. Что предлагаешь?
Птицын придвинул к себе чистый лист бумаги и начал быстро рисовать блок-схему, комментируя на ходу:
— Мы не останавливаемся. Но у нас кольцо, мы не можем просто крикнуть в обратную сторону. Если сумма не совпала, машина-приемник не пишет ошибку на экран. Она выставляет в хвост проходящего пакета служебный бит ошибки. Пакет летит дальше по кольцу.
— И когда маркер с пакетом возвращается к мастеру… — кивнул Кравец, предлагая Саше закончить мысль.
— Мастер видит этот бит. Понимает, что пакет доехал битым. Он сохраняет маркер у себя, ждет пару миллисекунд, чтобы помеха в кабеле успокоилась, и кидает пакет в кольцо заново.
— Сколько раз кидаем? Бесконечно? — прищурился Липатов. — У нас машина зависнет в бесконечном цикле, если провод топором перерубят.
— Три попытки, как и по таймеру, — Саша зачеркнул стрелку на схеме и нарисовал ромб условия. — Если три раза подряд пакет бьется, значит, линия оборвалась окончательно. Тогда выдаем критическую ошибку оператору. А если со второго раза прошло — работаем дальше. Оператор даже не заметит сбоя.
— А вот это уже ошибка, — Кравец наклонился над столом, упираясь ладонями в край. — Для оператора сбой пройдет незаметно. А техник обязан его увидеть. Иначе у тебя линия будет работать на соплях неделями, перекидывая каждый пакет по три раза, скорость упадет втрое, а никто и не почешется, пока всё не сгорит. Нам нужен счетчик в журнале.
Липатов моментально включился:
— Аппаратный счетчик?
— Программный, — Кравец постучал пальцем по схеме Птицына. — Саша, ты выделяешь в памяти два байта. Счетчик повторов. Каждый раз, когда ведущая машина вынуждена переотправить пакет, она увеличивает этот счетчик на единицу. В конце передачи оператор видит надпись: «ПЕРЕДАЧА ЗАВЕРШЕНА». А техник нажимает комбинацию клавиш и видит в журнале: «ПОВТОРОВ: 12». Если повторов ноль — всё идеально. Если два-три на тысячу пакетов — норма. Если сотня — берем паяльник и идем проверять контакты, пока линия жива.
Липатов аккуратно обвел записи.
— Это рабочий алгоритм. Фиксирую его как базовый профиль обмена, — произнес он. — Назовем его…
— «СФ-ЛИНК-81», черновик, — подсказал Кравец. — Базовый рабочий минимум.
Вернулся Петр Иванович, волоча за собой бухту тяжелого серого кабеля. Под толстой внешней оболочкой угадывалась медная экранирующая сетка. От провода пахло слежавшимся полихлорвинилом и подвальной сыростью — моток явно долго ждал своего часа на складе.
— Откусывай, — скомандовал аналоговик, протягивая Саше массивные бокорезы.
Следующие двадцать минут в комнате слышались только щелчки инструмента и тихое шипение канифоли. Птицын разделывал концы экранированной двужилки. Он аккуратно надрезал изоляцию, расплел медную сетку, скрутил в отдельную косичку, стараясь не повредить внутренние сигнальные провода, и залудил.
Кравец внимательно следил за руками Саши.
— Экран паяй только со стороны ведущей машины, — предупредил он. — На приемниках просто откуси и заизолируй.
— Почему не с обеих сторон? — удивился Птицын. Он обтер жало паяльника о кусок влажной ветоши, сбивая лишний припой. — Надежнее же масса будет.
Вместо Кравца ответил Петр Иванович.
— Вот потому вы, цифровики, и горите синим пламенем, — вздохнул ветеран. — У тебя три машины. Они питаются от разных розеток. Между нулями этих розеток может быть разность потенциалов. Вольта три, а то и пять. Если ты соединишь корпуса машин экраном кабеля, по этому экрану потечет уравнивающий ток. Получишь петлю. Вся твоя защита превратится в генератор помех прямо внутри провода. Экран должен служить клеткой Фарадея, сливать статику на землю в одной точке, а не работать силовым проводом.
Саша молча кивнул и послушно откусил расплетенную медь на концах, идущих к бездисковым «Сферам».
Пока Птицын возился с железом, Кравец присел на стул и прикрыл глаза, мысленно прокручивая алгоритм.
— Липатов, — не открывая глаз, сказал он. — В инструкцию. Раздел «Возможные неисправности». Что мы пишем, если машина-приемник вообще не отвечает? Даже ошибку не выдает. Просто молчит.
Сергей Дмитриевич перелистнул страницу.
— «Проверить подключение разъема. Заменить плату сетевого узла».
— А как программа ведущей машины поймет, что приемник отключен? — открыл глаза Кравец. — Она кинула пакет и ждет ответа. Приемник выключен, ответа нет.
Птицын, закручивая винты, спокойно отозвался:
— У меня стоит таймер на сто миллисекунд. Если тишина — порт сбросится и пойдет повтор.
— Верно, — кивнул Кравец. — Ограничение времени ожидания есть. Только теперь сброс по таймеру заводи в счетчик повторов. Обрыв и битый пакет обрабатываются одинаково.
К вечеру новую линию собрали. Серый экранированный кабель, жесткий и неподатливый, змеился по столу, соединяя три машины. Птицын потратил еще полчаса, переписывая код программы: добавил счетчик повторов, обработку NAK и привязал к ним уже существующий сброс по таймеру. Он вбивал шестнадцатеричные коды прямо в память, сверяясь с исчерканным листом бумаги.
— Готово, — наконец выдохнул он. — Запускаю?
— Давай, — Кравец встал за спиной Саши.
Петр Иванович снова пододвинул осциллограф.
Саша нажал клавишу ввода.
На экранах бездисковых машин побежали стройные столбцы подтверждений.
— Петр Иванович, глушите их, — скомандовал Кравец.
Аналоговик взял с соседнего стола мощное электромагнитное реле на двадцать четыре вольта, чьи провода тянулись к лабораторному блоку питания. Он поднес реле вплотную к серому кабелю и начал быстро замыкать и размыкать контакты. Раздался громкий, трескучий звук, и в воздух полетели синие искры.
На осциллографе зеленая линия дернулась, покрылась частоколом выбросов.
Экран правой «Сферы» моргнул. Строка подтверждения замерла.
Птицын подался ближе к дисплею. Кравец смотрел только на экран ведущей машины.
Прошла доля секунды.
На ведущей машине мелькнула надпись: «ПОВТОР 1».
Реле продолжало трещать, но пакет успел проскочить в миллисекундную паузу между замыканиями контактов.
На бездисковой машине вдруг появилась новая строка: «БЛОК 412 СУММА СОВПАЛА», и столбец побежал дальше. Алгоритм отработал лимит, не получив подтверждения, и пропихнул данные со второй попытки.
Саша облегченно выдохнул.
— Работает.
— Еще не всё, — Кравец дотянулся до клеммника правой машины, крутнул винт отверткой и выдернул провод данных.
Правый экран тут же замер. Следом остановилось обновление строк и на левой машине — физическое кольцо разомкнулось, полностью прервав обмен.
Программа на ведущей «Сфере» запнулась на треть секунды, исчерпывая лимит повторов и раз за разом дожидаясь подтверждения. Затем на экране высветилось: «ОТКАЗ ПЕРЕДАЧИ. ОБРЫВ КОНТУРА». Птицын потер шею, глядя на сообщение.
Кравец увесисто хлопнул Птицына по плечу, на секунду крепко сжав пальцы. Саша чуть подался вперед от толчка и довольно хмыкнул.
— Вот теперь — работает.
Петр Иванович выключил блок питания, бросил реле на стол и удовлетворенно потер руки.
— Выдержал экран. И защита ваша программная сработала. Неплохо, молодежь. Но на заводской длине в сто метров этот фокус с прямым подключением не пройдет. Сигнал затухнет.
— На сто метров мы мощную токовую петлю поставим, — пожал плечами Кравец. — Сегодня мы проверяли логику отказов.
Липатов вырвал исписанную страницу и закрыл обложку тетради. На бумаге осталась стройная, понятная таблица.
— Значит, в журнал стендовых испытаний вносим следующее, — Липатов выровнял лист поверх закрытой обложки. — Физическая линия — четыре метра, экранированный провод. Код ошибки ноль-четыре закреплен за несовпадением контрольной суммы. Лимит — три повтора передаваемого блока, затем останов с выдачей адреса узла. Завтра отдам этот черновик в машбюро. Сделаем первую рабочую памятку для участка сборки: как соединить машины, запустить тестовый обмен и в каком порядке проверять железо при отказах.
Птицын, сохраняя обновленный код на дискету, задумчиво посмотрел на кабель.
— Знаете, Вадим Сергеевич, — тихо сказал он. — А ведь это страшнее, чем операционную систему писать. В ОС всё внутри машины, всё логично. А тут ты выпустил пакет за пределы порта — и он улетел в темный лес. Где искрят реле, где земля плохая, где уборщица со шваброй.
Кравец усмехнулся, пряча карандаш обратно в карман.
— Тепличных условий за порогом лаборатории не выдают, Саш, — отозвался Кравец. — В цехах станки гудят, сварочные аппараты искрят, кран-балки по рельсам лязгают. Так что привыкай.
За окнами окончательно стемнело. На столе, среди обрезков синей изоляции, крошек канифоли и исчерканных листов Липатова, тихо работали три «Сферы». Серый экранированный кабель неровными петлями соединял их сетевые платы.