2014-01-27 3 views
1

ОБНОВЛЕНИЕ: Оказывается, это был просто взрыв LabView. Даже ints не проходили должным образом. Удаление и повторное создание некоторых узлов решало проблему.Почему LabView конвертирует десятичные числа в маленькие числа с плавающей запятой?

Я написал сборку .Net 3.5, которая потребляется инженером LabView. Это, по крайней мере, LabView 7, но я думаю, что выше. Метод в моей сборке возвращает массив объектов, где каждый экземпляр имеет свойство типа decimal (между прочим). Инженер LabView не делает ничего особенного и просто сбрасывает последовательность на front-end VI, и каждое из этих десятичных свойств выглядит как очень маленькие числа с плавающей запятой. Фактическое десятичное значение может быть 740.0, но оно видно в LabView как double, со значением 8.12345E-315. Это на несколько порядков!

Строковые и булевы свойства проходят через отлично.

Любая идея, почему это происходит?

EDIT: Мы проверили это, используя очень простой класс с некоторыми десятичными полями и свойствами, и он отлично работал в LabView. В этой DLL есть что-то подозрительное, поэтому мы пытаемся провести некоторые другие тесты, чтобы увидеть, можем ли мы реплицировать проблему, используя другую DLL.

Вот скриншот некоторых тестов, которые меняются под конец. При замене конечного типа свойств нашего простого тестового класса производились одинаковые значения. Перестановка конечного типа десятичных знаков из библиотеки реальных классов создает только небольшие крошечные поплавки.

http://i.imgur.com/WpZ8bYX.jpg

+0

Можете ли вы опубликовать некоторые из кода LabVIEW? скриншот диаграммы будет достаточным – CharlesB

ответ

0

Попробуйте удалить и воссоздать узлы доступа к свойствам. Иногда LabView запутывается и испортит данные.

+1

Если вы сомневаетесь, вы можете принудительно выполнить перекомпиляцию: кнопка ctrl-run –

1

Он пахнет как плохой бросок, LabVIEW верить decimal является двойной или одинарной точности с плавающей запятой. Вы должны явно преобразовать decimal в стандартную плавающую точку, прежде чем передавать ее в LabVIEW. Обратите внимание, что вы потеряете цифры точности. Или найдите цифровой тип, соответствующий точности decimal в LabVIEW и сделайте правильное преобразование.

+1

Примечание: LabVIEW doubles - это 64-битный float в Big Endian –

+0

Документация, которую читает инженер-испытатель, указывает, что тип преобразования по умолчанию. Net decimal является двойным, поэтому кажется, что это преднамеренное поведение по умолчанию , Но почему бросок так резко падает? Создание свойства float нежелательно, потому что LabView не является единственным потребителем этой библиотеки классов. Полагаю, я мог бы сделать класс адаптера, чтобы успокоить LabView. – Glazed

0

Вот обходный я мог сделать:

сделать класс адаптера, который изменяет интерфейс использовать хорошо поддерживаемый тип данных, как двойные, а затем использовать этот класс адаптера в LabView вместо исходного класса.

3

LabVIEW double - это 64-битный поплавок в Big Endian (из-за его наследия Mac). Ваша десятичная цифра может быть чем-то другим. Если вы хотите, чтобы зафиксировать его на стороне LabVIEW вы можете использовать следующий код: LabVIEW code snippet for endianness swap

Возможно, ему это нужно изменить константы преобразования вокруг.

+0

Это хорошая догадка, но мы пробовали это, и это не помогло. См. Примечания, которые я добавил к вопросу. – Glazed

Смежные вопросы