python之SCPI程控

        SCPI协议:SCPI协议建立于IEEE488.2基础上,可用于GPIB、RS232、VXIb总线,通过相同命令来控制不同仪器的相同功能,python SCPI程控,可以通过visa来进行控制。

        下面是简单基本的连接命令,open_resource中的是网口通信和USB通信的通信地址,如果连接成功会有产品型号等参数值返回。不同仪器的通信地址请参考相应的官方文档。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# author:SingWeek

import visa
rm=visa.ResourceManager()
res = rm.open_resource('TCPIP0::169.254.4.61::inst0::INSTR')#网口
res = rm.open_resource('USB0::0x0699::0x0368::c010850::INSTR')#串口
print(res.query("*IDN?"))#通用查询命令

        另外在电脑上还需要安装VISA驱动才能成功,驱动地址(百度云盘):链接:

       https://pan.baidu.com/s/1tNOMJiZPKB2UdrihUGTREA 提取码:tioa 
       python通过SCPI程控设备,一般操作也就需要用到visa中的三个函数,res.write(),res.read(),res.query()。如果不想调用python中写好的visa可以自己通过ctypes直接调用dll文件,dll=windll.LoadLibrary();然后直接对dll中的函数进行相关操作。python dll文件调用可以参考:https://blog.csdn.net/zx520113/article/details/85060765

        这里简单给出一个控制数字万用表34461的电流DC和AD选择以及电流当前电流参数的控制操作。可以通过pip install visa来安装visa库。 

class Multimeter:
    def __init__(self,TCPIP='TCPIP0::169.254.4.61::inst0::INSTR'):
        rm = visa.ResourceManager()
        self.ser=rm.open_resource(TCPIP)
    def Write(self,data):
        self.ser.write(data)
    def Set_DC(self,data=10):
        self.Write("CONF:CURR:DC "+str(data))
    def Set_AC(self,data=10):
        self.Write("CONF:CURR:AC " + str(data))
    def Read_IC(self):
        return float(self.ser.query("READ?"))
    def Read(self):
        return self.ser.read()

        query()相当于write()+read(),带有?的格式命令才有效。

   print(res.query("*IDN?"))     res.write("*IDN?")       print(res.read())

        例:对应的SCPI协议参数格式:

        CONFigure:CURRent:{AC|DC} [{|AUTO|MIN|MAX|DEF} [, {|MIN|MAX|DEF}]]

        在TCPIP或者USB中,通过visa控制发送的命令应该为:

        CONF:CURR:AC 1,0.001         设置交流测量

        CONF:CURR:DC 10,0.001       设置直流测量

        CONF:CURR:DC 10          默认测量精度最高

        Range为测量范围,resolution为测量精度,不设置默认最大。

        命令中大写字母部分必须完整,小写字母的部分可以不写。

        如果是RS232接口通信,可以通过serial库通过串口来进行控制,在这里或许会出现直接通过串口助手发送过去没有发应的情况,我们要注意命令的结束标志,一般是'\n',当然不同仪器的不同控制命令结束标志不同。在RS232连接的时候要注意串口号,以及设备设置IDE波特率等相关信息。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# author:SingWeek

import serial
ser=serial.Serial('COM16',19200,bytesize=8,parity="N",stopbits=1)
ser.write("*IDN?\n".encode())
result=ser.read(51)
print(result)

#设置的电流查询命令,返回三个通道的电流值
# ser.write("APP:CURR?\n".encode())
# result=ser.read(8)
# print(result)

        在通过RS232通信的时候,最好使用read读取数据,readlines(),read_all()等,在有些操作的时候不能读取返回值。

        基于SCPI的程控,不管是通过TCPIP、USB、还是RS232通信等,发送的命令在数据格式定义上都是大同小异的。

你可能感兴趣的:(Python,SCPI协议,SCPI程控,VISA程控,python程控,visa安装)