2015-07-02 3 views
1


У меня есть .Net 4 control /.dll, который я использую с LabVIEW.Labview. Net events

управления выставляет следующее событие:

public delegate void CommNewDataEventHandler(UInt16 u16StageGroup, UInt32 u32Status , string [] strNewDataTitle, float[] fNewData, string[] strNewDataUnit); 
    public event CommNewDataEventHandler CommNewDataEvent; 

То, что я хотел бы сделать, это подписаться на это событие в LabView и обновления цифровой индикатор со значением, указанным в float[] fNewData. Каков правильный способ сделать это?

current VIcallback VI

ответ

1

Как уже указывал предыдущий плакат, для этого не существует «правильного» способа. В зависимости от объема вашего проекта существует несколько различных подходов. Для общей процедуры регистрации и обработки событий .NET у NI есть хороший пример: https://decibel.ni.com/content/docs/DOC-9161

Этот образец кода является «обработчиком таймера» (с использованием встроенного .NET-таймера API) и иллюстрирует, как регистрироваться для события и создавать ваш обратный вызов VI. Давайте изменим это, чтобы достичь вашей цели. Чтобы сделать это, мы должны каким-то образом обмениваться данными с помощью нашего обратного вызова VI на другую часть программы (содержащую числовой индикатор, который мы хотим обновить). Варианты установления связи между отдельными частями нашего приложения:

  • Глобальные переменные
  • Функциональная глобальная переменная
  • управления/индикатор ссылается
  • Структурированные механизм синхронизации (т.е. очереди, уведомитель и т.д.)
  • Система обмена сообщениями (например, UDP через локальный шлейф, управляемые очереди и т. Д.)

Есть мужчина y, много вариантов, и это, конечно, не исчерпывающий список. Каждый подход имеет свои преимущества и недостатки, и ваши решения должны основываться на том, какое приложение вы пишете. Обратите внимание, что некоторые из них лучше, чем другие. Мое предпочтение (при написании довольно простого приложения) заключалось бы в использовании чего-то вроде уведомителя для одноточечного обновления данных. Мое мнение состоит в том, что это обеспечивает достаточную гибкость/мощность, и вы не получите поступок за очки стиля.

Ниже приведена модифицированная версия примерной программы NI с использованием уведомителя для передачи данных из VI обратного вызова на верхний уровень VI. Когда событие срабатывает, обратный вызов подталкивает некоторые данные в уведомитель, чтобы сигнализировать на ВП верхнего уровня, что истекшее время истекло, и произошло событие. VI верхнего уровня ожидает уведомления и использует предоставленные данные для обновления значения числового индикатора.

Обратите внимание, что это очень тривиальный пример. В этом случае мне даже не нужно отправлять какие-либо данные. Я знаю, что если уведомитель не отключился, чтобы событие запустилось и может впоследствии увеличить счетчик на верхнем уровне. Однако уведомитель позволяет вам гибко записывать произвольные данные в канал связи. Следовательно, он может сказать мне: «Эй, ваше состояние произошло!» и «вот некоторые данные, которые были сгенерированы».


Callback VI

callback


Top Level VI

top level


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

1

Там нет «правильного» способа сделать это, но вы можете поместить код в обратном вызове VI для передачи данных, где вам это нужно.

Например, вы можете передать контрольную ссылку в качестве пользовательского параметра (это терминал на узле регистрации и элемент управления в FP), а затем использовать Variant to Data, чтобы преобразовать его обратно в ссылку (изменить - вы не нужно конвертировать, если вы создаете ВП после подключения данных к узлу) и используйте свойство value. Это неэлегантно, но это сработает.

Более элегантным решением было бы передать пользовательское событие вашего типа данных в VI-обратный вызов (например, как пользовательский параметр), а затем сгенерировать это событие с данными, которые вы получили. Это более громоздко, но менее скрыто.