Conditions of use
Privacy Statement

Новые технологии быстрой разработки программного обеспечения для научных приборов

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

Рассмотрим стандартный цикл разработки программного обеспечения для какого-нибудь прибора, например осциллографа. Нет, не того допотопного осциллографа с несколькими верньерами и кнопками, а самого что ни на есть современного, подключаемого через шину USB к компьютеру, из кнопок у которого есть только одна – питания, а все управление производится электронным способом, и возможно, что и экрана у него нет – зачем ему экран? Все данные в цифровом виде идут прямо в компьютер, а там с ними можно что угодно сделать – хочешь дифференцируй, хочешь интегрируй, а можно в столбик распечатать и в Excel загнать. Только чтобы все это сделать, нужно сначала правильную программу написать. Для этого берется специально обученный человек, ему выдается техзадание и аванс, и через месяц готово творение – с кнопочками, меню, все что просили и даже немного больше. На этом можно было бы и закончить, но тут выясняется, что возможностей у прибора гораздо больше, чем вы думали, и хотелось бы добавить еще пару кнопок, и снимать не один сигнал, а четыре. А потом потребуется добавить новый режим и поменять единицы измерения у второго канала. И так далее до бесконечности. И каждый раз программисту нужно перелопачивать гору кодов, добавлять интерфейсы и калибровочные константы, перекомпилировать всю программу.

Рассмотрим, например, реализацию такого параметра, как развертка. Действительно, частота (или время) будет являться одним из основных параметров осциллографа. Для цифрового осциллографа так же важно разрешение – или число точек в одной строке отснятых данных. Так как частота оцифровки является фиксированным параметром аналого-цифрового преобразователя, то для того, чтобы получить желаемую частоту развертки, необходимо либо делать выборку при снятии данных на максимально возможной частоте, либо делать пропуски между оцифровкой двух последовательных точек. Допустим, что выбран второй вариант (как более оптимально использующий канал передачи данных между прибором и компьютером). Тогда частота развертки S будет измеряться примерно по следующей формуле:

S :=1/( T * N *( D +1))

где T – время оцифровки аналого-цифрового преобразователя, N – число измерений в строке, D – число пропущенных циклов оцифровки. Пользователь задает S и N , а в прибор должно уйти число D . Программисту для реализации элемента интерфейса потребуется создать два Edit -бокса, два элемента прокрутки, соответствующие обработчики, ввести калибровочную константу T , желательно тоже с интерфейсом, написать функции для проверки вводимых значений на допустимость. Потом все это нужно отладить, выловить ошибки, на что тоже уйдет куча драгоценного времени.

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

[constants]
adc_freq( Частота оцифровки , KHz),double=2000.0;
[controller]
samples_n=( Число точек ),int,0,1024;
delay=( Развертка , Hz),int,0,65535,$adc_freq*1000.0/(#samples_n*(1+##));

Как все это работает – об этом пойдет речь ниже.

Будем отталкиваться от следующих посылок:

  • Современные устройства контролируются без ручного вмешательства – электронным способом
  • Набор возможных состояний устройства может быть описан набором переменных
  • Число основных типов переменных ограничено (вещественные числа, строки, и т.п.)

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

Мы создали набор библиотек, реализующих основные типы переменных, и предоставляющих интерфейс для работы с ними. Главное достоинство этой реализации – то, что преобразование из внутреннего представления в пользовательское и обратно производится автоматически по произвольной формуле, задаваемой в текстовом виде. В формулу подставляются численные значения и символьные переменные, возможен вызов встроенных функций и внешних библиотек, зависимость может так же задаваться в табличном виде с помощью калибровочной кривой. При изменении пользователем переменной она автоматически пересчитывается и проверяется на допустимость. Переменные объединяются в списки, управляемые специальным менеджером, который отслеживает зависимости и в случае изменения одной переменной автоматически обновляет зависимые. Например, в вышеуказанной формуле при изменении параметра N автоматически обновится значение S . Пользователю для управления параметрами предоставляется стандартизованный интерфейс в виде таблицы с древовидной структурой (пример представлен на рис. 1). Здесь есть одна приятная возможность. Допустим, наш осциллограф может работать в двух режимах – с открытым и с закрытым входом. Соответственно, есть параметры, относящиеся только к одному из режимов. Так вот, таблица параметров автоматически фильтрует переменные, относящиеся к разным режимам, и прячет неиспользуемые переменные. Разумеется, описание переменных должно быть составлено специальным образом:

mode=( Режим ),enum,Open,Closed; 
open.scale=( Шкала , В ),double,0,100;
closed.scale=( Шкала , В ),double,0,100;

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

Программно пользовательский интерфейс реализован в виде объекта, аналогичного Windows Common Controls . При изменении переменной в очередь сообщений Windows выставляется событие, которое должно затем перехватываться написанным вашим программистом обработчиком. Возможно так же другое решение – в менеджере списка переменных регистрируется callback -функция, которая будет вызвана при изменении переменной.

Библиотеки написаны на С++ в Microsoft Visual Studio 6.0. Использование библиотек в вашем коде облегчается тем, что операция вызова значения переменной выполняется простым вызовом оператора преобразования типа:

double my_var=(double)V; 

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

Пока что шел разговор о задании параметров прибора. Теперь пришло время рассказать о методах, упрощающих реализацию сбора данных. Для этого реализованы два взаимозависимых понятия – процессы и потоки. Большая советская энциклопедия так объясняет слово «процесс»: Процесс (от лат. processus - продвижение), 1) последовательная смена состояний стадий развития. 2) Совокупность последовательных действий для достижения какого-либо результата.

