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

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

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

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

  • Каков процесс который потоки данных с рабочей области 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 входной параметр к 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

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

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

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.

Чтение текстовых данных по сравнению с чтением двоичных данных

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

Можно считать текстовые данные с fgetlfgets, и 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

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

fgetlfgetsfscanf, и 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);