Как стать автором
Обновить

Как жесткую программную систему превратить в гибкую или Двадцать лет спустя

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров3.1K

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

Постановка задачи

А задача была такая: создать программную систему для производства, поверки и тестирования интеллектуальных датчиков с протоколом HART на тестовых станциях с программируемым оборудованием. Кто не знает что такое HART - это протокол "точка-точка" частотной модуляции тока , который накладывается на токовую петлю 4-20 мА датчика и используется для калибровки,настройки и поверки интеллектуальных датчиков с токовой петлей 4-20 mA/HART. Тестирование таких изделий включает в себя линеаризацию передаточной характеристики датчика, поверку, множество тестов на этапах отработки и периодических испытаний с использованием циклов по давлению, температурам, напряжению питания и HART обмену. Желательно иметь возможность редактировать функционал Тестов, то есть изменять программу тестирования. Естественно, нужно сохранять "сырые" данные тестирования и формировать протоколы тестирования.

Одна тестовая станция должна поддерживать несколько десятков датчиков и включать такое оборудование как компьютер, задатчик воздействий на датчики, климатическую камеру, измерительное оборудование и коммутатор, эталон сопротивления, HART модем. Все приборы имеют различные интерфейсы управления, такие как USB, GPIB, TCP/IP, RS232. Тестовых станций может быть тоже не одна и не две, а в перспективе десяток и больше. Отсюда вытекает необходимость в некой системе мониторинга этих станций, которая бы показывала что происходит на каждой станции тестирования, режимы работы оборудования, логи и т п.

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

Работа с оборудованием и датчиками

