Scripting. Автоматизация эксперимента с использованием LUA

В этой небольшой заметке я хочу рассказать каким образом можно решить задачу автоматизации научных экспериментов. И если Вы попали на эту страничку не случайно то скорее всего уже задаете себе вопрос “А разве эта задача уже не решена?”. Да, решена, много раз, но это еще один путь, и особенно он будет интересен тем кто работает в государственных институтах и ВУЗах. Но обо всем по порядку…

Так сложилось, что моя работа в аспирантуре началась с создания и восстановления различных приборов. Одним из первых таких приборов (восстановленных) был монохроматор [5]. Монохроматор, это прибор который из непрерывного спектра излучения может “вырезать” довольно узкий диапазон, и легко посчитать, что если мы хотим просканировать видимый диапазон 380 – 780 нм с шагом, допустим 5 нм, то получим 80 измерений. Делать это вручную конечно сложно, поэтом в таком случае используют системы сбора данных (Data acquisition – DAQ, supervisory control and data acquisition – SCADA), которые осуществляют контроль и сбор данных с различных измерительных приборов. Одной из распространенных систем данного типа является LabView, но эта система является платной. Выходом из данного положения казалось использование аналогичных систем, доступных бесплатно, но подход не оправдался, так как эти системы больше были ориентированы на управление технологическими процессами и не обладали достаточной гибкостью. Это привело к тому, что оказалось проще, писать отдельные программы для своих устройств на C#. Такой подход работал, пока в системе было пару приборов, но со временем эксперименты усложнялись, и программы для них становились сложнее. Так как основной целью экспериментов было получение данных, а не написание ПО, то код таких программ с каждым новым экспериментом дорабатывался по принципу “лишь бы работало” и отладка начинала занимать много времени.

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

  1. Быстрое редактирование хода эксперимента
  2. Простота подключения новых устройств
  3. Возможность вывода результатов в CSV формате

В качестве языка программирования, на котором должен был описываться ход эксперимента, был выбран LUA – интерпретируемый язык с возможностью расширения за счет добавления пользовательских функций. Язык существует с 1993 года и активно используется для написания сценариев внутри компьютерных игр (например World of Warcraft, S.T.A.L.K.E.R и т.п.) [1]. Синтаксис языка очень прост, а возможность расширения с помощью пользовательских функций позволяет реализовать систему плагинов (подключаемых модулей), для связи с измерительными устройствами. Для быстрой разработки приложения использовались готовые библиотеки. Так, для текстового редактора использовался компонент AvalonEdit [2], а для связи с LUA интерпретатором используется C# обертка – LuaInterface [3]. Сама программа написана на C# с использованием WPF, плагины также пишутся на C#. В моем случае, в виду того что, ПО для большинства используемых приборов уже существовало, выделить код в отдельные плагины не представляло особой сложности. Разработка плагинов для большинства современных приборов также не должна быть проблемой, так как производители поставляют примеры кода для .NET платформы.
Изображение окна получившейся программы приведено на рис. 1, оно состоит из главного меню, текстового редактора и окна вывода (Output). Первая группа команд, основного меню, аналогична любому текстовому редактору. Вторая группа (Execution) предназначена для управления выполнением скрипта и позволяет запускать, приостанавливать и завершать выполнение. После нажатия кнопки Run скрипт исполняется интерпретатором LUA,  в случае ошибок, сообщения выводятся в области Output. Эта же область используется для вывода сообщений из скрипта (с помощью функции Base.Print). Текст из области Output можно скопировать в буфер обмена (кнопка Copy), либо стереть (кнопка Clear).

Окно программы Scripting

Вкладка Protocol содержит команды для сохранения протокола, а переключение на вкладку отображает сам протокол. Данные сохраняются в формате CSV, что обеспечивает возможность читать протоколы как обычным текстовым редактором, так и табличным процессором (например Excel), либо математическим пакетом (MathCAD и т.п.). Сохранение в другие форматы, либо в базу данных, можно реализовать за счет подключения плагинов.

На Рис. 1 также можно увидеть пример сценария для проведения измерения напряжения. В качестве аналого-цифрового преобразователя (АЦП) используется мультиметр Picotest M3500A. Для подключения мультиметра был написан соответствующий плагин, и все функции работы с мультиметром размещаются в отдельном пространстве имен – M3500. Строки которые начинаются с ”–” являются комментариями и никак не интерпретируются при выполнении. Программа начинается с поиска подключенных мультиметров, функция “M3500.GetList” возвращает список подключенных мультиметров, в строке 5 мы извлекаем идентификатор первого и помещаем его в переменную “adcVoltageId”, далее с помощью функции “M3500.Read()”, мы сможем считать значение из мультиметра. Сделаем это 5 раз, и выведем значение в Output с помощью (строки 8 – 13) оператора цикла – for.

На строке 12, можно увидеть обращение к методу Print из пространства имен Base, в котором предоставлены базовые функции для вывода в Output и заполнения протокола, это пространство имен предоставляется специальным модулем, который встроен в основную программу.

Кроме модуля Base и плагинов для измерительных приборов, в самом интерпретаторе LUA уже встроен ряд стандартных библиотек и функций, которые обеспечивают работу со строками, математические функции (например math.sin, math.cos), работу с файлами и т.п., полный список этих библиотек можно просмотреть в документации интерпретатора LUA [4].

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

Исходные коды

Исходные коды доступны на Github - https://github.com/rsrlab/Scripting

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

Ссылки

  1. http://ru.wikipedia.org/wiki/Lua
  2. https://github.com/icsharpcode/SharpDevelop/wiki/AvalonEdit
  3. https://code.google.com/p/luainterface/
  4. http://www.lua.org/manual/5.1/manual.html#5
  5. http://en.wikipedia.org/wiki/Monochromator

 

Leave a Reply