exponenta event banner

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

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

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

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

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

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

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

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

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

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

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

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

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

Имя функции

Описание

binblockwrite

Запишите данные binblock в прибор.

fprintf

Запишите текст в прибор.

fwrite

Запишите двоичные данные в прибор.

stopasync

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

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

Имя свойства

Описание

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? команда состоит из шести значений, поскольку символ End-Of-String записывается в прибор, как указано в EOSMode и EOSCharCode свойства. Кроме того, формат данных по умолчанию для fprintf функция указывает, что одно значение соответствует одному байту.

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

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

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

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

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

  1. Создание объекта инструмента - создание объекта GPIB g связан с контроллером GPIB National Instruments ® с индексом платы 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

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

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

Имя функции

Описание

binblockread

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

fgetl

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

fgets

Прочтите одну строку текста из прибора и включите признак конца.

fread

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

fscanf

Считывание данных из прибора и форматирование в виде текста.

readasync

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

scanstr

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

stopasync

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

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

Имя свойства

Описание

BytesAvailable

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

InputBufferSize

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

ReadAsyncMode

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

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 National Instruments с индексом платы 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 и последовательных объектов 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);