Три кода

Штрих (письмо)

У этого термина существуют и другие значения, см. Штрих.

Штрих (нем. Strich — линия, черта, зарубка):

  • тонкая черта, линия;
    • типографский знак: ;
  • характерная особенность, деталь в передаче или изображении чего-либо.

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

  • в геометрии, географии и т. д. штрихом обозначаются угловые минуты: (двойным штрихом — угловые секунды и т. д., каждый следующий разряд в 60 раз мельче предыдущего);
  • в математическом анализе штрихом обозначается первая производная: ; вторая и третья производная обозначаются соответственным числом штрихов; четвёртая и последующие производные обозначаются цифрами в скобках или (реже) римскими цифрами: ;
  • в английской типографике штрих — знак фута (а двойной штрих — дюйма): запись означает 5 футов 10 дюймов;
  • часто штрихи (одиночные, двойные, тройные) при буквах используются просто для расширения набора доступных условных обозначений; при этом обычно стараются ввести обозначения, в которых одинаковые буквы с разным числом штрихов соответствуют родственным или взаимосвязанным объектам;
  • в некоторых системах фонетической транскрипции штрих является знаком мягкости предыдущего согласного или знаком (главного) ударения на последующем слоге (побочное ударение при этом обозначается штрихом внизу);
  • в некоторых системах латинской транслитерации кириллицы штрих соответствует мягкому знаку, а двойной штрих — твёрдому знаку;
  • в греческой системе буквенного обозначения чисел штрих за последней буквой буквосочетания означал, что это не слово, а запись числа: ; эта же система использовалась и в некоторых славянских кирилловских изданиях (преимущественно украинского происхождения). Подстрочный штрих перед «буквоцифрой» обозначал, что речь идёт о тысячах: .

Код символа

Собственные коды имеют также двойной, тройной и даже четверной штрихи.

Штрих и похожие на него символы

Штрих не следует смешивать со знаком апострофа, который имеет форму запятой, а не прямого штриха. Использование вместо штриха так называемого «машинописного апострофа» также нежелательно и допустимо лишь при технических ограничениях.

Акут — надстрочный диакритический знак (по форме может совпадать со знаком ударения, но смысл бывает самый различный): á ń ѓ;

См. также

  • Апостроф
  • Акут
  • Знак ударения
  • Гравис
  • Машинописный обратный апостроф

BMW 6 series (E63) «Южанка» ›
Бортжурнал ›
Кодирование со смыслом, часть 1

Сначала я хотел написать пост про то, как изменить межсервисный интервал по замене масла. Однако вышло немного непонятно и получилось как у всех, одна только практика без теории. Поэтому я решил написать обширную теоретическую часть по кодированию, прочитав которую, вы научитесь хорошо понимать, что и с чем едят и менять всё что угодно и как угодно в своей машине, не прибегая к поискам инструкций. Думал это всё разместить в блоге, но практическая часть всё равно будет и относится она непосредственно к Южанке, поэтому всё-таки будет здесь, в БЖ.

Большинство инструкций по кодированию BMW, как правило, содержат в себе минимум информации, без каких-либо подробностей, вида «измените значение параметра «X» на «aktiv» или «wert_xx», и что-то будет работать по-другому». Этого в большинстве случаев достаточно, эффект достигнут и голова не болит. Однако любознательным товарищам иногда хочется понимать, что за что отвечает и как оно вообще устроено. Ниже пойдёт самая мякотка, но если вас кодирование в принципе не интересует, можно на этом закончить чтение. Поехали!

* * *

Предположим, что вы уже знаете, что такое NCS Expert, пакет программ BMW Standard Tools и файлы данных SP-Daten и всё это установили. И даже научились кодировать всякую ерунду типа поворотников на HUD, редактируя файл FSW_PSW.MAN. Хотя и не очень-то даже понимаете, как вообще это всё дело работает.

Начнём с тех самых SP-Daten файлов. Как правило это увесистый архив, в котором есть несколько папок:

