The SP2000TR laser interferometer continuously sends data. A script captures the data, parses them and updates dynamic attributes of a VcExecutor.
The VcExecutor code:
#!/bin/env python
"""
this VcExecutor exports some variables read from a SP2000TR interferometer
by the script SP2000TRScript.py
"""
import PyTango
class VC:
def __init__(self):
print " VC.init"
self.pos_ch1 = 0
self.pos_ch2 = 0
self.pos_ch3 = 0
self.sig_ch1 = 0
self.sig_ch2 = 0
self.sig_ch3 = 0
#
# dev_state
#
def dev_state( self):
return PyTango.DevState.ON
#
# Counts
#
def read_Counts( self):
return 1
def write_Counts( self, argin):
return 1
#
# reset
#
def Reset(self):
return True
def read_DynamicAttr(self, name):
if name == "pos_ch1":
return self.pos_ch1
elif name == "pos_ch2":
return self.pos_ch2
elif name == "pos_ch3":
return self.pos_ch3
elif name == "sig_ch1":
return self.sig_ch1
elif name == "sig_ch2":
return self.sig_ch2
elif name == "sig_ch3":
return self.sig_ch3
else:
raise ValueError( "SP200TK: failed to identify attribute name, %s" % name)
def write_DynamicAttr(self, name, value):
if name == "pos_ch1":
self.pos_ch1 = value
elif name == "pos_ch2":
self.pos_ch2 = value
elif name == "pos_ch3":
self.pos_ch3 = value
elif name == "sig_ch1":
self.sig_ch1 = value
elif name == "sig_ch2":
self.sig_ch2 = value
elif name == "sig_ch3":
self.sig_ch3 = value
else:
raise ValueError( "SP200TK: failed to identify attribute name, %s" % name)
return
The script that feeds the VcExecutor
#!/usr/bin/env python
"""
this scripts reads data from a SP2000TR and writes them to the
attributes of a VcExecutor
DynamicAttributes (Property)
pos_ch1,double,rw
pos_ch2,double,rw
pos_ch3,double,rw
sig_ch1,double,rw
sig_ch2,double,rw
sig_ch3,double,rw
"""
import socket, select, PyTango, time
DEVICE = "p99/vcexecutor/eh.06"
HOST = "hasep99varex01"
PORT = 35320
def main():
proxy = PyTango.DeviceProxy( DEVICE)
sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
server_address = ( HOST, PORT)
sock.settimeout( 3)
try:
sock.connect(server_address)
except Exception as e:
print( "SP2000TRScript: failed to connect to %s, %s " % ( HOST, PORT))
return
sock.sendall( "\n")
inout = [ sock]
argout = ""
count = 0
while 1:
infds, outfds, errfds = select.select( inout, [], [], 0.12)
if len( infds) == 0:
break
argout = sock.recv( 1024)
lines = argout.split( '\r\n')
for line in lines:
count += 1
words = line.split( ' ')
if len( words) < 4:
break
try:
#
# expecting these strings
# VAL003 pos_ch1 pos_ch2 pos_ch3
# STA003 sig_ch1 sig_ch2 sig_ch3
#
# ignore other input
#
if words[0] == 'VAL003':
proxy.pos_ch1 = float( words[1])
proxy.pos_ch2 = float( words[2])
proxy.pos_ch3 = float( words[3])
#print( "VAL003: %g, %g, %g" % ( float( words[1]), float( words[2]), float( words[3])))
if words[0] == 'STA003':
proxy.sig_ch1 = float( words[1])
proxy.sig_ch2 = float( words[2])
proxy.sig_ch3 = float( words[3])
#print( "STA003: %g, %g, %g" % ( float( words[1]), float( words[2]), float( words[3])))
except Exception as e:
pass
#print( repr(e))
#print( "--- %s" % line)
#
# tell the world that we are alive
#
if count % 1000 == 0:
print( "SP2000TRScript, count %d, line %s" % (count, line))
sock.close()
return
if __name__ == "__main__":
main()