Программа управления Agilent 344XX
Добавлено: 19 июл 2012, 00:16
Недавно на работе появилась задача - получить интегральную оценку работы прибора.
Для этого надо достаточно быстро (несколько десятков - сотен раз в секунду) снимать значение напряжения и скидывать их в табличку для последующей обработки.
Благо старый добрый 34401 и его более молодые собратья 34410/34411 достаточно распространенные мультиметры, буквально под ногами валяются И именно на эту линейку мультиметров NI включает в пример драйверов, так шо даже не пришлось лезть в программ мануал и возится с SCPI.
Правда все же и эти драйвера требуют доработку напильником, но пока обходился подпалитрой Low Level - более простые и выскоуровневые ВП оказались жутко тормазнутыми - ну, например, нафига при каждом снятии данных предварительно настраивать триггер и тратить на это 100 мс драгоценного времени, когда настройки триггера зависят от типа измерения и их можно определять один раз при конфигурировании.
Поэтому быстренько на коленках сваял небольшую прогу. Изначально, задумка была такова - полностью повторить лицевую панель и функциональные возможности "живого" прибора, который может быть подключен по GPIB, Ethernet, USB, RS-232. Ну и, конечно, прога должна быть универсальной и работать со всей линейкой этих мультиметров - как оказалось не зря - задачу поставили написать прогу для 01-го под RS-232, а на стенде оказался 11 и комп без COM-портов - вот так у нас нынче "круто" работает космическая промышленность, даже ТЗ разучились составлять
Выкладываю прогу и надеюсь с одной стороны на дельные советы, т.к. на работе советоваться мне не с кем, а сдругой стороны - можь кому эта прога понадобиться - т.к. позволяет управлять, снимать данные и записывать их в файл с достаточно распространенного мультиметра.
Пока получилось следующее:
Настройки программы и мультиметра
- выбор типа измерения
- настройка входного фильтра
- настройка времени интегрирования (в моем случае надо было мерить как можно быстрее, но я с самого начала поставил цель собрать универсальную программу)
- переключатель автоустановки нуля
- переключатель autorange
- настройка интервала между замерами
- настройка внешнего порта (изначально делал для COM-порта, но как оказалось, отлично работает и по ethernet)
Работа с данными
- График снятых данных
- Текущее значение измеряемой величины
- Запись данных
- Сохранение в отчет
- Табличка, где можно посмотреть сохраняемый массив данных
- Сигнализатор того что интервалы между замерами постоянны
Замеры производятся однократные, непрерывно повторяющиеся через заданный интервал.
Каковы достижения:
- Как оказалось прога может работать и по Ethernet, и по GPIB, и по RS-232 (на USB не проверял). Спасибо программистам NI - оригинальные дрова под от Аджилента намного хуже.
- Минимальное время замеров по RS-232 37 мс (по даташиту, 18 мс)
- Минимальное время замеров по GPIB и Ethernet 5 мс (по даташиту 1мс)
Вообщем то круто, но хотелось бы еще меньшее время между замерами, тем более ходит байка, шо какой-то из некогда работающих программистов смог заставить мультиметр мерить данные и валить их на комп с периодом в 3 мс, но я в это не верю - при 9600 бод/с по COM-порту такого физически добиться невозможно
Примерный алгоритм работы с ней таков:
1. Настраиваем порт и выбипаем тип интерфейса
2. Настраиваем мультиметр и задержку между замерами
3. Врубаем режим записи данных (блокируется возможность изменения настроек)
4. Смотрим в табличке какие данные валятся в буфер
5. Смотрим на график (презентабильнее чем табличка)
6. Сохраняем данные в тектсовый файл, запись данных сразу же отключается, разблокируется меню настроек
7. ...
8. profit?
Чего нет, и что надо будет добавить потом:
- Установка таймера (шоб сам прекращал замер, сохранял, производил анализ и печатал отчет)
- Тулза по статитстической обработки данных (а то надоело уже вручную в Экселе строить графики, распределение плотности вероятности, матожидание, сигма, дисперсия и прочее)
- Последующая вставка обработанных данных в отчет
- Уменьшить минимально возможное время между замерами до значений по даташиту (хотя шо-то мне подсказывает, двойное время по даташиту - вот предел моей проги)
- В перспективе надо будет снимать не только напряжения, но и считать количество импульсов, приходящих с датчиков Холла, записывать осциллограммы. И все это по-идеи должно быть засинхронизировано.
- Ну и больше тонких настроек мультиметра, конечно...
Теперь же перейдем к затруднениям...
А затруднения возникли следующие:
Чего я еще не пробовал в этой проге:
- Timed структур, их применение позволит жестко контролировать время исполнения программы с точностью как минимум до 1 мкс, но думаю можно и круче. Но с этими структурами я почти не работал.
- Не применял очередей. Возможно их придется применять, если я захочу делать многоканальные измерения.
- Не пробовал раздельные циклы - снятия данных и их вывода-записи
Отсюда появляются частные, но не менее важные вопрсы:
Прога пока все еще сырая - буду допиливать однозначно, так что ногами программиста не бить, программист кодит как умеет. Да и даже не программист, а конструктор, у которого была 3-ка по русскому. Так шо за русский язык, тоже ногами не бить.
К.О.: Сама прога в прицепе, под названием State Template.
Второй вариант проги могу скинуть отдельно по-желанию - она мало чем отличается, но почему-то работает стабильней, поэтому и вопросов к ней меньше.
Для этого надо достаточно быстро (несколько десятков - сотен раз в секунду) снимать значение напряжения и скидывать их в табличку для последующей обработки.
Благо старый добрый 34401 и его более молодые собратья 34410/34411 достаточно распространенные мультиметры, буквально под ногами валяются И именно на эту линейку мультиметров NI включает в пример драйверов, так шо даже не пришлось лезть в программ мануал и возится с SCPI.
Правда все же и эти драйвера требуют доработку напильником, но пока обходился подпалитрой Low Level - более простые и выскоуровневые ВП оказались жутко тормазнутыми - ну, например, нафига при каждом снятии данных предварительно настраивать триггер и тратить на это 100 мс драгоценного времени, когда настройки триггера зависят от типа измерения и их можно определять один раз при конфигурировании.
Поэтому быстренько на коленках сваял небольшую прогу. Изначально, задумка была такова - полностью повторить лицевую панель и функциональные возможности "живого" прибора, который может быть подключен по GPIB, Ethernet, USB, RS-232. Ну и, конечно, прога должна быть универсальной и работать со всей линейкой этих мультиметров - как оказалось не зря - задачу поставили написать прогу для 01-го под RS-232, а на стенде оказался 11 и комп без COM-портов - вот так у нас нынче "круто" работает космическая промышленность, даже ТЗ разучились составлять
Выкладываю прогу и надеюсь с одной стороны на дельные советы, т.к. на работе советоваться мне не с кем, а сдругой стороны - можь кому эта прога понадобиться - т.к. позволяет управлять, снимать данные и записывать их в файл с достаточно распространенного мультиметра.
Пока получилось следующее:
Настройки программы и мультиметра
- выбор типа измерения
- настройка входного фильтра
- настройка времени интегрирования (в моем случае надо было мерить как можно быстрее, но я с самого начала поставил цель собрать универсальную программу)
- переключатель автоустановки нуля
- переключатель autorange
- настройка интервала между замерами
- настройка внешнего порта (изначально делал для COM-порта, но как оказалось, отлично работает и по ethernet)
Работа с данными
- График снятых данных
- Текущее значение измеряемой величины
- Запись данных
- Сохранение в отчет
- Табличка, где можно посмотреть сохраняемый массив данных
- Сигнализатор того что интервалы между замерами постоянны
Замеры производятся однократные, непрерывно повторяющиеся через заданный интервал.
Каковы достижения:
- Как оказалось прога может работать и по Ethernet, и по GPIB, и по RS-232 (на USB не проверял). Спасибо программистам NI - оригинальные дрова под от Аджилента намного хуже.
- Минимальное время замеров по RS-232 37 мс (по даташиту, 18 мс)
- Минимальное время замеров по GPIB и Ethernet 5 мс (по даташиту 1мс)
Вообщем то круто, но хотелось бы еще меньшее время между замерами, тем более ходит байка, шо какой-то из некогда работающих программистов смог заставить мультиметр мерить данные и валить их на комп с периодом в 3 мс, но я в это не верю - при 9600 бод/с по COM-порту такого физически добиться невозможно
Примерный алгоритм работы с ней таков:
1. Настраиваем порт и выбипаем тип интерфейса
2. Настраиваем мультиметр и задержку между замерами
3. Врубаем режим записи данных (блокируется возможность изменения настроек)
4. Смотрим в табличке какие данные валятся в буфер
5. Смотрим на график (презентабильнее чем табличка)
6. Сохраняем данные в тектсовый файл, запись данных сразу же отключается, разблокируется меню настроек
7. ...
8. profit?
Чего нет, и что надо будет добавить потом:
- Установка таймера (шоб сам прекращал замер, сохранял, производил анализ и печатал отчет)
- Тулза по статитстической обработки данных (а то надоело уже вручную в Экселе строить графики, распределение плотности вероятности, матожидание, сигма, дисперсия и прочее)
- Последующая вставка обработанных данных в отчет
- Уменьшить минимально возможное время между замерами до значений по даташиту (хотя шо-то мне подсказывает, двойное время по даташиту - вот предел моей проги)
- В перспективе надо будет снимать не только напряжения, но и считать количество импульсов, приходящих с датчиков Холла, записывать осциллограммы. И все это по-идеи должно быть засинхронизировано.
- Ну и больше тонких настроек мультиметра, конечно...
Теперь же перейдем к затруднениям...
А затруднения возникли следующие:
Был бы рад за совет, а то проводников становится все больше и больше, код становится все более объемным и что-то изменять становиться все труднее, а сама блок-диаграмма уже давно не вмещается в экран Мне кажется, что где-то я неправильно с самого начала организовал структуру программы. Был бы очень благодарен за дельный совет и темплейтВо-первых, жесткая установка времени между замерами. Видимо программа нифика не оптимизирована и задержка между замерами на деле оказалась очень нестабильной - колбасится в пределах 1-2 мс. А если мерить несколько часов, колбасится начинает еще сильнее. Пичалька.
В общем, встает первый вопрос - как добиться жесткой фиксации интервалов между замерами.
*Самое что интересное, сегодня до обеда с нуля переписал пол программы - и в ней уже этой проблемы нет - ставишь 50 мс, время стабильно держится 50 мс, ставишь 38 мс - стабильно 38 мс, ставишь 5 мс - 5 мс (если по изернету). В чем секрет - я так и не понял.
Во-вторых, многоканальные измерения. Про это тоже мне никто не сказал, но как оказалось - надо было мерить не просто изменение напряжения с одного датчика, а как минимум с 3-х (благо мультиметров свободных много), а сам я по-началу до этого не додумался
И это будет уже второй вопрос - как мне допилить программу так, что бы в ней была заложена возможность многоканальных измерений. Причем многоканальность должна быть гибкой - количество каналов и их адреса задет оператор.
*Правда есть альтернативный вариант - написать ActiveX сервер - и не парится - внедрять в него столько копий этой программы, сколько душе угодно, что порождает следующий пункт.
В-третьих, начиная допиливать программу, я столкнулся с тем, что каждое новое нововеденние вводится все сложнее и сложнее, а программа становится все менее и менее красивой.
Это моя главная загвоздка - третья, выбор модели программирования и архитектуры программы.
Как лучше организовать потоки данных?
Как лучше построить иерархию проекта?
Ударяться в сторону ActiveX или оставить ActiveX на потом, например для объединения программ для разных приборов (мультиметр+ частотомер +осциллограф)?
Чего я еще не пробовал в этой проге:
- Timed структур, их применение позволит жестко контролировать время исполнения программы с точностью как минимум до 1 мкс, но думаю можно и круче. Но с этими структурами я почти не работал.
- Не применял очередей. Возможно их придется применять, если я захочу делать многоканальные измерения.
- Не пробовал раздельные циклы - снятия данных и их вывода-записи
Отсюда появляются частные, но не менее важные вопрсы:
В общем буду рад любым советам.- Применять ли таймед структуры?
- Использовать ли очереди?
- Использовать ли событийной управляемый автомат?
- Как лучше производить обработку событий GUI, а именно кнопок и полей ввода? В каждом цикле, или по событиям, или внутри специального состояния? Ведь даже булевые кнопочки у меня по-разному должны выполняться.
- Как лучше оформить GUI: использовать Tab или кластеры?
- Где какие проводники данных расставить, что бы в дальнейшем проще было модифицировать программу?
- Что делать когда данных станет очень и очень много в случае многочасовых измерений?
- Как оптимизировать программу, а то две разные варианты программы, написанные по одному шаблону работают тоже по-разному?
- Как добиться более менее жесткого контроля времени исполнения? Да это не ось реального времени, а всего лишь виндоуз, но микросекундный интервал и виндоуз вполне достижим.
Прога пока все еще сырая - буду допиливать однозначно, так что ногами программиста не бить, программист кодит как умеет. Да и даже не программист, а конструктор, у которого была 3-ка по русскому. Так шо за русский язык, тоже ногами не бить.
К.О.: Сама прога в прицепе, под названием State Template.
Второй вариант проги могу скинуть отдельно по-желанию - она мало чем отличается, но почему-то работает стабильней, поэтому и вопросов к ней меньше.