cfgdat — файлы конфигурации для NCS Expert, содержит также расшифровки кодов ошибок при кодировании;

data — самая «толстая» папка, в ней лежат прошивки для ЭБУ;

daten — кодировочные файлы и файлы с описанием комплектаций, опций и т. д. Об этих файлах мы и поговорим чуть ниже;

ecu & sgdat — папки с библиотеками для работы с блоками управления. Что-то вроде так называемых интерфейсов, описывающих функции блоков;

Оставшиеся папки содержат в себе информацию о применимости прошивок, их связей друг с другом, данные о формате БД, контрольные суммы и т. д. Тоже интересно, но не в этой теме.

Кодировочные файлы

Больше всего нам интересна папка daten. В ней содержатся файлы с расширениями вида .Cxx, где xx — произвольный шестнадцатиричный номер, обозначающий порядковый номер этого файла (или вернее «кодировочный индекс»). На один и тот же ЭБУ может существовать несколько таких файлов (т. е. кодировочных индексов), каждый из которых привязан к версии прошивки в этом блоке. С течением времени в прошивки добавляли новые или изменяли старые функции, а вместе с ними добавлялись/изменялись параметры для них. При таких изменениях заводился новый кодировочный файл, со следующим по порядку индексом. Но не всякая новая прошивка содержит новый же кодировочный индекс, зачастую в прошивке просто исправляют ошибки и ничего более. Например, блок LM2 у E60 имеет аж 53 кодировочных индекса (последний — 35h), правда не все доступны в daten-файлах, а совсем старые уже удалены.

Daten-файлы

При установке с помощью запуска скрипта LADEN.BAT все файлы копируются в папку NCS Expert и после этого мы можем их использовать. Это понятно, но кое-что в этих файлах есть весьма интересное — файлы с расширениями 000, ZUS и M00. Как оказалось, это обычные текстовые файлы и в них есть любопытная информация. Т. к. рассматриваем мы кузов E60 (и соответсвенно E61, E63 и E64), то самый интересный файл — E60AT.000. Его можно открыть в текстовом редакторе и внимательно изучить, но сначала поговорим о кодировании.

Vehicle Order

Наверняка вы знакомы с понятием VO (Vehicle Order) или FA (Fahrzeugauftrag). Это шифр, описывающий комплектацию и другие параметры автомобиля. Этот шифр хранится в нескольких блоках автомобиля, в E60 его хранят блоки CAS и LMA. Возможно вы даже изменяли его при кодировании, обычно это делается при дооснащениями какими-либо опциями. В некоторых инструкциях весь шифр называют VO, а отдельный элемент — FA. Это неправильно, т. к. VO и FA это суть одно и то же.

Типичный шифр комплектации автомобиля выглядит вот так (это актуальный на момент публикации FA Южанки):

Когда вы подключаетесь к машине и считываете в NCS Expert FA из машины, он сохраняется в файл fa.trc в папке WORK. Он точно описывает текущую комплектацию автомобиля и некоторые специальные параметры, заданные конкретно для этого автомобиля. Можно разложить этот шифр по полочкам:

E63_ — кузов;

#0908 — так называемый временной критерий. Это параметр, который отражает технический уровень автомобиля. По ходу жизни автомобиля на конвеере, в его конструкцию вносятся изменения, добавляют новые возможности или модернизируются старые. В среднем новый временной критерий выходит раз в полгода, а в первые года выпусков и того чаще. В данном случае мой критерий — сентябрь 2008. На самом деле оригинальный заводской был старше, #0907, но он был изменён после установки CIC для корректности работы диагностических программ. По этому критерию программы для работы с авто определяют, какие блоки в машине соответствуют определённым опциям. Если временной критерий неверный, то программы, например, могут неверно отображать список блоков в авто;

&LED5 — цвет и материал обивки. В данном случае Leder D5, он же Saddle Brown;

