Added utility programs which update motor subsitutions files from

the values read rom the actual controller
This commit is contained in:
2023-02-17 10:45:15 +01:00
parent 3c9932dc18
commit 61290b5e2c
4 changed files with 318 additions and 0 deletions

110
utils/syncEL734Sub.py Executable file
View File

@ -0,0 +1,110 @@
#!/usr/bin/env python3
"""
This little program synchronizes an EPICS substitutions file with values read
from the EL734 motor controller. Some research showed that the EPICS motorRecord
seems to have no means of reading configuration data like limits or speeds or such
from the device support. Than it is the easiest to read the data with this small
program and update the substitutions file with it.
Mark Koennecke, January 2023
"""
import socket
import sys
socke = None
sockfd = None
# --------------- communication section
def connect(host, port):
global socke, sockfd
socke = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socke.connect(('localhost', 5050))
socke.connect((host, port))
socke.settimeout(2.)
sockfd = socke.makefile(mode='rw', newline='\r')
sockfd.write('RMT 1\r')
sockfd.flush()
sockfd.write('ECHO 0\r')
sockfd.flush()
sockfd.readline()
def transact(command):
global socke, sockfd
sockfd.write(command + '\r')
sockfd.flush()
return sockfd.readline()
def find_commas(rawline):
comma_list = []
for i in range(len(rawline)):
if rawline[i] == ',':
comma_list.append(i)
return comma_list
def pretty_line(newlist, comma_list):
"""
adds spaces to match the tabbing of the pattern line
"""
newline = ''
for item, idx in zip(newlist, comma_list):
length = len(newline) + 1 + len(item)
if length < idx:
newline += ' ' * (idx - length)
newline += item
newline += ','
newline += newlist[-1]
return newline[0:-1]
def fix_line(par_list, index_list):
# import pdb; pdb.set_trace()
addridx = index_list.index('ADDR')
motNo = par_list[addridx]
limits = transact('H ' + motNo)
l = limits.split()
lowidx = index_list.index('DLLM')
par_list[lowidx] = l[0]
highidx = index_list.index('DHLM')
par_list[highidx] = l[1]
speed = transact('J ' + motNo)
vidx = index_list.index('VELO')
par_list[vidx] = speed.strip()
# vidx = index_list.index('VMAX')
# par_list[vidx] = speed.strip()
return par_list
def scan_substitution_file(filename):
index_list = None
# import pdb; pdb.set_trace()
with open(filename, 'r') as fin:
rawline = fin.readline()
while rawline:
line = rawline.replace(' ','')
line = line.strip('{}')
l = line.split(',')
if line.find('DHLM') > 0:
index_list = l
comma_list = find_commas(rawline)
sys.stdout.write(rawline)
elif not index_list:
sys.stdout.write(rawline)
else:
if len(l) == len(index_list):
newlist = fix_line(l, index_list)
# newline = ','.join(newlist)
newline = pretty_line(newlist, comma_list)
sys.stdout.write('{' + newline)
else:
sys.stdout.write(rawline)
rawline = fin.readline()
#------------------ main
if len(sys.argv) < 4:
print('Usage:\n\tsyncEL734sub.py <host> <port> <substitutions-file>\n')
sys.exit(1)
connect(sys.argv[1], int(sys.argv[2]))
scan_substitution_file(sys.argv[3])
socke.close()