This commit is contained in:
boccioli_m
2018-03-20 11:14:41 +01:00
parent dc3a79ab41
commit 194ca56518
203 changed files with 10434 additions and 1 deletions

View File

@@ -0,0 +1,5 @@
#Wed Oct 18 15:07:43 CEST 2017
name=AMA1
tests=RPS Tests Interlocklilmits
parameters=ilkInExpectedValS&"0x91DD"&"[hex] Interlock Input expected value for small values of magnet";magnetCh&"AMA1\:SOL\:1"&"Magnet epics channel";ilkInCh&"J102025\:REG\:R\:6"&"Interlock Input epics channel";ilkInExpectedValIni&"0x1DDD"&"[hex] Interlock Input expected initial value";ilkOutExpectedValL&"0x0000"&"[hex] Interlock Output expected value for large values of magnet";magnetEndVal&"50000"&"[int] magnet final value for scan sequence";ilkOutCh&"J102025\:REG\:R\:3"&"Interlock Output epics channel";ilkOutExpectedValIni&"0x0000"&"[hex] Interlock Output expected initial value";ilkOutExpectedValS&"0x000C"&"[hex] Interlock Output expected value for small values of magnet";magnetInitVal&"0"&"[int] magnet initial value for scan sequence";setGetDelay&"1"&"[s] delay between set and get";mode&"2,IQCOM,$GNT2,1,DIA"&"operating mode";
description=Ablenkungsmagnet AMA1

View File

@@ -0,0 +1,3 @@
name=DMAF1
description=Collimators
tests=Collimator Tests pro

View File

@@ -0,0 +1,4 @@
#Mon Sep 21 15&08&09 CEST 2015
name=FMA1XR
tests=Collimator Tests pro
description=Spalt

View File

@@ -0,0 +1,5 @@
#Wed Oct 18 10:54:16 CEST 2017
name=Gantry1
tests=RPS Tests Betriebsmode
description=rps section till Gantry 1
parameters=mode&"2,IQCOM,$GNT1,1,DIA"&"betriebsmode";expectedVal14&"0x0040"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";

View File

@@ -0,0 +1,5 @@
#Wed Oct 18 10:54:16 CEST 2017
name=Gantry2
tests=RPS Tests Betriebsmode
description=rps section till Gantry 2
parameters=mode&"2,IQCOM,$GNT2,1,DIA"&"betriebsmode";expectedVal14&"0x0000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0004"&"[hex] Expected value for channels 5-8";

View File

@@ -0,0 +1,5 @@
#Wed Oct 18 10:54:16 CEST 2017
name=Gantry3
tests=RPS Tests Betriebsmode
description=rps section till Gantry 3
parameters=mode&"2,IQCOM,$GNT3,1,DIA"&"betriebsmode";expectedVal14&"0x0400"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";

View File

@@ -0,0 +1,5 @@
#Wed Oct 18 10:54:16 CEST 2017
name=Optis
tests=RPS Tests Betriebsmode
description=rps section till Optis
parameters=mode&"2,IQCOM,$OPT,1,DIA"&"betriebsmode";expectedVal14&"0x4000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";

View File

@@ -0,0 +1,5 @@
#Wed Oct 18 10:54:16 CEST 2017
name=PIF
tests=RPS Tests Betriebsmode
description=rps section till PIF
parameters=mode&"2,IQCOM,$PIF,1,DIA"&"betriebsmode";expectedVal14&"0x0400"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";

View File

@@ -0,0 +1,4 @@
name=PO2DV-NCS-LS
description=Optis 2 Linear Slide in test office setup
#tests=Collimator Tests
tests=Linear Slide Tests

View File

@@ -0,0 +1,3 @@
name=PO2DV-NCS-VHQ3
description=Optis 2 Linear Slide in test office setup
tests=PS Tests

View File

@@ -0,0 +1,3 @@
name=PO2DV-NCS-VHQ2
description=Optis 2 Linear Slide in test office setup
tests=PS Tests

View File

@@ -0,0 +1,3 @@
name=PO2DV-NCS-VHQ1
description=Optis 2 Linear Slide in test office setup
tests=PS Tests

View File

@@ -0,0 +1,3 @@
name=PO2TC-NCS-RS
description=RS& Range Shifter
tests=Range Shifter Tests

View File

@@ -0,0 +1,3 @@
name=PROF02&DMAF1
description=Collimators
tests=Collimator Tests pro

View File

@@ -0,0 +1,3 @@
name=PO2DV-NCS-VHQ1
description=Optis 2 Linear Slide in test office setup
tests=PS Tests

View File

@@ -0,0 +1,3 @@
name=PO2TC-NCS-FIXL
description=FIXL& Fixation Light
tests=Display Tests

View File

@@ -0,0 +1,3 @@
name=PO2TC-NCS-MWD
description=MWD& Modulator Wheel Display
tests=Display Tests

View File

@@ -0,0 +1,3 @@
name=PO2TC-NCS-SC21
description=SC21& Scatter Foil 2.1
tests=Linear Slide Tests

View File

@@ -0,0 +1,3 @@
name=PO2TC-NCS-SC22
description=SC21& Scatter Foil 2.2
tests=Linear Slide Tests

View File

@@ -0,0 +1,3 @@
name=PO2TC-NCS-SC23
description=SC23& Scatter Foil 2.3
tests=Linear Slide Tests

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:57:25 CEST 2017
name=XMA0310
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J101030"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:58:05 CEST 2017
name=XMA0311
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J101030"&"RPS module EPICS channel name";expectedValue2&"0x0001"&"[hex] expected value 2";expectedValue1&"0x000D"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:58:37 CEST 2017
name=XMA0410
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:7"&"RPS EPICS attribute";rpsModule&"J101046"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:53:14 CEST 2017
name=XMA1115
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J102007"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:41:43 CEST 2017
name=XMA1116
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J102007"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:53:44 CEST 2017
name=XMA1117
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J102007"&"RPS module EPICS channel name";expectedValue2&"0x1000"&"[hex] expected value 2";expectedValue1&"0xD000"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:40:33 CEST 2017
name=XMA1118
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:7"&"RPS EPICS attribute";rpsModule&"J102025"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:41:13 CEST 2017
name=XMA1119
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J102007"&"RPS module EPICS channel name";expectedValue2&"0x0001"&"[hex] expected value 2";expectedValue1&"0x000D"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 14:02:17 CEST 2017
name=XMB0510
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J108053"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 14:00:49 CEST 2017
name=XMC0610
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J110060"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 14:01:23 CEST 2017
name=XMC2010
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J117065"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 14:01:52 CEST 2017
name=XMC2011
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J117065"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:59:03 CEST 2017
name=XMD0710
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J124081"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:59:41 CEST 2017
name=XMD0711
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J124081"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 14:00:11 CEST 2017
name=XMD0717
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J124092"&"RPS module EPICS channel name";expectedValue2&"0x0001"&"[hex] expected value 2";expectedValue1&"0x000D"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:54:46 CEST 2017
name=XME1310
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:6"&"RPS EPICS attribute";rpsModule&"J112009"&"RPS module EPICS channel name";expectedValue2&"0x0001"&"[hex] expected value 2";expectedValue1&"0x000D"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:55:53 CEST 2017
name=XME1311
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J112023"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:56:25 CEST 2017
name=XME1410
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J112023"&"RPS module EPICS channel name";expectedValue2&"0x0001"&"[hex] expected value 2";expectedValue1&"0x000D"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Fri Oct 20 13:56:53 CEST 2017
name=XME1411
tests=RPS Tests Diagnostic
parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J112023"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
description=Diagnostic module

View File

@@ -0,0 +1,5 @@
#Wed Oct 18 10:54:10 CEST 2017
name=bis-BMA1
tests=RPS Tests Betriebsmode
parameters=mode&"2,IQCOM,$BMA1,1,DIAG"&"operating mode";expectedVal14&"0x0000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";
description=rps section till BMA1

View File

@@ -0,0 +1,5 @@
#Wed Oct 18 10:54:10 CEST 2017
name=bis-BMC1
tests=RPS Tests Betriebsmode
parameters=mode&"2,IQCOM,$BMC1,1,DIAG"&"operating mode";expectedVal14&"0x0000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";
description=rps section till BMC1

View File

@@ -0,0 +1,5 @@
#Wed Oct 18 10:54:16 CEST 2017
name=bis-BMD1
tests=RPS Tests Betriebsmode
description=rps section till BMD1
parameters=mode&"2,IQCOM,$BMD1,1,DIA"&"betriebsmode";expectedVal14&"0x0000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";

View File

@@ -0,0 +1,5 @@
#Wed Oct 18 10:54:16 CEST 2017
name=bis-BME1
tests=RPS Tests Betriebsmode
description=rps section till BME1
parameters=mode&"2,IQCOM,$BME1,1,DIA"&"betriebsmode";expectedVal14&"0x0000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";

View File

@@ -0,0 +1,5 @@
#Tue Oct 03 13&56&43 CEST 2017
name=bx84
tests=sad
description=simulation device in playground
parameters=delay&".2"&"delay between 2 steps";bla&"234"&"bla bla";setVal&"11"&"value to set";expectedVal&"18.1"&"expected returned value";mask&"2"&"bit mask";

View File

@@ -0,0 +1,5 @@
#Fri Oct 13 10:59:28 CEST 2017
name=bx84_2
tests=sad
parameters=a&IQCOM,$GNT3,1,DIA\:22&23;delay&.2&delay between 2 steps;bla&234&bla bla;setVal&21&value to set;expectedVal&18.1&expected returned value;mask&2&bit mask;
description=simulation device in playground

View File

@@ -0,0 +1,5 @@
#Tue Mar 20 09:48:39 CET 2018
name=newbx84
tests=New Structure Tests
parameters=par1&"1"&"override param 1";par3&"p3"&"device specific param";
description=bx84 device for new testing list structure

View File

@@ -0,0 +1,5 @@
#Fri Oct 13 12:10:12 CEST 2017
name=newdev
tests=RPS Tests Betriebsmode
parameters="pv"&"PXXF\:VAL\:2"&"ssp";"ds"&"2,IQCOM,$BMA1,1,DIA"&"vla";
description=del

View File

@@ -0,0 +1,12 @@
name=Calibrate
description=Calibrates the device
filename=Calibrate.xml
help = \
This test sends a command to the low level firmware which controls the collimators \n\
requesting that it calibrates itself. \n\n\
<b>Calibration</b> involves moving to the R1 and R2 reference positions and measuring the \n\
number of steps required to do so. At the end of the sequence the default collimator \n\
will be selected. \n\n\
During the course of the expected calibration period (45-70 seconds) the test \n\
procedure will plot the values of all critical system variables. \n\n\
For further information please consult Valery Ovinnikov.<br/>\

View File

@@ -0,0 +1,139 @@
###### Init - DO NOT MODIFY THE CODE BELOW ######
global sys, inspect, os, traceback
import sys, inspect, os, traceback
def startTest(testName, DEVICE, params):
# by default, assume the test failed
ret = 'Test failed'
success = False
# plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
# put the whole custom code under try/catch
try:
# get the path of this script
testPath = inspect.getfile(inspect.currentframe())
# init the testing tool class. It can be sued in the following ways:
test = TestingTool(testName, testPath, DEVICE, params)
samplePeriod = 0.1
######### WRITE YOUR CODE HERE BELOW #############
scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], ['Motor Pos (IST3:2)', 'Poti Position (IST2:1)',
'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
'Diameter (DIAM:2)', 'Logical Position (IST:2)',
'Motor Pos Raw (IST3:1)','Poti Pos From Beam (IST1:2)',
'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
scan.setPlotTitle(plotName)
scan.start()
try:
idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
idMotorPositionRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
idCom = Channel(DEVICE + ':COM:2' , type = 'd') # current position as from motor step counter [mm]
idMotorPosition = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
idPotiPosFromBeam = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
#Pre-actions: 1 = calibrate
caput(DEVICE+':COM:2', 1)
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
test.sendFeedback( ret, success)
return
countDeviceInModeIdle = 0
for setpoint1 in range(0, 10000):
sleep( samplePeriod ) # Settling time
MotorStatus = idMotorStatus.get()
LogicalPosition = idLogicalPosition.get()
PotiRaw = idPotiRaw.get()
MotorPositionRaw = idMotorPositionRaw.get()
MotorPosition = idMotorPosition.get()
PotiPosFromBeam = idPotiPosFromBeam.get()
PotiPosition = idPotiPosition.get()
PotiRef1Position = idPotiRef1Position.get()
PotiRef2Position = idPotiRef2Position.get()
Diameter = idDiameter.get()
Inkr = idInkr.get()
InkrRb = idInkrRb.get()
scan.append([setpoint1], [setpoint1],
[MotorPosition, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, LogicalPosition,
MotorPositionRaw, PotiPosFromBeam, PotiRaw, PotiRef1Position, PotiRef2Position])
if (int(MotorStatus) & int('1',2))==0: #device finished calibration (bit#1)
#give the device some time before stating that it has really finished
countDeviceInModeIdle = countDeviceInModeIdle +1
if countDeviceInModeIdle == 10:
break
else:
countDeviceInModeIdle = 0
#check if any error bit is raised
if bool(int(MotorStatus) & int('10000',2)): #error: abort test
test.sendFeedback('Motor switched off (bit#4)', False)
return
if bool(int(MotorStatus) & int('100000',2)): #error: abort test
test.sendFeedback('No motor link (bit#5)', False)
return
if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
test.sendFeedback('No poti link (bit#6)', False)
return
if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
test.sendFeedback('Calibration error (bit#7)', False)
return
if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
test.sendFeedback('Cannot get to R1 (bit#8)', False)
return
if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
test.sendFeedback('Cannot get to R2 (bit#9)', False)
return
if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
test.sendFeedback('Position measurement mismatch (bit#10)', False)
return
if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
test.sendFeedback('Movement timeout (bit#11)', False)
return
#Closing channels
idMotorStatus.close()
idLogicalPosition.close()
idPotiRaw.close()
idMotorPositionRaw.close()
idMotorPosition.close()
idPotiPosFromBeam.close()
idPotiPosition.close()
idPotiRef1Position.close()
idPotiRef2Position.close()
idDiameter.close()
idInkr.close()
idInkrRb.close()
scan.end()
ret = 'Calibration done'
success = True
scan.end()
################ END OF YOUR CODE ################
###### Final - DO NOT MODIFY THE CODE BELOW ######
# just in case the feedback was forgotten
test.sendFeedback(ret, success)
except:
# generic error handler
ret = traceback.format_exc()
success = False
test.sendFeedback(ret, success)
# launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.psi.ch/~ebner/models/scan/1.0">
<data fileName="Calibrate.fda"/>
<scan>
<!-- Send Calibrate Command -->
<preAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ChannelAction" channel="{DEVICE}:COM:2" value="CALLIBR"/>
<dimension>
<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="PseudoPositioner" settlingTime="0.1" id="id000000">
<counts>900</counts>
</positioner>
<!-- Motor Drive Status -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:1" id="id000001"/>
<!-- Logical Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:2" id="id00001B"/> -->
<!-- Interlock Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IIST:2" id="id000002"/> -->
<!-- Logical Position -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST:2" id="id000003"/>
<!-- Collimator Diameter -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:DIAM:2" id="id000004"/>
<!-- Position Counter: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:1" id="id000005"/>
<!-- Position Counter: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:2" id="id000006"/>
<!-- Potentiometer: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:1" id="id000007"/>
<!-- Potentiometer: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:2" id="id000008"/>
<!-- BTVS Digitiser: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:1" id="id000009"/>
<!-- BTVS Digitiser: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:2" id="id000010"/>
</dimension>
</scan>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000001" title="Drive Status: {DEVICE}:STA:1"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000002" title="ILK Status: {DEVICE}:IIST:2"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000003" title="Logical Pos: {DEVICE}:IST:2"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000004" title="Diameter: {DEVICE}:DIAM:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000005" title="Cpc: {DEVICE}:IST1:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000006" title="Cpc: {DEVICE}:IST1:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000007" title="Pot: {DEVICE}:IST2:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000008" title="Pot: {DEVICE}:IST2:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000009" title="Btvs: {DEVICE}:IST3:1 (ADC raw)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000010" title="Btvs: {DEVICE}:IST3:2 (mm)"/>
</configuration>

View File

@@ -0,0 +1,3 @@
name=Drive Out
description=Drives the Collimator to the Out Position
filename=Drive Out.xml

View File

@@ -0,0 +1,82 @@
#Script imported from: Drive Out.xml
import traceback
#by default, failed
ret = 'Test failed'
success = False
try:
#Pre-actions: 2 = drive out
caput(DEVICE+':COM:2', 2)
#Creating channels: dimension 1
#PseudoPositioner id000000
#ScalarDetector id000001
id000001 = Channel(DEVICE+':STA:1', type = 'd')
#ScalarDetector id000003
id000003 = Channel(DEVICE+':IST:2', type = 'd')
#ScalarDetector id000004
id000004 = Channel(DEVICE+':DIAM:2', type = 'd')
#ScalarDetector id000005
id000005 = Channel(DEVICE+':IST1:1', type = 'd')
#ScalarDetector id000006
id000006 = Channel(DEVICE+':IST1:2', type = 'd')
#ScalarDetector id000007
id000007 = Channel(DEVICE+':IST2:1', type = 'd')
#ScalarDetector id000008
id000008 = Channel(DEVICE+':IST2:2', type = 'd')
#ScalarDetector id000009
id000009 = Channel(DEVICE+':IST3:1', type = 'd')
#ScalarDetector id000010
id000010 = Channel(DEVICE+':IST3:2', type = 'd')
except:
print "Unexpected error:", sys.exc_info()[0]
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
raise Exception('Unable to create channel - ' + traceback.format_exc())
sys.exit()
#TODO: Set the diplay names of positioners and detectors
scan = ManualScan(['id000000'], ['id000001', 'id000003', 'id000004', 'id000005', 'id000006', 'id000007', 'id000008', 'id000009', 'id000010'] , [0.0], [3000.0], [3000])
scan.start()
#Dimension 1
#PseudoPositioner id000000
for setpoint1 in range(0, 3000):
readback1 = setpoint1
sleep( 0.1 ) # Settling time
#Detector id000001
detector1 = id000001.get()
#Detector id000003
detector2 = id000003.get()
#Detector id000004
detector3 = id000004.get()
#Detector id000005
detector4 = id000005.get()
#Detector id000006
detector5 = id000006.get()
#Detector id000007
detector6 = id000007.get()
#Detector id000008
detector7 = id000008.get()
#Detector id000009
detector8 = id000009.get()
#Detector id000010
detector9 = id000010.get()
scan.append ([setpoint1], [readback1], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, detector9])
#Closing channels
id000001.close()
id000003.close()
id000004.close()
id000005.close()
id000006.close()
id000007.close()
id000008.close()
id000009.close()
id000010.close()
scan.end()
#return ok
ret = 'Slides moved out'
success = True

