В Шенноне у киля Boeing-707. Ночной кошмар проектировщика и заказчика ;-)

Главная Статьи Разработки Интересы О себе

 

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

Всё проекты, которые Вы здесь найдёте, выполнены с использованием компилятора Microsoft Visual C разных версий. Некоторые из них требуют наличия библиотеки MFC. Если что-то из бинарников у Вас не запустится, то Вам необходимо будет установить Microsoft Visual C Redistributable. Любые находящиеся здесь бинарники вы можете использовать как угодно on your own risk. Часть проектов сопровождаются исходными кодами, они здесь встречаются трёх видов:

Редактор с подсветкой синтаксиса для генератора Coco/R.
Эмулятор контроллера станции управления РУМБ КСУ-06.
Программный комплекс верхнего уровня РУМБ-8 для КСУ-06.
Эмулятор modbus-slave устройства (для serial-порта).
Анализатор протоколов (для serial-порта).
Программный эмулятор slave-устройства УПИ (для serial-порта).
Утилита для рекурсивного удаления временных файлов в MSVC.
Утилита для отправки по почте большого количества файлов (MAPI).
Функциональный аналог Realflex SCADA на платформе win32.
Компонент для экспорта данных Realflex SCADA в реляционные СУБД.
GUI telnet-клиент с эмуляцией консоли QNX.
Шлюз интерфейса SPPI в технологическую почту.
Некоторые полезные примеры по работе с сокетами и перехвату API.
Порт библиотеки mysql++ для MySQL версии 3.x.
ISAPI-фильтр к IIS для перевода cp1251 в koi-8r "на лету".
Комплекс по приёму телеграмм (для модема "Альфа-Телекс").
Программа для проведения тестирования (для учебных заведений).
Консольный telnet-клиент с эмуляцией терминала SCO ANSI.
Автоматизированная система по работе с ценными бумагами.

Редактор с подсветкой синтаксиса для генератора Coco/R.

Задачи синтаксического разбора чрезвычайно распространены. Для их решения существует огромное количество инструментов: ANTLR, Yacc, Bizon, Bizon++ и другие. Мне, однако же, больше всего нравится COCO/R. Однако, у него есть небольшие недостатки:

Вот эти то небольшие недостатки я и решил, написав редактор для atg-файлов c подсветкой лексем (кстати, парсер в редакторе сгенерирован самим Coco/R) и встроив frame-файлы в ресурсы самого Coco.
Скачать архив можно по этой ссылке.


Эмулятор контроллера станции управления РУМБ КСУ-06.

Для отладки и проверки некоторых идей очень удобно иметь эмулятор. Поэтому мной и был разработан эмулятор для контроллера станции управления РУМБ КСУ-06. Фактически, это - эмулятор Microchip PIC 18F8720 вместе с эмулятором индикатора FUTABA NA204SD02AA/BA-#0#. Система команд реализована полностью, в нём неплохо работает штатная прошивка, сделанная для контроллера. Данный эмулятор применяется для создания новых меню КСУ. Можно, конечно, отлаживаться на реальном "железе", но прошивка занимает время, а с эмулятором это происходит быстрее и удобнее. Опять же, это мои исходники и при необходимости я их всегда смогу изменить. Эмулятор позволяет загружать и выполнять (с эмуляцией прерываний):

После распаковки Вы увидите подкаталог PIC18, в котором вы можете, среди прочего, увидеть файлы moon.hex и moon.c. Это - программа, иллюстрирующая возможности эмулятора. Она представляет собой очень древнюю игру "Посадка на Луну" (Moon Lander), которую я нашёл в каких-то очень старых архивах за 1974 год. Просто посмотрите, это интересно.

Скачать программу можно по этой ссылке.


Программный комплекс верхнего уровня РУМБ-8 для КСУ-06.

Контроллера РУМБ КСУ-06 - это просто железка, работать с ним можно только "в поле". Для разбора журналов, анализа эффективности настроек, поиска неисправностей нужен удобный инструмент, с помощью которого можно неспешно разбирать считанные ранее данные в тиши кабинета. Таким инструментом и является РУМБ-8. Он позволяет:

История создания этого продукта заслуживает отдельной статьи. Придёт время и я это обязательно сделаю. Сейчас программа поддерживает три различных версии журнала и два способа получения данных. Если бы я в своё время не провёл глубокий реинжиниринг проекта, доставшегося мне от предшественника - я бы наверное уже тронулся умом :-). Типы данных и способы их обработки были крайне плохо систематизированы, ситуация выглядела почти безнадёжной. К счастью, сейчас всё это уже позади.

Если захочется посмотреть на этот пакет внимательно, то Вам понадобятся считанные данные. Для загрузки данных нужно будет из меню "Файл" выбрать "Импорт журнала" и загрузить файл sample.rlog.

Скачать программу можно по этой ссылке.


Эмулятор modbus-slave устройства (для serial-порта).

Modbus - очень распространённый протокол для получения данных из "железа". Эмуляторов для master и slave в Интернет можно найти очень много, вот только хороших среди них не так уж много. Для наших внутренних целей я разработал свой эмулятор, отличающийся следующими особенностями:


Скачать программу можно по этой ссылке.


Анализатор протоколов (для serial-порта).

Мне часто приходится ковыряться в различных полевых протоколах. Иногда они более-менее стандартные, но некоторые экземпляры скорее стоит назвать извращёнными. Контроллер станции управления РУМБ КСУ-06 поддерживает многие из них. Для того, чтобы отладка не превращалась в кошмар и к вечеру ни у кого голова бы "не пухла" от 16-ричных чисел, мной был создан анализатор для нескольких протоколов. Анализатор позволяет просматривать "на лету" следующие протоколы:

используется устройство, называемое УПИ. По назначению, это - та же "флешка", но предназначенная для работы при низких температурах. Иногда этого самого УПИ под рукой не оказывается, вот для таких случаев и была создана данная программа. Программа допускает подключение к линии по "подслушке" (перекрёстная распайка), но может и перехватывать обращения к serial-портам путём перехвата системных вызовов без всяких проводов.
Скачать программу можно по этой ссылке.


Программный эмулятор slave-устройства УПИ (для serial-порта).

Для работы с контроллерами РУМБ семейства КСУ-06. используется устройство, называемое УПИ. По назначению, это - та же "флешка", но предназначенная для работы при низких температурах. Иногда этого самого УПИ под рукой не оказывается, вот для таких случаев и была создана данная программа.
Скачать программу можно по этой ссылке.


Утилита для рекурсивного удаления временных файлов в MSVC.

Те, кто программируют на C++ в Microsoft Visual Studio, знают, что сей замечательный компилятор, да и сама среда, используют временные файлы для своих разнообразных нужд. При архивации проекта эти файлы не нужны - они создадутся заново. Так зачем же тратить на них свободное место и засорять свои архивы? Для избавления от таких файлов очень давно я написал для себя очень простую утилиту, которой предлагаю пользоваться и Вам.
Скачать программу можно по этой ссылке. Исходный текст на C++ лежит здесь.


Утилита для отправки по почте большого количества файлов (MAPI).

Иногда приходится отправлять по почте большое количество файлов с вложениями. Например, если кто-то попросил "нарезать" большой архив на части и высылать по частям, не более 500 кб. Обычно, такие проблемы вызваны бесплатными почтовыми серверами, но... заказчиков не выбирают. Если у Вас бывают такие случаи, то данная программа Вам поможет. В отличие от всего остального, она написана не на C++, а на C#. Это не был эксперимент - я вполне неплохо владею C#, просто данную задачу на C# было сделать проще, а на C++ - просто лень ;-).
Исходный текст на C# лежит здесь.


Функциональный аналог Realflex SCADA на платформе win32.

