Programming Example: SDS Oscilloscope screen image capture using Python over LAN

March 14, 2019

Here is a brief code example written in Python 3.4 that uses a socket to pull a display image (screenshot) from a SIGLENT SDS1000X-E scope via LAN
and save it to the local drive of the controlling computer.

NOTE: This program saves the picture/display image file in the same directory that the .py file is being run from. It will overwrite any existing file that has the same name.

Download Python 3.4, connect a scope to the LAN using an Ethernet cable, get the scope IP address, and run the attached .PY program to save a bitmap (BMP) image of the oscilloscope display.

You can download the .PY file here: [Download not found]

Tested with:

Python 3.4
SDS1202X-E
SDS1104/1204X-E
SDS2000X-E Models
SDS5000X Models

 

#!/usr/bin/env python 3.4.3
#-*- coding:utf-8 –*-
#-----------------------------------------------------------------------------
#The short script is a example that open a socket, sends a query to return a
#screen dump from the scope, saves the screen dump as a BMP in the python folder,
#and closes the socket.
#
#Currently tested on SDS1000X-E,2000X-E, and 5000X models
#
#No warranties expressed or implied
#
#SIGLENT/JAC 03.2019
#
#-----------------------------------------------------------------------------
import socket # for sockets
import sys # for exit
import time # for sleep
#-----------------------------------------------------------------------------
remote_ip = "192.168.55.100" # should match the instrument’s IP address
port = 5025 # the port number of the instrument service
def SocketConnect():
try:
#create an AF_INET, STREAM socket (TCP)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
print ('Failed to create socket.')
sys.exit();
try:
#Connect to remote server
s.connect((remote_ip , port))
s.setblocking(0) # non-blocking mode, an exception occurs when no data is detected by the receiver
#s.settimeout(3) 
except socket.error:
print ('failed to connect to ip ' + remote_ip)
return s
def SocketQuery(Sock, cmd):
try :
#Send cmd string
Sock.sendall(cmd)
Sock.sendall(b'\n') #Command termination
time.sleep(1)
except socket.error:
#Send failed
print ('Send failed')
sys.exit()
data_body = bytes() 
while True:
try:
time.sleep(0.01)
server_replay = Sock.recv(8000)
#print(len(server_replay))
data_body += server_replay
except BlockingIOError:
print("data received complete..")
break
return data_body
'''
PACK_LEN = 768067#the packet length you will receive;
#SDS5000X is 2457659;SDS1000X-E/2000X-E is 768067
had_received = 0    
data_body = bytes() 
while had_received < PACK_LEN:
part_body= Sock.recv(PACK_LEN - had_received)
data_body +=  part_body
part_body_length = len(part_body)
#print('part_body_length', part_body_length)
had_received += part_body_length
return data_body
'''
def SocketClose(Sock):
#close the socket
Sock.close()
time.sleep(5)
def main():
global remote_ip
global port
global count
#Open a file
file_name = "SCDP.bmp"
# Body: Open a socket, query the screen dump, save and close
s = SocketConnect()
qStr = SocketQuery(s, b'SCDP') #Request screen image
print(len(qStr))
f=open(file_name,'wb')
f.write(qStr)
f.flush()
f.close()
SocketClose(s)
sys.exit
if __name__ == '__main__':
proc = main()