View File

@@ -0,0 +1,144 @@
# Drive Out
###### Init - DO NOT MODIFY THE CODE BELOW ######
global sys, inspect, os, traceback
import sys, inspect, os, traceback
def startTest(testName, DEVICE, params):
# by default, assume the test failed
ret = 'Test failed'
success = False
# plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
# put the whole custom code under try/catch
try:
# get the path of this script
testPath = inspect.getfile(inspect.currentframe())
# init the testing tool class. It can be sued in the following ways:
test = TestingTool(testName, testPath, DEVICE, params)
samplePeriod = 0.1
######### WRITE YOUR CODE HERE BELOW #############
scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], ['Motor Pos (IST3:2)', 'Poti Position (IST2:1)',
'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
'Diameter (DIAM:2)', 'Com (COM:2)', 'Logical Position (IST:2)',
'Motor Pos Raw (IST3:1)','Poti Pos From Beam (IST1:2)',
'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
scan.setPlotTitle(plotName)
scan.start()
try:
idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
idMotorPositionRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
idCom = Channel(DEVICE + ':COM:2' , type = 'd') # current position as from motor step counter [mm]
idMotorPosition = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
idPotiPosFromBeam = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
#Pre-actions: 2 = drive out
caput(DEVICE+':COM:2', 2)
sleep( samplePeriod ) # Settling time
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
test.sendFeedback( ret, success)
return
for setpoint1 in range(0, 10000):
sleep( samplePeriod ) # Settling time
MotorStatus = idMotorStatus.get()
LogicalPosition = idLogicalPosition.get()
PotiRaw = idPotiRaw.get()
MotorPositionRaw = idMotorPositionRaw.get()
Com = idCom.get()
MotorPosition = idMotorPosition.get()
PotiPosFromBeam = idPotiPosFromBeam.get()
PotiPosition = idPotiPosition.get()
PotiRef1Position = idPotiRef1Position.get()
PotiRef2Position = idPotiRef2Position.get()
Diameter = idDiameter.get()
Inkr = idInkr.get()
InkrRb = idInkrRb.get()
scan.append([setpoint2], [setpoint2],
[MotorPosition, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, Com, LogicalPosition,
MotorPositionRaw, PotiPosFromBeam, PotiRaw, PotiRef1Position, PotiRef2Position])
if (MotorStatus & int('1',2))==0: #device finished calibration (bit#1)
#give the device some time before stating that it has really finished
countDeviceInModeIdle = countDeviceInModeIdle +1
if countDeviceInModeIdle == 10:
break
else:
countDeviceInModeIdle = 0
#check if any error bit is raised
if bool(int(MotorStatus) & int('10000',2)): #error: abort test
test.sendFeedback('Motor switched off (bit#4)', False)
return
if bool(int(MotorStatus) & int('100000',2)): #error: abort test
test.sendFeedback('No motor link (bit#5)', False)
return
if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
test.sendFeedback('No poti link (bit#6)', False)
return
if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
test.sendFeedback('Calibration error (bit#7)', False)
return
if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
test.sendFeedback('Cannot get to R1 (bit#8)', False)
return
if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
test.sendFeedback('Cannot get to R2 (bit#9)', False)
return
if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
test.sendFeedback('Position measurement mismatch (bit#10)', False)
return
if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
test.sendFeedback('Movement timeout (bit#11)', False)
return
#Closing channels
idMotorStatus.close()
idLogicalPosition.close()
idPotiRaw.close()
idMotorPositionRaw.close()
idCom.close()
idMotorPosition.close()
idPotiPosFromBeam.close()
idPotiPosition.close()
idPotiRef1Position.close()
idPotiRef2Position.close()
idDiameter.close()
idInkr.close()
idInkrRb.close()
scan.end()
ret = 'Drive Out done'
success = True
scan.end()
################ END OF YOUR CODE ################
###### Final - DO NOT MODIFY THE CODE BELOW ######
# just in case the feedback was forgotten
test.sendFeedback(ret, success)
except:
# generic error handler
ret = traceback.format_exc()
success = False
test.sendFeedback(ret, success)
# launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.psi.ch/~ebner/models/scan/1.0">
<data fileName="Drive Out.fda"/>
<scan>
<!-- Send Drive Out Command -->
<preAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ChannelAction" channel="{DEVICE}:COM:2" value="FAHR_AUS"/>
<dimension>
<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="PseudoPositioner" settlingTime="0.1" id="id000000">
<counts>3000</counts>
</positioner>
<!-- Motor Drive Status -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:1" id="id000001"/>
<!-- Logical Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:2" id="id00001B"/> -->
<!-- Interlock Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IIST:2" id="id000002"/> -->
<!-- Logical Position -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST:2" id="id000003"/>
<!-- Collimator Diameter -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:DIAM:2" id="id000004"/>
<!-- Position Counter: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:1" id="id000005"/>
<!-- Position Counter: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:2" id="id000006"/>
<!-- Potentiometer: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:1" id="id000007"/>
<!-- Potentiometer: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:2" id="id000008"/>
<!-- BTVS Digitiser: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:1" id="id000009"/>
<!-- BTVS Digitiser: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:2" id="id000010"/>
</dimension>
</scan>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000001" title="Drive Status: {DEVICE}:STA:1"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000002" title="ILK Status: {DEVICE}:IIST:2"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000003" title="Logical Pos: {DEVICE}:IST:2"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000004" title="Diameter: {DEVICE}:DIAM:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000005" title="Cpc: {DEVICE}:IST1:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000006" title="Cpc: {DEVICE}:IST1:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000007" title="Pot: {DEVICE}:IST2:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000008" title="Pot: {DEVICE}:IST2:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000009" title="Btvs: {DEVICE}:IST3:1 (ADC raw)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000010" title="Btvs: {DEVICE}:IST3:2 (mm)"/>
</configuration>

View File

@@ -0,0 +1,4 @@
#Fri Jun 09 14&14&06 CEST 2017
name=Monitor Movement
description=Monitor the movements during the specified time interval. No commands are sent.
parameters=monitorTime&20&How long the monitoring is performed [s];samplingDelay&0.1&Delay between each sample is taken [s];

View File

@@ -0,0 +1,98 @@
###### Init - DO NOT MODIFY THE CODE BELOW ######
global sys, inspect, os, traceback
import sys, inspect, os, traceback
def startTest(testName, DEVICE, params):
#by default, assume the test failed
ret = 'Test failed'
success = False
#plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
#put the whole custom code under try/catch
try:
#get the path of this script
testPath = inspect.getfile(inspect.currentframe())
#init the testing tool class. It can be sued in the following ways:
test = TestingTool(testName, testPath, DEVICE, params)
######### WRITE YOUR CODE HERE BELOW #############
#get parameters from the calling interface
try:
#test.log( "with the following parameters:\n" + str(params))
#test.log( 'testpath: ' + testPath )
#test.log( 'parameters:' + str( params) )
#test.log( 'device: ' + DEVICE )
monitorTime = float(test.getParam("monitorTime"))
samplePeriod = 0.05 #seconds
except:
ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
success = False
test.sendFeedback( ret, success)
return
#get parameters from the calling interface
scan = ManualScan(['time [s]'],
['Motor Pos (IST3:2)', 'Poti Position (IST2:1)', 'Motor Pos - Poti Pos'] )
scan.setPlotTitle(plotName)
scan.start()
#Creating channels: dimension 1
try:
idCom = Channel(DEVICE+':COM:2' , type = 'd') #current position as from motor step counter [mm]
idMotorPosition = Channel(DEVICE+':IST3:2', type = 'd') #current position as from motor step counter [mm]
#idPotiPosFromBeam = Channel(DEVICE+':IST1:2', type = 'd') #current position from beam as from potentiometer [mm]
idPotiPosition = Channel(DEVICE+':IST2:1', type = 'd') #current position as from potentiometer [mm]
#idPotiRef1Position = Channel(DEVICE+':REF1:1', type = 'd') #R1 position as from potentiometer [mm]
#idPotiRef2Position = Channel(DEVICE+':REF2:1', type = 'd') #R2 position as from potentiometer [mm]
except:
test.sendFeedback( 'Unable to create channel - ' + traceback.format_exc(), False)
return
r1 = tscan((idMotorPosition, idPotiPosition), int(monitorTime/0.02), 0.02)
test.log( 'Monitoring movement for ' + str(monitorTime) + 's')
#scan quickly the output during some seconds
timeElapsed=0
startTime=float(java.lang.System.currentTimeMillis())
currentTime = float(java.lang.System.currentTimeMillis())
timeElapsed=currentTime-startTime
while timeElapsed<(monitorTime*1000):
#Detector time
currentTime = float(java.lang.System.currentTimeMillis())
timeElapsed=currentTime-startTime
motorPosition = idMotorPosition.get()
#potiPosFromBeam = idPotiPosFromBeam.get()
potiPosition = idPotiPosition.get()
#potiRef1Position = idPotiRef1Position.get()
#potiRef2Position = idPotiRef2Position.get()
diff1 = motorPosition-potiPosition
scan.append ([timeElapsed/1000], [timeElapsed/1000], [motorPosition, potiPosition, diff1])
sleep( samplePeriod ) # Settling time
#timeElapsed=timeElapsed+1
#Closing channels
idCom.close()
idMotorPosition.close()
#idPotiPosFromBeam.close()
idPotiPosition.close()
#idPotiRef1Position.close()
#idPotiRef2Position.close()
ret = 'End of Monitoring'
success = True
################ END OF YOUR CODE ################
###### Final - DO NOT MODIFY THE CODE BELOW ######
#just in case the feedback was forgotten
test.sendFeedback(ret, success)
except:
#generic error handler
ret = traceback.format_exc()
success = False
test.sendFeedback(ret, success)
#launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,12 @@
<html>
<body>
<h2>Description</h2>
Monitor the movements during the specified time interval. No commands are sent.
<h2>Parameters</h2>
<code>monitorTime</code> Monitoring time interval [s] <br/>
<code>samplingDelay </code>Delay between each sample is taken [s]
<h2>Contact</h2>
<a href="https://intranet.psi.ch/Main/MarcoBoccioli">Marco Boccioli </a>
</html>
</body>

View File

@@ -0,0 +1,7 @@
name=Motor Test 1
description=Moves to CW switch then CCW switch N times.
#optional parameters. Description is compulsory. Syntax&
#parameters=<parameter1Name>&<parameter1Value>&<Parameter 1 description>[;<parameter2Name>&<parameter2Value>&<Parameter 2 description>]
parameters=repeatTimes&1&Repeat N times;delayS&5&Pause delay [s]

View File

@@ -0,0 +1,154 @@
#Script Motor Test 1
#Moves to CCW switch; then for M times moves N times to CW switch then CCW switch; between each M pauses for delay; log at CCW and CW
import traceback
#by default, failed
ret = 'Test failed'
status = False
DEVICE = device
params = parameters
#DEVICE = 'PO2DV-NCS-LS'
#get parameters from the calling interface
try:
print "Running test Motor Test 1 with the following parameters:"
print params
loopTimes = int(params["repeatTimes"]["value"])
delaySeconds = int(params["delayS"]["value"])
except:
print "Could not retrieve testing parameters: ", sys.exc_info()[0]
ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
success = False
raise Exception('Could not retrieve testing parameters - ' + traceback.format_exc())
#TODO: Set the diplay names of positioners and detectors
#scan = ManualScan(['idX', 'idInkr'], ['idMotorStatus', 'idLogicalPosition', 'idDiameter', 'idMotorPosition', 'idPotiRaw', 'idPotiProc', 'idBtvsRaw', 'idBtvsProc', 'idDiff01', 'idDiff02'] , [-0.5, 0.0], [4.0, 3000.0], [3000, 20])
scan = ManualScan(['idX'], ['idMotorStatus', 'idLogicalPosition', 'idDiameter', 'idMotorPosition', 'idPotiRaw', 'idPotiProc', 'idBtvsRaw', 'idBtvsProc', 'idDiff01', 'idDiff02'] , [ 0.0], [ 3000.0], [20])
scan.start()
#Creating channels: dimension 1
try:
#RegionPositioner idInkr
#idInkr = Channel(DEVICE+':INKR:2', type = 'd')
idInkr = Channel(DEVICE+':MOTOR.VAL', type = 'd')
#ScalarDetector idMotorStatus
#idMotorStatus = Channel(DEVICE+':STA:1', type = 'd')
idMotorStatus = Channel(DEVICE+':MOTOR.MSTA', type = 'd')
#ScalarDetector idLogicalPosition
#idLogicalPosition = Channel(DEVICE+':IST:2', type = 'd')
idLogicalPosition = Channel(DEVICE+':MOTOR.RVAL', type = 'd')
#ScalarDetector idDiameter
#idDiameter = Channel(DEVICE+':DIAM:2', type = 'd')
idDiameter = Channel(DEVICE+':ENCODERoff', type = 'd')
#ScalarDetector idMotorPosition
#idMotorPosition = Channel(DEVICE+':IST1:2', type = 'd')
idMotorPosition = Channel(DEVICE+':MOTOR.RBV', type = 'd')
#ScalarDetector idPotiRaw
#idPotiRaw = Channel(DEVICE+':POSA:1', type = 'd')
idPotiRaw = Channel(DEVICE+':ENCODERraw', type = 'd')
#ScalarDetector idPotiProc
#idPotiProc = Channel(DEVICE+':POSA:2', type = 'd')
idPotiProc = Channel(DEVICE+':ENCODER', type = 'd')
#ScalarDetector idBtvsRaw
#idBtvsRaw = Channel(DEVICE+':IST3:1', type = 'd')
idBtvsRaw = Channel(DEVICE+':MOTOR.LLS', type = 'd')
#ScalarDetector idBtvsProc
#idBtvsProc = Channel(DEVICE+':IST3:2', type = 'd')
idBtvsProc = Channel(DEVICE+':MOTOR.HLS', type = 'd')
#ScalarDetector idEndSwitchL
#idBtvsRaw = Channel(DEVICE+':IST3:1', type = 'd')
idEndSwitchL = Channel(DEVICE+':MOTOR.LLS', type = 'd')
#ScalarDetector idEndSwitchH
#idBtvsProc = Channel(DEVICE+':IST3:2', type = 'd')
idEndSwitchH = Channel(DEVICE+':MOTOR.HLS', type = 'd')
#high position limit
idLimitH = Channel(DEVICE+':MOTOR.HLM', type = 'd')
#low position limit
idLimitL = Channel(DEVICE+':MOTOR.LLM', type = 'd')
except:
print "Unexpected error:", sys.exc_info()[0]
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
raise Exception('Unable to create channel - ' + traceback.format_exc())
sys.exit()
#remove limits
idLimitH.put(999999.9, timeout=None)
idLimitL.put(-999999.9, timeout=None)
#Dimension 1
direction = 1.0;
startDefault = -100.0
endDefault = 1000.0
end = endDefault
#find position at Low end switch: it will be the starting point of the test
print 'Homing'
idInkr.put(-100.0, timeout=None) # TODO: Set appropriate timeout
start = startDefault #idInkr.get()+direction
setpoint2 = end
count = 0
print 'Starting test sequence'
for setpoint1 in range(0, loopTimes*2):
sleep( delaySeconds ) # Settling time
#RegionPositioner idInkr
idInkr.put(setpoint2, timeout=None) # TODO: Set appropriate timeout
readback2 = idInkr.get()
#if abs(readback2 - setpoint2) > 1 : # TODO: Check accuracy
# ret = 'Actor idInkr could not be set to the value ' + str(setpoint2) + ' (current value: ' + str(readback2) + ')'
# success = False
# raise Exception(ret)
#Detector idMotorStatus
detector1 = idMotorStatus.get()
#Detector idLogicalPosition
detector2 = idLogicalPosition.get()
#Detector idDiameter
detector3 = idDiameter.get()
#Detector idMotorPosition
detector4 = idMotorPosition.get()
#Detector idPotiRaw
detector5 = idPotiRaw.get()
#Detector idPotiProc
detector6 = idPotiProc.get()
#Detector idBtvsRaw
detector7 = idBtvsRaw.get()
#Detector idBtvsProc
detector8 = idBtvsProc.get()
#end switches
endH = idEndSwitchH.get()
endL = idEndSwitchL.get()
#Manipulation idDiff02
#Variable Mappings
a = detector4
b = detector8
idDiff02 = a-b
#Manipulation idDiff01
#Variable Mappings
a = detector4
b = detector6
count = count + 1
idDiff01 = a-b
if endH>0.0 :
#invert direction and swap start with end of translation
setpoint2 = start
print 'End H switch, changing target to ' + str(setpoint2)
scan.append ([setpoint2], [readback2], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, idDiff02, idDiff01])
if endL>0.0 :
#invert direction and swap start with end of translation
setpoint2 = end
print 'End L switch, changing target to ' + str(setpoint2)
scan.append ([setpoint2], [readback2], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, idDiff02, idDiff01])
#set limits back
idLimitH.put(145.0, timeout=None)
idLimitL.put(0.0, timeout=None)
#Closing channels
idInkr.close()
idMotorStatus.close()
idLogicalPosition.close()
idDiameter.close()
idMotorPosition.close()
idPotiRaw.close()
idPotiProc.close()
idBtvsRaw.close()
idBtvsProc.close()
scan.end()
ret = 'Slide moved back and forth (' + str(count) + ' runs)'
status = True

