CVI. Тонкости работы с функцией DS_GetDataType. (OPC)

Ответить
Аватара пользователя
Chupakabra

Tutorials
professional
professional
Сообщения: 360
Зарегистрирован: 21 янв 2009, 10:50
Награды: 1
Версия LabVIEW: 2015
Откуда: Москва
Поблагодарили: 4 раза
Контактная информация:

CVI. Тонкости работы с функцией DS_GetDataType. (OPC)

Сообщение Chupakabra »

Продолжаю исследовать LabWindows/CVI.

Хочу немного рассказать о тонкостях работы с функцией DS_GetDataType, нобходимой для работы с OPC в CVI.

Эта функция возвращаят тип данных для выбранного OPC тега. Например:
CAVT_SHORT Contains a short
CAVT_LONG Contains a long
CAVT_INT Contains an int (same as CAVT_LONG
CAVT_FLOAT Contains a float
CAVT_DOUBLE Contains a double
Подробности см. в help к CVI.
Эти поименованные константы определены в перичесляемом типе (enum) в заголовочном файле cviauto.h

Тонкость проявляет себя следующим образом. Предположим существует на OPC сервере тег Tag1 типа DOUBLE. Который считывается OPC сервером с контроллера (ПЛК). Когда связь с ПЛК стабильна, возвращаемый функцией DS_GetDataType тип CAVT_DOUBLE. Все логично, но когда связь с ПЛК нарушается DS_GetDataType возвращает CAVT_DOUBLE при продолжающемся (DS_Open) подключении к OPC тегу, и CAVT_LONG при новом (DS_Open) подключении к OPC тегу. Т.е. тип данных начинает не соотвтетствовать действительному. Удалось найти следующие рекомендации по этому поводу: http://digital.ni.com/public.nsf/allkb/ ... 20006B9455
Why Does DataSocket Report Different Data Types in Read Mode Than in Write Mode?

Primary Software: LabWindows/CVI Development Systems>>Full Development System
Primary Software Version: 5.5
Primary Software Fixed Version: N/A
Secondary Software: Other NI Software>>DataSocket



Problem: I am using DataSocket to connect to an OPC item. If I call DS_GetDataType function to open an item in Read mode, then the reported datatype is DOUBLE, which is correct; however, if I open the item in Write mode, then the datatype is incorrectly reported as LONG.

Solution: There are different scenarios for opening an item in Read and Write modes. If an item is opened in Read mode, then DataSocket receives data. When it receives data it also gets information on how to interpret it, in terms of data type. You can also call the DS_GetDataType function to get the actual data type.

In Write mode DataSocket does not receive any data to derive the data type. In this case DS_GetDataType returns the "default" LONG data type. This does not mean that you cannot write a value with a different data type to this item. If you know that the actual data type is DOUBLE, then you can go ahead and write a DOUBLE value. For example, if "opc:/Server1/Item1" is opened in Write mode, then DS_GetDataType gives you back LONG, but you can still send a DOUBLE value to the server:
hr = DS_SetDataValue (opcHandle, CAVT_DOUBLE, &NewVal, 0, 0);
Generally, you should not rely on the data type returned by DS_GetDataType, if the item is opened in Write mode. Either use the data type that the DS_GetDataType function returns in Read mode, or refer to the server documentation to determine the actual data type of the item.

Related Links:

Attachments:

Report Date: 18.07.2000
Last Updated: 28.05.2004
Document ID: 1ZHDIHJ6
Тут говорится о том, что при открыти тега на чтение (read), пока передаются данные, тип будет определяться корректно, в отличи от открытия тега на запись. Похоже, что при нарушении связи с ПЛК и изменение статуса тега на сервере срабатывает тот же механизм. Вывод: Если Вам требуется использовать функцию DS_GetDataType, проверяйте статус тега с помощью DS_GetStatus.
Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4421
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Благодарил (а): 24 раза
Поблагодарили: 9 раз
Контактная информация:

Re: CVI. Тонкости работы с функцией DS_GetDataType. (OPC)

Сообщение Pavel Krivozubov »

Chu, ты в свое время написал замечательную статью под названием "Почему именно LabVIEW?". И вот сейчас у меня возник вопрос: Почему именно LabWindows/CVI? Что в ней такого что нельзя сделать в LabVIEW? Хочется услышать твоё мнение как специалиста в этом вопросе.
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: CVI. Тонкости работы с функцией DS_GetDataType. (OPC)

Сообщение mzu2006 »

Присоединяюсь к просьбе Indey.
Аватара пользователя
Chupakabra

Tutorials
professional
professional
Сообщения: 360
Зарегистрирован: 21 янв 2009, 10:50
Награды: 1
Версия LabVIEW: 2015
Откуда: Москва
Поблагодарили: 4 раза
Контактная информация:

Re: CVI. Тонкости работы с функцией DS_GetDataType. (OPC)

Сообщение Chupakabra »

Indey писал(а):Chu, ты в свое время написал замечательную статью под названием "Почему именно LabVIEW?". И вот сейчас у меня возник вопрос: Почему именно LabWindows/CVI? Что в ней такого что нельзя сделать в LabVIEW? Хочется услышать твоё мнение как специалиста в этом вопросе.
Ну что я могу сказать. Попробую сформулировать некоторые моменты, из-за которых я обратил внимание на CVI.
1. Честно захотелось поизучать чего-нибудь новенького, притом что СИ я знаю неплохо. Эта среда в России мало распространена (хотя иногда промелькивает: http://www.r-technology.ru/products/aut ... /index.php). В этом смысле интересно почувствовать себя первопроходцем (пионером :haha:).
2. Изучение, работа в CVI для меня не является приоритной (параллельно, не считая еще и основной работы своей :), изучаю и другие вещи).
2. CVI выглядит довольно целостно, отточенно, позволяет (пока не вижу обратного) реализовать полноценный GUI для систем управления + работа с БД.
3. Работает, ihmo, быстрее LabVIEW, при аналогичных базовых возможностях. Код контролирую и оптимизирую сам, на более низком уровне, чем в LabVIEW. Для СVI имеет место обратная концепция LV: Контроль и скорость кода против скорости разработки. (вообще попробую на досуге провести сравнительные тесты производительности, чтобы не голословить)

Не надо думать, что я отказываюсь от LabVIEW, просто пытаюсь увеличить гибкость своих возможностей, за счет траты времени на осваивание смежных технологий, и считаю эту трату оправданной :).

