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} [{<range>|AUTO|MIN|MAX|DEF} [, {<resolution>|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通信等,发送的命令在数据格式定义上都是大同小异的。