View File

@@ -0,0 +1,187 @@
# Script Motor Test 1
# Moves to CCW switch; then for M times moves N times to CW switch then CCW switch; between each M pauses for delay; log at CCW and CW
###### Init - DO NOT MODIFY THE CODE BELOW ######
global sys, inspect, os, traceback
import sys, inspect, os, traceback
def startTest(testName, DEVICE, params):
# by default, assume the test failed
ret = 'Test failed'
success = False
# plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
# put the whole custom code under try/catch
try:
# get the path of this script
testPath = inspect.getfile(inspect.currentframe())
# init the testing tool class. It can be sued in the following ways:
test = TestingTool(testName, testPath, DEVICE, params)
######### WRITE YOUR CODE HERE BELOW #############
# DEVICE = 'PO2DV-NCS-LS'
# get parameters from the calling interface
try:
test.log("Running test with the following parameters:")
test.log(params)
loopTimes = int(test.getParam("repeatTimes"))
delaySeconds = int(test.getParam("delayS"))
samplePeriod = 0.05 #seconds
except:
ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
success = False
test.sendFeedback(ret, success)
return
scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], [
'Btvs Poti Position (IST3:2)',
'Mcs Poti Position (IST2:1)',
'Motor Status (STA:1)',
'Inkr (INKR:2)',
'InkrRb (INKRRB:2)',
'Diameter (DIAM:2)',
'Logical Position (IST:2)',
'Btvs Raw (IST3:1)',
'Motor Position (IST1:2)',
'Poti Raw (POSA:1)',
'Poti Ref1 Position (REF1:1)',
'Poti Ref2 Position (REF2:1)'])
p1 = plot(None, name = "Motor Position - Btvs Poti Position", context = plotName + " pos difference")[0]
scan.setPlotTitle(plotName)
scan.start()
# Creating channels: dimension 1
try:
idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
idBtvsRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
idCom = Channel(DEVICE + ':COM:2' , type = 'd') # motor commands [0=Stop; 1=Calibrate; 2=gotoR1; 3=gotoR2]
idBtvs = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
idMotorPosition = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
test.sendFeedback(ret, success)
return
end = 4.0 #go to R2
start = 3.0 #go to R1
setpoint2 = end
count = 0
test.log('Starting test sequence')
for setpoint1 in range(0, (loopTimes * 2)):
p1.addSeries(LinePlotSeries("Run"+str(count)))
sleep(delaySeconds) # Settling time between runs
# RegionPositioner idInkr
idCom.put(setpoint2, timeout=None) # TODO: Set appropriate timeout
count = count + 1
# scan for changes
for scanTimes in range(0, 100000):
sleep(samplePeriod)
currentTime = float(java.lang.System.currentTimeMillis())
MotorStatus = idMotorStatus.get()
LogicalPosition = idLogicalPosition.get()
PotiRaw = idPotiRaw.get()
BtvsRaw = idBtvsRaw.get()
Btvs = idBtvs.get()
MotorPosition = idMotorPosition.get()
PotiPosition = idPotiPosition.get()
PotiRef1Position = idPotiRef1Position.get()
PotiRef2Position = idPotiRef2Position.get()
Diameter = idDiameter.get()
Inkr = idInkr.get()
InkrRb = idInkrRb.get()
idDiff01 = MotorPosition - Btvs
scan.append([currentTime], [currentTime],
[Btvs, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, LogicalPosition,
BtvsRaw, MotorPosition, PotiRaw, PotiRef1Position, PotiRef2Position])
p1.getSeries(count).appendData(currentTime, idDiff01)
#extract Status bits
endH = bool(int(MotorStatus) & 8) #Ref2 (high limit)
endL = bool(int(MotorStatus) & 4) #Ref1 (low limit)
#check if arrived to R1 or R2
if endH:
# invert direction and swap start with end of translation
setpoint2 = start
test.log('Reached R2 switch, changing target to R1')
break
elif endL:
# invert direction and swap start with end of translation
setpoint2 = end
test.log('Reached R1 switch, changing target to R2')
break
#check if any error bit is raised
if bool(int(MotorStatus) & int('10000',2)): #error: abort test
test.sendFeedback('Motor switched off (bit#4)', False)
return
if bool(int(MotorStatus) & int('100000',2)): #error: abort test
test.sendFeedback('No motor link (bit#5)', False)
return
if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
test.sendFeedback('No poti link (bit#6)', False)
return
if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
test.sendFeedback('Calibration error (bit#7)', False)
return
if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
test.sendFeedback('Cannot get to R1 (bit#8)', False)
return
if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
test.sendFeedback('Cannot get to R2 (bit#9)', False)
return
if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
test.sendFeedback('Position measurement mismatch (bit#10)', False)
return
if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
test.sendFeedback('Movement timeout (bit#11)', False)
return
# Closing channels
idMotorStatus.close()
idLogicalPosition.close()
idPotiRaw.close()
idBtvsRaw.close()
idBtvs.close()
idMotorPosition.close()
idPotiPosition.close()
idPotiRef1Position.close()
idPotiRef2Position.close()
idDiameter.close()
idCom.close()
idInkr.close()
idInkrRb.close()
scan.end()
ret = 'Slide moved back and forth (' + str(count) + ' runs)'
success = True
################ END OF YOUR CODE ################
###### Final - DO NOT MODIFY THE CODE BELOW ######
# just in case the feedback was forgotten
test.sendFeedback(ret, success)
except:
# generic error handler
ret = traceback.format_exc()
success = False
test.sendFeedback(ret, success)
# launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,178 @@
# Script Motor Test 1
# Moves to CCW switch; then for M times moves N times to CW switch then CCW switch; between each M pauses for delay; log at CCW and CW
###### Init - DO NOT MODIFY THE CODE BELOW ######
global sys, inspect, os, traceback
import sys, inspect, os, traceback
def startTest(testName, DEVICE, params):
# by default, assume the test failed
ret = 'Test failed'
success = False
# plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
# put the whole custom code under try/catch
try:
# get the path of this script
testPath = inspect.getfile(inspect.currentframe())
# init the testing tool class. It can be sued in the following ways:
test = TestingTool(testName, testPath, DEVICE, params)
######### WRITE YOUR CODE HERE BELOW #############
# DEVICE = 'PO2DV-NCS-LS'
# get parameters from the calling interface
try:
test.log("Running test with the following parameters:")
test.log(params)
loopTimes = int(test.getParam("repeatTimes"))
delaySeconds = int(test.getParam("delayS"))
samplePeriod = 0.05 #seconds
except:
ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
success = False
test.sendFeedback(ret, success)
return
scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], ['Btvs (IST3:2)', 'Poti Position (IST2:1)',
'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
'Diameter (DIAM:2)', 'Logical Position (IST:2)',
'Btvs Raw (IST3:1)','Motor Position (IST1:2)',
'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
p1 = plot(None, name = "Poti Pos From Beam - Motor Position", context = plotName + " pos difference")[0]
scan.setPlotTitle(plotName)
scan.start()
# Creating channels: dimension 1
try:
idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
idBtvsRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
idCom = Channel(DEVICE + ':COM:2' , type = 'd') # current position as from motor step counter [mm]
idBtvs = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
idMotorPosition = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
test.sendFeedback(ret, success)
return
end = 4.0 #go to R2
start = 3.0 #go to R1
setpoint2 = end
count = 0
test.log('Starting test sequence')
for setpoint1 in range(0, (loopTimes * 2)):
p1.addSeries(LinePlotSeries("Run"+str(count)))
sleep(delaySeconds) # Settling time between runs
# RegionPositioner idInkr
idCom.put(setpoint2, timeout=None) # TODO: Set appropriate timeout
count = count + 1
# scan for changes
for scanTimes in range(0, 100000):
sleep(samplePeriod)
currentTime = float(java.lang.System.currentTimeMillis())
MotorStatus = idMotorStatus.get()
LogicalPosition = idLogicalPosition.get()
PotiRaw = idPotiRaw.get()
BtvsRaw = idBtvsRaw.get()
Btvs = idBtvs.get()
MotorPosition = idMotorPosition.get()
PotiPosition = idPotiPosition.get()
PotiRef1Position = idPotiRef1Position.get()
PotiRef2Position = idPotiRef2Position.get()
Diameter = idDiameter.get()
Inkr = idInkr.get()
InkrRb = idInkrRb.get()
idDiff01 = PotiPosition - Btvs
scan.append([currentTime], [currentTime],
[Btvs , PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, LogicalPosition,
BtvsRaw , MotorPosition, PotiRaw, PotiRef1Position, PotiRef2Position])
p1.getSeries(count).appendData(currentTime, idDiff01)
#extract Status bits
endH = bool(int(MotorStatus) & 8) #Ref2 (high limit)
endL = bool(int(MotorStatus) & 4) #Ref1 (low limit)
#check if arrived to R1 or R2
if endH:
# invert direction and swap start with end of translation
setpoint2 = start
test.log('Reached R2 switch, changing target to R1')
break
elif endL:
# invert direction and swap start with end of translation
setpoint2 = end
test.log('Reached R1 switch, changing target to R2')
break
#check if any error bit is raised
if bool(int(MotorStatus) & int('10000',2)): #error: abort test
test.sendFeedback('Motor switched off (bit#4)', False)
return
if bool(int(MotorStatus) & int('100000',2)): #error: abort test
test.sendFeedback('No motor link (bit#5)', False)
return
if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
test.sendFeedback('No poti link (bit#6)', False)
return
if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
test.sendFeedback('Calibration error (bit#7)', False)
return
if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
test.sendFeedback('Cannot get to R1 (bit#8)', False)
return
if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
test.sendFeedback('Cannot get to R2 (bit#9)', False)
return
if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
test.sendFeedback('Position measurement mismatch (bit#10)', False)
return
if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
test.sendFeedback('Movement timeout (bit#11)', False)
return
# Closing channels
idMotorStatus.close()
idLogicalPosition.close()
idPotiRaw.close()
idBtvsRaw .close()
idBtvs.close()
idMotorPosition.close()
idPotiPosition.close()
idPotiRef1Position.close()
idPotiRef2Position.close()
idDiameter.close()
idCom.close()
idInkr.close()
idInkrRb.close()
scan.end()
ret = 'Slide moved back and forth (' + str(count) + ' runs)'
success = True
################ END OF YOUR CODE ################
###### Final - DO NOT MODIFY THE CODE BELOW ######
# just in case the feedback was forgotten
test.sendFeedback(ret, success)
except:
# generic error handler
ret = traceback.format_exc()
success = False
test.sendFeedback(ret, success)
# launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,14 @@
<html>
<body>
<h2>Short Description</h2>
Moves to CW switch then CCW switch N times.
<h2>Details</h2>
Moves to CW switch then CCW switch N times.
<h2>Parameters</h2>
<code>repeatTimes</code> Repeat the moving N times<br/>
<code>delayS</code> Pause delay between each repetition [s]
<h2>Contact</h2>
<a href="https://intranet.psi.ch/Main/MarcoBoccioli">Marco Boccioli </a>
</html>
</body>

View File

@@ -0,0 +1,7 @@
name=Motor Test 2
description=Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
#optional parameters. Description is compulsory. Syntax&
#parameters=<parameter1Name>&<parameter1Value>&<Parameter 1 description>[;<parameter2Name>&<parameter2Value>&<Parameter 2 description>]
parameters=repeatTimes&1&Repeat N times;midPoint&41.0&Middle point A [mm];spanFromMidPoint&2.0&B steps around middle point A [integer];translationStep&5.0&Step lenght [mm]

View File

@@ -0,0 +1,206 @@
# Script Motor Test 2 for production system
# Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
###### Init - DO NOT MODIFY THE CODE BELOW ######
global sys, inspect, os, traceback
import sys, inspect, os, traceback
def startTest(testName, DEVICE, params):
# by default, assume the test failed
ret = 'Test failed'
success = False
# plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
# put the whole custom code under try/catch
try:
# get the path of this script
testPath = inspect.getfile(inspect.currentframe())
# init the testing tool class. It can be sued in the following ways:
test = TestingTool(testName, testPath, DEVICE, params)
######### WRITE YOUR CODE HERE BELOW #############
# get parameters from the calling interface
try:
test.log("Running test with the following parameters:")
test.log(params)
middle = float(test.getParam("midPoint"))
loopTimes = int(test.getParam("repeatTimes"))
span = float(test.getParam("spanFromMidPoint"))
translationStep = float(test.getParam("translationStep")) # each translation will be this amount of mm
settlingTime = 0.2 # seconds
except:
ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
success = False
test.sendFeedback(ret, success)
return
scan = ManualScan(['time [1/'+ str(1/settlingTime) + ' s]'], ['Btvs Poti Position (IST3:2)', 'Mcs Poti Position (IST2:1)',
'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
'Diameter (DIAM:2)', 'Logical Position (IST:2)',
'Btvs Raw (IST3:1)','Motor Position (IST1:2)',
'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
scan.setPlotTitle(plotName)
scan.start()
# coloured plot (one colour per scan)
p1 = plot(None, name="Motor Position - Btvs Poti Position", context=plotName + " difference")[0]
# Creating channels: dimension 1
try:
idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
idBtvsRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
idBtvs = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
idMotorPosition = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
idCom = Channel(DEVICE + ':COM:2' , type = 'd') # motor commands [0=Stop; 1=Calibrate; 2=gotoR1; 3=gotoR2]
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
test.sendFeedback(ret, success)
return
# find position: it will be the middle point of the test
test.log('Moving to initial position R1')
idCom.put(2, timeout=None) # go to R1 start limit
test.log('Moving to middle point ' + str(middle))
idInkr.put(middle, timeout=None) # TODO: Set appropriate timeout
if abs(readback2 - middle) > 5: # TODO: Check accuracy
ret = 'Actor idInkr could not be set to the value ' + str(middle) + ' (current value: ' + str(readback2) + ')'
success = False
test.sendFeedback(ret, success)
return
direction = 1.0
count = 0
test.log('Moving around middle point (+-' + str(span) + ')')
for setpoint1 in range(0, (loopTimes * 2)):
count = count + 1
sleep(5) # Settling time
p1.addSeries(LinePlotSeries("Run" + str(count)))
# RegionPositioner idInkr
for setpoint2 in range(0, span+1):
idInkr.put(translationStep*direction, timeout=None)
sleep(settlingTime) # Settling time
currentTime = float(java.lang.System.currentTimeMillis())
MotorStatus = idMotorStatus.get()
LogicalPosition = idLogicalPosition.get()
PotiRaw = idPotiRaw.get()
BtvsRaw = idBtvsRaw.get()
Btvs = idBtvs.get()
MotorPosition = idMotorPosition.get()
PotiPosition = idPotiPosition.get()
PotiRef1Position = idPotiRef1Position.get()
PotiRef2Position = idPotiRef2Position.get()
Diameter = idDiameter.get()
Inkr = idInkr.get()
InkrRb = idInkrRb.get()
idDiff01 = MotorPosition - Btvs
# plots
scan.append([currentTime], [currentTime],
[Btvs, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, LogicalPosition,
BtvsRaw, MotorPosition, PotiRaw, PotiRef1Position, PotiRef2Position])
# plot error against position
p1.getSeries(count).appendData(MotorPosition, idDiff01)
# end of loop: invert direction
if setpoint2 == span:
direction = direction*(-1.0)
break
# check if reached end of span before the end of loop; if so, invert direction
if (direction > 0.0 and MotorPosition >= middle+span):
# invert direction and swap start with end of translation
direction = -1.0
test.log('End of span (' + str(MotorPosition) + '), changing direction to towards R1')
break
if (direction < 0.0 and MotorPosition <= middle-span):
# invert direction and swap start with end of translation
direction = 1.0
test.log('End of span (' + str(MotorPosition) + '), changing direction to towards R2')
break
# extract Status bits
endH = bool(int(MotorStatus) & 8) # Ref2 (high limit)
endL = bool(int(MotorStatus) & 4) # Ref1 (low limit)
# check if arrived to R1 or R2; if so, invert direction
if endH:
# invert direction and swap start with end of translation
direction = -1.0
test.log('Reached R2, changing direction to ' + str(direction))
break
elif endL:
# invert direction and swap start with end of translation
direction = 1.0
test.log('Reached R1, changing direction to ' + str(direction))
break
# check if any error bit is raised
if bool(int(MotorStatus) & int('10000',2)): # error: abort test
test.sendFeedback('Motor switched off (bit# 4)', False)
return
if bool(int(MotorStatus) & int('100000',2)): # error: abort test
test.sendFeedback('No motor link (bit# 5)', False)
return
if bool(int(MotorStatus) & int('1000000',2)): # error: abort test
test.sendFeedback('No poti link (bit# 6)', False)
return
if bool(int(MotorStatus) & int('10000000',2)): # error: abort test
test.sendFeedback('Calibration error (bit# 7)', False)
return
if bool(int(MotorStatus) & int('100000000',2)): # error: abort test
test.sendFeedback('Cannot get to R1 (bit# 8)', False)
return
if bool(int(MotorStatus) & int('1000000000',2)): # error: abort test
test.sendFeedback('Cannot get to R2 (bit# 9)', False)
return
if bool(int(MotorStatus) & int('10000000000',2)): # error: abort test
test.sendFeedback('Position measurement mismatch (bit# 10)', False)
return
if bool(int(MotorStatus) & int('100000000000',2)): # error: abort test
test.sendFeedback('Movement timeout (bit# 11)', False)
return
# Closing channels
idMotorStatus.close()
idLogicalPosition.close()
idPotiRaw.close()
idBtvsRaw.close()
idBtvs.close()
idMotorPosition.close()
idPotiPosition.close()
idPotiRef1Position.close()
idPotiRef2Position.close()
idDiameter.close()
idInkr.close()
idInkrRb.close()
idCom.close()
scan.end()
ret = 'Slide moved back and forth (' + str(count) + ' runs)'
success = True
################ END OF YOUR CODE ################
###### Final - DO NOT MODIFY THE CODE BELOW ######
# just in case the feedback was forgotten
test.sendFeedback(ret, success)
except:
# generic error handler
ret = traceback.format_exc()
success = False
test.sendFeedback(ret, success)
# launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,209 @@
# Script Motor Test 2 for production system
# Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
###### Init - DO NOT MODIFY THE CODE BELOW ######
global sys, inspect, os, traceback
import sys, inspect, os, traceback
def startTest(testName, DEVICE, params):
# by default, assume the test failed
ret = 'Test failed'
success = False
# plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
# put the whole custom code under try/catch
try:
# get the path of this script
testPath = inspect.getfile(inspect.currentframe())
# init the testing tool class. It can be sued in the following ways:
test = TestingTool(testName, testPath, DEVICE, params)
######### WRITE YOUR CODE HERE BELOW #############
# get parameters from the calling interface
try:
test.log("Running test with the following parameters:")
test.log(params)
middle = float(test.getParam("midPoint"))
loopTimes = int(test.getParam("repeatTimes"))
span = float(test.getParam("spanFromMidPoint"))
settlingTime = 0.2 #seconds
except:
ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
success = False
test.sendFeedback(ret, success)
return
scan = ManualScan(['time [1/'+ str(1/settlingTime) + ' s]'], ['Motor Pos (IST3:2)', 'Poti Position (IST2:1)',
'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
'Diameter (DIAM:2)', 'Logical Position (IST:2)',
'Motor Pos Raw (IST3:1)','Poti Pos From Beam (IST1:2)',
'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
scan.setPlotTitle(plotName)
scan.start()
# coloured plot (one colour per scan)
p1 = plot(None, name="Poti-Increment difference", context=plotName + " difference")[0]
p2 = plot(None, name="Poti-MotorPosition difference", context=plotName + " difference")[0]
# Creating channels: dimension 1
try:
idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
idMotorPositionRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
idMotorPosition = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
idPotiPosFromBeam = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
test.sendFeedback(ret, success)
return
direction = 1.0
startDefault = middle - span
endDefault = middle + span
end = endDefault + 1
# find position: it will be the middle point of the test
test.log('Moving to middle point ' + str(middle))
idInkr.put(middle, timeout=None) # TODO: Set appropriate timeout
readback2 = idInkr.get()
if abs(readback2 - middle) > 5: # TODO: Check accuracy
ret = 'Actor idInkr could not be set to the value ' + str(middle) + ' (current value: ' + str(
readback2) + ')'
success = False
test.sendFeedback(ret, success)
return
start = readback2 + direction
countSteps = 0
count = 0
test.log('Moving around middle point (+-' + str(span) + ')')
for setpoint1 in range(0, (loopTimes * 2)):
count = count + 1
sleep(5) # Settling time
p1.addSeries(LinePlotSeries("Run" + str(count)))
# RegionPositioner idInkr
for setpoint2 in frange(start, end, direction):
readback1 = setpoint1
idInkr.put(setpoint2, timeout=None) # TODO: Set appropriate timeout
sleep(settlingTime) # Settling time
readback2 = idInkr.get()
MotorStatus = idMotorStatus.get()
LogicalPosition = idLogicalPosition.get()
PotiRaw = idPotiRaw.get()
MotorPositionRaw = idMotorPositionRaw.get()
MotorPosition = idMotorPosition.get()
PotiPosFromBeam = idPotiPosFromBeam.get()
PotiPosition = idPotiPosition.get()
PotiRef1Position = idPotiRef1Position.get()
PotiRef2Position = idPotiRef2Position.get()
Diameter = idDiameter.get()
Inkr = idInkr.get()
InkrRb = idInkrRb.get()
idDiff01 = PotiPosition - MotorPosition
countSteps = countSteps + 1
scan.append([setpoint2], [setpoint2],
[MotorPosition, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, LogicalPosition,
MotorPositionRaw, PotiPosFromBeam, PotiRaw, PotiRef1Position, PotiRef2Position])
p1.getSeries(count).appendData(setpoint2, idDiff01)
if (direction > 0.0 and setpoint2 >= end - 1):
# invert direction and swap start with end of translation
end = startDefault - 1
start = setpoint2 - direction
direction = -1.0
test.log('End of span (' + str(setpoint2) + '), changing direction to ' + str(direction))
break
if (direction < 0.0 and setpoint2 <= end + 1):
# invert direction and swap start with end of translation
end = endDefault + 1
start = setpoint2 - direction
direction = 1.0
test.log('End of span (' + str(setpoint2) + '), changing direction to ' + str(direction))
break
#extract Status bits
endH = bool(int(MotorStatus) & 8) #Ref2 (high limit)
endL = bool(int(MotorStatus) & 4) #Ref1 (low limit)
#check if arrived to R1 or R2; if so, invert direction
if endH:
# invert direction and swap start with end of translation
end = startDefault - 1
start = setpoint2 - direction
direction = -1.0
test.log('Reached R2 switch, changing direction to ' + str(direction))
break
elif endL:
# invert direction and swap start with end of translation
end = endDefault + 1
start = setpoint2 - direction
direction = 1.0
test.log('Reached R1 switch, changing direction to ' + str(direction))
break
#check if any error bit is raised
if bool(int(MotorStatus) & int('10000',2)): #error: abort test
test.sendFeedback('Motor switched off (bit#4)', False)
return
if bool(int(MotorStatus) & int('100000',2)): #error: abort test
test.sendFeedback('No motor link (bit#5)', False)
return
if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
test.sendFeedback('No poti link (bit#6)', False)
return
if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
test.sendFeedback('Calibration error (bit#7)', False)
return
if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
test.sendFeedback('Cannot get to R1 (bit#8)', False)
return
if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
test.sendFeedback('Cannot get to R2 (bit#9)', False)
return
if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
test.sendFeedback('Position measurement mismatch (bit#10)', False)
return
if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
test.sendFeedback('Movement timeout (bit#11)', False)
return
# Closing channels
idMotorStatus.close()
idLogicalPosition.close()
idPotiRaw.close()
idMotorPositionRaw.close()
idMotorPosition.close()
idPotiPosFromBeam.close()
idPotiPosition.close()
idPotiRef1Position.close()
idPotiRef2Position.close()
idDiameter.close()
idInkr.close()
idInkrRb.close()
scan.end()
ret = 'Slide moved back and forth (' + str(count) + ' runs)'
success = True
################ END OF YOUR CODE ################
###### Final - DO NOT MODIFY THE CODE BELOW ######
# just in case the feedback was forgotten
test.sendFeedback(ret, success)
except:
# generic error handler
ret = traceback.format_exc()
success = False
test.sendFeedback(ret, success)
# launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,16 @@
<html>
<body>
<h2>Short Description</h2>
Oscillate around a specified position
<h2>Details</h2>
Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
<h2>Parameters</h2>
<code>repeatTimes</code> Repeat N times<br/>
<code>midPoint</code> Position A [mm]<br/>
<code>spanFromMidPoint</code> The B steps [integer]<br/>
<code>translationStep</code> Length of the movement per each traslation step [mm]<br/>
<h2>Contact</h2>
<a href="https://intranet.psi.ch/Main/MarcoBoccioli">Marco Boccioli </a>
</html>
</body>

View File

@@ -0,0 +1,7 @@
name=Motor Test 3
description=Moves from CCW to CW as a series of discrete translations (C times) logs after each translation. When end switch is encountered change direction. Repeat N times
#optional parameters. Description is compulsory. Syntax&
#parameters=<parameter1Name>&<parameter1Value>&<Parameter 1 description>[;<parameter2Name>&<parameter2Value>&<Parameter 2 description>]
parameters=repeatTimes&1&Repeat N times;translation&2&Translation C steps

View File

@@ -0,0 +1,212 @@
#Script Motor Test 3
#Moves from CCW to CW as a series of discrete translations (C times) logs after each translation. When end switch is encountered change direction. Repeat N times
###### Init - DO NOT MODIFY THE CODE BELOW ######
global sys, inspect, os, traceback
import sys, inspect, os, traceback
def startTest(testName, DEVICE, params):
#by default, assume the test failed
ret = 'Test failed'
success = False
#plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
#put the whole custom code under try/catch
try:
#get the path of this script
testPath = inspect.getfile(inspect.currentframe())
#init the testing tool class. It can be sued in the following ways:
test = TestingTool(testName, testPath, DEVICE, params)
######### WRITE YOUR CODE HERE BELOW #############
#get parameters from the calling interface
try:
test.log("Running test Motor Test 3 with the following parameters:")
test.log(params)
loopTimes = int(test.getParam("repeatTimes")) # C times
translation = int(test.getParam("translation")) # Increment mm
samplePeriod = 0.2 #seconds
except:
test.log("Could not retrieve testing parameters: ", sys.exc_info()[0])
ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
success = False
test.sendFeedback(ret, success)
return
scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], [
'Btvs Poti Position (IST3:2)',
'Mcs Poti Position (IST2:1)',
'Motor Status (STA:1)',
'Inkr (INKR:2)',
'InkrRb (INKRRB:2)',
'Diameter (DIAM:2)',
'Logical Position (IST:2)',
'Btvs Raw (IST3:1)',
'Motor Position (IST1:2)',
'Poti Raw (POSA:1)',
'Poti Ref1 Position (REF1:1)',
'Poti Ref2 Position (REF2:1)'])
scan.setPlotTitle(plotName)
scan.start()
p1 = plot(None, name = "Motor Position - Btvs Poti Position", context = plotName + " Motor-Poti difference")[0]
# Creating channels
try:
idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
idBtvsRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
idBtvs = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
idMotorPosition = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
idCom = Channel(DEVICE + ':COM:2' , type = 'd') # motor commands [0=Stop; 1=Calibrate; 2=gotoR1; 3=gotoR2]
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
test.sendFeedback( ret, success)
return
#go to position at Low end switch: it will be the starting point of the test
test.log('Homing')
idCom.put(2, timeout=10) # go to R1
# wait for motor to get to Ref1
for setpoint1 in range(0, 100):
sleep( 2 ) # Settling time
MotorStatus = idMotorStatus.get()
if bool(int(MotorStatus) & 4): # arrived at Ref1 (low limit)
break
if not bool(int(MotorStatus) & 4): # not arrived at Ref1 (low limit)
ret = 'Could not reach Ref1'
success = False
test.sendFeedback( ret, success)
return
direction = 1
countSteps = 0
test.log('Starting testing sequence')
count = 0
for setpoint1 in range(0, (loopTimes*2)):
count = count + 1
sleep( 2 ) # Settling time
# add multi cuve plot
p1.addSeries(LinePlotSeries("Run"+str(count)))
for setpoint2 in frange(0, 1000000):
idInkr.put(translation*direction, timeout=10)
sleep(samplePeriod) # Settling time
currentTime = float(java.lang.System.currentTimeMillis())
MotorStatus = idMotorStatus.get()
LogicalPosition = idLogicalPosition.get()
PotiRaw = idPotiRaw.get()
BtvsRaw = idBtvsRaw.get()
Btvs = idBtvs.get()
MotorPosition = idMotorPosition.get()
PotiPosition = idPotiPosition.get()
PotiRef1Position = idPotiRef1Position.get()
PotiRef2Position = idPotiRef2Position.get()
Diameter = idDiameter.get()
Inkr = idInkr.get()
InkrRb = idInkrRb.get()
idDiff01 = MotorPosition-Btvs
countSteps = countSteps + (translation*direction)
# multi plot
scan.append([currentTime], [currentTime],[
Btvs,
PotiPosition,
MotorStatus,
Inkr,
InkrRb,
Diameter,
LogicalPosition,
BtvsRaw,
MotorPosition,
PotiRaw,
PotiRef1Position,
PotiRef2Position])
# draw diff against steps
p1.getSeries(count).appendData(countSteps, idDiff01)
#extract Status bits
endH = bool(int(MotorStatus) & 8) #Ref2 (high limit)
endL = bool(int(MotorStatus) & 4) #Ref1 (low limit)
#check if arrived to R1 or R2
if endH:
#invert direction and swap start with end of translation
direction = -1
test.log('Reached R2 switch, changing target to R1')
break
elif endL:
#invert direction and swap start with end of translation
direction = 1
test.log('Reached R1 switch, changing target to R2')
break
#check if any error bit is raised
if bool(int(MotorStatus) & int('10000',2)): #error: abort test
test.sendFeedback('Motor switched off (bit#4)', False)
return
if bool(int(MotorStatus) & int('100000',2)): #error: abort test
test.sendFeedback('No motor link (bit#5)', False)
return
if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
test.sendFeedback('No poti link (bit#6)', False)
return
if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
test.sendFeedback('Calibration error (bit#7)', False)
return
if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
test.sendFeedback('Cannot get to R1 (bit#8)', False)
return
if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
test.sendFeedback('Cannot get to R2 (bit#9)', False)
return
if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
test.sendFeedback('Position measurement mismatch (bit#10)', False)
return
if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
test.sendFeedback('Movement timeout (bit#11)', False)
return
#Closing channels
idMotorStatus.close()
idLogicalPosition.close()
idPotiRaw.close()
idBtvsRaw.close()
idBtvs.close()
idMotorPosition.close()
idPotiPosition.close()
idPotiRef1Position.close()
idPotiRef2Position.close()
idDiameter.close()
idInkr.close()
idInkrRb.close()
idCom.close()
scan.end()
ret = 'Slide moved back and forth (' + str(count) + ' runs)'
success = True
################ END OF YOUR CODE ################
###### Final - DO NOT MODIFY THE CODE BELOW ######
#just in case the feedback was forgotten
test.sendFeedback(ret, success)
except:
#generic error handler
ret = traceback.format_exc()
success = False
test.sendFeedback(ret, success)
#launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,13 @@
<html>
<body>
<h2>Description</h2>
Moves from CCW to CW as a series of discrete translations (C steps) logs after each translation. When end switch is encountered change direction. Repeat N times
<h2>Parameters</h2>
<code>repeatTimes </code>How many N times the test is repeated<br/>
<code>translation </code>How many C steps are done for one translation<br/>
<h2>Contact</h2>
<a href="https://intranet.psi.ch/search/#?t=phonebook&q=boccioli_m">boccioli_m</a>
</html>
</body>

View File

@@ -0,0 +1,3 @@
name=Move Ref 1
description=Moves to the Reference 1 Position
filename=Move Ref 1.xml

View File

@@ -0,0 +1,90 @@
###### DO NOT MODIFY THE CODE BELOW ######
def startTest(testName, DEVICE, params):
#get the path of this script
testPath = inspect.getfile(inspect.currentframe())
#by default, failed
ret = 'Test failed'
success = False
#plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
###### WRITE YOUR CODE HERE BELOW #######
#get parameters from the calling interface
print_log(testName, DEVICE, 'testpath: ' + testPath )
print_log(testName, DEVICE, 'parameters:' + str( params) )
print_log(testName, DEVICE, 'device: ' + DEVICE )
scan = ManualScan(['time'], ['idMotorStep', 'idPotiPosition', 'idPotiRef1Position','idMotorStep-idPotiPosition'] , [0.0], [30.0], [20])
scan.setPlotTitle(plotName)
scan.start()
#Creating channels: dimension 1
try:
idCom = Channel(DEVICE+':COM:2', type = 'd') #current position as from motor step counter [mm]
idMotorStep = Channel(DEVICE+':IST3:2', type = 'd') #current position as from motor step counter [mm]
idPotiPosFromBeam = Channel(DEVICE+':IST1:2', type = 'd') #current position from beam as from potentiometer [mm]
idPotiPosition = Channel(DEVICE+':IST2:1', type = 'd') #current position as from potentiometer [mm]
idPotiRef1Position = Channel(DEVICE+':REF1:1', type = 'd') #R1 position as from potentiometer [mm]
idPotiRef2Position = Channel(DEVICE+':REF2:1', type = 'd') #R2 position as from potentiometer [mm]
except:
sendFeedback(testPath, testName, DEVICE, 'Unable to create channel - ' + traceback.format_exc(), False)
#raise Exception('Unable to create channel - ' + traceback.format_exc())
return
idCom.put('3', timeout=None) # go to R1
print_log(testName, DEVICE, 'Moving to reference point')
#scan quickly the output during some seconds
detector4 = idPotiPosition.get()
detector6 = idPotiRef2Position.get()
timeElapsed=0
while detector4>detector6 and timeElapsed<600:
#Detector time
detector1 = float(java.lang.System.currentTimeMillis())
detector2 = idMotorStep.get()
detector3 = idPotiPosFromBeam.get()
detector4 = idPotiPosition.get()
detector5 = idPotiRef1Position.get()
detector6 = idPotiRef2Position.get()
diff1 = detector2-detector4
scan.append ([detector1], [detector1], [detector2, detector4, detector5, diff1])
sleep( 0.1 ) # Settling time
timeElapsed=timeElapsed+1
#Closing channels
idCom.close()
idMotorStep.close()
idPotiPosFromBeam.close()
idPotiPosition.close()
idPotiRef1Position.close()
idPotiRef2Position.close()
print_log(testName, DEVICE, ' Reference point reached')
########## END OF YOUR CODE ###########
###### DO NOT MODIFY THE CODE BELOW ######
sendFeedback(testPath, testName, DEVICE, ret, success)
#prepare and send feedback to calling tool
def sendFeedback(testPath, testName, DEVICE, returnString, testPassed):
print_log(testName, DEVICE, 'End of test. Result:')
print_log(testName, DEVICE, 'Test path: ' + testPath)
print_log(testName, DEVICE, 'Test name: ' + testName )
print_log(testName, DEVICE, 'Device: ' + DEVICE)
print_log(testName, DEVICE, 'Test passed: ' + str(testPassed))
print_log(testName, DEVICE, 'Return string: ' + returnString)
ret = [testPath, DEVICE, returnString, testPassed]
set_return(ret)
def print_log(testName, DEVICE, text):
time.ctime()
now = time.strftime('%Y.%m.%d %H:%M:%S')
print now + ' ' + DEVICE + ' - ' + testName + ': ' + text
import sys, inspect, os, traceback
#get test arguments
DEVICE = device
testName = test
params = parameters
#launch the test
startTest(testName, DEVICE, params)

View File

@@ -0,0 +1,144 @@
# Drive to R1
###### Init - DO NOT MODIFY THE CODE BELOW ######
global sys, inspect, os, traceback
import sys, inspect, os, traceback
def startTest(testName, DEVICE, params):
# by default, assume the test failed
ret = 'Test failed'
success = False
# plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
# put the whole custom code under try/catch
try:
# get the path of this script
testPath = inspect.getfile(inspect.currentframe())
# init the testing tool class. It can be sued in the following ways:
test = TestingTool(testName, testPath, DEVICE, params)
samplePeriod = 0.1
######### WRITE YOUR CODE HERE BELOW #############
scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], ['Motor Pos (IST3:2)', 'Poti Position (IST2:1)',
'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
'Diameter (DIAM:2)', 'Com (COM:2)', 'Logical Position (IST:2)',
'Motor Pos Raw (IST3:1)','Poti Pos From Beam (IST1:2)',
'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
scan.setPlotTitle(plotName)
scan.start()
try:
idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
idMotorPositionRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
idCom = Channel(DEVICE + ':COM:2' , type = 'd') # current position as from motor step counter [mm]
idMotorPosition = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
idPotiPosFromBeam = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
idCom.put('3', timeout=None) # go to R1
sleep( samplePeriod ) # Settling time
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
test.sendFeedback( ret, success)
return
#scan for a while to collect data
for setpoint1 in range(0, 10000):
sleep( samplePeriod ) # Settling time
MotorStatus = idMotorStatus.get()
LogicalPosition = idLogicalPosition.get()
PotiRaw = idPotiRaw.get()
MotorPositionRaw = idMotorPositionRaw.get()
Com = idCom.get()
MotorPosition = idMotorPosition.get()
PotiPosFromBeam = idPotiPosFromBeam.get()
PotiPosition = idPotiPosition.get()
PotiRef1Position = idPotiRef1Position.get()
PotiRef2Position = idPotiRef2Position.get()
Diameter = idDiameter.get()
Inkr = idInkr.get()
InkrRb = idInkrRb.get()
scan.append([setpoint2], [setpoint2],
[MotorPosition, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, Com, LogicalPosition,
MotorPositionRaw, PotiPosFromBeam, PotiRaw, PotiRef1Position, PotiRef2Position])
if (MotorStatus & int('1',2))==0: #device finished calibration (bit#1)
#give the device some time before stating that it has really finished
countDeviceInModeIdle = countDeviceInModeIdle +1
if countDeviceInModeIdle == 10:
break
else:
countDeviceInModeIdle = 0
#check if any error bit is raised
if bool(int(MotorStatus) & int('10000',2)): #error: abort test
test.sendFeedback('Motor switched off (bit#4)', False)
return
if bool(int(MotorStatus) & int('100000',2)): #error: abort test
test.sendFeedback('No motor link (bit#5)', False)
return
if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
test.sendFeedback('No poti link (bit#6)', False)
return
if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
test.sendFeedback('Calibration error (bit#7)', False)
return
if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
test.sendFeedback('Cannot get to R1 (bit#8)', False)
return
if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
test.sendFeedback('Cannot get to R2 (bit#9)', False)
return
if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
test.sendFeedback('Position measurement mismatch (bit#10)', False)
return
if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
test.sendFeedback('Movement timeout (bit#11)', False)
return
#Closing channels
idMotorStatus.close()
idLogicalPosition.close()
idPotiRaw.close()
idMotorPositionRaw.close()
idCom.close()
idMotorPosition.close()
idPotiPosFromBeam.close()
idPotiPosition.close()
idPotiRef1Position.close()
idPotiRef2Position.close()
idDiameter.close()
idInkr.close()
idInkrRb.close()
scan.end()
ret = 'Moved to R1'
success = True
scan.end()
################ END OF YOUR CODE ################
###### Final - DO NOT MODIFY THE CODE BELOW ######
# just in case the feedback was forgotten
test.sendFeedback(ret, success)
except:
# generic error handler
ret = traceback.format_exc()
success = False
test.sendFeedback(ret, success)
# launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.psi.ch/~ebner/models/scan/1.0">
<data fileName="Move Ref 1.fda"/>
<scan>
<!-- Send Move to Ref 1 Command -->
<preAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ChannelAction" channel="{DEVICE}:COM:2" value="FAHR_R1"/>
<dimension>
<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="PseudoPositioner" settlingTime="0.1" id="id000000">
<counts>3000</counts>
</positioner>
<!-- Motor Drive Status -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:1" id="id000001"/>
<!-- Logical Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:2" id="id00001B"/> -->
<!-- Interlock Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IIST:2" id="id000002"/> -->
<!-- Logical Position -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST:2" id="id000003"/>
<!-- Collimator Diameter -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:DIAM:2" id="id000004"/>
<!-- Position Counter: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:1" id="id000005"/>
<!-- Position Counter: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:2" id="id000006"/>
<!-- Potentiometer: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:1" id="id000007"/>
<!-- Potentiometer: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:2" id="id000008"/>
<!-- BTVS Digitiser: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:1" id="id000009"/>
<!-- BTVS Digitiser: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:2" id="id000010"/>
</dimension>
</scan>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000001" title="Drive Status: {DEVICE}:STA:1"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000002" title="ILK Status: {DEVICE}:IIST:2"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000003" title="Logical Pos: {DEVICE}:IST:2"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000004" title="Diameter: {DEVICE}:DIAM:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000005" title="Cpc: {DEVICE}:IST1:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000006" title="Cpc: {DEVICE}:IST1:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000007" title="Pot: {DEVICE}:IST2:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000008" title="Pot: {DEVICE}:IST2:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000009" title="Btvs: {DEVICE}:IST3:1 (ADC raw)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000010" title="Btvs: {DEVICE}:IST3:2 (mm)"/>
</configuration>

View File

@@ -0,0 +1,13 @@
<html>
<body>
<h2>Short Description</h2>
Go to reference position R1
<h2>Details</h2>
Go to reference position R1 (command '3').
<h2>Parameters</h2>
none
<h2>Contact</h2>
<a href="https://intranet.psi.ch/Main/MarcoBoccioli">Marco Boccioli </a>
</html>
</body>

View File

@@ -0,0 +1,3 @@
name=Move Ref 2
description=Moves to the Reference 2 Position
filename=Move Ref 2.xml

View File

@@ -0,0 +1,144 @@
# Drive to R2
###### Init - DO NOT MODIFY THE CODE BELOW ######
global sys, inspect, os, traceback
import sys, inspect, os, traceback
def startTest(testName, DEVICE, params):
# by default, assume the test failed
ret = 'Test failed'
success = False
# plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
# put the whole custom code under try/catch
try:
# get the path of this script
testPath = inspect.getfile(inspect.currentframe())
# init the testing tool class. It can be sued in the following ways:
test = TestingTool(testName, testPath, DEVICE, params)
samplePeriod = 0.1
######### WRITE YOUR CODE HERE BELOW #############
scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], ['Motor Pos (IST3:2)', 'Poti Position (IST2:1)',
'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
'Diameter (DIAM:2)', 'Com (COM:2)', 'Logical Position (IST:2)',
'Motor Pos Raw (IST3:1)','Poti Pos From Beam (IST1:2)',
'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
scan.setPlotTitle(plotName)
scan.start()
try:
idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
idMotorPositionRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
idCom = Channel(DEVICE + ':COM:2' , type = 'd') # current position as from motor step counter [mm]
idMotorPosition = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
idPotiPosFromBeam = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
idCom.put('4', timeout=None) # go to R2
sleep( samplePeriod ) # Settling time
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
test.sendFeedback( ret, success)
return
#scan for a while to collect data
for setpoint1 in range(0, 10000):
sleep( samplePeriod ) # Settling time
MotorStatus = idMotorStatus.get()
LogicalPosition = idLogicalPosition.get()
PotiRaw = idPotiRaw.get()
MotorPositionRaw = idMotorPositionRaw.get()
Com = idCom.get()
MotorPosition = idMotorPosition.get()
PotiPosFromBeam = idPotiPosFromBeam.get()
PotiPosition = idPotiPosition.get()
PotiRef1Position = idPotiRef1Position.get()
PotiRef2Position = idPotiRef2Position.get()
Diameter = idDiameter.get()
Inkr = idInkr.get()
InkrRb = idInkrRb.get()
scan.append([setpoint2], [setpoint2],
[MotorPosition, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, Com, LogicalPosition,
MotorPositionRaw, PotiPosFromBeam, PotiRaw, PotiRef1Position, PotiRef2Position])
if (MotorStatus & int('1',2))==0: #device finished calibration (bit#1)
#give the device some time before stating that it has really finished
countDeviceInModeIdle = countDeviceInModeIdle +1
if countDeviceInModeIdle == 10:
break
else:
countDeviceInModeIdle = 0
#check if any error bit is raised
if bool(int(MotorStatus) & int('10000',2)): #error: abort test
test.sendFeedback('Motor switched off (bit#4)', False)
return
if bool(int(MotorStatus) & int('100000',2)): #error: abort test
test.sendFeedback('No motor link (bit#5)', False)
return
if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
test.sendFeedback('No poti link (bit#6)', False)
return
if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
test.sendFeedback('Calibration error (bit#7)', False)
return
if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
test.sendFeedback('Cannot get to R1 (bit#8)', False)
return
if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
test.sendFeedback('Cannot get to R2 (bit#9)', False)
return
if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
test.sendFeedback('Position measurement mismatch (bit#10)', False)
return
if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
test.sendFeedback('Movement timeout (bit#11)', False)
return
#Closing channels
idMotorStatus.close()
idLogicalPosition.close()
idPotiRaw.close()
idMotorPositionRaw.close()
idCom.close()
idMotorPosition.close()
idPotiPosFromBeam.close()
idPotiPosition.close()
idPotiRef1Position.close()
idPotiRef2Position.close()
idDiameter.close()
idInkr.close()
idInkrRb.close()
scan.end()
ret = 'Moved to R2'
success = True
scan.end()
################ END OF YOUR CODE ################
###### Final - DO NOT MODIFY THE CODE BELOW ######
# just in case the feedback was forgotten
test.sendFeedback(ret, success)
except:
# generic error handler
ret = traceback.format_exc()
success = False
test.sendFeedback(ret, success)
# launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.psi.ch/~ebner/models/scan/1.0">
<data fileName="Move Ref 2.fda"/>
<scan>
<!-- Send Move to Ref 2 Command -->
<preAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ChannelAction" channel="{DEVICE}:COM:2" value="FAHR_R2"/>
<dimension>
<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="PseudoPositioner" settlingTime="0.1" id="id000000">
<counts>3000</counts>
</positioner>
<!-- Motor Drive Status -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:1" id="id000001"/>
<!-- Logical Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:2" id="id00001B"/> -->
<!-- Interlock Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IIST:2" id="id000002"/> -->
<!-- Logical Position -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST:2" id="id000003"/>
<!-- Collimator Diameter -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:DIAM:2" id="id000004"/>
<!-- Position Counter: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:1" id="id000005"/>
<!-- Position Counter: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:2" id="id000006"/>
<!-- Potentiometer: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:1" id="id000007"/>
<!-- Potentiometer: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:2" id="id000008"/>
<!-- BTVS Digitiser: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:1" id="id000009"/>
<!-- BTVS Digitiser: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:2" id="id000010"/>
</dimension>
</scan>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000001" title="Drive Status: {DEVICE}:STA:1"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000002" title="ILK Status: {DEVICE}:IIST:2"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000003" title="Logical Pos: {DEVICE}:IST:2"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000004" title="Diameter: {DEVICE}:DIAM:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000005" title="Cpc: {DEVICE}:IST1:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000006" title="Cpc: {DEVICE}:IST1:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000007" title="Pot: {DEVICE}:IST2:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000008" title="Pot: {DEVICE}:IST2:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000009" title="Btvs: {DEVICE}:IST3:1 (ADC raw)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000010" title="Btvs: {DEVICE}:IST3:2 (mm)"/>
</configuration>

View File

@@ -0,0 +1,13 @@
<html>
<body>
<h2>Short Description</h2>
Go to reference position R2
<h2>Details</h2>
Go to reference position R2 (command '4').
<h2>Parameters</h2>
none
<h2>Contact</h2>
<a href="https://intranet.psi.ch/Main/MarcoBoccioli">Marco Boccioli </a>
</html>
</body>

View File

@@ -0,0 +1,3 @@
name=Stop
description=Sends the STOP command
filename=Stop.xml

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.psi.ch/~ebner/models/scan/1.0">
<data fileName="Stop.fda"/>
<scan>
<!-- Send STOP Command -->
<preAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ChannelAction" channel="{DEVICE}:COM:2" value="STOP"/>
<dimension>
<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="PseudoPositioner" settlingTime="0.1" id="id000000">
<counts>3000</counts>
</positioner>
<!-- Motor Drive Status -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:1" id="id000001"/>
<!-- Logical Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:2" id="id00001B"/> -->
<!-- Interlock Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IIST:2" id="id000002"/> -->
<!-- Logical Position -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST:2" id="id000003"/>
<!-- Collimator Diameter -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:DIAM:2" id="id000004"/>
<!-- Position Counter: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:1" id="id000005"/>
<!-- Position Counter: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:2" id="id000006"/>
<!-- Potentiometer: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:1" id="id000007"/>
<!-- Potentiometer: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:2" id="id000008"/>
<!-- BTVS Digitiser: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:1" id="id000009"/>
<!-- BTVS Digitiser: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:2" id="id000010"/>
</dimension>
</scan>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000001" title="Drive Status: {DEVICE}:STA:1"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000002" title="ILK Status: {DEVICE}:IIST:2"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000003" title="Logical Pos: {DEVICE}:IST:2"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000004" title="Diameter: {DEVICE}:DIAM:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000005" title="Cpc: {DEVICE}:IST1:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000006" title="Cpc: {DEVICE}:IST1:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000007" title="Pot: {DEVICE}:IST2:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000008" title="Pot: {DEVICE}:IST2:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000009" title="Btvs: {DEVICE}:IST3:1 (ADC raw)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000010" title="Btvs: {DEVICE}:IST3:2 (mm)"/>
</configuration>

View File

@@ -0,0 +1,4 @@
#Fri Sep 11 13&31&33 CEST 2015
name=monitorAllParams
parameters=monitorTime&0.1&This is the parameter n.1 with unit [unit];samplingDelay&30&This is the parameter n.2 with unit [unit];
description=d

View File

@@ -0,0 +1,13 @@
<html>
<body>
<h2>Description</h2>
d
<h2>Parameters</h2>
<code>monitorTime </code>This is the parameter n.1 with unit [unit]<br/>
<code>samplingDelay </code>This is the parameter n.2 with unit [unit]<br/>
<h2>Contact</h2>
<a href="https://intranet.psi.ch/search/#?t=phonebook&q=boccioli_m">boccioli_m</a>
</html>
</body>

View File

@@ -0,0 +1,145 @@
# Test name: monitorAllParams
# d
###### Init - DO NOT MODIFY THE CODE BELOW ######
global sys, inspect, os, traceback
import sys, inspect, os, traceback
def startTest(testName, DEVICE, params):
# by default, assume the test failed
ret = 'Test failed'
success = False
# plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
# put the whole custom code under try/catch
try:
# get the path of this script
testPath = inspect.getfile(inspect.currentframe())
# init the testing tool class. It can be sued in the following ways:
test = TestingTool(testName, testPath, DEVICE, params)
################ END OF Init #####################
######### WRITE YOUR CODE HERE BELOW #############
"""
All the code in this section ###..YOUR CODE..### can be modified/deleted.
It must be indented to the same level as this comment
-----------------------------------
GETTING INPUTS:
If needed, the following variables are available:
testPath string, path of this test file
testName string, name of this test
DEVICE string, device for which the test must run (typically it is the beginning of a process variable name)
-----------------------------------
GETTING TEST PARAMETERS:
if you need to get parameters for the test, use (casting may be necessary):
myParamValue = test.getParam('myParamName')
see the test config for the list of parameters specific to the test.
-----------------------------------
SETTING OUTPUTS:
ret string, a text summarizing the result of the test. It must be set before the end of your code.
success bool, True = test successful. It must be set before the end of your code.
test.sendFeedback(ret,success) method that ends the testing script and gives the report to the calling application.
Examples:
whenever the code must quit (i.e. after an error), you must end with:
ret = 'here is some info on what failed on the test'
success = false
test.sendFeedback(ret, success)
whenever the code is finished successfully, you must end with:
ret = 'here is some info on the success of the test'
success = true
test.sendFeedback(ret, success)
-----------------------------------
LOG INFO:
when some information must be shown on the log, use:
test.log('test to log')
"""
########## Example (can be removed) ######
# print the list of parameters passed. If any error, stop and send feedback
test.log("Example - Test name: " + testName)
test.log("Example - Device name: " + DEVICE)
try:
test.log("Running test Initialise with the following parameters:")
test.log(params)
# If present, use the parameters here below for your test script. You might need to change the casting
monitorTime = float(test.getParam('monitorTime')) ; samplingDelay = float(test.getParam('samplingDelay')) ;
except:
ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
success = False
test.sendFeedback(ret, success)
return
# loop to read channels for a while and plot the channels values.
# initialise plot tab with 2 plots
scan = ManualScan(['sample'], ['Motor Status (MSTA)', 'Motor Position (VAL)'])
# set plot name(tab title)
scan.setPlotTitle(plotName)
# start plots. See further below how to add points to the plots
scan.start()
# IMPORTANT: if the test failed, write the report into the variables ret and success.
# for example, write the following:
ret = "Example - Error, the test failed because...."
success = False
# set up connection to channels. "type" of data can be "d" (= double), "l" (= long)
try:
pv_motor_msta = Channel(DEVICE + ':MOTOR.MSTA', type='d')
pv_motor_val = Channel(DEVICE + ':MOTOR.VAL', type='d')
except:
# prepare return information: return text
ret = 'Unable to create channel - ' + traceback.format_exc()
# prepare return information: return success
success = False
# send return information
test.sendFeedback(ret, success)
return
# take 100 samples of the channels
for sample in range(0, 100):
readback1 = sample
sleep(0.1) # Settling time
# get value
motor_msta = pv_motor_msta.get()
# get value
motor_val = pv_motor_val.get()
# add values to plot
scan.append([sample], [readback1], [motor_msta, motor_val])
# Closing channels
pv_motor_msta.close()
pv_motor_val.close()
# IMPORTANT: if the test was successful, write the report into the variables ret and success.
# for example, write the following:
ret = "Example - Test successful, here some detail: ..."
success = True
test.sendFeedback(ret, success)
# once the test is finished, no need to do anything. The code below yours will do the rest.
################ End of Example ##########
################ END OF YOUR CODE ################
###### Final - DO NOT MODIFY THE CODE BELOW ######
# just in case the feedback was forgotten
test.sendFeedback(ret, success)
except (KeyboardInterrupt):
# user stop error handler
ret = 'Test stopped by user.'
success = False
test.sendFeedback(ret, success)
except:
# generic error handler
ret = traceback.format_exc()
success = False
test.sendFeedback(ret, success)
# launch the test
startTest(test, device, parameters)
################ END OF Final ####################
#### IF NEEDED, ADD YOUR FUNCTIONS HERE BELOW ####
# def yourCustomFunction:

View File

@@ -0,0 +1,8 @@
Test 1 plotted curves
CCWsteps
CCWpoti
CWsteps
CWpoti

View File

@@ -0,0 +1,12 @@
name=Calibrate test vme
description=Calibrates the device
filename=Calibrate.xml
help = \
This test sends a command to the low level firmware which controls the collimators \n\
requesting that it calibrates itself. \n\n\
<b>Calibration</b> involves moving to the R1 and R2 reference positions and measuring the \n\
number of steps required to do so. At the end of the sequence the default collimator \n\
will be selected. \n\n\
During the course of the expected calibration period (45-70 seconds) the test \n\
procedure will plot the values of all critical system variables. \n\n\
For further information please consult Valery Ovinnikov.<br/>\

View File

@@ -0,0 +1,136 @@
#Script imported from: Calibrate.xml
###### DO NOT MODIFY THE CODE BELOW ######
import sys, inspect, os, traceback, time
global print_log, sendFeedback
def startTest(testName, DEVICE, params):
try:
import traceback
#get the path of this script
testPath = inspect.getfile(inspect.currentframe())
#by default, failed
ret = 'Test failed'
success = False
#plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
####### WRITE YOUR CODE HERE BELOW #######
#Pre-actions
try:
caput(DEVICE+':INIT.PROC', '1')
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
sendFeedback(testPath, testName, DEVICE, ret, success)
return
#TODO: Set the diplay names of positioners and detectors
scan = ManualScan(['id000000'], ['id000001', 'id000002', 'id000003', 'id000004', 'id000005', 'id000006', 'id000007', 'id000008', 'id000009', 'id000010', 'idResult'] , [0.0], [1000.0], [1000])
scan.start()
#Creating channels: dimension 1
#PseudoPositioner id000000
#ScalarDetector id000001
id000001 = Channel(DEVICE+':MOTOR.MSTA', type = 'd')
#ScalarDetector id000002
id000002 = Channel(DEVICE+':MOTOR.RVAL', type = 'd')
#ScalarDetector id000003
id000003 = Channel(DEVICE+':MOTOR.VAL', type = 'd')
#ScalarDetector id000004
id000004 = Channel(DEVICE+':MOTOR.ATHM', type = 'd')
#ScalarDetector id000005
id000005 = Channel(DEVICE+':MOTOR.LLS', type = 'd')
#ScalarDetector id000006
id000006 = Channel(DEVICE+':MOTOR.HLS', type = 'd')
#ScalarDetector id000007
id000007 = Channel(DEVICE+':ENCODERraw', type = 'd')
#ScalarDetector id000008
id000008 = Channel(DEVICE+':ENCODER', type = 'd')
#ScalarDetector id000009
id000009 = Channel(DEVICE+':RDY', type = 'd')
#ScalarDetector id000010
id000010 = Channel(DEVICE+':ILK', type = 'd')
#Dimension 1
#PseudoPositioner id000000
for setpoint1 in range(0, 1000):
readback1 = setpoint1
sleep( 0.05 ) # Settling time
#Detector id000001
detector1 = id000001.get()
#Detector id000002
detector2 = id000002.get()
#Detector id000003
detector3 = id000003.get()
#Detector id000004
detector4 = id000004.get()
#Detector id000005
detector5 = id000005.get()
#Detector id000006
detector6 = id000006.get()
#Detector id000007
detector7 = id000007.get()
#Detector id000008
detector8 = id000008.get()
#Detector id000009
detector9 = id000009.get()
#Detector id000010
detector10 = id000010.get()
#Manipulation idResult
#Variable Mappings
ready = detector9
interlock = detector10
count = setpoint1
if count < 800:
idResult = (0, "Note: the "+DEVICE+" calibration procedure did not complete.")
if ready == 1 and interlock == 1:
#print "The "+DEVICE+" drive was successfully initialised. The RDY and ILK signals indicate the drive is ready."
ret = 'Drive successfully initialised'
success = True
else:
#print "The RS calibration procedure failed. The RDY and ILK signals indicate the drive was NOT ready at the expected time (after 40s)."
ret = 'The RDY and ILK signals indicate the drive was NOT ready at the expected time (after 40s).'
success = False
scan.append ([setpoint1], [readback1], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, detector9, detector10, idResult])
#Closing channels
id000001.close()
id000002.close()
id000003.close()
id000004.close()
id000005.close()
id000006.close()
id000007.close()
id000008.close()
id000009.close()
id000010.close()
scan.end()
############# END OF YOUR CODE ###########
###### DO NOT MODIFY THE CODE BELOW ######
sendFeedback(testPath, testName, DEVICE, ret, success)
except:
ret = traceback.format_exc()
success = False
sendFeedback(testPath, testName, DEVICE, ret, success)
return
#prepare and send feedback to calling tool
def sendFeedback(testPath, testName, DEVICE, returnString, testPassed):
print_log(testName, DEVICE, 'End of test. Result:')
print_log(testName, DEVICE, 'Test path: ' + testPath)
print_log(testName, DEVICE, 'Test name: ' + testName)
print_log(testName, DEVICE, 'Device: ' + DEVICE)
print_log(testName, DEVICE, 'Test passed: ' + str(testPassed))
print_log(testName, DEVICE, 'Return string: ' + returnString)
ret = [testPath, DEVICE, returnString, testPassed]
set_return(ret)
def print_log(testName, DEVICE, text):
time.ctime()
now = time.strftime('%Y.%m.%d %H:%M:%S')
print now + ' ' + DEVICE + ' - ' + testName + ': ' + text
#launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,12 @@
name=Calibrate
description=Calibrates the device
filename=Calibrate.xml
help = \
This test sends a command to the low level firmware which controls the collimators \n\
requesting that it calibrates itself. \n\n\
<b>Calibration</b> involves moving to the R1 and R2 reference positions and measuring the \n\
number of steps required to do so. At the end of the sequence the default collimator \n\
will be selected. \n\n\
During the course of the expected calibration period (45-70 seconds) the test \n\
procedure will plot the values of all critical system variables. \n\n\
For further information please consult Valery Ovinnikov.<br/>\

View File

@@ -0,0 +1,79 @@
#Script imported from: Calibrate.xml
ret = 'Calibration failed'
success = False
try:
#Pre-actions: 1 = calibrate
caput(DEVICE+':COM:2', 1)
#Creating channels: dimension 1
#PseudoPositioner id000000
#ScalarDetector id000001
id000001 = Channel(DEVICE+':STA:1', type = 'd')
#ScalarDetector id000003
id000003 = Channel(DEVICE+':IST:2', type = 'd')
#ScalarDetector id000004
id000004 = Channel(DEVICE+':DIAM:2', type = 'd')
#ScalarDetector id000005
id000005 = Channel(DEVICE+':IST1:1', type = 'd')
#ScalarDetector id000006
id000006 = Channel(DEVICE+':IST1:2', type = 'd')
#ScalarDetector id000007
id000007 = Channel(DEVICE+':IST2:1', type = 'd')
#ScalarDetector id000008
id000008 = Channel(DEVICE+':IST2:2', type = 'd')
#ScalarDetector id000009
id000009 = Channel(DEVICE+':IST3:1', type = 'd')
#ScalarDetector id000010
id000010 = Channel(DEVICE+':IST3:2', type = 'd')
except:
print "Unexpected error:", sys.exc_info()[0]
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
raise Exception('Unable to create channel - ' + traceback.format_exc())
sys.exit()
#TODO: Set the diplay names of positioners and detectors
scan = ManualScan(['id000000'], ['id000001', 'id000003', 'id000004', 'id000005', 'id000006', 'id000007', 'id000008', 'id000009', 'id000010'] , [0.0], [900.0], [900])
scan.start()
#Dimension 1
#PseudoPositioner id000000
for setpoint1 in range(0, 900):
readback1 = setpoint1
sleep( 0.1 ) # Settling time
#Detector id000001
detector1 = id000001.get()
#Detector id000003
detector2 = id000003.get()
#Detector id000004
detector3 = id000004.get()
#Detector id000005
detector4 = id000005.get()
#Detector id000006
detector5 = id000006.get()
#Detector id000007
detector6 = id000007.get()
#Detector id000008
detector7 = id000008.get()
#Detector id000009
detector8 = id000009.get()
#Detector id000010
detector9 = id000010.get()
scan.append ([setpoint1], [readback1], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, detector9])
#Closing channels
id000001.close()
id000003.close()
id000004.close()
id000005.close()
id000006.close()
id000007.close()
id000008.close()
id000009.close()
id000010.close()
scan.end()
ret = 'Calibration done'
success = True

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.psi.ch/~ebner/models/scan/1.0">
<data fileName="Calibrate.fda"/>
<scan>
<!-- Send Calibrate Command -->
<preAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ChannelAction" channel="{DEVICE}:COM:2" value="CALLIBR"/>
<dimension>
<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="PseudoPositioner" settlingTime="0.1" id="id000000">
<counts>900</counts>
</positioner>
<!-- Motor Drive Status -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:1" id="id000001"/>
<!-- Logical Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:2" id="id00001B"/> -->
<!-- Interlock Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IIST:2" id="id000002"/> -->
<!-- Logical Position -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST:2" id="id000003"/>
<!-- Collimator Diameter -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:DIAM:2" id="id000004"/>
<!-- Position Counter: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:1" id="id000005"/>
<!-- Position Counter: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:2" id="id000006"/>
<!-- Potentiometer: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:1" id="id000007"/>
<!-- Potentiometer: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:2" id="id000008"/>
<!-- BTVS Digitiser: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:1" id="id000009"/>
<!-- BTVS Digitiser: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:2" id="id000010"/>
</dimension>
</scan>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000001" title="Drive Status: {DEVICE}:STA:1"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000002" title="ILK Status: {DEVICE}:IIST:2"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000003" title="Logical Pos: {DEVICE}:IST:2"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000004" title="Diameter: {DEVICE}:DIAM:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000005" title="Cpc: {DEVICE}:IST1:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000006" title="Cpc: {DEVICE}:IST1:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000007" title="Pot: {DEVICE}:IST2:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000008" title="Pot: {DEVICE}:IST2:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000009" title="Btvs: {DEVICE}:IST3:1 (ADC raw)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000010" title="Btvs: {DEVICE}:IST3:2 (mm)"/>
</configuration>

View File

@@ -0,0 +1,5 @@
name=Check Status
description=Monitors the success of the device
filename=Check Status.xml
help= \
This test plots the success of all relevant drive signals for a period of 15 seconds.

View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.psi.ch/~ebner/models/scan/1.0" failOnSensorError="true">
<data fileName="Check Status.fda"/>
<scan>
<dimension>
<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="PseudoPositioner" settlingTime="0.1" id="idX">
<counts>3000</counts>
</positioner>
<!-- Motor Drive Status -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:1" id="idMotorStatus"/>
<!-- Logical Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:2" id="id000002"/> -->
<!-- Interlock Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IIST:2" id="id000002"/> -->
<!-- Logical Position -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST:2" id="idLogicalPosition"/>
<!-- Collimator Diameter -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:DIAM:2" id="idDiameter"/>
<!-- Position Counter: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:2" id="idMotorPosition"/>
<!-- Potentiometer: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:POSA:1" id="idPotiRaw"/>
<!-- Potentiometer: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:POSA:2" id="idPotiProc"/>
<!-- BTVS Digitiser: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:1" id="idBtvsRaw"/>
<!-- BTVS Digitiser: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:2" id="idBtvsProc"/>
</dimension>
<manipulation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScriptManipulation" id="idDiff01">
<mapping xsi:type="IDParameterMapping" refid="idMotorPosition" variable="a"/>
<mapping xsi:type="IDParameterMapping" refid="idPotiProc" variable="b"/>
<mapping xsi:type="IDParameterMapping" refid="idX" variable="count"/>
<script>def process(a,b,count):
return a-b</script>
</manipulation>
<manipulation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScriptManipulation" id="idDiff02">
<mapping xsi:type="IDParameterMapping" refid="idMotorPosition" variable="a"/>
<mapping xsi:type="IDParameterMapping" refid="idBtvsProc" variable="b"/>
<mapping xsi:type="IDParameterMapping" refid="idX" variable="count"/>
<script>def process(a,b,count):
return a-b</script>
</manipulation>
</scan>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="idX" y="idMotorStatus" title="idMotorStatus"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="idX" y="idLogicalPosition" title="idLogicalPosition"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="idX" y="idDiameter" title="idDiameter"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="idX" y="idMotorPosition" title="idMotorPosition"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="idX" y="idPotiRaw" title="idPotiRaw"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="idX" y="idPotiProc" title="idPotiProc"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="idX" y="idBtvsRaw" title="idBtvsRaw"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="idX" y="idBtvsProc" title="idBtvsProc"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="idX" y="idDiff01" title="idDiff01"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="idX" y="idDiff02" title="idDiff02"/>
</configuration>

View File

@@ -0,0 +1,3 @@
name=Drive Out
description=Drives the Collimator to the Out Position
filename=Drive Out.xml

View File

@@ -0,0 +1,82 @@
#Script imported from: Drive Out.xml
import traceback
#by default, failed
ret = 'Test failed'
success = False
try:
#Pre-actions: 2 = drive out
caput(DEVICE+':COM:2', 2)
#Creating channels: dimension 1
#PseudoPositioner id000000
#ScalarDetector id000001
id000001 = Channel(DEVICE+':STA:1', type = 'd')
#ScalarDetector id000003
id000003 = Channel(DEVICE+':IST:2', type = 'd')
#ScalarDetector id000004
id000004 = Channel(DEVICE+':DIAM:2', type = 'd')
#ScalarDetector id000005
id000005 = Channel(DEVICE+':IST1:1', type = 'd')
#ScalarDetector id000006
id000006 = Channel(DEVICE+':IST1:2', type = 'd')
#ScalarDetector id000007
id000007 = Channel(DEVICE+':IST2:1', type = 'd')
#ScalarDetector id000008
id000008 = Channel(DEVICE+':IST2:2', type = 'd')
#ScalarDetector id000009
id000009 = Channel(DEVICE+':IST3:1', type = 'd')
#ScalarDetector id000010
id000010 = Channel(DEVICE+':IST3:2', type = 'd')
except:
print "Unexpected error:", sys.exc_info()[0]
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
raise Exception('Unable to create channel - ' + traceback.format_exc())
sys.exit()
#TODO: Set the diplay names of positioners and detectors
scan = ManualScan(['id000000'], ['id000001', 'id000003', 'id000004', 'id000005', 'id000006', 'id000007', 'id000008', 'id000009', 'id000010'] , [0.0], [3000.0], [3000])
scan.start()
#Dimension 1
#PseudoPositioner id000000
for setpoint1 in range(0, 3000):
readback1 = setpoint1
sleep( 0.1 ) # Settling time
#Detector id000001
detector1 = id000001.get()
#Detector id000003
detector2 = id000003.get()
#Detector id000004
detector3 = id000004.get()
#Detector id000005
detector4 = id000005.get()
#Detector id000006
detector5 = id000006.get()
#Detector id000007
detector6 = id000007.get()
#Detector id000008
detector7 = id000008.get()
#Detector id000009
detector8 = id000009.get()
#Detector id000010
detector9 = id000010.get()
scan.append ([setpoint1], [readback1], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, detector9])
#Closing channels
id000001.close()
id000003.close()
id000004.close()
id000005.close()
id000006.close()
id000007.close()
id000008.close()
id000009.close()
id000010.close()
scan.end()
#return ok
ret = 'Slides moved out'
success = True

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.psi.ch/~ebner/models/scan/1.0">
<data fileName="Drive Out.fda"/>
<scan>
<!-- Send Drive Out Command -->
<preAction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ChannelAction" channel="{DEVICE}:COM:2" value="FAHR_AUS"/>
<dimension>
<positioner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="PseudoPositioner" settlingTime="0.1" id="id000000">
<counts>3000</counts>
</positioner>
<!-- Motor Drive Status -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:1" id="id000001"/>
<!-- Logical Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:STA:2" id="id00001B"/> -->
<!-- Interlock Status -->
<!-- <detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IIST:2" id="id000002"/> -->
<!-- Logical Position -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST:2" id="id000003"/>
<!-- Collimator Diameter -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:DIAM:2" id="id000004"/>
<!-- Position Counter: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:1" id="id000005"/>
<!-- Position Counter: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST1:2" id="id000006"/>
<!-- Potentiometer: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:1" id="id000007"/>
<!-- Potentiometer: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST2:2" id="id000008"/>
<!-- BTVS Digitiser: Raw -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:1" id="id000009"/>
<!-- BTVS Digitiser: Processed -->
<detector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ScalarDetector" name="{DEVICE}:IST3:2" id="id000010"/>
</dimension>
</scan>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000001" title="Drive Status: {DEVICE}:STA:1"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000002" title="ILK Status: {DEVICE}:IIST:2"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000003" title="Logical Pos: {DEVICE}:IST:2"/>
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000004" title="Diameter: {DEVICE}:DIAM:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000005" title="Cpc: {DEVICE}:IST1:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000006" title="Cpc: {DEVICE}:IST1:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000007" title="Pot: {DEVICE}:IST2:1 (mm)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000008" title="Pot: {DEVICE}:IST2:2 (mm)"/>
<!-- <visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000009" title="Btvs: {DEVICE}:IST3:1 (ADC raw)"/> -->
<visualization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="LinePlot" x="id000000" y="id000010" title="Btvs: {DEVICE}:IST3:2 (mm)"/>
</configuration>