Первый вариант, который пришел в голову - использовать какой либо язык с ООП, описать на нем структуру команд всех интерфейсов приборов и т п. Вариант был сразу отметен ввиду сложности и длительности процесса такой разработки, да и найти такого специалиста соответствующей квалификации (допустим для C#) очень проблематично. Я знал такие подходы в компании где работал до этого и в общем, это работало, но тенденции в мире измерений и тестирования электроники такие, что ведущие компании по производству интеллектуальных приборов переходят (или уже перешли) в таких задачах на оборудование и программную систему LabView компании National Instruments. Все необходимые интерфейсы к приборам и оборудованию в LabView есть и использовать их относительно просто (тому кто знаком с языком управления приборами SCPI, к примеру). Оставалось найти программиста LabView. Их не очень много, так как графическая среда разработки в которой вообще нет кода, довольно специфична. Но тот кто ищет, тот всегда найдет. Такой человек в команду нашелся и довольно высокой квалификации в этой области программирования. SQL я взял на себя, памятуя о довольно приличном опыте в нем двадцать лет назад.

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

Программирование тестов и работа с базой данных

Идея с редактируемым скриптом теста сразу натолкнула на мысль, что клиент LabView тестовой станции должен быть по сути интерпретатором, в основном выполняющим команды из скрипта теста. Отсюда следовало, что скрипт должен содержать команды управления оборудованием с параметром типа "Установить давление 100 кПа", "Установить температуру -40 С", "Измерить и Записать данные токовой петли","Подключить канал коммутатора 4" и т. п. Фактически это означало, что надо разработать некую систему команд в виде табличного скрипта, которая будет включать работу с оборудованием, базой данных, климатической камерой, датчиками и Тест в данном случае будет состоять из таблицы строк команд с параметрами в виде линейного алгоритма, соответствующий определенному функционалу Теста, который будет выполнятся на тестовой станции клиентом LabView , работающего в режиме интерпретатора. Функционал Теста тогда можно строить из "кирпичиков" - операций Теста. Оставалась одна сложность - как разбивать тесты на операции ( команды) по функционалу Тестов. Видов тестов требовалось довольно много. Если разбить мелко - будет слишком длинные тесты в табличном виде и редактировать их будет неудобно. Если разбить крупно - снижается гибкость программирования теста. Золотая середина была найдена так - первый вариант основного теста температурной калибровки датчика делался с жесткой логикой на клиенте Labview. Это помогло понять подходы к разбиению теста на операции . Но одно дело понять, другое сделать и протестировать. В общем все было сделано, таблица с операциями Теста температурной калибровки получилась длинная, так как алгоритм был линейный и включал циклы по давлению, температуре и пулу тестируемых датчиков в виде последовательных наборов операций. Напрашивалось добавление операторов (команд) цикла типа WHILE, где бы внутри цикла последовательность операций выполнялась столько раз , сколько указано в начале цикла. Исходя их этого в систему команд табличных скриптов тестов были добавлены две команды инициализации цикла и проверки окончания цикла. Кроме того, проход по пулу тестируемых датчиков (не стоит забывать, что у нас HART, то есть тип соединения "точка- точка") был включен в сами операции работы (измерение, обнуление, калибровка и т. п.) с датчиками с указанием (через параметр) работы с пулом или с конкретным каналом. Это помогло уменьшить длину Теста и повысить функциональность программ тестирования по управлению каналами коммутатора датчиков.

Реализация общего цикла WHILE была сделана в базе данных в отдельной таблице, в которую записывались параметры цикла ( начальное значение цикла, конечное значение цикла, текущее значение, активный тестируемый пул датчиков, станция тестирования) при выполнении операции инициализации цикла. Введение операторов цикла позволило резко сократить ( в два раза ) количество строк Теста. Такой цикл требует перед его выполнением выполнения операции загрузки из таблиц БД статических моделей воздействий внутри цикла ( списка температур и давлений, к примеру). Для инициализации циклов по температурам, давлениям и каналам и получения величин воздействий из самого скрипта теста использовался тот же вид цикла что уже был, но для операций инициализации цикла ( в зависмости от вида воздействия) потребовалась дополнительная таблица циклов по по типам воздействий с указанием начальных и конечных значений параметров воздействий, шага воздействия и способа модификации переменной цикла до или после начала цикла ( ++i и i++ по аналогии с циклами в С++).

Встал вопрос - сколько нужно параметров для операций (команд), которые будут использоваться в скрипте теста? Ответ - 2 параметра оказалось достаточно для всех созданных операций в скриптах ( всего было разработано больше 100 операций, из которых можно строить программы тестирования датчиков). Так как операций и вариантов параметров много и запомнить их сложно, таблица, в которой редактировался Тест связывалась по номеру операции с таблицей описания использования параметров операций и в редакторе Теста при выборе строки Теста показывалось описание параметров. Редактор Теста позволял копировать Тесты , редактировать и "компилировать" их ( стирать старый тест и заменять его новым). Получилось довольно не затратно - программист Теста заботится только о порядке операций, добавлении или удалении операций и значениях 2-х параметров. Все остальное ( расстановка нумерации строк, ссылок на следующю команду теста, комментарии к операциям с учетом циклов и т п) взяла на себя система ( используется встроенная процедура корректировки указанного Теста, которая автоматически формирует тест и все ссылки)

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

Клиент Labview работает с базой данных через вызовы хранимых процедур. Это не простые SELECT * FROM ..., а порой сложные запросы и обработка данных в зависимости от операции ( команды ). К примеру, первая операция теста с номером 0 создает в базе данных новый номер пула и при поиске датчиков по протоколу HART они автоматически привязываются к этому пулу ( записываются в таблицу пулов). Далее Labview через полученный из этой операции номер пула обращается к базе данных по этому пулу и номеру датчика в процессе тестирования. Как пример сложной обработки в хранимой процедуре - формирование протокола тестирования пула датчиков, которая при вызове соответствующей хранимой процедуры формирования отчета с параметром пула рассчитывает метрологические параметры датчиков и определяет класс точности с учетом формул расчета референсных погрешностей в зависимости от диапазона и настройки датчиков из таблицы описания типа. Все это делает хранимая процедура на сервере без участия клиента, который передает только номер пула для расчета.

Считывание строки скрипта и выполнение операции происходит построчно из таблицы скрипта. Такой режим выбран для того, чтобы был доступен режим корректировки Теста в процессе его выполнения, подобно тому, как запускается любая программа в режиме отладки. Для того чтобы знать на какую строку переходить после выполнения текущей, в выполняемой строке скрипта есть ссылка на следующую строку программы теста. То есть скрипт теста связывает строки по ссылке, но она скрыта от пользователя и формируется автоматически при "компиляции" теста. Ссылка на следующую операцию в конце цикла указывает на следующую строку после инициализации цикла, но когда переменная цикла достигает максимума, программа переходит на следующую строку после операции проверки конца цикла. Все эти "хитрости" cо скриптами и циклами, были реализовананы в хранимой процедуре базы данных и в итоге позволили получить неограниченную вложенность циклов, режим пошагового выполнения скрипта ( программы Теста) для отладки операций, остановку выполнения операций , ручной переход на любую строку скрипта. Практика показала что это очень важно при отладке теста и очень удобно при различных нестандартных ситуациях в процессе тестирования, когда нужно повторить ранее выполненные операции , пропустить следующие, добавить операцию в выполняемый Тест и т д. При внезапных отключениях питания тестовых станций ( климатическую камеру к примеру на UPS не подключить) есть режим перезапуска теста. Так как основная информация хранится в SQL базе данных и соединение с ней не обрывается, так как БД защищена от пропадания питания, то режим перезапуска позволяет не запускать тест заново, а вернуться при перезапуске в ту же точку где программа теста была оборвана.

Рис.1 Пример программы теста.
Рис.1 Пример программы теста.

Для программирования теста и его изменения программисту теста нужно менять только два параметра в колонках PROCESS_TEST и AUTO_OR_HAND. Комментарии к строкам, все скрытые ссылки связности операций и циклов формируются автоматически при "компиляции" теста, что делает соответствующая хранимая процедура в БД

Мониторинг тестовых станций

Часть сбора параметров оборудования для мониторинга тестовых станций была отдана клиенту Labview, который сохранял их в БД c интервалом 1 сек. Также сохранялся в базе данных лог всех выполненных операций. Под систему мониторинга было сделано отдельное приложение, которое обращаясь к параметрам оборудования и логам операций (через вызовы хранимых процедур) формировало и показывало следующие указанные ниже представления в режиме on-line c интервалом 1 сек.:

Рис.3 Внешний вид программы мониторинга тестовых станций
Рис.3 Внешний вид программы мониторинга тестовых станций
  • список и статус режима работы станций  и длительность активного текущего теста на них,

  • тесты и операции, выполненные и выполняемые  в реальном времени  на каждой станции тестирования,

  • статусы и текущие параметры оборудования  выбранной тестовой станции:

    • метрология датчика ( приведенная к диапазону погрешность токовой петли, приведенная к диапазону цифровая погрешность)

    • текущая температура в климатической камере,

    • текущее давление на выходе калибратора давления,

    • статус работы вакуумного насоса,

    • номер текущего активного канала коммутатора,

    • номер текущей\последней HART команды,

    • размер рабочей базы данных и лога транзакций, а также ее состояние (on или off),

    • загрузка сервера БД (%) и объем (%) используемой оперативной памяти на сервере,

    • текущее напряжение питания датчиков,

    • состав пула датчиков (серийный номер, диапазон, наименование и номер теста и т п.)

    • текущая операция с пулом и метрология датчика (основная и температурная погрешность и т п в момент подачи воздействия и измерения,

    • программа выполняемого теста (завершенные операции, выполняемая операция и ожидающие выполнения операции и их параметры),

    • статус HART каждого датчика в процессе выполнения Теста,

    • операционный лог и HART‑лог по станциям, пулам и датчикам в активных тестах.

    • получение отчетов по выполненным тестам CV и верификации,

    • поиск данных по поверке датчиков, протоколам, датам и т. п. и выгрузка отчетов (протоколов) в EXcell по проведенным поверкам датчиков и калибровкам (CV) датчиков.

Система отличается высокой стабильностью и предсказуемостью. Нестандартные ситуации с получением данных обрабатываются в базе данных и в случае ошибок программа уходит в режим паузы для выбора дальнейших действий оператором. Нестандартные ситуации с приборами и задатчиками обрабатываются на клиенте LabView.  Все такие ситуации отображаются в операционном логе и в программе мониторинга станций тестирования.  Сложно в небольшой статье описать все что удалось реализовать в связке SQL + LabView. Эта связка показала что при переносе основной логики в БД можно относительно быстро и просто реализовать сложные тесты сбора и обработки данных датчиков по методологии ETL и приборные интерфейсы.

Эта связка была положена в следующую разработанную нами  систему - настройка, мониторинг и конфигурирование приборов  с интерфейсом Modbus. Но об этом в следующей статье. 

Теги:
Хабы:
Всего голосов 5: ↑4 и ↓1+4
Комментарии4

Публикации

Истории

Работа

Ближайшие события

12 – 13 июля
Геймтон DatsDefense
Онлайн
19 сентября
CDI Conf 2024
Москва