Запись и чтение данных

Перед выполнением операций чтения/записи

Связь с вашим инструментом включает запись и чтение данных. Например, вы можете записать текстовую команду в генератор функций, который запрашивает его пиковое напряжение и затем считать назад значение напряжения как массив двойной точности.

Перед выполнением операции write или read необходимо рассмотреть эти три вопроса:

  • Каков процесс потока данных из MATLAB?® рабочей области к инструменту, и от инструмента к рабочему пространству MATLAB?

    Instrument Control Toolbox™ автоматически управляет данными, переданными между рабочим пространством MATLAB и инструментом. Для многих распространенных приложений можно игнорировать процесс буферизации и потока данных. Однако, если вы переносите большое количество значений, выполняете операцию асинхронного чтения или записи или отлаживаете ваше приложение, вам может потребоваться знать, как этот процесс работает.

  • Передаются ли данные двоичные (числовые) или текстовые (ASCII)?

    Для многих инструментов запись текстовых данных означает запись строковых команд, которые изменяют настройки инструмента, готовят инструмент к возвращению данных или информации о состоянии и так далее. Запись двоичных данных означает запись числовых значений в инструмент, такой как данные калибровки или формы волны.

  • Будет ли write или read доступ функционального блока к Командному окну MATLAB?

    Вы управляете доступом к Командному окну MATLAB, определяя, является ли операция чтения или записи синхронной или асинхронной. Синхронная операция блокирует доступ к командной строке, пока функция чтения или записи не завершит выполнение. Асинхронная операция не блокирует доступ к командной строке, и можно выдавать дополнительные команды во время read или write функция выполняется в фоновом режиме.

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

Запись данных

Функции, связанные с записью данных

Имя функции

Описание

binblockwrite

Запишите данные бинблока в инструмент.

fprintf

Напишите текст в инструмент.

fwrite

Запишите двоичные данные в инструмент.

stopasync

Остановите асинхронные операции чтения и записи.

Свойства, связанные с записью данных

Имя свойства

Описание

BytesToOutput

Укажите количество байтов в буфере выхода.

OutputBufferSize

Укажите размер выходного буфера в байтах.

Timeout

Укажите время ожидания для завершения операции чтения или записи.

TransferStatus

Указывает, выполняется ли операция асинхронного чтения или записи.

ValuesSent

Укажите общее количество значений, записанных в инструмент.

Выходной буфер и поток данных

Буфер выхода является памятью компьютера, выделенной объектом инструмента для хранения данных, которые должны быть записаны в инструмент. Поток данных из рабочего пространства MATLAB в ваш инструмент следует следующим шагам:

  1. Данные, заданные в write функция отправляется в выходной буфер.

  2. Данные в выход буфере посылаются в прибор.

The OutputBufferSize свойство задает максимальное количество байтов, которые можно хранить в выходе буфере. The BytesToOutput свойство указывает количество байтов в буфере выхода. Значения по умолчанию для этих свойств:

g = gpib('ni',0,1);
g.OutputBufferSize

ans =

   512
g.BytesToOutput

ans =

     0

Если вы пытаетесь записать больше данных, чем может поместиться в выход буфер, возвращается ошибка, и данные не записываются.

Примечание

При записи данных может потребоваться задать значение, которое может состоять из одного или нескольких байтов. Это потому, что некоторые функции записи позволяют вам управлять количеством бит, записанных для каждого значения, и интерпретацией этих бит как значений символов, целого числа или с плавающей точкой. Для примера, если вы записываете одно значение из инструмента, используя int32 формат, затем это значение состоит из четырех байтов.

Например, предположим, что вы записываете строковую команду *IDN? к инструменту используя fprintf функция. Как показано ниже, строка сначала записывается в выходной буфер как шесть значений.

The *IDN? команда состоит из шести значений, поскольку символ End-Of-String записывается в инструмент, как задано в EOSMode и EOSCharCode свойства. Более того, формат данных по умолчанию для fprintf функция задает, что одно значение соответствует одному байту.

Как показано ниже, после того, как строка сохранена в выход буфере, она затем записывается в инструмент.

Запись текстовых данных в зависимости от записи двоичных данных

Для многих инструментов запись текстовых данных означает запись строковых команд, которые изменяют настройки инструмента, готовят инструмент к возвращению данных или информации о состоянии и так далее. Запись двоичных данных означает запись числовых значений в инструмент, такой как данные калибровки или формы волны.

Вы можете записать текстовые данные с fprintf функция. По умолчанию, fprintf использует %s\n формат, который форматирует данные как строку и включает терминатор строки. Вы можете записать двоичные данные с fwrite функция. По умолчанию fwrite записывает данные с помощью uchar точность, которая преобразует данные как беззнаковые 8-битные символы. Обе эти функции поддерживают многие другие форматы и точности, как описано на их страницах с описанием.