В начале 2002 года возникла задача написать небольшую однопользовательскую систему под win32 для работы одним из RTU, выпускаемых компанией DATAC. Задача была поручена мне, постановку задачи никто SCADA-системой ещё не называл - требования были достаточно простые.
Работа была начата с реализации сервера протокола между Realflex и клиентами Flex.Win, чтобы не пришлось разрабатывать ещё и клиентскую часть. Работа шла быстро и через некоторое время был реализован необходимый минимум, позволявший показывать на штатной панели Flex.View данные реального времени и посылать управляющие воздействия. Через некоторое время стало понятно, что никаких препятствий для реализации практически ВСЕГО протокола нет и "аппетит пришёл во время еды". В результате, через некоторое время стали поддерживаться еще и:

Фактически, менее, чем за три года была фактически заново (исходных кодов Realflex я не использовал) разработана SCADA-система, во многом соизмеримая по возможностям с "настоящим" Realflex. Не удалось мне реализовать лишь отслеживание зон (zoning) и режим защиты от аварий (main-standby).

Для управления АЭС такую систему, конечно, ставить себе дороже, но для небольших задач она вполне может применяться. Её с успехом применяли для демонстраций возможностей Realflex на выставках, проводившихся в разных странах. А Denis Curtin, вице-президент компании DATAC, использовал Real.Win для управления отоплением собственного дома. Судя по тому, что зимой он насмерть не замёрз, всё работало как надо ;-). Были и другие применения, впрочем, точным числом продаж я никогда не интересовался.

Real.Win является самостоятельным коммерческим продуктом, прочитать информацию о нём и можно здесь. Демонстрационную версию пакетов Real.Win и Flex.Win Вы можете забрать на официальном сайте Realflex Technologies.


Компонент для экспорта данных Realflex SCADA в реляционные СУБД.

У любой SCADA-системы есть свой собственный формат хранения исторических данных и тревог. Так делают иногда из коммерческих соображений, чтобы потом продать ещё и инструмент для выборки данных. Но чаще "авторский" формат объясняется тем, что он работает в разы быстрее. В Realflex тоже существует собственная модель хранения данных, оптимизированная для высокой скорости. Однако иногда у заказчика бывают потребности интегрировать SCADA с какими-то системами, одним из решений такой задачи может быть непрерывный экспорт истории в одну из реляционных баз данных. Мой продукт Flex.Base был создан именно для решения таких задач.

Я разработал несколько версий Flex.Base для экспорта в MySQL, Microsoft SQL Server и Oracle 8i. Наиболее быстро работала версия для MySQL за счёт отсутствия транзакций. Одна из версий работала (возможно, работает до сих пор) на нефтяной платформе BP ULA в Норвежском секторе Северного моря, где мне довелось побывать. Она используется для интеграции с ABB Operator Station. Продукт является коммерческим и продаётся как опция пакета Flex.Win.


GUI telnet-клиент с эмуляцией консоли QNX.

Этот telnet-клиент имеет был создан для проекта Flex.Win. В компании DATAC тогда шли работы по создании "выносного" рабочего места оператора для популярной SCADA-системы Realflex. Однако в первых версиях не все необходимые операции с QNX могли быть выполнены через среду. "Родной" telnet-клиент от Windows не вполне соответствовал потребностям из-за того, что у QNX версии 4 описание терминала (TERM=qnxt) сильно отличалось, что для полноэкранных сред (типичным представителем полноэкранных сред являются среды компилятора и отладчика Watcom). Поэтому мой проект и был реализован.

Однако, он не так прост, как может показаться. В нём был реализован встроенный FTP-explorer (в виде отдельной OCX) и реализован язык скриптов, позволявший автоматизировать из командной строки часто встречающиеся функции. Скрипты были похожи на скрипты для установки связи по модему с конструкциями WaitFor и Transmit и имели необходимые логические конструкции вроде if и while. Пример скрипта Вы можете скачать здесь.

Продукт является коммерческим и продаётся в составе пакета Flex.Win


Шлюз интерфейса SPPI в технологическую почту.

