PyVisa教程-用Python控制儀器【9,開發PyVisa後臺】

起初,PyVISA是一個是VISA庫的Python容器,更準確的說是NI-VISA庫的ctypes容器。這種配置運行很好,但是無法控制NI-VISA。不支持的儀器。用戶需要使用採用不同的API的其他包來更改他們的程序。

從1.6開始,PyVISA變成了VISA庫的前端,提供了有好的,Python式的API,並能連接不同的位置。每個初始化實現低等級通訊的VisaLibraryBase派生類。基於NI-VISA庫的ctypes容器做爲替換初始(命名:ni),以便便捷性被PyVISA綁定。

可以利用@標記符初始化資源管理器的方法自定義定義。記住ni是替換的。

>>> import visa

>>> rm = visa.ResourceManager()

等同於

>>> import visa

>>> rm = visa.ResourceManager('@ni')

如果需要,亦可以提供文件路徑

>>> import visa

>>> rm = visa.ResourceManager('/path/to/lib@ni')

ResourceManager看起來像是請求預先的VISA庫實現。

PyVISA通過名稱載入一級。如果這樣做:

>>> import visa

>>> rm = visa.ResourceManager('@somename')

PyVISA將加載名稱爲pyvisa-somename的包/模塊,當然這必須已經安裝在系統中。這是一個簡易的松設置。PyVISA在實際使用之前,不需要知道任何後臺信息。

可以通過以下命令列出已經安裝的後臺信息:

python -m visa info

開發一款新後臺

一個最小化的後臺非常簡單:

from pyvisa.highlevel import VisaLibraryBase

 

class MyLibrary(VisaLibraryBase):

    pass

 

WRAPPER_CLASS = MyLibrary

此外,可以提供get_debug_info的靜態方法,這在調用“ python -m visa info”或“ pyvisa-info”時打印詞典類型的調試信息。

這是因爲任何包含pyvisa名稱的設置工具產生的腳步,被命名爲“ pyvisa-*-script”,而並非不是後臺。 pyvisa-shell”和“ pyvisa-info”腳本。

開發後臺需要知道VisaLibraryBase實現了什麼,哪些API需要開放。

完整的VISA庫實現,需要很多函數(基本上所有架構章節介紹的中等級函數,本節最後有詳細的列表)。然而,可工作的實現完全沒有實現。

非常簡易的實現需要:

  • open_default_resouce_manager:返回默認的ResourceManager設備中斷
  • 打開:打開設定設備例程
  • close:關閉設定的設備清單,事件或查找列表
  • list_resources:返回所有匹配查詢的設備元組

只是這樣,無法獲得任何有用信息。通常還需要:

  • get_attribute:返回設備的配置信息
  • set_attribute:設置或配置設備

需要傳輸數據給基於消息類型的儀器,還需要:

  • 閱讀:從設備或接口讀取數據
  • 寫:向設備或接口傳輸數據

對於設備的其他應用,需要實現其他的函數。這必然你和你的需要。

這些函數將產生“ pyvisa.errors.VisaIOError”或“ pyvisa.errors.VisaIOWarning”。

所需實現中等級函數的清單:

def read_memory(self, session, space, offset, width, extended=False):

def write_memory(self, session, space, offset, data, width, extended=False):

def move_in(self, session, space, offset, length, width, extended=False):

def move_out(self, session, space, offset, length, data, width, extended=False):

def peek(self, session, address, width):

def poke(self, session, address, width, data):

def assert_interrupt_signal(self, session, mode, status_id):

def assert_trigger(self, session, protocol):

def assert_utility_signal(self, session, line):

def buffer_read(self, session, count):

def buffer_write(self, session, data):

def clear(self, session):

def close(self, session):

def disable_event(self, session, event_type, mechanism):

def discard_events(self, session, event_type, mechanism):

def enable_event(self, session, event_type, mechanism, context=None):

def flush(self, session, mask):

def get_attribute(self, session, attribute):

def gpib_command(self, session, data):

def gpib_control_atn(self, session, mode):

def gpib_control_ren(self, session, mode):

def gpib_pass_control(self, session, primary_address, secondary_address):

def gpib_send_ifc(self, session):

def in_8(self, session, space, offset, extended=False):

def in_16(self, session, space, offset, extended=False):

def in_32(self, session, space, offset, extended=False):

def in_64(self, session, space, offset, extended=False):

def install_handler(self, session, event_type, handler, user_handle):

def list_resources(self, session, query='?*::INSTR'):

def lock(self, session, lock_type, timeout, requested_key=None):

def map_address(self, session, map_space, map_base, map_size,

def map_trigger(self, session, trigger_source, trigger_destination, mode):

def memory_allocation(self, session, size, extended=False):

def memory_free(self, session, offset, extended=False):

def move(self, session, source_space, source_offset, source_width, destination_space,

def move_asynchronously(self, session, source_space, source_offset, source_width,

def move_in_8(self, session, space, offset, length, extended=False):

def move_in_16(self, session, space, offset, length, extended=False):

def move_in_32(self, session, space, offset, length, extended=False):

def move_in_64(self, session, space, offset, length, extended=False):

def move_out_8(self, session, space, offset, length, data, extended=False):

def move_out_16(self, session, space, offset, length, data, extended=False):

def move_out_32(self, session, space, offset, length, data, extended=False):

def move_out_64(self, session, space, offset, length, data, extended=False):

def open(self, session, resource_name,

def open_default_resource_manager(self):

def out_8(self, session, space, offset, data, extended=False):

def out_16(self, session, space, offset, data, extended=False):

def out_32(self, session, space, offset, data, extended=False):

def out_64(self, session, space, offset, data, extended=False):

def parse_resource(self, session, resource_name):

def parse_resource_extended(self, session, resource_name):

def peek_8(self, session, address):

def peek_16(self, session, address):

def peek_32(self, session, address):

def peek_64(self, session, address):

def poke_8(self, session, address, data):

def poke_16(self, session, address, data):

def poke_32(self, session, address, data):

def poke_64(self, session, address, data):

def read(self, session, count):

def read_asynchronously(self, session, count):

def read_stb(self, session):

def read_to_file(self, session, filename, count):

def set_attribute(self, session, attribute, attribute_state):

def set_buffer(self, session, mask, size):

def status_description(self, session, status):

def terminate(self, session, degree, job_id):

def uninstall_handler(self, session, event_type, handler, user_handle=None):

def unlock(self, session):

def unmap_address(self, session):

def unmap_trigger(self, session, trigger_source, trigger_destination):

def usb_control_in(self, session, request_type_bitmap_field, request_id, request_value,

def usb_control_out(self, session, request_type_bitmap_field, request_id, request_value,

def vxi_command_query(self, session, mode, command):

def wait_on_event(self, session, in_event_type, timeout):

def write(self, session, data):

def write_asynchronously(self, session, data):

def write_from_file(self, session, filename, count):

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章