Основанная на регистре коммуникация Используя VISA

В этом примере показано, как сделать основанные на регистре операции чтения и операции записи для объектов VISA-GPIB-VXI и VISA-VXI.

Введение

Примеры, данные в этом примере, используют объект VISA-VXI. Однако можно также использовать объект VISA-GPIB-VXI. Обратитесь к справке командной строки на функции VISA, чтобы видеть, как создать объект VISA-GPIB-VXI.

Инструменты VXI или основаны на сообщении или основаны на регистре. Обычно это принято, что основанные на сообщении инструменты легче использовать, в то время как основанные на регистре инструменты быстрее.

Основанный на сообщении инструмент имеет свой собственный процессор, который позволяет ему интерпретировать высокоуровневые команды, такие как команда SCPI. Поэтому, чтобы связаться с основанным на сообщении инструментом, можно использовать ASCII или бинарное чтение и записать функции (FSCANF, FREAD, FPRINTF, FWRITE...). Если основанный на сообщении инструмент также содержит общую память, можно получить доступ к общей памяти посредством основанных на регистре операций чтения и операций записи.

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

Все инструменты VXI имеют пространство памяти A16, состоящее из 64 байтов. Это известно как пробел A16, потому что адреса 16 битов шириной. Основанные на регистре инструменты предоставляют карту распределения памяти адресного пространства, которое включает детали об информации, содержавшей в пробеле A16. Например, инструмент HP E1432A содержит следующую информацию:

  Offset              Information
  ------              -----------
  0                   ID Register
  2                   Device Type Register
  4                   Status Register
  6                   Offset Register

Некоторые инструменты VXI также имеют A24 или пробел A32, если 64 байтов, обеспеченных пробелом A16, недостаточно, чтобы выполнить необходимые задачи. Инструмент VXI не может использовать и A24 и пробел A32.

Требования

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

Используемый инструмент был Hewlett-Packard (HP) E1432A 51.2 kSa/s Цифровых преобразователя С 16 каналами плюс Модуль DSP.

Функции и свойства

Эти функции используются, чтобы выполнить основанные на регистре операции чтения и операции записи:

MEMMAP           - Map memory for low-level memory
                   read and write.
MEMPEEK          - Low-level memory read of instrument
                   register.
MEMPOKE          - Low-level memory write of instrument
                   register.
MEMREAD          - High-level memory read of instrument
                   register.
MEMUNMAP         - Unmap memory for low-level memory
                   read and write.
MEMWRITE         - High-level memory write to instrument
                   register.

Эти свойства сопоставлены с основанными на регистре операциями чтения и операциями записи:

MappedMemoryBase - The base address of the mapped memory
MappedMemorySize - The size of the mapped memory
MemoryBase       - Indicate the base address of the A24
                   or A32 space
MemoryIncrement  - Indicate whether the VXI registers are
                   read from or written to as block or FIFO
MemorySize       - Indicate the size of the A24 or A32
                   space
MemorySpace      - Indicate the type of memory space the
                   instrument supports

Создание объекта VISA

Чтобы начаться, создайте объект VISA-VXI. Инструмент HP E1432A VXI находится в первом шасси и имеет логический адрес 8.

>> v = visa('agilent', 'VXI0::8::INSTR');
  VISA-VXI Object Using AGILENT Adaptor : VISA-VXI0-8
  Communication Address
     ChassisIndex:       0
     LogicalAddress:     8
  Communication State
     Status:             closed
     RecordStatus:       off
  Read/Write State
     TransferStatus:     idle
     BytesAvailable:     0
     ValuesReceived:     0
     ValuesSent:         0

Соединение объекта VISA к инструменту

Прежде чем можно будет выполнить операцию чтения или операцию записи, необходимо соединить объект VISA-VXI с инструментом с функцией FOPEN. Если объект VISA-VXI был успешно соединен, его свойство Status автоматически сконфигурировано, чтобы открыться.

>> fopen(v)
>> get(v, 'Status')
ans =
open

Укажите характеристики

Укажите характеристические свойства - MemorySpace

Свойство MemorySpace указывает на тип пространства памяти инструментальные поддержки. По умолчанию все инструменты поддерживают пространство памяти A16. Однако это свойство может быть A16/A24 или A16/A32, если инструмент также поддерживает A24 или пространство памяти A32, соответственно.

>> get(v, 'MemorySpace')
ans =
A16/A24

Обратите внимание на то, что объект VXI должен быть соединен с инструментом, прежде чем свойство MemorySpace будет запрошено, в противном случае значение по умолчанию A16 возвращено.

Укажите характеристические свойства - MemoryBase и MemorySize

Свойство MemoryBase указывает на базовый адрес A24 или пробела A32, и задано как шестнадцатеричная строка. Свойство MemorySize указывает на размер A24 или пробела A32. Если инструмент VXI поддерживает только пространство памяти A16, значения по умолчанию MemoryBase к '0H %' и значения по умолчанию MemorySize к 0.

