В этом примере показано, как сделать основанные на регистре операции чтения и операции записи для объектов 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-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-VXI с инструментом с функцией FOPEN. Если объект VISA-VXI был успешно соединен, его свойство Status автоматически сконфигурировано, чтобы открыться.
>> fopen(v) >> get(v, 'Status')
ans =
open
Свойство MemorySpace указывает на тип пространства памяти инструментальные поддержки. По умолчанию все инструменты поддерживают пространство памяти A16. Однако это свойство может быть A16/A24 или A16/A32, если инструмент также поддерживает A24 или пространство памяти A32, соответственно.
>> get(v, 'MemorySpace')
ans =
A16/A24
Обратите внимание на то, что объект VXI должен быть соединен с инструментом, прежде чем свойство MemorySpace будет запрошено, в противном случае значение по умолчанию A16 возвращено.
Свойство 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);
Объект 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