%0300 — код краски (300, Alpinweiss 3);

*EA51 — Код кузова, двигателя и региона. Как правило, содержится в VIN-номере после первых трёх букв (WBA для немецких или X4X для калининградских авто);

$xxx — коды опций, идущие подряд. В расшифровке автомобиля вы можете увидеть те же коды, только в формате SxxxA;

-xxx (или +xxx) — Персональная настройка. Что-то вроде «галочек» в настройках программ;

Ну вроде всё просто? Вполне. Внимательные могут заметить в начале каждого значения специальный символ, который обозначает тип значения (# для временного критерия, & для обивки, % для краски и т. д.). Теоретически порядок следования этих значений при таких префиксах вообще неважен.

Идентификаторы опций

Вернёмся к нашему E60AT.000.

E60AT.000

Он весьма объёмный, но в нём есть очень полезная информация с комментариями (они написаны после двух слешей «//», программисты сразу поймут), правда на немецком. Не все опции, вписанные в FA, влияют на кодировку автомобиля. Поэтому для опций, которые влияют, заведены отдельные идентификаторы или набор идентификаторов, которые используются в работе при кодировании. В файле E60AT.000 как раз и приведены соответствия идентификатора или группы идентификаторов какой-либо опции из FA.

Общий формат такой:

X YYYY WWWW ZZZZZ //комментарий

Где X обозначает тип значения в FA, YYYY — собственно само значение из FA (без спец. символа), WWWW — условие, при котором данное соответствие актуально (в большинстве случаев никаких условий нет), ZZZZ — идентификатор для кодирования, иногда их сразу несколько.

Типы значений FA:

A — временной критерий (#xxxx);

Z — актуальный временной критерий (также #xxxx);

W — основные опции ($xxx) или тип кузова/двигателя/региона (*xxxx);

E, H, K — настройка основных опций (-xxx, +xxx);

Примеры:

A #0903 PU03 //PU 09/03

Здесь мы видим, что #0903 в FA соответствуюет идентификатору (отсюда и далее будет «идент» для простоты написания) PU03. При кодировании наличие этого идента позволяет правильно закодировать автомобиль с учётом установленного оборудования (если машина реально соответствует временному критерию «сентябрь 2003»).

A #0305 PU03 DEZ03 MAERZ04 APRIL04 JUNI04 PU04 MAERZ05 //MAERZ PU 03/05 (LM_AHL)

Тут как мы видим, #0305 включает в себя сразу несколько идентификаторов. Все иденты кроме сентября вполне соответствуют обозначениям месяцев на немецком. Сентябрь же обозначается аббревиатурой «PU», не знаю почему.

Рассмотрим вариант с настройкой. В терминах программирования такие настройки соответствуют понятию «флаг», ну или для обывателей — «галочки» в настройках программ:

K OI11 OHNE_FA_SBR //Deaktivierung FAHRER SEATBELTREMINDER (bis PU03/04 im KOMBI ab PU03/04 im SGM! ab PU09/05 im ACSM)

Значения FA с типом K чаще всего пишутся в FA с префиксом «+», а с типом E и H с префиксом «-«, хотя некоторые настройки пересекаются по типам. В чём принципиальная разница — не знаю, не разобрался. В примере у нас значение OI11 типа K (т. е. это соответствует +OI11 в FA), которое позволяет отключить напоминание непристёгнутого ремня для водителя. Для кодирования значение +OI11 из FA превращается в идентификатор OHNE_FA_SBR. Т. е. при наличии данной «галочки» в FA, некоторые параметры соответствующих блоков принимают такие значения, которые соответствуют отключенному предупреждению о непристёгнутом ремне. Благодаря E60AT.000, вы теперь знаете все возможные «галочки».

Далее основные опции:

W 6FL AUDIOPLAYER_USB //USB-/AUDIO- SCHNITTSTELLE

Ну тут всё понятно, $6FL в FA соответствует иденту AUDIOPLAYER_USB. В некоторых случаях на одно значение есть два разных набора идентов в зависимости от условий, например от временного критерия. Как пример, опция $609 (навигация Professional):

W 609 V0908 NAVIGATION CCC //NAVI-SYSTEM PROFESSIONAL OHNE TV (PA021/315ZWAKO 964)NICHT MIT 663
W 609 N0908 NAVIGATION CIC //

Vor (нем. «до») 09/2008 значению $609 соответствуют иденты NAVIGATION и CCC, а Nach («после») 09/2008 — NAVIGATION и CIC. Там же можно увидеть интересное:

W 6VA CIC //CIC Zusteuerung (03/08-09/08)(NK71 PU71 PV31 PV71 PW51 PX51 PX71 PX91 PY51)Alternativ zusteuerung CIC

Опция $6VA указывает на идент CIC. Так сказать, говорит о заказной установке CIC, действующей с 03/2008 по 09/2008, на перечисленных типах кузовов и двигателях (почему-то правда только E61 и только бензиновые европейки). Т. е. CIC ставился опционально с марта по сентябрь вместо CCC при запросе клиента. А позже CCC был заменён на CIC в качестве системы навигации по умолчанию, но по запросу клиента могли установить CCC (но с новым джойстиком iDrive). В таком случае за «принудительный» CCC отвечает опция $6VB. Кстати, на F-сериях опция $6VA также существует, но означает, что место NBT стоит CIC по запросу клиента (для машин с 07/2012).

Последний пример:

W NF33 E60 N52B30 UL LL US ALLRAD OIL_LEVEL_1 //Limousine 525xiUL //US LL 04/05 — 03/07 /160kW</b>

Теперь зная, какие иденты соответствуют значениям из FA, можно составить их полный список. Вручную это делать не надо, за вас это сделает NCS Expert, когда вы прочитаете FA из машины. Чтобы увидеть список, достаточно открыть файл ASW.TRC из папки WORK:

ASW.TRC

На основании именно этого списка идентов определяются значения параметров блоков при кодировании, а FA лишь источник для формирования этого списка.

Что нам делать с этим списком и вообще полученными знаниями? Пригодятся они нам для работы с программой NCS Dummy.

NCS Dummy

Саму программу можно добыть . Там же и инструкция к ней, на английском, но я её не читал, но вы прочитайте всё-таки :))

К сожалению, настоящее имя автора неизвестно, только его ник — revtor. Единственное, что мне удалось найти о нём, это то, что живёт он в Антверпене (Бельгия) или пригороде, ему около 35 лет и он владеет BMW 850CSi (нашёл даже номер автомобиля) в отличном состоянии. И ещё удалось найти его фотографию за рулём:

revtor

Благодаря этому человеку энтузиасты по всему миру кодируют многочисленные BMW и, конечно же, зарабатывают на этом деньги. Поэтому скажите ему спасибо 🙂

Фильтрация списка модулей

NCS Dummy — весьма мощный инструмент, который позволяет наглядно работать с daten и TRC-файлами. С помощью этой программы, например, можно определить все необходимые блоки для кодирования определённой опции. Для этого в программе предусмотрен фильтр списка блоков по различным критерям, один из которых — поиск по иденту опции.

Например, установили вы зеркало с камерой FLA. В расшифровке автомобиля это — опция S5ACA Автоматический дальний свет. В FA это будет $5AC, именно это значение мы будем добавлять в FA при кодировании. Можно просто добавить эту опцию и закодировать автомобиль целиком (Process Car), т. е. все-все блоки в автомобиле будут закодированы в соответствии с текущим FA (или, вернее, списком идентов). Такой вариант на самом деле годится лишь для новичков, т. к. все параметры блоков, которые вы изменили по своему усмотрению, будут восстановлены к тем значениям, которые соответствуют FA. Т. е. при таком кодировании у вас «слетят» всяческие опции закрытия зеркал с ключа, поворотники в HUD и прочие нестандартные вещи.

Гораздо вернее кодировать только те блоки, в которых есть параметры, зависящие от данной опции и в определении списка зависимых модулей нам как раз и поможет NCS Dummy. После первого запуска необходимо указать пути к папке программы NCS Expert. После этого в первой вкладке у вас появятся на выбор доступные кузова:

Выбран E60

Во втором выпадающем списке у нас перечислены все кодировочные файлы для всех модулей. Теперь надо этот список отфильтровать, но для начала заглянем в E60AT.000 и поищем там идент опции 5AC. Нашли:

W 5AC FLA XENONLICHT //FERNLICHTASSISTENT (PU09/05), (Zwako zu SA430oderSA431 und SA522 PA623/072)

Опции 5AC соответствуют иденты FLA и XENONLICHT. Заодно понимаем, что 5AC без опции 522 (XENONLICHT) не бывает. Можно даже убрать $522 из FA, но идент XENONLICHT, как мы видим, никуда не денется.

Чтобы отфильтровать список модулей по конкретной опции, надо нажать кнопку «Filter» справа от списка модулей, перейти на вкладку «Order option» (фильтрация по опции), вписать в поле «FLA» и запустить фильтрацию. Спустя непродолжительное время список модулей будет отфильтрован:

NCS Dummy modules filter

Таким образом кодировать нам надо блок света LM, блок головного устройства (CIC, MASK, CCC в зависимости от того, что установлено) и собственно сам модуль FLA. В большинстве инструкций по дооснащению автоматическим дальним написано, что нужно ещё кодировать блок KOMBI (комбинация приборов), однако, как мы видим, в нём нет ни одного параметра, связанного с FLA и модуль отсутствует в списке.

Уже в самом списке параметров можно запустить поиск по тем же критериям и найти зависимые параметры. Здесь также стоит сделать некоторое замечание касательно такой фильтрации и поиска, но для начала расскажу про логические выражения.

Логические выражения (условия)

Каждое значение параметра зависит не только от одного идентификатора, но и от сочетаний этих идентификаторов, причём сочетания могут быть весьма сложные и иногда представляют собой строку вида:

!((ACEA_CO2+!IHKA_CI_0C, IHKA_CI_0C+ACEA_CO2+(E60, E61)+!LUFTKL)+!ALPINA+!S85B50)

Это — логическое выражение (или условие применения), где «, » символизирует логическое «ИЛИ», «+» означает логическое «И», а «!» означает логическое отрицание, а скобки работают примерно также, как в математике. Для программистов такие выражения в целом понятны. Если данное логическое выражение этого значения на основе заданного списка идентов соответсвует истине (т. е. условие выполняется), значение будет выбрано для кодирования. Если же нет, тогда будет выбрано то, у которого условия выполняются. В некоторых случаях параметры могут иметь сразу несколько значений и все они будут выбраны при выполнении условия в каждом из них.

Условия отображаются в графе Options при выборе значения какого-либо параметра:

NCS Dummy logic expressions

На скриншоте выбрано значение «aktiv» для параметра UMWAELZPUMPE модуля IHKA_E60 с индексом 0D (13-ый кодировочный индекс). Тут же рядом пояснение, что данный параметр отвечает за активацию управления дополнительной помпой по CAN-шине и значение «aktiv» будет выбрано при выполнении следующего условия:

(STANDHEIZUNG, NACHRUEST_SHZH)+(M47D20, M57D25, M57D30, N47D20)

STANDHEIZUNG — это опция 536 (подглядываем в E60AT.000) или вернее S536A Автономная система отопления. NACHRUEST_SHZH — это тоже самое, только указывает на персональную настройку +K536 (или возможно -K536, не знаю), обозначает модернизацию отопителя. Остальные иденты обозначают дизельные двигатели соответствующих моделей.

Логически данное выражение выглядит вот так:

(есть опция 536 ИЛИ настройка K536) и (есть любой из двигателей M47D20, M57D25, M57D30 и N47D20)

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

!((STANDHEIZUNG, NACHRUEST_SHZH)+(M47D20, M57D25, M57D30, N47D20))

Выражение обёрнуто в скобки и перед ними стоит знак отрицания, т. е. значение nicht_aktiv будет выбрано в том случае, если выражение внутри скобок ложно по какой-либо причине.

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

Возвращаясь к фильтрации списка модулей или поиска параметров, хочу отметить то, что система не совсем совершенна, ввиду того, что работает как простой поиск подстроки в строке условия и в одном из четырёх режимов: просто как часть строки, в начале строки, в конце или точное соответствие. Т. е. в поле поиска можно писать не только идент опции, но и целое логическое выражение, а можно вообще хоть пару символов из идента. Это удобно, но не хватает режима поиска «как целое слово», чтобы в результаты поиска не попадали иденты, которые хоть и содержат указанную строку, но отношения к теме не имеют. Например, когда мы фильтруем список модулей по строке «FLA», в результатах фильтрации есть сам модуль FLA, который по идее туда не должен попадать, но попал ровно потому что парочка значений в параметрах зависят от идентов типа FLA_CI_05. Т. е. мы искали всё, что завязано на идент «FLA», но попутно ещё нашли и FLA_CI_05 из-за того, что «FLA» — часть этой строки. Сам по себе модуль не может содержать параметры, которые зависят от самого наличия этого модуля, т. к. это абсурд 🙂

Update: В версии 0.6.0.5 добавлен режим «Exact word», т. е. поиск по целому слово. Прекрасно.

Специальные иденты и тонкости кодировочных индексов

Кстати, об идентах типа «XXX_CI_XX» (CI = Codierung Index, кодировочный индекс). Такие вы не найдёте в E60AT.000, т. к. это иденты, обозначающие зависимость от кодировочного индекса конкретного модуля.

Например, возьмём параметр STREETLAMP_COUNT (количество уличных источников света, при котором отключается дальний свет) модуля FLA. Он имеет два значения: wert_01 и wert_02. Однако в завимости от кодировочного индекса, этим значениям соответствуют разные данные, т. е. при одном и том же значении в блок будет записано разное количество источников света.

Всего для модуля FLA у нас три кодировочных индекса: 03, 04 и 05, соответственно FLA_E65.C03, FLA_E65.C04, FLA_E65.C05. Интересная особенность индекса 04 в том, что параметр STREETLAMP_COUNT в нём в принципе отсутствует. Однако не означает, что такого параметра нет. На самом деле он есть, но равен нулю всегда, т. е. хотя бы один источник света автоматом отключает дальний свет. Это интересный случай, обычно в таком случае оставляют параметр с единственно возможным значением, но, видимо это не тот случай.

Итак, в индексе 03 для wert_01 у нас указано 24 источника света, а для wert_02 — 0:

FLA_E65.C03 STREETLAMP_COUNT

04 индекс у нас на деле жёстко задаёт 0 без возможности смены (не спрашивайте, откуда я это знаю, сейчас не про это :), а в 05 индексе wert_01 у нас означает 24 источника света, а wert_02 аж 64:

FLA_E65.C05 STREETLAMP_COUNT

Количество источников понятно, но нам интересны условия для данных параметров. Так, для wert_01 логическое выражение такое:

!(!FLA_CI_05, FLA_CI_05+US)

А для wert_02 оно же, но без общего отрицания:

!FLA_CI_05, FLA_CI_05+US

Т. е. значение wert_02 будет выставлено либо если индекс модуля FLA не равен 05, либо он равен 05 и машина американка. В противном случае будет выбран wert_01.

Нетрудно догадаться, что основная разница в достаточном количестве источников света между европейкой и американкой будет только при кодировочном индексе 05. Европейке достанется значение wert_01 (24 источника света), а американке — wert_02 с 64-мя «лампочками». Не очень понятными остаются такие условия в индексе 03, т. к. в любом случае там будет задано wert_02. Скорее всего, если найти какой-нибудь старый архив SP-Daten, где вообще нет индексов 04 и 05, условия для параметров будут другими, но, пожалуй, выяснение этого момента я оставлю на плечах читателей 🙂

Пытаться разобрать истинность длинных логических выражений, думаю, не стоит, за вас это будет делать NCS Expert в режиме заводского кодирования. Он будет опираться на список идентов, полученных из FA и кодировочных индексов и сам подберёт нужные значения. Можно управлять установкой параметров, меняя сам FA (даже не обязательно его сохранять в блоки).

Теперь вы лучше понимаете, что такое FA, как он формируется, как на его основе составляется список идентов, как эти иденты используются при определении значений параметров, а так же что такие кодировочные индексы и как всё это дело связано друг с другом.

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

Часть вторая

«Печать антихриста» и штрих-коды. Комментарий технического специалиста

У каждой группы людей есть свои вечные темы – автомобилисты регулярно спорят о преимуществах механической коробки передач над автоматической, молодые и не очень мамы – о грудном и искусственном вскармливании, а православные христиане – о времени, месте и способе нанесения обещанной в книге Откровения «печати антихриста».

Спорят столько, сколько существует предмет спора. И недавно православный спор зашел на новый круг. Поводом стало выступление известного своей православной экстравагантностью бизнесмена Василия Бойко-Великого, который объяснил, что «Печать Антихриста» содержится именно в штрих-кодах, которые его компания вынуждена наклеивать на свою продукцию, дабы продавать ее в магазинах. Но для того, чтобы продемонстрировать позицию непринятия «печати», штрих-коды на продукции фабрики «Русское Молоко» перечёркиваются красным Андреевским Крестом.

В тексте присутствует довольно много технических подробностей и потому имеет смысл привести комментарий технического специалиста.

Павел Белоусов работает в компании «VMC», которая занимается именно разработкой сканеров штрих-кодов, и пишет программную начинку тех устройств, которые пиликают на кассах супермаркетов. И, соответственно, Павел по долгу своей работы знает о штрих-кодах всё. Его комментарий с рядом незначительных технических правок мы приводим ниже:

– Будучи специалистом в области штрих-кодов, я решил разобраться для себя во всей этой истории с числом 666, якобы закодированном в любом штрих-коде.

Я сейчас не обсуждаю корректность толкования текста книги Откровения, а только технический факт: справедливо ли с точки зрения штрихового кодирования утверждать, что в штрих-кодах всегда присутствует это число. Мои выводы изложены ниже. Текст длинный и нудный, но, как я полагаю, исчерпывающий. А в самом конце бонус – страшное разоблачение!

I) Во-первых, речь идёт не обо ВСЕХ штрих-кодах, которых существуют десятки типов, а только о двух очень похожих типах (символиках), которые называются EAN–13 и UPC–A. Это, однако, самые распространённые типы. Именно их ставят на все товары. Они описаны в Википедии и (тут подробнее о структуре). Все рассуждения, которые я привожу ниже, можно проверить по этим статьям.

II) Основной тезис штрихкодоненавистников: «По стандарту во всех штрих-кодах присутствуют три полосы: две с краев и одна посередине. Остальные полосы соответствуют индивидуальному цифровому кодированию и отвечают цифрам от 0 до 9. Так вот, три универсальные полосы, более длинные, чем индивидуальные, соответствуют одинаковой цифре, а именно: шестерке. Так как универсальных три – получаются выделены именно три шестерки». Поясняющую картинку можно посмотреть в тексте на сайте «Русского Молока».