Из минусов: необходимость run-time быблиотек, но для меня это не критично.

p.s. Принимаю доводы "разума", что можно выбрать .NET, MFC. Но как-то сложилось, что просто душа не лежит к этим технологиям, если кто переубедит душу :).
Аватара пользователя
Konstantin Sumenko

Activity Bronze
expert
expert
Сообщения: 1439
Зарегистрирован: 17 июл 2008, 12:20
Награды: 2
Версия LabVIEW: 2010
Откуда: Moscow
Поблагодарили: 1 раз
Контактная информация:

Re: CVI. Тонкости работы с функцией DS_GetDataType. (OPC)

Сообщение Konstantin Sumenko »

Контролы там выглядят как элементы библиотек, их можно видоизменять, создавать? Как организовано обращение к контролам из других потоков? Многопоточность библиотечная?
Аватара пользователя
Chupakabra

Tutorials
professional
professional
Сообщения: 360
Зарегистрирован: 21 янв 2009, 10:50
Награды: 1
Версия LabVIEW: 2015
Откуда: Москва
Поблагодарили: 4 раза
Контактная информация:

Re: CVI. Тонкости работы с функцией DS_GetDataType. (OPC)

Сообщение Chupakabra »

Crowbar писал(а):Контролы там выглядят как элементы библиотек, их можно видоизменять, создавать? Как организовано обращение к контролам из других потоков? Многопоточность библиотечная?
По контролам скоро отвечу в отдельной теме, по многопоточности позже.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «LabWindows / CVI / Measurement Studio»