На железной дороге широко использовался шлюз из протокола АП-70 в электронную почту, который разработал Андрей Чесноков, с которым мы раньше сидели за одной партой, строили ракеты и хулиганили. Этот устаревший протокол был нужен для обмена данными с ЕС ЭВМ, на которой работала ЕК ИОДВ. Одним из клиентов этой системы был АРМ ТВК, разработанный ЦИТТРАНС. ТВК - продукт по-своему уникальный, в нём была реализована мультизадачность в DOS на основе весьма нестандартных решений. К середине же 90-х годов все приличные разработчики этой системы перебрались в США и иные отдалённые места, фактически его развитие остановилось. Поэтому в ТВК остался крайне убогий протокол АП-70 и с интерфейсом файлового обмена SPPI.
Вот для этого экзотического продукта я и написал свой некогда популярный шлюз SPPI в электронную почту. Программа стартовала, ждала нотификаций файловой системы и обрабатывала очередь исходящих сообщений. Исходящие сообщения уходили по протоколу SMTP для передачи в ЕК ИОДВ. Ответы забирались из почтового ящика по POP3 и "скармливались" ТВК по тому же интерфейсу SPPI. Не думаю, что кому-то сейчас интересен протокол АП-70 или SPPI, но для любителей посмотреть на старинные поделки исходный текст прилагается.


Некоторые полезные примеры по работе с сокетами и перехвату API.

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

Я в своё время много экспериментировал и хочу поделиться следующим:


Порт библиотеки mysql++ для MySQL версии 3.x.

Я много работал с различными базами данных, в том числе и MySQL. Этот сервер баз данных мне всегда нравился больше других своей многоплатформенностью и потрясающим быстродействием. Для него создано много полезных API и инструментов, одним из которых является библиотека mysql++. Этот интерфейс очень удобен для программирования на C++ и я широко использовал его в своих проектах.
Тучи сгустились с выходом в свет компилятора Microsoft Visual C версии 7 (2003). После того, как они "привели свою STL в соответствие со стандартами", mysql++ больше не желала собираться, выдавая тонны каких-то космических ошибок на сложных template-ах. Пришлось "засучить рукава" и почти месяц приводить STL-ный код в рабочее состояние.
В конце концов мне удалось добиться, что все мои проекты, использовавшие mysql++, стали нормально собираться и работать и в VS2003. Возможно, всё будет хорошо и c VS2005/2008, но я этого не проверял. Если Вы будете собирать исходники этой библиотеки, то обновите файлы header-файлы и библиотеки от MySQL API для поддержки более новых версий.

Прежде, чем начинать эту работу, я перерыл весь Интернет в поисках FAQ и даже переписывался с авторами этой библиотеки. Но результата не было, готового решения я не нашёл. Можете мне поверить на слово - в тот момент, когда я это делал, mysql++ на VS2003 не собиралась ни у кого. Возможно, и сейчас эта сборка существует в единственном экземпляре на этом сайте.
Исходный текст на C++ лежит здесь.


ISAPI-фильтр к IIS для перевода cp1251 в koi-8r "на лету".

Когда я работал в ИВЦ Приволжской железной дороги, полыхали "религиозные войны" по любым вопросам противостояния Windows и различных версий UNIX. Одним из проявлений такого "фундаментализма" была война кодировок koi-8r и cp1251. Проблема сторонников Windows в то заключалась в том, что держать и поддерживать страницы в koi-8r было не очень удобно. Особенно крупные неудобства были, когда приходилось в ASP-скриптах выдавать данные, взятые из Microsoft SQL сервера. Для таких задач требовался инструмент для перекодировки "на лету".
До меня в Новосибирске подобный фильтр сделал Антон Лобастов, который назывался rusauto.dll. Он определял кодировку в зависимости от "Accept-Language:" и "User-Agent:". Но у его программы один крупный недостаток: она не работала при включенном локальном кеше у IIS 3.0, что делало невозможным ее использование вместе с MS Index Server. Это сильно замедляло работу сервера, но с этим можно как-то было как-то мириться. Однако, в IIS 4.0 и последующих возможность отключения локального кеша убрали вовсе.
Это и заставило меня создать свой ISAPI-фильтр. При его создании я стремился к максимальной простоте и у меня это получилось - фильтр не имеет настроек и автоматически меняет кодировку всего потока между сервером и браузером на требуемую. При работе на стороне Windows можно ни о чём не задумываться, а на стороне клиента автоматически получится koi-8r. При этом, ни с ASP, ни c SQL никаких проблем нет и производительность сервера не страдает.
Скачать программу можно по этой ссылке. Исходный текст на C++ лежит здесь.


