Чтение в кластер бинарных данных

Простейшие вопросы в области инженерной разработки
Ответить
Аватара пользователя
Select
developer
developer
Сообщения: 281
Зарегистрирован: 12 дек 2017, 23:56
Версия LabVIEW: 18
Откуда: Врата надежды.
Поблагодарили: 2 раза

Чтение в кластер бинарных данных

Сообщение Select »

Всем привет, подскажите пожалуйста каким образом принять содержимое из *.bin в кластер.
Содержимое *.bin состоит из данных аналогичного кластера (5 элементов), который находится в другом :vi:
В результате я должен унаследовать все данные в приемнике.
Возможно в таком виде сохраненные данные не отобразятся в исходных значениях приемника, метод не катит.
Буду благодарен за пример такого импорта из кластера одного :vi: в такой же кластер другого :vi:
Вложения
Cluster.png
Последний раз редактировалось Select 14 авг 2019, 12:31, всего редактировалось 1 раз.
LabView 14,18
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Чтение в кластер бинарных данных

Сообщение IvanLis »

Select писал(а):Всем привет, подскажите пожалуйста каким образом принять содержимое из *.bin в кластер.
Содержимое *.bin состоит из данных аналогичного кластера (5 элементов), который находится в другом :vi:
В результате я должен унаследовать все данные в приемнике.
У функции Read from Binary File имеется вход data type, подключите свой кластер туда.
Только желательно TypeDef использовать в таких случаях.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Чтение в кластер бинарных данных

Сообщение Borjomy_1 »

Есть нюанс. Если кластер содержит массивы, строки, переменные типа Variant и прочие варианты, подразумевающие изменяемый размер кластера в памяти, то данный метод не подходит.
Необходимо оборачивать кластер в строку (Flatten To String) и в файл записывать сначала длину этой строки, а потом уже само тело. И читать соответственно: вычитывается длина записи, потом считывается строка этого размера, ну и потом обратное преобразование.
А еще лучше не изобретать велосипед и использовать tdms
Аватара пользователя
Select
developer
developer
Сообщения: 281
Зарегистрирован: 12 дек 2017, 23:56
Версия LabVIEW: 18
Откуда: Врата надежды.
Поблагодарили: 2 раза

Re: Чтение в кластер бинарных данных

Сообщение Select »

IvanLis,
я это изначально сделал, метод не рулит.
Borjomy_1,
Есть нюанс. Если кластер содержит массивы, строки ....
Такое присутствует. Где бы я мог посмотреть примеры с такими нюансами?
Вложения
Cluster1.png
Cluster1.png (4.4 КБ) 2442 просмотра
LabView 14,18
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Чтение в кластер бинарных данных

Сообщение IvanLis »

Select писал(а): IvanLis,
я это изначально сделал, метод не рулит.
Все "рулит", Вы просто готовить не можете пока...
Читайте доки и ищите примеры: https://knowledge.ni.com/KnowledgeArtic ... AU&l=ru-RU
Borjomy_1 писал(а):Есть нюанс. Если кластер содержит массивы, строки, переменные типа Variant и прочие варианты, подразумевающие изменяемый размер кластера в памяти, то данный метод не подходит.
:dntknw: у меня все работает, многократно использовал...
можно впихнуть, все что угодно

Это при сохранении массива кластеров (кластер имеет вложенный массив и String).
Снимок экрана от 2019-08-14 13-34-09.png
Снимок экрана от 2019-08-14 13-34-09.png (18.69 КБ) 2438 просмотров
1.png
Untitled 1.vi
lv2010 save from 2016
(8.06 КБ) 92 скачивания
Это сохранение именно кластера (имеет вложенный массив и String).
Снимок экрана от 2019-08-14 13-34-34.png
Снимок экрана от 2019-08-14 13-34-34.png (18.06 КБ) 2438 просмотров
2.png
Untitled 2.vi
(8.15 КБ) 78 скачиваний
Аватара пользователя
Select
developer
developer
Сообщения: 281
Зарегистрирован: 12 дек 2017, 23:56
Версия LabVIEW: 18
Откуда: Врата надежды.
Поблагодарили: 2 раза

Re: Чтение в кластер бинарных данных

Сообщение Select »

Так выглядит оригинальный кластер:
Вложения
Cluster2.png
LabView 14,18
Аватара пользователя
Select
developer
developer
Сообщения: 281
Зарегистрирован: 12 дек 2017, 23:56
Версия LabVIEW: 18
Откуда: Врата надежды.
Поблагодарили: 2 раза

Re: Чтение в кластер бинарных данных

Сообщение Select »

