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

Прежде, чем Выполнить Операции Чтения-записи

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

Прежде, чем выполнить запись или операцию чтения, необходимо рассмотреть эти три вопроса:

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

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

  • Данные должны быть переданы (числовой) двоичный файл или текст (ASCII)?

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

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

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

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

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

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

FunctionName

Описание

binblockwrite

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

fprintf

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

fwrite

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

stopasync

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

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

PropertyName

Описание

BytesToOutput

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

OutputBufferSize

Задайте размер буфера вывода в байтах.

Timeout

Задайте время ожидания, чтобы завершить операцию чтения или операцию записи.

TransferStatus

Укажите, происходят ли асинхронная операция чтения или операция записи.

ValuesSent

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

Буфер вывода и поток данных

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

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

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

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

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

ans =

   512
g.BytesToOutput

ans =

     0

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

Примечание

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

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

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

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

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

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

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

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

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

    g = gpib('ni',0,1);
    g.OutputBufferSize = 3000;
  2. Соединитесь с инструментом — Подключение g к инструменту.

    fopen(g)
  3. Запишите и считайте данные — команды строки Записи, которые конфигурируют осциллограф, чтобы хранить данные о сигнале в двоичной форме в ячейке памяти A.

    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]);

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

    g.ValuesSent
    ans =
            2577
  4. Разъединитесь и вымойтесь — Когда вам больше не нужен g, необходимо отключить его от инструмента, удалить его из памяти и удалить его из рабочего пространства MATLAB.

    fclose(g)
    delete(g)
    clear g

Синхронный по сравнению с асинхронными операциями записи

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

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

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

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

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

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

g.TransferStatus
ans =
write

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

g.BytesToOutput
ans =
        2512

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

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

FunctionName

Описание

binblockread

Считайте binblock данные из инструмента.

fgetl

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

fgets

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

fread

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

fscanf

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

readasync

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

scanstr

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

stopasync

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

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

PropertyName

Описание

BytesAvailable

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

InputBufferSize

Задайте размер входного буфера в байтах.

ReadAsyncMode

Задайте, является ли асинхронное чтение непрерывным или ручным (только последовательный порт, TCPIP, UDP и последовательные ВИЗОЙ объекты).

Timeout

Задайте время ожидания, чтобы завершить операцию чтения или операцию записи.

TransferStatus

Укажите, происходят ли асинхронная операция чтения или операция записи.

ValuesReceived

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

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

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

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

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

Свойство InputBufferSize задает максимальное количество байтов, которые можно сохранить во входном буфере. Свойство 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, сопоставленный с Национальным Инструментальным контроллером 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

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

    g.ValuesReceived
    ans =
         65
  4. Разъединитесь и вымойтесь — Когда вам больше не нужен g, необходимо отключить его от инструмента, удалить его из памяти и удалить его из рабочего пространства MATLAB.

    fclose(g)
    delete(g)
    clear g

Синхронный по сравнению с асинхронными операциями чтения

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

Примечание

Для последовательного порта, TCPIP, UDP и последовательных ВИЗОЙ объектов, можно также выполнить асинхронную операцию чтения путем конфигурирования свойства 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);
Для просмотра документации необходимо авторизоваться на сайте