III) Верно ли это? Ответ: нет, не верно. Но сначала несколько слов о структуре штрих-кода EAN–13/UPC–A. В стандарте нет никаких «полос».

Штрих-код состоит из элементов, штрихов и пробелов, которые принимают равное участие в кодировании информации и могут иметь 4 варианта ширины: одинарную, двойную, тройную и четверную (далее я буду писать 1-, 2-, 3- и 4- соответственно). Подчеркну, что цвет элемента не имеет значения, а только его ширина.

Любая цифра от 0 до 9 соответствует своему набору из четырёх элементов (пробел-штрих-пробел-штрих или штрих-пробел-штрих-пробел), сумма ширин которых должна быть строго равна семи минимальным ширинам. Последовательность ширин элементов в таком наборе и определяет, какая именно цифра в них закодирована.

Например, в правой половине штрих-кода цифра 5 кодируется как «1-штрих — 2-пробел — 3-штрих — 1-пробел», а злополучная 6 как «1-штрих – 1-пробел – 1-штрих – 4-пробел».

V) Именно в защитных шаблонах, левом, центральном и правом, некоторые видят три шестёрки. Видят, потому что в каждом из них есть набор (1-штрих – 1-пробел – 1-штрих), который среди блоков, кодирующих цифры, встречается только в шестёрке (см. п. III). Но шаблоны не могут кодировать цифры, так как ни один из них не удовлетворяет необходимому условию: ЧЕТЫРЕ (а не три или пять) элемента, сумма ширин которых строго равна 7. Правый и левый шаблоны имеют по 3 элемента с общей суммой 3, а центральный – 5 с суммой тоже 5.