IvanLis писал(а):
Select писал(а): IvanLis,
Все "рулит", Вы просто готовить не можете пока...
:dntknw: у меня все работает, многократно использовал...
можно впихнуть, все что угодно
Т.е. считывающий :vi: , должен иметь такую же структуру как записывающий, по аналогии как это происходит в одном :vi: ?
LabView 14,18
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Чтение в кластер бинарных данных

Сообщение Borjomy_1 »

IvanLis, Сомнительно. Вы попробуйте несколько записей с разным количеством элементов массива в файл сохранить, а потом считать последнюю. С программной точки зрения функция чтения должна прочитать каждую запись со своей длиной, с учетом размеров всех ее элементов. Может, в 2016 и сделали такое, но я ОЧЕНЬ сильно сомневаюсь. Эта функция работает только с записями фиксированной длины, туда интегрирован встроенный TypeCast, который в строку-то скидывает, а вот обратно сложные типы восстановить не способен.
Последний раз редактировалось Borjomy_1 14 авг 2019, 14:07, всего редактировалось 1 раз.
Аватара пользователя
Select
developer
developer
Сообщения: 281
Зарегистрирован: 12 дек 2017, 23:56
Версия LabVIEW: 18
Откуда: Врата надежды.
Поблагодарили: 2 раза

Re: Чтение в кластер бинарных данных

Сообщение Select »

Borjomy_1 писал(а):IvanLis, Сомнительно. Вы попробуйте несколько записей с разным количеством элементов массива в файл ........Может, в 2016 и сделали такое, но я ОЧЕНЬ сильно сомневаюсь. Эта функция работает только с записями фиксированной длины.
Попробую собрать в 18. Предыдущий пост несколько прояснил принцип.
LabView 14,18
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Чтение в кластер бинарных данных

Сообщение Borjomy_1 »

Вот, что в Help пишут:
Тип данных устанавливает тип данных, которые функция использует для чтения из двоичного файла. Функция интерпретирует данные, начиная с текущей позиции файла, как количество экземпляров типа данных. Если типом является массив, строка или кластер, содержащий массив или строку, функция предполагает, что каждый экземпляр этого типа данных содержит информацию о размере. Если экземпляр не включает информацию о размере, функция неправильно интерпретирует данные. Если LabVIEW определяет, что данные не соответствуют типу, он устанавливает данные по умолчанию для указанного типа и возвращает ошибку.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Чтение в кластер бинарных данных

Сообщение IvanLis »

Select писал(а):Т.е. считывающий :vi: , должен иметь такую же структуру как записывающий, по аналогии как это происходит в одном :vi: ?
Нет, чтение и запись никак не связаны (я в одном :vi: сделал для удобства).
Но считывающий должен только однозначно знать структуру данных, которую необходимо читать.
По этому я и с самого начала говорил о TypeDef.
Аватара пользователя
Select
developer
developer
Сообщения: 281
Зарегистрирован: 12 дек 2017, 23:56
Версия LabVIEW: 18
Откуда: Врата надежды.
Поблагодарили: 2 раза

Re: Чтение в кластер бинарных данных

Сообщение Select »

IvanLis писал(а): Нет, чтение и запись никак не связаны (я в одном :vi: сделал для удобства).
Но считывающий должен только однозначно знать структуру данных, которую необходимо читать.
По этому я и с самого начала говорил о TypeDef.
Все это учел, разнес нужные куски по виайкам, ненужные кластера в каждом случае установил в hide, прописал пути файла. Все заработало.
Всех в который раз благодарю за своевременную поддержку и понимание :drink:
LabView 14,18
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Чтение в кластер бинарных данных

Сообщение IvanLis »

Borjomy_1 писал(а):Сомнительно. Вы попробуйте несколько записей с разным количеством элементов массива в файл сохранить, а потом считать последнюю. С программной точки зрения функция чтения должна прочитать каждую запись со своей длиной, с учетом размеров всех ее элементов. Может, в 2016 и сделали такое, но я ОЧЕНЬ сильно сомневаюсь. Эта функция работает только с записями фиксированной длины, туда интегрирован встроенный TypeCast, который в строку-то скидывает, а вот обратно сложные типы восстановить не способен.
Я не говорил, что можно считать какой-то конкретный блок данных или элемент массива.
Структура пишется полностью одним махом и так же считывается.
Потом из нее можно уже выбрать необходимые данные.

В ранее выложенных :vi: я и делал массивы разного размера, они сохранены "по умолчанию".

Вот более рандомная структура массивов. Подобное проделывал и в 2010, но сейчас минимальная 2012.
Запихивал туда и изображения разной размерности и Enum и Variant, не встречался ни разу с ошибками.
Снимок экрана от 2019-08-14 15-48-26.png
Untitled 3.vi
lv2012
(19.13 КБ) 79 скачиваний
Если Вы продемонстрируете повторяемую ошибку, буду признателен.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»