>> get(v, {'MemoryBase', 'MemorySize'})
ans =
   '200000H'    [262144]

Высокоуровневые операции чтения памяти и операции записи

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

Высокоуровневое чтение памяти

Прежде чем вы выполните операцию чтения или операцию записи, необходимо изучить информацию, хранившую регистрами инструмента. Документация HP E1432A утверждает, что первый 16-битный регистр, Регистр ID, предоставляет информацию о настройке инструмента. Это всегда задается как CFFF:

      Bits     Value     Description
      ====     =====     ===========
      15-14    11        indicating that the instrument
                         is register-based
      13-12    00        indicating that the instrument
                         supports the A24 memory space
      11-0     all 1's   HP's ID

MEMREAD позволяет вам читать uint8, uint16, uint32, или одно значения от заданного пространства памяти с заданным смещением. Например, считайте первый 16-битный регистр (смещение 0) как uint16.

>> data = memread(v, 0, 'uint16', 'A16')
data =
     53247
>> dec2hex(data)
ans =
CFFF
>> dec2bin(53247)
ans =
1100111111111111

Высокоуровневое чтение памяти - чтение блока данных

Также возможно считать блок данных с функцией MEMREAD. Например, считайте Регистр Регистра и Типа устройства ID инструмента.

Регистр ID был считан в предыдущем примере и должен иметь значение CFFF. Регистр Типа устройства является следующим регистром и определяется следующим образом:

    Bits               Contents
    ----               --------
    15-12              required A24 memory
    11-0               Model Code - should be 201H
>> data = memread(v, 0, 'uint16', 'A16', 2)
data =
     53247
     20993

Высокоуровневая запись памяти

Функция MEMWRITE позволяет вам писать uint8, uint16, uint32, или одно значения к заданному пространству памяти с заданным смещением.

Запишите значение в Регистр Смещения, который является при смещении 6 на пробеле A16. Регистр Смещения задает базовый адрес регистров A24 устройства. Обратите внимание на то, что это значение должно быть восстановлено, он - исходные значения, если вы хотите получить доступ к регистрам A24.

>> original_Value = memread(v, 6, 'uint16', 'A16');
>> memwrite(v, 40960, 6, 'uint16', 'A16');
>> memread(v, 6, 'uint16', 'A16')
ans =
   40960
>> memwrite(v, original_Value, 'uint16', 'A16');

Низкоуровневые операции чтения памяти и операции записи

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

Отображение пространства памяти

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

Обратите внимание на то, что, если память, которую требует функция MEMMAP, не существует, ошибка возвращена.

В этом примере сопоставьте первые 16 регистров пространства памяти A16:

>> memmap(v, 'A16', 0, 16);

Низкоуровневые свойства памяти - MappedMemoryBase и MappedMemorySize

Объект VISA-VXI имеет два свойства, которые указывают, была ли память сопоставлена: MappedMemoryBase и MappedMemorySize. Эти свойства похожи на свойства MemoryBase и MemorySize, которые описывают A24 или пространство памяти A32. Свойство MappedMemoryBase является базовым адресом расширенной памяти и задано как шестнадцатеричная строка. Свойство MappedMemorySize является размером расширенной памяти.

>> get(v, {'MappedMemoryBase', 'MappedMemorySize'})
ans =
   '16737610H'    [16]

Низкоуровневое чтение памяти

Функция MEMPEEK позволяет вам читать uint8, uint16, uint32, или одно значения от заданного смещения на пробеле расширенной памяти.

Например, считайте информации в Регистре ID. Это - первый регистр на пробеле A16:

>> mempeek(v, 0, 'uint16')
ans =
      53247

Теперь считайте информации в Регистре Типа устройства. Этот регистр также предоставляет информацию о настройке инструмента.

>> mempeek(v, 2, 'uint16')
ans =
      20993

Низкоуровневая запись памяти

Функция MEMPOKE позволяет вам писать uint8, uint16, uint32, или одно значения к заданному смещению на пробеле расширенной памяти.

Например, запишите значение в Регистр Смещения и проверьте, что значение было записано путем чтения нового значения Регистра Смещения.

>> original_Value = mempeek(v, 6, 'uint16');
>> mempoke(v, 45056, 6, 'uint16');
>> mempeek(v, 6, 'uint16')
ans =
    45056
>> mempoke(v, original_Value, 6, 'uint16');

Неотображение пространства памяти

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

>> memunmap(v)
>> get(v, {'MappedMemoryBase', 'MappedMemorySize'})
ans =
   '0H'    [0]

Обратите внимание на то, что, если память все еще сопоставлена, когда объект отключается от инструмента, память автоматически не сопоставлена для вас.

Очистка

Если вы закончены с объектом VISA-VXI, отключаете его от инструмента, удаляете его из памяти и удаляете его из рабочей области.

>> fclose(v);
>> delete(v);
>> clear v