Следующий пример иллюстрирует запись текстовых данных и двоичных данных в Tektronix® осциллограф TDS 210. Текстовые данные состоят из строковых команд, в то время как двоичные данные являются формой волны, которая должна быть загружена в возможности и сохранена в ее памяти:

  1. Создайте объект инструмента - Создайте объект GPIB g связанные с National Instruments ™® Контроллер GPIB с индексом платы 0 и инструмент с первичным адресом 1. Размер выходного буфера увеличивается для размещения данных формы волны. Необходимо сконфигурировать OutputBufferSize свойство, в то время как объект GPIB отключен от инструмента.

    g = gpib('ni',0,1);
    g.OutputBufferSize = 3000;
  2. Соедините с прибором - Соедините g к прибору.

    fopen(g)
  3. Запись и чтение данных - Запись строковых команд, которые конфигурируют возможности для хранения двоичных данных формы волны в расположении памяти А.

    fprintf(g,'DATA:DESTINATION REFA');
    fprintf(g,'DATA:ENCDG SRPbinary');
    fprintf(g,'DATA:WIDTH 1');
    fprintf(g,'DATA:START 1');

    Создайте данные формы волны.

    t = linspace(0,25,2500);
    data = round(sin(t)*90 + 127);

    Запишите двоичные данные формы волны в возможности.

    cmd = double('CURVE #42500');
    fwrite(g,[cmd data]);

    The ValuesSent свойство указывает общее количество значений, записанных на инструмент.

    g.ValuesSent
    ans =
            2577
  4. Отсоедините и очистите - когда вам больше не нужно g, следует отсоединить его от инструмента, удалить из памяти и удалить из рабочего пространства MATLAB.

    fclose(g)
    delete(g)
    clear g

Операции синхронной и асинхронной записи

По умолчанию все функции записи работают синхронно и блокируют Командное окно MATLAB до завершения операции. Чтобы выполнить операцию асинхронной записи, вы поставляете async входной параметр в fprintf или fwrite функция.

Для примера вы используете следующий синтаксис, чтобы изменить fprintf команды, используемые в предыдущем примере для асинхронной записи текстовых данных.

fprintf(g,'DATA:DESTINATION REFA','async');

Точно так же вы используете следующий синтаксис, чтобы изменить fwrite команда, используемая в предыдущем примере, для асинхронной записи двоичных данных.

fwrite(g,[cmd data],'async');

Вы можете контролировать состояние операции асинхронной записи с помощью TransferStatus свойство. Значение idle указывает, что асинхронные операции не выполняются.

g.TransferStatus
ans =
write

Можно использовать BytesToOutput свойство, указывающее количество байтов, существующих в выходном буфере, ожидающем записи в инструмент.

g.BytesToOutput
ans =
        2512

Чтение данных

Функции, связанные с чтением данных

Имя функции

Описание

binblockread

Считайте данные бинблока из инструмента.

fgetl

Прочитайте одну линию текста из инструмента и сбросьте терминатор строки.

fgets

Прочитайте одну линию текста из инструмента и включите терминатор строки.

fread

Считайте двоичные данные с прибора.

fscanf

Считывайте данные с инструмента и форматируйте как текст.

readasync

Считывайте данные асинхронно с прибора.

scanstr

Считывайте данные с инструмента, форматируйте как текст и анализируйте

stopasync

Остановите асинхронные операции чтения и записи.

Свойства, связанные с чтением данных

Имя свойства

Описание

BytesAvailable

Укажите количество байтов, доступных в входе буфере.

InputBufferSize

Укажите размер входного буфера в байтах.

ReadAsyncMode

Укажите, является ли асинхронное чтение непрерывным или ручным (только последовательный порт, TCPIP, UDP и VISA-последовательные объекты).

Timeout

Укажите время ожидания для завершения операции чтения или записи.

TransferStatus

Указывает, выполняется ли операция асинхронного чтения или записи.

ValuesReceived

Укажите общее количество значений, считанных с прибора.

Входной буфер и поток данных

Буфер входа является памятью компьютера, выделенной объектом прибора для хранения данных, которые должны считываться с прибора. Поток данных из вашего инструмента в рабочее пространство MATLAB следует следующим шагам:

  1. Данные, считанные с прибора, хранятся в входе буфере.

  2. Данные в вход буфере возвращаются в Переменный MATLAB, заданную функцией read.

The InputBufferSize свойство задает максимальное количество байтов, которые можно хранить в входе буфере. The BytesAvailable свойство указывает количество байтов, доступных для чтения из буфера входа. Значения по умолчанию для этих свойств:

g = gpib('ni',0,1);
g.InputBufferSize

ans =

   512
g.BytesAvailable

ans =

     0

Если вы пытаетесь считать больше данных, чем может поместиться в вход буфере, возвращается ошибка, и данные не считываются.

Например, предположим, что вы используете fscanf функция для чтения текстовой характеристики *IDN? команда, ранее записанная в инструмент. Данные сначала считываются в буфер входа.

Обратите внимание, что для данной операции чтения вы можете не знать количество байтов, возвращенных инструментом. Поэтому вам может потребоваться предустановить InputBufferSize свойство к достаточно большому значению перед соединением объекта прибора.

Как показано ниже, после того, как данные хранятся в входе буфере, они затем передаются в переменный выход, заданную как fscanf.

Чтение текстовых данных в зависимости от чтения двоичных данных

Для многих инструментов чтение текстовых данных означает чтение строковых данных, которые отражают настройки инструмента, информацию о состоянии и так далее. Чтение двоичных данных означает считывание числовых значений с прибора.

Вы можете считать текстовые данные с fgetl, fgets, и fscanf функций. По умолчанию эти функции возвращают данные с помощью %c формат. Вы можете считать двоичные данные с fread функция. По умолчанию fread возвращает числовые значения как массивы двойной точности. Оба fscanf и fread функции поддерживают многие другие форматы и точности, как описано в их страницах с описанием.

Следующий пример иллюстрирует чтение текстовых данных и двоичных данных с осциллографа Tektronix TDS 210, который отображает периодический входной сигнал с номинальной частотой 1,0 кГц.

  1. Создайте объект инструмента - Создайте объект GPIB g сопоставлен с National Instruments ™ контроллером GPIB с индексом платы 0 и с инструментом с первичным адресом 1.

    g = gpib('ni',0,1);
  2. Соедините с прибором - Соедините g к прибору.

    fopen(g)
  3. Запись и чтение данных - Запись *IDN? Командой к возможностям и считайте идентификационную информацию как текст.

    fprintf(g,'*IDN?')
    idn = fscanf(g)
    idn =
    TEKTRONIX,TDS 210,0,CF:91.1CT FV:v1.16 TDS2CM:CMV:v1.04

    Сконфигурируйте возможности, чтобы вернуть период входного сигнала, и затем считайте период как двоичное значение. Формат вывода сконфигурирован, чтобы использовать краткое экспоненциальное обозначение для двойных чисел.

    fprintf(g,'MEASUREMENT:MEAS1:TYPE PERIOD')
    fprintf(g,'MEASUREMENT:MEAS1:VALUE?')
    format short e
    period = fread(g,9)'
    period =
        49    46    48    48    54    69    45    51    10

    period состоит из положительных целых чисел, представляющих коды символов, где 10 является линия каналом. Чтобы преобразовать значение периода в строку, используйте char функция.

    char(period)
    ans =
    1.006E-3

    The ValuesReceived свойство указывает общее количество значений, считанных с прибора.

    g.ValuesReceived
    ans =
         65
  4. Отсоедините и очистите - когда вам больше не нужно g, следует отсоединить его от инструмента, удалить из памяти и удалить из рабочего пространства MATLAB.

    fclose(g)
    delete(g)
    clear g

Операции синхронного и асинхронного чтения

fgetl, fgets, fscanf, и fread функции работают синхронно и блокируют Командное окно MATLAB до завершения операции. Чтобы выполнить операцию асинхронного чтения, вы используете readasync функция. readasync асинхронно считывает данные с прибора и сохраняет их в вход буфере. Чтобы перенести данные из буфера входа в Переменный MATLAB, вы используете одну из функций синхронного чтения.

Примечание

Для последовательных портов, TCPIP, UDP и VISA-последовательных объектов можно также выполнить операцию асинхронного чтения путем настройки ReadAsyncMode свойство к continuous.

Например, чтобы изменить предыдущий пример, чтобы асинхронно считать идентификационную информацию возможностей, вы бы выпустили readasync функция после *IDN? команда записывается.

fprintf(g,'*IDN?')
readasync(g)

Вы можете контролировать состояние операции асинхронного чтения с помощью TransferStatus свойство. Значение idle указывает, что асинхронные операции не выполняются.

g.TransferStatus
ans =
read

Можно использовать BytesAvailable свойство, указывающее количество байтов, существующих во входном буфере, ожидающем передачи в рабочее пространство MATLAB.

g.BytesAvailable
ans =
     56

Когда чтение завершается, можно перенести данные как текст в переменный MATLAB с помощью fscanf функция.

idn = fscanf(g);