View File

@@ -0,0 +1,7 @@
name=Go to specific position
description=Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
#optional parameters. Description is compulsory. Syntax&
#parameters=<parameter1Name>&<parameter1Value>&<Parameter 1 description>[;<parameter2Name>&<parameter2Value>&<Parameter 2 description>]
parameters=repeatTimes&2&Repeat N times;midPoint&41.0&Middle point A;spanFromMidPoint&3.0&B steps around middle point A;delayS&0&Delay between each oscillation [s]

View File

@@ -0,0 +1,162 @@
#Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
###### DO NOT MODIFY THE CODE BELOW ######
global print_log, sendFeedback, inspect
import sys, inspect, os, traceback
def print_log(testName, DEVICE, text):
time.ctime()
now = time.strftime('%Y.%m.%d %H:%M:%S')
print now + ' ' + DEVICE + ' - ' + testName + ': ' + str(text)
#prepare and send feedback to calling tool
def sendFeedback(testPath, testName, DEVICE, returnString, testPassed):
print_log(testName, DEVICE, 'End of test. Result:')
print_log(testName, DEVICE, 'Device: ' + DEVICE)
print_log(testName, DEVICE, 'Test name: ' + testName)
print_log(testName, DEVICE, 'Test path: ' + testPath)
print_log(testName, DEVICE, 'Test passed: ' + str(testPassed))
print_log(testName, DEVICE, 'Return string: ' + returnString)
ret = [testPath, DEVICE, returnString, testPassed]
set_return(ret)
def startTest(testName, DEVICE, params):
try:
import traceback
#get the path of this script
testPath = inspect.getfile(inspect.currentframe())
#by default, failed
ret = 'Test failed'
success = False
#plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
###### WRITE YOUR CODE HERE BELOW #######
#get parameters from the calling interface
try:
print_log(testName, DEVICE, "Running test Motor Test 2 for device " + DEVICE + " with the following parameters:\n" + str(params))
middle = float(params["midPoint"]["value"])
loopTimes = int(params["repeatTimes"]["value"])
delayS = int(params["delayS"]["value"])
if(delayS<1): delayS=1
span = float(params["spanFromMidPoint"]["value"])
except:
ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
success = False
sendFeedback(testPath, testName, DEVICE, ret, success)
return
#scan = ManualScan(['idX'], ['idMotorStatus', 'idLogicalPosition', 'idDiameter', 'idMotorPosition', 'idPotiRaw', 'idEncoderPosition', 'idBtvsRaw', 'idBtvsProc', 'idDiff01', 'idDiff02'] , [ 0.0], [ 3000.0], [20])
scan = ManualScan(['idX'], ['idMotorStatus', 'idMotorPosition', 'idEncoderPosition', 'idError'])
scan.setPlotTitle(plotName)
scan.start()
#Creating channels: dimension 1
try:
idInkr = Channel(DEVICE+':MOTOR.VAL', type = 'd')
idMotorStatus = Channel(DEVICE+':MOTOR.MSTA', type = 'd')
idMotorPosition = Channel(DEVICE+':MOTOR.RBV', type = 'd')
idEncoderPosition = Channel(DEVICE+':ENCODER', type = 'd')
idEndSwitchL = Channel(DEVICE+':MOTOR.LLS', type = 'd')
idEndSwitchH = Channel(DEVICE+':MOTOR.HLS', type = 'd')
idLimitH = Channel(DEVICE+':MOTOR.HLM', type = 'd')
idLimitL = Channel(DEVICE+':MOTOR.LLM', type = 'd')
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
sendFeedback(testPath, testName, DEVICE, ret, success)
return
#remove limits
idLimitH.put(999999.9, timeout=None)
idLimitL.put(-999999.9, timeout=None)
direction = 1.0
startDefault = middle - span
endDefault = middle + span
end = endDefault+1
#find position: it will be the middle point of the test
print_log(testName, DEVICE, 'Moving to middle point ' + str(middle) )
idInkr.put(middle, timeout=None) # TODO: Set appropriate timeout
readback2 = idInkr.get()
if abs(readback2 - middle) > 1 : # TODO: Check accuracy
ret = 'Actor idInkr could not be set to the value ' + str(middle) + ' (current value: ' + str(readback2) + ')'
success = False
sendFeedback(testPath, testName, DEVICE, ret, success)
return
start = readback2+direction
countSteps = 0
count = 0
print_log(testName, DEVICE, 'Moving around middle point (+-' + str(span) + ')' )
for setpoint1 in range(0, loopTimes*2):
count = count + 1
print_log(testName, DEVICE, 'Pausing ' + str(delayS) + 's' )
sleep( delayS ) # Settling time
#RegionPositioner idInkr
for setpoint2 in frange(start, end, direction):
readback1 = setpoint1
idInkr.put(setpoint2, timeout=None) # TODO: Set appropriate timeout
sleep( 0.2 ) # Settling time
readback2 = idInkr.get()
if abs(readback2 - setpoint2) > 1 : # TODO: Check accuracy
ret = 'Actor idInkr could not be set to the value ' + str(setpoint2) + ' (current value: ' + str(readback2) + ')'
success = False
sendFeedback(testPath, testName, DEVICE, ret, success)
return
#Detector idMotorStatus
detector1 = idMotorStatus.get()
detector4 = idMotorPosition.get()
detector6 = idEncoderPosition.get()
endH = idEndSwitchH.get()
endL = idEndSwitchL.get()
#Manipulation idDiff01
#Variable Mappings
a = detector4
b = detector6
idDiff01 = a-b
countSteps = countSteps + 1
scan.append ([countSteps], [countSteps], [detector1, detector4, detector6, idDiff01])
if endH>0.0 or (direction > 0.0 and setpoint2 >= end -1):
#invert direction and swap start with end of translation
end = startDefault-1
start = setpoint2 - direction
direction = -1.0
print_log(testName, DEVICE, 'End of span (' + str(setpoint2) + '), changing direction to ' + str(direction) )
break
if endL>0.0 or ( direction < 0.0 and setpoint2 <= end +1):
#invert direction and swap start with end of translation
end = endDefault+1
start = setpoint2 - direction
direction = 1.0
print_log(testName, DEVICE, 'End of span (' + str(setpoint2) + '), changing direction to ' + str(direction) )
break
#set limits back
idLimitH.put(145.0, timeout=None)
idLimitL.put(0.0, timeout=None)
#Closing channels
idInkr.close()
idMotorStatus.close()
idMotorPosition.close()
idEncoderPosition.close()
idLimitH.close()
idLimitL.close()
scan.end()
ret = 'Slide moved back and forth (' + str(count) + ' runs)'
success = True
############# END OF YOUR CODE ###########
###### DO NOT MODIFY THE CODE BELOW ######
sendFeedback(testPath, testName, DEVICE, ret, success)
except:
ret = traceback.format_exc()
success = False
sendFeedback(testPath, testName, DEVICE, ret, success)
return
#launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,16 @@
<html>
<body>
<h2>Short Description</h2>
Oscillate around a specific position
<h2>Details</h2>
Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
<h2>Parameters</h2>
<code>midPoint</code> Middle point A around which it will oscillate<br/>
<code>spanFromMidPoint</code> B stepst to oscillate around A<br/>
<code>repeatTimes</code> Repeat the moving N times<br/>
<code>delayS</code> Pause delay (>0s) between each oscillation [s]
<h2>Contact</h2>
<a href="https://intranet.psi.ch/Main/MarcoBoccioli">Marco Boccioli </a>
</html>
</body>