Комплекс по приёму телеграмм (для модема "Альфа-Телекс")

Эта программа была создана для приёма телеграмм из МПС. В те давние времена все директивные материалы на железных дорогах передавались по телеграфным каналам. Программный продукт был предназначен для приёма и телеграфных сообщений по выделенным и коммутируемым линиям со скоростями 50, 75, 100, 134.5 и 150 бод. Сейчас она имеет скорее археологическую ценность, но вдруг у кого-нибудь до сих пор используются телеграфные каналы?

Скачать программу можно по этой ссылке. Исходный текст на C++ лежит здесь.


Программа для проведения тестирования (для учебных заведений).

Моя жена работает учителем информатики в средней школе. И как-то, то есть уже весьма давно, я решил сделать ей инструмент для автоматического тестирования. Задумка была проста - создать некий формальный язык, в котором за каждый ответ начислялись бы баллы. Затем сумма набранных баллов выводилась бы в конце теста. Идея несколько похожа на тесты Prometric, которую используют авторизованные центры сертификации Microsoft. В архиве лежит пример теста.
Скачать программу можно по этой ссылке. Исходный текст на C++ лежит здесь.


Консольный telnet-клиент с эмуляцией терминала SCO ANSI.

На Приволжской железной дороге активно развивали терминальные системы, построенные на основе SCO и FreeBSD. Штатный telnet-клиент Windows в то время был очень убог, а нам нужен был такой, чтобы приложения со SCO на нём выглядели нормально. В Интернет найти такого не удалось и пришлось написать свой собственный на win32, тогда как раз появилась Windows 95 и Windows NT 4.0. Пришлось, конечно, разбираться со всевозможными RFC, разбираться с особенностями работы socket-ов под win32, с компилятором Microsoft Visual C 2.2, но сравнительно быстро я создал telnet-клиент с полной эмуляцией консоли SCO UNIX и даже возможностью локальной печати. Эта программа была растиражирована по всей Приволжской дороге, а потом была выложена в Интернет. Ей пользовались во многих местах, например в "Мост-Банке" в Красноярске, откуда мне прислали записанный протокол сессии. На основе моих исходных текстов мой коллега Антон Давидович чуть позднее написал GUI-версию, которая называлась CombineTelnet.

Исходный текст на C++ лежит здесь.


Автоматизированная система по работе с ценными бумагами.

Когда я работал в СП "Прагма Электроника", мне поручили разработать и автоматизированный реестр акционеров для ОАО "Саратовэнерго". Я тогда очень серьёзно подошёл к делу, очень много времени провёл у заказчика и на тот момент разобрался в ценных бумагах весьма неплохо. Значительная часть законов только принималась и ПО приходилось постоянно переделывать, порой очень серьёзно. В конце концов, удалось создать логичную, гибкую, не перегруженную модель хранения данных, отличавшуюся высокой производительностью. Для 386-й машины 25 MHz расчёт по 18 тысячам акционеров и 14 филиалам был весьма трудоёмкой задачей, если вспомнить, что расчёт ведётся всегда задним числом с откатом по истории операций на дату начисления. Никаких SQL-серверов ещё не было и все "транзакции" надо было придумывать самостоятельно. Из-за нехватки разрядной сетки для ходивших тогда "неденоминированных" рублей приходилось расчёт дивидендов вести с плавающей точкой.
Позднее неоднократно сталкивался с этой своей программой у бандитов. Естественно, у СП "Прагма Электроника" они её никогда и не покупали.

Скачать программу можно по этой ссылке. После распаковки архива запускайте start.bat т.к. в нём устанавливается переменная окружения, необходимая для работы Clipper5. Исходные тексты у меня сохранились, если будут нужны - обращайтесь.

 

© Пчелинцев А.В. 2009-2011. Использование материалов допускается только с разрешения автора.

Используются технологии uCoz