Допустим, наш виртуальный осциллограф может выполнять два процесса: собственно сканирование, и калибровку. При сканировании мы получаем поток интересующих нас данных, при калибровке ничего не получаем – умный осциллограф должен калиброваться автоматически. Отсюда следуют следующие характеристики:

Процесс – продолжительное во времени состояние, в котором может находиться прибор. С процессом ассоциирован набор переменных, которые сильно влияют на его протекание (например, скорость сканирования и число точек в строке). Результатом процесса может быть один или несколько потоков данных.

Поток – набор данных, скорей всего весьма объемный. Данные могут поступать не сразу, а порциями. Поток данных может быть разных размерностей – для осциллографа это одна размерность (зависимость входного сигнала от времени), для фотоизображения – две (зависимость интенсивности от координат по горизонтали и вертикали) и т.д. Если мы меряем значение в одной точке, то размерность будет нулевой. Каждая размерность может быть ассоциирована с одной и более осью измерения – например, размер фотографии может быть в сантиметрах или дюймах.

Согласно этой модели в наших библиотеках реализованы классы процессов и потоков. Если ваш прибор согласуется с предложенной моделью, то в качестве обработчика процессов и потоков можно использовать успешно применяющуюся для управления научными приборами программу FemtoScan Online – она может обрабатывать одно- и двумерные потоки, плюс обладает широким набором функций для анализа полученных данных. Стыковка с программой осуществляется путем реализации сетевого интерфейса, для чего существует отдельная библиотека. В ней есть классы буферизованных потоков ввода-вывода (не путайте с потоками данных, о которых шла речь выше), класс сообщений и очереди сообщений, ориентированные на использование в многозадачной среде. Предлагаемая библиотека позволяет быстро и эффективно реализовать обмен данными через TCP / IP . Например, реализация обработчика сообщений будет выглядеть следующим образом:

while(dc->outMsgQueue.HaveData()) {//dc – рабочий контекст 
	MessageType msg;
	dc->outMsgQueue.GetData(msg); //отсылаем сообщения
	sock.WriteMsg(msg);
}

MessageType msg;
if(!sock.ReadMsg(msg)) {//читаем входящее сообщение
	sock.Close();
	break;
}
if(msg.IsOk())
	dispatchMessage(msg,dc);//обрабатываем сообщение
else 
	Sleep(100);

Все описанные возможности (универсальные переменные, менеджер управления списком переменных, пользовательский интерфейс, классы реализации обмена сообщениями по TCP / IP ) реализованы в виде трех библиотек, описанных в таблице 1.

В настоящее время на базе этих библиотек реализованы два проекта:

•  Управление сканирующим зондовым микроскопом FemtoScan (адрес в Интернет http://www.nanoscopy.net/en/Femtoscan-V.shtm ).

•  Управление устройством на базе микроконтроллера Microchip PIC 16 C 765 (адрес в Интернет http://www.polymer.genebee.msu.ru/garden/demo.html). Стоит заметить, что по указанному адресу работает Java -клиент, но так же существует и клиент в виде обычного Windows -приложения.

Подведем итог: предлагаемый набор решений позволяет с минимальными затратами на изменение текущего программного обеспечения добавить новую функциональность с возможностью дальнейшего масштабирования. В приложения легко встраивается сетевой уровень, позволяющий вести передачу данных через Интернет. В качестве клиентской части (при соблюдении протокола обмена) возможно использование программы FemtoScan .

Если вас заинтересовала предложенная информация, свяжитесь с нами удобным для вас способом.

Наши координаты: ООО НПП «Центр перспективных технологий», e-mail: spm@nanoscopy.net , адрес в Интернет: http://www.nanoscopy.net, тел. (901)5104643

Рисунок 1. Пример пользовательского интерфейса.

fmutl . dll

Классы универсальной переменной, списка переменных, потока, процесса, калькулятор, вспомогательные функции

fsio . dll

Классы сообщения, потока, очереди

fmcmnctl . dll

Пользовательский интерфейс для списка переменных

Таблица 1 . Распределение функций по отдельным библиотекам.

 

    Что мы предлагаем:
  • реализация нашими программистами в кратчайшие сроки (от 3-х дней для небольших проектов) системы управления прибором через интернет
  • набор библиотек для самостоятельной разработки
  • разработка с "чистого листа" или модернизация существующих проектов
    Ожидается в ближайшем будущем:
  • документация по созданию скинов