在一个一维扫描的最简单合理配置中,使用了以下字段:
当一个扫描被启动时(通过1到EXSC字段),sscan记录指挥定位器移动到它的起始位置。sscan记录使用recDynLinkPutCallback()告诉定位器移动,并且等待产生的回调,表明这个定位器结束了,在进入此扫描的下个阶段前,触发探测器。也是使用recDynLinkPutCallback()触发这个探测器,并且在读取探测器并且继续执行另一个(移动,触发,读取)顺序来采集下个数据点前读取探测器。这个算法持续,直到sscan记录完成了NPTS步,或者扫描被取消(通过一个客户端写0到EXSC字段)。在扫描结尾,sscan记录填充一个访问过位置的数组(P1RA),以及一个采集的探测器数组(D01DA)。我们再过一遍,这次更加一般,更详细,并且包含了更多可用选项。
在扫描后:在扫描结束后,你可以使用PASM字段告诉定位器做什么。默认行为仅是把它们留在扫描结束时所在的位置,但你可以告诉它们返回它们的扫描前位置,或者到它们的起始位置,或者到从采集数据计算出的位置。(例如:在扫描过程中,指定探测器信号REFD达到它峰值的位置)。
以下本示例中使用到硬件:
1)KOHZU多轴控制器”ARIES”和”LYNX”:在本例中使用了三路电机驱动,启动后三个电机的PV名分别为ARIES:m1, ARIES:m2, ARIES:m3:
2)计时器/计数器:Ortec974A和NCT16,启用后的PV名为Ortect974A:Scaler1和NCT16:scaler1:
?3) sscan记录启动后,加载其控制界面:
a) Positioners设置:
在Positioners按钮下Read和Drive中分别填入要驱动电机的回读值和设定值。
我们这里填写Start,END和Step Size分别为-3,3,0.1分别代表电机的起始位置,终止位置和步长。
扫描模式选择线性,并且是绝对位置进行定位。
b) DetTrigers设置:
在1和2文本框中分别填入Ortec974A:Scaler1.CNT和NCT16:scanler1.CNT,它们分别用于触发Ortec974A计时/计数器和NCT16计时/计数器运行。
c) Detectors设置:
01~04文本框填入Ortec974A:Scaler1.S1,Ortec974A:Scaler1.S2, NCT16:scanler1.S1和NCT16:scanler1.S2,它们分别对应Ortec974A的第1和2通道和 NCT16的第1和第2通道。
在启动sscan记录时,需要一个req文件配置存储那些PV,在此用到的req文件如下:
[prefix]
$(P)
$(Q)
$(R)
[status]
$(P)saveData_status
[message]
$(P)saveData_message
[filename]
$(P)saveData_fileName
[counter] # scan counter
$(P)saveData_scanNumber
[fileSystem] # scan file system
$(P)saveData_fileSystem
[subdir] # scan file subdirectory
$(P)saveData_subDir
[basename] # PV containing the desired data-file base name
$(P)saveData_baseName
[fullPathName]
$(P)saveData_fullPathName
[realTime1D] # if nonzero, write 1D data as it comes in
$(P)saveData_realTime1D
[scanRecord] # specify scan records to be monitored
$(P)scan1
[extraPV]
$(P)m1.VAL "motor m1"
$(Q)Scaler1.S1 "Ortec974A T"
$(Q)Scaler1.S2 "Ortec974A CH1"
$(R)scaler1.S1 "NCT16 T"
$(R)scaler1.S2 "NCT16 CH1"
并且在启动脚本中,在iocInit后,执行以下程序,初始化sscan的存储配置:
saveData_Init("saveData.req", "P=ARIES:,Q=Ortec974A:,R=NCT16:")
点击scan_full.adl窗口上面的SAVE DATA按钮,弹出了scan_saveData.adl窗口:
填写保存路径和保存所用文件名。
进行测试,点击SCAN命令,点击开始扫描过程,等到扫描结束。
# cd /data/
# ls
aa aabb_0001.mda
发现指定目录下产生了一个aabb_0001.mda的文件。使用工具命令将其转成ascii文件:
./mda2ascii /data/aabb_0001.mda
# ls
aa aabb_0001.asc aabb_0001.mda
查询数据内容如下,sscan完成了预设的扫描过程:
# cat aabb_0001.asc
## mda2ascii 1.4.2 generated output
# MDA File Version = 1.4
# Scan number = 1
# Overall scan dimension = 1-D
# Total requested scan size = 61
# Extra PV: name, descr, values (, unit)
# Extra PV 1: ARIES:m1.VAL, motor m1, "-3", mm
# Extra PV 2: Ortec974A:Scaler1.S1, Ortec974A T, "10",
# Extra PV 3: Ortec974A:Scaler1.S2, Ortec974A CH1, "50001",
# Extra PV 4: NCT16:scaler1.S2, NCT16 CH1, "20001",
# Extra PV 5: NCT16:scaler1.S1, NCT16 T, "1000000",
# 1-D Scan
# Points completed = 61 of 61
# Scanner = ARIES:scan1
# Scan time = Dec 20, 2023 15:42:43.611534
# Positioner: name, descr, step mode, unit, rdbk name, rdbk descr, rdbk unit
# Detector: name, descr, unit
# Column Descriptions:
# 1 [ Index ]
# 2 [1-D Positioner 1] ARIES:m1.VAL, X, LINEAR, mm, , ,
# 3 [1-D Detector 1] Ortec974A:Scaler1.S1, ,
# 4 [1-D Detector 2] Ortec974A:Scaler1.S2, ,
# 5 [1-D Detector 3] NCT16:scaler1.S2, ,
# 6 [1-D Detector 4] NCT16:scaler1.S1, ,
# 1-D Scan Values
1 -3 10 50001 20000 1000000
2 -2.9 10 50001 20001 1000000
3 -2.8 10 50001 20001 1000000
4 -2.7 10 50001 20000 1000000
5 -2.6 10 50001 20001 1000000
6 -2.5 10 50001 20000 1000000
7 -2.4 10 50001 20001 1000000
8 -2.3 10 50001 20001 1000000
9 -2.2 10 50001 20000 1000000
10 -2.1 10 50001 20001 1000000
11 -2 10 50001 20001 1000000
12 -1.9 10 50001 20001 1000000
13 -1.8 10 50001 20000 1000000
14 -1.7 10 50001 20000 1000000
15 -1.6 10 50001 20001 1000000
16 -1.5 10 50001 20000 1000000
17 -1.4 10 50001 20001 1000000
18 -1.3 10 50001 20001 1000000
19 -1.2 10 50001 20000 1000000
20 -1.1 10 50001 20000 1000000
21 -1 10 50001 20000 1000000
22 -0.9 10 50001 20000 1000000
23 -0.8 10 50001 20000 1000000
24 -0.7 10 50001 20000 1000000
25 -0.6 10 50001 20000 1000000
26 -0.5 10 50001 20000 1000000
27 -0.4 10 50001 19999 1000000
28 -0.3 10 50001 20000 1000000
29 -0.2 10 50001 20001 1000000
30 -0.1 10 50001 20000 1000000
31 1.52655666e-15 10 50001 20000 1000000
32 0.1 10 50001 20000 1000000
33 0.2 10 50001 20000 1000000
34 0.3 10 50001 20001 1000000
35 0.4 10 50001 20001 1000000
36 0.5 10 50001 20001 1000000
37 0.6 10 50001 20000 1000000
38 0.7 10 50001 20000 1000000
39 0.8 10 50001 20000 1000000
40 0.9 10 50001 20000 1000000
41 1 10 50001 20000 1000000
42 1.1 10 50001 19998 1000000
43 1.2 10 50001 20001 1000000
44 1.3 10 50001 20000 1000000
45 1.4 10 50001 20000 1000000
46 1.5 10 50001 20000 1000000
47 1.6 10 50001 20000 1000000
48 1.7 10 50000 20000 1000000
49 1.8 10 50001 20000 1000000
50 1.9 10 50001 20000 1000000
51 2 10 50001 20001 1000000
52 2.1 10 50001 20000 1000000
53 2.2 10 50001 20000 1000000
54 2.3 10 50001 20001 1000000
55 2.4 10 50001 20001 1000000
56 2.5 10 50001 20001 1000000
57 2.6 10 50001 20000 1000000
58 2.7 10 50001 20001 1000000
59 2.8 10 50001 20001 1000000
60 2.9 10 50001 20001 1000000
61 3 10 50001 20000 1000000
将scan_full.adl中扫描模式设置成TABLE,可以按表格进行扫描:
扫描前准备:
caput ARIES:scan1.NPTS 6 # 设置扫描点数
caput -a ARIES:scan1.P1PA 6 -2 -1.5 0 1.2 1.8 2 # 设置使用的表格
然后点击SCAN开始扫描,等待扫描结束,查看产生的数据,如下,可以发现电机位置为在P1PA字段中设置的位置:?
# cat aabb_0002.asc
## mda2ascii 1.4.2 generated output
# MDA File Version = 1.4
# Scan number = 2
# Overall scan dimension = 1-D
# Total requested scan size = 6
# Extra PV: name, descr, values (, unit)
# Extra PV 1: ARIES:m1.VAL, motor m1, "-2", mm
# Extra PV 2: Ortec974A:Scaler1.S1, Ortec974A T, "10",
# Extra PV 3: Ortec974A:Scaler1.S2, Ortec974A CH1, "50001",
# Extra PV 4: NCT16:scaler1.S2, NCT16 CH1, "20000",
# Extra PV 5: NCT16:scaler1.S1, NCT16 T, "1000000",
# 1-D Scan
# Points completed = 6 of 6
# Scanner = ARIES:scan1
# Scan time = Dec 20, 2023 15:57:42.174413
# Positioner: name, descr, step mode, unit, rdbk name, rdbk descr, rdbk unit
# Detector: name, descr, unit
# Column Descriptions:
# 1 [ Index ]
# 2 [1-D Positioner 1] ARIES:m1.VAL, X, TABLE, mm, , ,
# 3 [1-D Detector 1] Ortec974A:Scaler1.S1, ,
# 4 [1-D Detector 2] Ortec974A:Scaler1.S2, ,
# 5 [1-D Detector 3] NCT16:scaler1.S2, ,
# 6 [1-D Detector 4] NCT16:scaler1.S1, ,
# 1-D Scan Values
1 -2 10 50001 20001 1000000
2 -1.5 10 50001 20000 1000000
3 0 10 50001 19999 1000000
4 1.2 10 50001 20001 1000000
5 1.8 10 50001 20000 1000000
6 2 10 50001 20001 1000000