I've made progress since earlier, here are some notes. I'm a LXI / VXI11 / USBTMC newb so any tips and corrections are appreciated.
* I haven't gotten USBTMC working. Yes, I have selected USBTMC in the settings menu. The TO1104 doesn't reliably enumerate and even when it appears to succeed, I get:
import usbtmc
scope= usbtmc.Instrument(idVendor=0x18D1,idProduct=0x0303)
scope.ask("*IDN?")
# USBError: [Errno None] b'libusb0-dll:err [control_msg] sending control message failed, win error: A device attached to the system is not functioning.\r\n\n'
* The Micsig app appears to listen for proprietary (afaik) broadcast UDP packets and then connect using VLC over port 8888. This interface is not particularly useful for scripting.
* It appears that VXI11 discovery is broken. I'm new to these standards, but I believe what is supposed to happen is that a connection to a RPC directory service on port 111 is supposed to return the actual port number that responds to SCPI commands. My TO1104 does not listen to port 111. The connection always fails:
import pyvisa
rm = pyvisa.ResourceManager("@py")
scope = rm.open_resource("TCPIP::192.168.0.109::INSTR")
# VI_ERROR_RSRC_NFOUND
* A portscan reveals the following open ports:
* Connecting directly to port 18212 works!
# pip install pyvisa pyvisa-py
import pyvisa
rm = pyvisa.ResourceManager("@py")
scope = rm.open_resource("TCPIP::192.168.0.109::18212::SOCKET")
scope.read_termination = '\r\n' # It fails to recognize end-of-response and times out with default
scope.query("*IDN?") # sanity check. 'Micsig, TO1104M, 313100050, 6.11'
* Kinda. You get one chance. You can't open two connections at once and I haven't found a way of properly closing a connection (in the sense of allowing reconnect) aside from restarting the scope.
* Now that the connectivity is only 3/4 broken it's time to figure out what SCPI we can use. I found an old unencrypted firmware and dumped the following from the "Desktop" and "oscillo_pad" executables:
*ESE?
*ESR?
*IDN?
*OPC?
*SRE?
*STB?
*TST?
:AUTO
:BEEP
:CALibrate:ADGain
:CALibrate:ADGain?
:CALibrate:ADPHa
:CALibrate:ADPHa?
:CALibrate:CHDF
:CALibrate:CHDF?
:CALibrate:CHGain
:CALibrate:CHGain?
:CALibrate:DATE:GET
:CALibrate:DATE:LENGth?
:CALibrate:DATE?
:CALibrate:FILE:RESet?
:CALibrate:OFFSet
:CALibrate:OFFSet?
:CALibrate:QUIT
:CALibrate:RESult?
:CALibrate:STARt
:CALibrate:STOP
:CALibrate:TRIGger:AC:ZERopoint
:CALibrate:TRIGger:AC:ZERopoint?
:CALibrate:TRIGger:COEFficient
:CALibrate:TRIGger:COEFficient?
:CALibrate:TRIGger:PRECise
:CALibrate:TRIGger:PRECise?
:CALibrate:TRIGger:ZERopoint
:CALibrate:TRIGger:ZERopoint?
:CALibrate:ZERopoint
:CALibrate:ZERopoint?
:CHANnel:BAND
:CHANnel:BAND?
:CHANnel:COUPle
:CHANnel:COUPle?
:CHANnel:DISPlay
:CHANnel:DISPlay?
:CHANnel:EXTent
:CHANnel:EXTent?
:CHANnel:INPutres
:CHANnel:INPutres?
:CHANnel:INVerse
:CHANnel:INVerse?
:CHANnel:PLUS:EXTent
:CHANnel:PLUS:POSition
:CHANnel:POSition
:CHANnel:POSition?
:CHANnel:PROBe
:CHANnel:PROBe?
:CHANnel:PRTY
:CHANnel:PRTY?
:CHANnel:VERNier
:CHANnel:VERNier?
:CHANnel#:COUPle
:CHANnel#:COUPle?
:CHANnel#:DISPlay
:CHANnel#:DISPlay?
:CHANnel#:INPutres
:CHANnel#:INPutres?
:CHANnel#:INVerse
:CHANnel#:INVerse?
:CHANnel#:PC
:CHANnel#:PC?
:CHANnel#:POSition
:CHANnel#:POSition?
:CHANnel#:PROBe
:CHANnel#:PROBe?
:CHANnel#:PRTY
:CHANnel#:PRTY?
:CHANnel#:SCALe
:CHANnel#:SCALe?
:CHANnel#:VERNier
:CHANnel#:VERNier?
:CURSor:CXA
:CURSor:CXA?
:CURSor:CXB
:CURSor:CXB?
:CURSor:CYA
:CURSor:CYA?
:CURSor:CYB
:CURSor:CYB?
:CURSor:HORizontal
:CURSor:HORizontal?
:CURSor:PLUS:CXA
:CURSor:PLUS:CXB
:CURSor:PLUS:CYA
:CURSor:PLUS:CYB
:CURSor:RATio?
:CURSor:SOURce
:CURSor:SOURce?
:CURSor:VERTical
:CURSor:VERTical?
:CURSor:XAValue?
:CURSor:XBValue?
:CURSor:XDELta?
:CURSor:YAValue?
:CURSor:YBValue?
:CURSor:YDELta?
:DISPlay:BRIGhtness
:DISPlay:BRIGhtness?
:DISPlay:GRATicule
:DISPlay:GRATicule?
:DISPlay:HIGH
:DISPlay:HIGH?
:DISPlay:HORRef
:DISPlay:HORRef?
:DISPlay:INTensity
:DISPlay:INTensity?
:DISPlay:PERSist:ADJust
:DISPlay:PERSist:ADJust?
:DISPlay:PERSist:CLEar
:DISPlay:PERSist:MODE
:DISPlay:PERSist:MODE?
:DISPlay:WAVeform
:DISPlay:WAVeform?
:DISPlay:ZOOM
:DISPlay:ZOOM?
:INTerface:BATTery?
:INTerface:CLEAn
:INTerface:LOCK
:INTerface:PHOTos
:INTerface:RESTart
:INTerface:SCOPe
:INTerface:SETTing:BRIGhtness
:INTerface:SETTing:BRIGhtness?
:INTerface:SETTing:LANGuage
:INTerface:SETTing:LANGuage?
:INTerface:SETTing:SHUTdown
:INTerface:SETTing:SHUTdown?
:INTerface:SETTing:STANdby
:INTerface:SETTing:STANdby?
:INTerface:SETTing:USB
:INTerface:SETTing:USB?
:INTerface:SETTing:VOLume
:INTerface:SETTing:VOLume?
:INTerface:SHUTdown
:INTerface:STANdby
:INTerface:SYSTem?
:INTerface:TIME
:INTerface:TIME?
:INTerface:UNLock
:LAN:DNS
:LAN:DNS?
:LAN:IPADdress
:LAN:IPADdress?
:LAN:IPSetting
:LAN:IPSetting?
:LAN:MAC?
:LAN:ROUTer
:LAN:ROUTer?
:LAN:SUBMask
:LAN:SUBMask?
:LAN:VISA?
:MASK:AUXout
:MASK:AUXout?
:MASK:ENABle
:MASK:ENABle?
:MASK:OPERate
:MASK:OPERate?
:MASK:RANGe
:MASK:RANGe?
:MASK:RESet
:MASK:SOOutput
:MASK:SOOutput?
:MASK:SOURce
:MASK:SOURce?
:MASK:STATistic
:MASK:STATistic?
:MASK:X
:MASK:X?
:MASK:Y
:MASK:Y?
:MATH:ADD:EXTent
:MATH:ADD:EXTent?
:MATH:ADD:OFFSet
:MATH:ADD:OFFSet?
:MATH:ADD:PLUS:EXTent
:MATH:ADD:PLUS:OFFSet
:MATH:ADD:S1
:MATH:ADD:S1?
:MATH:ADD:S2
:MATH:ADD:S2?
:MATH:ADVanced:EXPRession
:MATH:ADVanced:EXPRession?
:MATH:ADVanced:EXTent
:MATH:ADVanced:EXTent?
:MATH:ADVanced:OFFSet
:MATH:ADVanced:OFFSet?
:MATH:ADVanced:VAR1
:MATH:ADVanced:VAR1?
:MATH:ADVanced:VAR2
:MATH:ADVanced:VAR2?
:MATH:DISPlay
:MATH:DISPlay?
:MATH:DIV:EXTent
:MATH:DIV:EXTent?
:MATH:DIV:OFFSet
:MATH:DIV:OFFSet?
:MATH:DIV:PLUS:EXTent
:MATH:DIV:PLUS:OFFSet
:MATH:DIV:S1
:MATH:DIV:S1?
:MATH:DIV:S2
:MATH:DIV:S2?
:MATH:FFT:EXTent
:MATH:FFT:EXTent?
:MATH:FFT:OFFSet
:MATH:FFT:OFFSet?
:MATH:FFT:PLUS:EXTent
:MATH:FFT:PLUS:OFFSet
:MATH:FFT:SOURce
:MATH:FFT:SOURce?
:MATH:FFT:TYPE
:MATH:FFT:TYPE?
:MATH:FFT:WINDow
:MATH:FFT:WINDow?
:MATH:FILTer:BANDwidth
:MATH:FILTer:BANDwidth?
:MATH:FILTer:EXTent
:MATH:FILTer:EXTent?
:MATH:FILTer:FORMat
:MATH:FILTer:FORMat?
:MATH:FILTer:OFFSet
:MATH:FILTer:OFFSet?
:MATH:FILTer:SOURce
:MATH:FILTer:SOURce?
:MATH:LOGic:EXTent
:MATH:LOGic:EXTent?
:MATH:LOGic:OFFSet
:MATH:LOGic:OFFSet?
:MATH:LOGic:OPERator
:MATH:LOGic:OPERator?
:MATH:LOGic:S1
:MATH:LOGic:S1?
:MATH:LOGic:S2
:MATH:LOGic:S2?
:MATH:MODE
:MATH:MODE?
:MATH:MUL:EXTent
:MATH:MUL:EXTent?
:MATH:MUL:OFFSet
:MATH:MUL:OFFSet?
:MATH:MUL:PLUS:EXTent
:MATH:MUL:PLUS:OFFSet
:MATH:MUL:S1
:MATH:MUL:S1?
:MATH:MUL:S2
:MATH:MUL:S2?
:MATH:SUB:EXTent
:MATH:SUB:EXTent?
:MATH:SUB:OFFSet
:MATH:SUB:OFFSet?
:MATH:SUB:PLUS:EXTent
:MATH:SUB:PLUS:OFFSet
:MATH:SUB:S1
:MATH:SUB:S1?
:MATH:SUB:S2
:MATH:SUB:S2?
:MEASure:ADISplay
:MEASure:ADISplay?
:MEASure:AMP?
:MEASure:AREa?
:MEASure:BURStwidth?
:MEASure:CARea?
:MEASure:CLEar
:MEASure:CLOSe
:MEASure:CMEan?
:MEASure:COUNter:VALue?
:MEASure:CRMS?
:MEASure:DELay?
:MEASure:FALLtime?
:MEASure:FREQuency?
:MEASure:HIGH?
:MEASure:ITEM
:MEASure:ITEM?
:MEASure:LOW?
:MEASure:MAX?
:MEASure:MEAN?
:MEASure:MIN?
:MEASure:NDUTy?
:MEASure:NOVershoot?
:MEASure:NWIDth?
:MEASure:OPEN
:MEASure:PDUTy?
:MEASure:PERiod?
:MEASure:PHASe?
:MEASure:PKPK?
:MEASure:POVershoot?
:MEASure:PWIDth?
:MEASure:RISetime?
:MEASure:RMS?
:MEASure:SCOPe
:MEASure:SCOPe?
:MEASure:SOURce
:MEASure:SOURce?
:MEASure:STATistic:DISPlay
:MEASure:STATistic:DISPlay?
:MEASure:STATistic:RESet
:MENU:AUTO
:MENU:BEEP
:MENU:COUNter
:MENU:COUNter?
:MENU:HALF:CHANnel
:MENU:HALF:LEVel
:MENU:HALF:TRIGpos
:MENU:HALF:XCURsor
:MENU:HALF:YCURsor
:MENU:HOMepage
:MENU:LOCK
:MENU:MEASure
:MENU:MULTiple
:MENU:RESet
:MENU:RETurn
:MENU:RUN
:MENU:SINGle
:MENU:STOP
:MENU:TRIGger
:MENU:UNLock
:MULTiple
:PRIVate:BANDwidth
:PRIVate:BANDwidth?
:PRIVate:DELiverydate
:PRIVate:DELiverydate?
:PRIVate:DISPlay:SERiaino
:PRIVate:DISPlay:SERiaino?
:PRIVate:HWVersion
:PRIVate:HWVersion?
:PRIVate:MACHinetype
:PRIVate:MACHinetype?
:PRIVate:REBoot
:PRIVate:SERiaino
:PRIVate:SERiaino?
:PRIVate:SETTing:CLEar
:PRIVate:STARt
:PRIVate:STATe?
:PRIVate:STOP
:PRIVate:STRingcode
:PRIVate:UUID?
:REFerence:CURRent
:REFerence:DISPlay
:REFerence:DISPlay?
:REFerence:ENABle
:REFerence:ENABle?
:REFerence:HSCale
:REFerence:HSCale?
:REFerence:PLUS:HOFFset
:REFerence:PLUS:HSCale
:REFerence:PLUS:VOFFset
:REFerence:PLUS:VSCale
:REFerence:VSCale
:REFerence:VSCale?
:SAMPle:ENVelop
:SAMPle:ENVelop?
:SAMPle:MDEPth?
:SAMPle:MEAN
:SAMPle:MEAN?
:SAMPle:SEGMented
:SAMPle:SRATe?
:SAMPle:TYPE
:SAMPle:TYPE?
:SINGle
:STOP
:STORage:CAPTure
:STORage:CONLoad
:STORage:CONSave
:STORage:DEPTh
:STORage:DEPTh?
:STORage:LOAD
:STORage:PLAY
:STORage:PLAY:BACK
:STORage:PLAY:BACK?
:STORage:PLAY:SPEed
:STORage:PLAY:SPEed?
:STORage:PLAY?
:STORage:RECord
:STORage:RECord?
:STORage:SAVE
:SYS:SCReen?
:SYS:SN?
:SYS:TOUCh
:SYS:WRIT?
:TIMebase:EXTent
:TIMebase:EXTent?
:TIMebase:MODE
:TIMebase:MODE?
:TIMebase:OFFSet
:TIMebase:OFFSet?
:TIMebase:PLUS:EXTent
:TIMebase:PLUS:OFFSet
:TIMebase:XY1:DISPlay
:TIMebase:XY1:DISPlay?
:TRIGger:B:COUPle
:TRIGger:B:COUPle?
:TRIGger:B:EDGE
:TRIGger:B:EDGE?
:TRIGger:B:LEVel
:TRIGger:B:LEVel?
:TRIGger:B:SEQuence
:TRIGger:B:SEQuence?
:TRIGger:B:SOURce
:TRIGger:B:SOURce?
:TRIGger:CAN:DATA
:TRIGger:CAN:DATA?
:TRIGger:CAN:DLC
:TRIGger:CAN:DLC?
:TRIGger:CAN:ID
:TRIGger:CAN:ID?
:TRIGger:CAN:LEVel
:TRIGger:CAN:LEVel?
:TRIGger:CAN:SOURce
:TRIGger:CAN:SOURce?
:TRIGger:CAN:TYPE
:TRIGger:CAN:TYPE?
:TRIGger:DWARt:BTIMe
:TRIGger:DWARt:BTIMe?
:TRIGger:DWARt:CONDition
:TRIGger:DWARt:CONDition?
:TRIGger:DWARt:HLEVel
:TRIGger:DWARt:HLEVel?
:TRIGger:DWARt:HTIMe
:TRIGger:DWARt:HTIMe?
:TRIGger:DWARt:LLEVel
:TRIGger:DWARt:LLEVel?
:TRIGger:DWARt:LTIMe
:TRIGger:DWARt:LTIMe?
:TRIGger:DWARt:PLUS:HLEVel
:TRIGger:DWARt:PLUS:LLEVel
:TRIGger:DWARt:POLarity
:TRIGger:DWARt:POLarity?
:TRIGger:DWARt:SOURce
:TRIGger:DWARt:SOURce?
:TRIGger:EDGE:COUPle
:TRIGger:EDGE:COUPle?
:TRIGger:EDGE:LEVel
:TRIGger:EDGE:LEVel?
:TRIGger:EDGE:PLUS:LEVel
:TRIGger:EDGE:SLOPe
:TRIGger:EDGE:SLOPe?
:TRIGger:EDGE:SOURce
:TRIGger:EDGE:SOURce?
:TRIGger:HOLDoff
:TRIGger:HOLDoff?
:TRIGger:IIC:ADDRess
:TRIGger:IIC:ADDRess?
:TRIGger:IIC:DATA
:TRIGger:IIC:DATA?
:TRIGger:IIC:LEVel
:TRIGger:IIC:LEVel?
:TRIGger:IIC:RELation
:TRIGger:IIC:RELation?
:TRIGger:IIC:SOURce
:TRIGger:IIC:SOURce?
:TRIGger:IIC:TYPE
:TRIGger:IIC:TYPE?
:TRIGger:LIN:DATA
:TRIGger:LIN:DATA?
:TRIGger:LIN:ID
:TRIGger:LIN:ID?
:TRIGger:LIN:LEVel
:TRIGger:LIN:LEVel?
:TRIGger:LIN:SOURce
:TRIGger:LIN:SOURce?
:TRIGger:LIN:TYPE
:TRIGger:LIN:TYPE?
:TRIGger:LOGic:CONDition
:TRIGger:LOGic:CONDition?
:TRIGger:LOGic:FUNCtion
:TRIGger:LOGic:FUNCtion?
:TRIGger:LOGic:LEVel
:TRIGger:LOGic:LEVel?
:TRIGger:LOGic:PLUS:LEVel
:TRIGger:LOGic:STATus
:TRIGger:LOGic:STATus?
:TRIGger:LOGic:TIME
:TRIGger:LOGic:TIME?
:TRIGger:MODE
:TRIGger:MODE?
:TRIGger:NEDGe:EDGE
:TRIGger:NEDGe:EDGE?
:TRIGger:NEDGe:IDLE
:TRIGger:NEDGe:IDLE?
:TRIGger:NEDGe:LEVel
:TRIGger:NEDGe:LEVel?
:TRIGger:NEDGe:PLUS:LEVel
:TRIGger:NEDGe:SLOPe
:TRIGger:NEDGe:SLOPe?
:TRIGger:NEDGe:SOURce
:TRIGger:NEDGe:SOURce?
:TRIGger:PULSe:CONDition
:TRIGger:PULSe:CONDition?
:TRIGger:PULSe:LEVel
:TRIGger:PULSe:LEVel?
:TRIGger:PULSe:PLUS:LEVel
:TRIGger:PULSe:POLarity
:TRIGger:PULSe:POLarity?
:TRIGger:PULSe:SOURce
:TRIGger:PULSe:SOURce?
:TRIGger:PULSe:WIDTh
:TRIGger:PULSe:WIDTh?
:TRIGger:SETup:CEDGe
:TRIGger:SETup:CEDGe?
:TRIGger:SETup:CLEVel
:TRIGger:SETup:CLEVel?
:TRIGger:SETup:CLOCk
:TRIGger:SETup:CLOCk?
:TRIGger:SETup:DATA
:TRIGger:SETup:DATA?
:TRIGger:SETup:DLEVel
:TRIGger:SETup:DLEVel?
:TRIGger:SETup:HTIMe
:TRIGger:SETup:HTIMe?
:TRIGger:SETup:STIMe
:TRIGger:SETup:STIMe?
:TRIGger:SLOPe:BTIMe
:TRIGger:SLOPe:BTIMe?
:TRIGger:SLOPe:CONDition
:TRIGger:SLOPe:CONDition?
:TRIGger:SLOPe:EDGE
:TRIGger:SLOPe:EDGE?
:TRIGger:SLOPe:HLEVel
:TRIGger:SLOPe:HLEVel?
:TRIGger:SLOPe:HTIMe
:TRIGger:SLOPe:HTIMe?
:TRIGger:SLOPe:LLEVel
:TRIGger:SLOPe:LLEVel?
:TRIGger:SLOPe:LTIMe
:TRIGger:SLOPe:LTIMe?
:TRIGger:SLOPe:PLUS:HLEVel
:TRIGger:SLOPe:PLUS:LLEVel
:TRIGger:SLOPe:SOURce
:TRIGger:SLOPe:SOURce?
:TRIGger:SPI:DATA
:TRIGger:SPI:DATA?
:TRIGger:SPI:LEVel
:TRIGger:SPI:LEVel?
:TRIGger:SPI:SOURce
:TRIGger:SPI:SOURce?
:TRIGger:STATus?
:TRIGger:TIMeout:POLarity
:TRIGger:TIMeout:POLarity?
:TRIGger:TIMeout:SOURce
:TRIGger:TIMeout:SOURce?
:TRIGger:TIMeout:TIME
:TRIGger:TIMeout:TIME?
:TRIGger:TYPE
:TRIGger:TYPE?
:TRIGger:UART:DATA
:TRIGger:UART:DATA?
:TRIGger:UART:LEVel
:TRIGger:UART:LEVel?
:TRIGger:UART:RELation
:TRIGger:UART:RELation?
:TRIGger:UART:SOURce
:TRIGger:UART:SOURce?
:TRIGger:UART:TYPE
:TRIGger:UART:TYPE?
:TRIGger:VIDeo:AFRequence
:TRIGger:VIDeo:AFRequence?
:TRIGger:VIDeo:AMODe
:TRIGger:VIDeo:AMODe?
:TRIGger:VIDeo:BFRequence
:TRIGger:VIDeo:BFRequence?
:TRIGger:VIDeo:BMODe
:TRIGger:VIDeo:BMODe?
:TRIGger:VIDeo:POLarity
:TRIGger:VIDeo:POLarity?
:TRIGger:VIDeo:SOURce
:TRIGger:VIDeo:SOURce?
:TRIGger:VIDeo:STANdard
:TRIGger:VIDeo:STANdard?
:WAVeform:BEGin
:WAVeform:DATA
:WAVeform:EDN
:WAVeform:FORMat
:WAVeform:FORMat?
:WAVeform:MODE
:WAVeform:MODE?
:WAVeform:POINts
:WAVeform:POINts?
:WAVeform:PREamble?
:WAVeform:RESet
:WAVeform:SOURce
:WAVeform:SOURce?
:WAVeform:STARt
:WAVeform:STARt?
:WAVeform:STATus?
:WAVeform:STOP
:WAVeform:STOP?
:WAVeform:XINCrement?
:WAVeform:XORigin?
:WAVeform:XREFerence?
:WAVeform:YINCrement?
:WAVeform:YORigin?
:WAVeform:YREFerence?
:WIFI:DNS
:WIFI:DNS?
:WIFI:IPADdress
:WIFI:IPADdress?
:WIFI:IPSetting
:WIFI:IPSetting?
:WIFI:OPEN
:WIFI:OPEN?
:WIFI:ROUTer
:WIFI:ROUTer?
:WIFI:SUBMask
:WIFI:SUBMask?
DEFault
EXTernal
IMMediate
INFinity
MAXimum
MINimum
* Here is some python code that fetches and plots a waveform. I don't really know if I was just spoiled by a highly tolerant SCPI implementation in my Rohde & Schwarz scope or if the Micsig implementation is actually horribly broken, but it took *a lot* of experimentation to get here. Ugh.
# pip install pyvisa pyvisa-py
# --------- Connect to the Instrument ---------
import pyvisa
rm = pyvisa.ResourceManager("@py")
#scope = rm.open_resource("TCPIP::192.168.0.109::INSTR") # VI_ERROR_RSRC_NFOUND
scope = rm.open_resource("TCPIP::192.168.0.109::18212::SOCKET")
scope.read_termination = '\r\n' # It fails to recognize end-of-response and times out with default
scope.query("*IDN?") # sanity check. 'Micsig, TO1104M, 313100050, 6.11'
# --------- Channel Setup ---------
# Crashes if we queue up more than ~2 commands with scope.write()
# *OPC? does not wait until complete, so we use :CHANNEL1:DISPLAY? instead.
scope.timeout=10000 # milliseconds. RESET takes longer than default of 2000.
scope.query(":MENU:RESET; :CHANNEL1:DISPLAY?")
scope.query(":CHANNEL2:DISPLAY 0; :CHANNEL1:DISPLAY?")
scope.query(":CHANNEL3:DISPLAY 0; :CHANNEL1:DISPLAY?")
scope.query(":CHANNEL4:DISPLAY 0; :CHANNEL1:DISPLAY?")
scope.query(":CHANNEL1:POSITION 0; :CHANNEL1:DISPLAY?") # Vertical center of screen
scope.query(":CHANNEL1:PROBE 1; :CHANNEL1:DISPLAY?") # 1x
scope.query(":CHANNEL1:SCALE .001; :CHANNEL1:DISPLAY?") # 1mV/div
None
# --------- Waveform Fetch Routine ---------
import numpy as np, time
def get_waveform(scope):
scope.timeout = 2000
waveform_chunks = []
scope.write(":WAVEFORM:BEGIN")
# It takes time for the data to become ready
# If we fetch before ready, we get length 0
# I don't know how to wait until ready
# So we poll with timeout
num_empties_before_give_up = 5
num_empties = 0
wav_info = None
while num_empties < num_empties_before_give_up:
bv = scope.query_binary_values(":WAVEFORM:DATA?", datatype="i", is_big_endian=False)
if len(bv)==0:
time.sleep(0.1)
num_empties += 1
continue
if wav_info is None: # this is the first non-empty we've seen
# Once we have seen a non-empty, seeing empty => we're done
num_empties = num_empties_before_give_up-1
# The following info is only nonzero after the first non-empty
# so fetch it now.
wav_info = dict()
wav_info['xorigin'] = float(scope.query(":WAVeform:XORigin?"))
wav_info['xincrement'] = float(scope.query(":WAVeform:XINCrement?"))
wav_info['yorigin'] = float(scope.query(":WAVeform:YORigin?"))
wav_info['yincrement'] = float(scope.query(":WAVeform:YINCrement?"))
waveform_chunks.append(bv)
scope.write(":WAVEFORM:END")
yvals = wav_info['yorigin'] + wav_info['yincrement']*np.concatenate(waveform_chunks)
xvals = wav_info['xorigin'] + wav_info['xincrement']*np.arange(len(yvals))
return xvals,yvals
#--------- Fetch and Plot ---------
import matplotlib.pyplot as plt
xvals,yvals = get_waveform(scope)
fig,ax = plt.subplots(1,1,figsize=(10,5))
ax.set_title('Data from Micsig TO1104')
ax.set_xlabel('Time (seconds)')
ax.set_ylabel('Volts')
ax.plot(xvals,yvals)
plt.show()
I still haven't figured out :WAVeform:SOURce and :WAVeform:POINts? but I have what I need for now.