VI) Таким образом, эти шаблоны НЕ шестёрки и даже не цифры вообще! Точнее, они такие же шестёрки, какой шестёркой является, скажем, буква «о»: чтобы «о» стала цифрой «6», к ней нужно пририсовать сверху загогулинку. Без неё это просто «о» или кружок.

Также и к набору (1-штрих – 1-пробел – 1-штрих) нужно добавить 4-пробел, чтобы он стал шестёркой в смысле штрихового кодирования. На возражение, что нижний кружок встречается ещё и, скажем, в цифре 8, тогда как блок «1-штрих – 1-пробел – 1-штрих»– ТОЛЬКО в шестёрке, и, следовательно, всегда является намёком именно на неё, можно вспомнить букву С – такой силуэт точно есть только у 6! Так что как где увидите три буквы С, знайте — это скрытое 666!

VII) В отношении левого и правого шаблонов «дешифровщики» пытаются выйти из положения следующим образом: смотрите, говорят они (не в этом, а в более основательных текстах по теме), слева и справа от штрих-кода всегда есть большие пробелы (в штриховом кодировании они называются свободными зонами), – там-то и спрятан необходимый для цифры «6» четверной пробел!

Замечу, что по стандарту свободная зона должна быть не меньше семи 1-ширин. Но к центральному защитному шаблону уж точно ни с какой стороны ничего не припишешь – места нет, стандарт не позволяет.

VIII) Итак, я полагаю, тема 666 закрыта: утверждения о наличии в каждом штрих-коде EAN-13/UPC-A этого числа основываются на значительных и столь же сомнительных дополнительных построениях.

Итак, если обобщить: повторяющиеся элементы в штрих-кодах типа EAN–13/UPC–A не являются шестерками, так как не кодируют цифр вообще.

«Андреевский крест» на «Рузском молоке»

И если применить тот же метод, то есть найти трижды повторяющийся знак, который возможно «дополнить» (скажем, дополнительным крючком или чёрточкой) до шестерки, и принять его на этом основании за шестерку, то мы обнаружим, например, что все эти перечёркивания штрих-кодов на молоке нужны лишь для отвода глаз от страшной тайны, связанной с «Русским молоком»: оказывается число зверя 666 сокрыто в святом святых – самом названии агрохолдинга «Русское молоко», да и ещё и дважды!!!

Вы его уже видите? Нет? А вот так: «РУ66К6Е М6Л6К6»? Что, нечестно? Сомнительные дополнительные построения? Но, минуточку, кто первый начал-то?