View File

@@ -0,0 +1,8 @@
name=Initialise
description=Initialises the motor
help = \
This test sends a INIT command to the device, as many times as configured with the parameter RepeatTimes.
#optional parameters. Description is compulsory. Syntax&
#parameters=<parameter1Name>&<parameter1Value>&<Parameter 1 description>[;<parameter2Name>&<parameter2Value>&<Parameter 2 description>]
parameters=repeatTimes&2&Repeat N times;delayS&4&Delay between each initialisation [s]

View File

@@ -0,0 +1,129 @@
###### DO NOT MODIFY THE CODE BELOW ######
global print_log, sendFeedback, inspect
import sys, inspect, os, traceback
def print_log(testName, DEVICE, text):
time.ctime()
now = time.strftime('%Y.%m.%d %H:%M:%S')
print now + ' ' + DEVICE + ' - ' + testName + ': ' + str(text)
#prepare and send feedback to calling tool
def sendFeedback(testPath, testName, DEVICE, returnString, testPassed):
print_log(testName, DEVICE, 'End of test. Result:')
print_log(testName, DEVICE, 'Device: ' + DEVICE)
print_log(testName, DEVICE, 'Test name: ' + testName)
print_log(testName, DEVICE, 'Test path: ' + testPath)
print_log(testName, DEVICE, 'Test passed: ' + str(testPassed))
print_log(testName, DEVICE, 'Return string: ' + returnString)
ret = [testPath, DEVICE, returnString, testPassed]
set_return(ret)
def startTest(testName, DEVICE, params):
try:
import traceback
#get the path of this script
testPath = inspect.getfile(inspect.currentframe())
#by default, failed
ret = 'Test failed'
success = False
#plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
plotName = DEVICE + ' - ' + testName
###### WRITE YOUR CODE HERE BELOW #######
#Pre-actions
# try:
# caput(DEVICE+':INIT.PROC', '1')
# except:
# ret = 'Unable to create channel - ' + traceback.format_exc()
# success = False
# sendFeedback(testPath, testName, DEVICE, ret, success)
# return
#get parameters from the calling interface
try:
print_log(testName, DEVICE, "Running test Initialise with the following parameters:")
print_log(testName, DEVICE, params )
loopTimes = int(params["repeatTimes"]["value"])
delaySeconds = int(params["delayS"]["value"])
except:
ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
success = False
sendFeedback(testPath, testName, DEVICE, ret, success)
return
scan = ManualScan(['idX'], ['idMotorPosition', 'idEncoderPosition', 'idError'] )
scan.setPlotTitle(plotName)
scan.start()
#Creating channels: dimension 1
try:
idInit = Channel(DEVICE+':INIT.PROC', type = 'l')
idReady = Channel(DEVICE+':RDY', type = 'l')
idInterlock = Channel(DEVICE+':ILK', type = 'l')
idMotorPosition = Channel(DEVICE+':MOTOR.RBV', type = 'd')
idEncoderPosition = Channel(DEVICE+':ENCODER', type = 'd')
except:
ret = 'Unable to create channel - ' + traceback.format_exc()
success = False
sendFeedback(testPath, testName, DEVICE, ret, success)
return
count = 0
timeout = 90000 #timeout in ms
for count in range(1, loopTimes+1):
print_log(testName, DEVICE, 'Initialisation #' + str(count) + '/' + str(loopTimes))
idInit.put(1, timeout=None) # TODO: Set appropriate timeout
timeStampStart = float(java.lang.System.currentTimeMillis())
sleep(0.1)
ready = 0
interlock = idInterlock.get()
timeElapsed = 0 #in ms
while (ready == 0) and timeElapsed<timeout:
#Detector time
timeStamp = float(java.lang.System.currentTimeMillis())
timeElapsed = timeStamp - timeStampStart
ready = idReady.get()
sleep( 0.1 )
detector4 = idMotorPosition.get()
detector6 = idEncoderPosition.get()
ready = idReady.get()
interlock = idInterlock.get()
#Manipulation idDiff01
a = detector4
b = detector6
idError = a-b
scan.append ([timeStamp],[timeStamp], [detector4, detector6, idError])
if ready == 1 and interlock == 1:
print_log(testName, DEVICE, 'Initialisation #' + str(count) + '/' + str(loopTimes) + ' successful')
ret = 'Drive initialised ' + str(count) + ' times'
success = True
else:
ret = 'The RDY and ILK signals indicate the drive was NOT ready at the expected time (after ' + str(timeout/1000) + 's).'
success = False
break
if(count < loopTimes):
print_log(testName, DEVICE, 'Next initialisation starting in ' + str(delaySeconds) + 's')
sleep( delaySeconds ) # pause between two init
idInit.close()
idReady.close()
idMotorPosition.close()
idEncoderPosition.close()
scan.end()
############# END OF YOUR CODE ###########
###### DO NOT MODIFY THE CODE BELOW ######
sendFeedback(testPath, testName, DEVICE, ret, success)
except:
ret = traceback.format_exc()
success = False
sendFeedback(testPath, testName, DEVICE, ret, success)
return
#launch the test
startTest(test, device, parameters)

View File

@@ -0,0 +1,14 @@
<html>
<body>
<h2>Short Description</h2>
Initialise N times.
<h2>Details</h2>
This test sends a INIT command to the device, as many times as configured with the parameter repeatTimes.
<h2>Parameters</h2>
<code>repeatTimes</code> Repeat the Initialisation N times<br/>
<code>delayS</code> Pause delay between each Initialisation [s]
<h2>Contact</h2>
<a href="https://intranet.psi.ch/Main/MarcoBoccioli">Marco Boccioli </a>
</html>
</body>

Some files were not shown because too many files have changed in this diff Show More