内容
一、概要
scaler记录提供对最多64个由常见start/stop机制控制的32-bit计数器的支持。如果硬件能够预置计数器操作,这个记录根据每个通道的门空字段(Gn)划分scaler通道为两个组:简单计数器[Gn="N"(0)],以及预置计数器[Gn="Y"(1)]。在计数开始前,简单计数器被立即置零,并且向上计数。预置计数器是计数不大于一个预置值的简单计数器。第一个预置计数器到达其预置值停止所有计数器。(硬件可通通过在预置值中装载并且向下数到0实际地实现一个预置计数器。如果这样,预计设备支持维持所有计数器从0向上计数的假象。) 当前存在对应Joerger VSC 8和16通道VME scalers;Joerger VS64飞行计数scaler;SIS3801多通道scaler,模仿单个scaler池和SIS3820的设备支持。Joerger VS scaler不支持预置计数,因而软件设置Gn字段为0并且保持它们那个值。
Scaler通道1接收特殊对待:假定他对一个参考频率时钟信号计数并且其值表明启动计数期间的时间间隔。这些字段:
1) T(时间)
2) TP(时间预置)
3) S1(scaler通道1值)
4) PR1(scaler通达1预置值)
5) FREQ(时钟频率)
满足以下等式:
1) T = S1 / FREQ
2) TP = PR1 / FREQ
对于不同种类的scaler硬件,用于管理时基的方式不同。
1) Joerger VSC scalers:确认一个时钟信号被预置到通道1输入,并且FREQ实际包含了那个时钟信号的频率是用户的工作。在前面板上可用的10Mz信号通常用于这个目的。
2) SIS3801 scalers:通过软件开关,硬件通常被设置成连接一个由内部产生的25MHz时钟到通道1。(因而,连接到SIS3801通道1的任何外部信息将被忽略)。使用一个外部产生的时钟是可能的,并且在任何情况下,确保FREQ包含正确值仍然是用户的责任。SIS3801不支持硬件预置。但按如下模拟预置。这个scaler使用一个FIFO在每个停顿时长中缓存计数。对于这个scaler记录模式(而不是与MCA记录一起使用的MCS模式),停顿时间被设置成0.01秒。因而,每0.01秒,对应每个通道的计数被压入了这个FIFO栈。当驱动以这个scaler轮询率(.RATE)读取这个FIFO,它将对应每个通道的总计数与预置计数做比较。如果达到了任何预置,则它发出计数结束的信号。因而,计数可延长到最长比请求的长0.01秒,但每个通道将计数完全相同时间周期,因此每秒计数将是准确的。
3) SIS3820 scalers:硬件通常通过软件开关设置成连接一个内部产生的50MHz时钟到通道1。SIS3820支持硬件预置。但对应通道1-16只有一个预置,对应通道17-32第二个预置。这表示仅一个来自1-16的通道和仅一个来自17-32的通道可以在相同时间用作预置。驱动通过使用每组中最大编号的通道(其有一个非0预置(PRn)和有效门(Gn=Y))处理这种限制。例如,如果PR1,PR3,PR18和PR22都是非0并且G1, G3,G18和G22是"Y",则这个scaler将在S3=PR3或者S22=PR22时停止计数,取决于这两个哪个最先满足。
4) Joerger VS scalers:硬件不支持实现预置计数器;一个内部16-bit门-时间计数器用于设置计数时间。设备支持软件将为这个计数器选择一个参考频率,并且使得硬件产生并使用它。设备支持根据其选择的参考频率设置和提交FREQ字段。但参考信号仍然必须有用户连接到通道1输入,因此这个记录和任何客户端可以把通道1当成时基。
这是如何使用scaler记录:
1) 用户设置FREQ为输入到scaler通道1的时钟信号频率。(仅Joerger VSC, SIS3801和SIS3820)
2) 用户设置TP(时间预置)和/或PRn(对应scaler通道n的预置值)。(对于Joerger VS scalers, 只设置TP或PR1)。
3) 用户设置CNT为"Count"(1),初始化计数。
4) 对于Joerger VSC, SIS3801和SIS3820 scalers,计数器计数到任意预置计数器达到其预置值,随之这个记录重置CNT为"Done"(0),或者手动重置CNT为"Done",使得计数停止。对于Joerger VS scalers,计数器计数到内部门-时间计数器达到器预置,或者用户手动重置CNT为"Done"(0)。
这个scaler记录版本维护两种计数模式:正常和后台(也称为AutoCount)。正常计数是由如上描述的CNT("Count/Done")字段、时间预置和可能的其它预置控制。后台计数是由CONT("OneShot/AutoCount")字段控制,通常忽略用户预置值,并且是为了在scaler空闲时给用户持续更新。
当CONT="AutoCount“(1),并且没有正常的计数操作已经在运行中,这个scaler等待AutoCount延时(DLY1);对AutoCount周期(TP1)计数,并且显示结果。如果AutoCount周期(TP1)短于.001秒,我们默认为对应确定计数周期的正常标准。如果AutoCount Display Rate(RAT1)大于0(Hz),则在后台计数运行过程中,以这个速率显示scaler值。
当用CNT字段启动一个正常计数操作时,后台计数立即被中断,并在在这个scaler结束正常计数后,在后台计数再次开始前,一个正常计数的结果被保留10秒中。通过设置证书变量'scaler_wait_time'为以秒为单位的所需保持时间或者在ioc console或者在ioc-启动文件st.cmd,能够更改10秒数据保持周期。
后台计数不影响CNT字段的状态,因此这个字段总是用于确定一个正常计数操作何时开始和结束。
scaler记录不同于大多数EPICS记录,其运行不是"同步"也不是"异步"。当前,在记录运行结束后,PACT字段总是FALSAE,即使这个scaler可能正在计数。这表示这个记录总是响应通道访问输入,并且能在任何时间停止计数。在这个scaler停止计数前,不执行这个记录的forward链接。
字段描述
除了所有记录类型共有的字段,scaler记录还由以下描述的字段。
字母顺序的记录特定字段的列表
名称 | 访问权 | 提示 | 数据类型 | 注释 |
CNT | R/W* | Count | RECCHOICE | (0:"Done",1:"Count") |
CONT | R/W* | OneShot/ AutoCount | RECCHOICE | (0:"OneShot",1:"AutoCount") |
COUT | R/W | CNT Output | OUTLINK | 到PV的链接 |
COUTP | R/W | Prompt COUNT | OUTLINK | 到PV的链接 |
D1...D64 | R/W | Count Direction n | RECCHOICE | (0:”Up“, 1:"Dn") |
DLY | R/W | Delay | FLOAT | 在计数前 |
DLY1 | R/W | Auto-mode Delay | FLOAT | 在计数前 |
EGU | R/W | Units Name | String | 8个字符 |
FREQ | R/W | Time base freq | DOUBLE | 例如,1e7 |
G1...G64 | R/W | Gate Control n | RECCHOICE | 预置吗?(0:"N", 1:"Y") |
NCH | R | Number of Channels | SHORT | 来自设备 |
NM1...NM64 | R/W | Scaler n name | STRING | 用户的字段 |
OUT | R | Output Specification | OUTLINK | 到硬件的链接 |
PCNT | R | Prev Count | RECCHOICE | 私有 |
PREC | R/W | Display Precision | SHORT | 十进制位数 |
PR1...PR64 | R/W | Preset n | ULONG | 预置值 |
RATE | R/W | Display Rate(Hz) | FLOAT | 以[0..60]Hz |
RAT1 | R/W | Auto Display Rate | FLOAT | 以[0..60]Hz |
RPVT | r | private | void * | 私有 |
S1...S64 | R | Scaler n | ULONG | 结果 |
SS | r | Scaler state | SHORT | 硬件状态 |
T | R | Timer | DOUBLE | 消耗时间 |
TP | R/W | 时间预置 | DOUBLE | 预置时间 |
TP1 | R/W | 时间预置 | DOUBLE | 预置时间(auto模式) |
US | r | User State | DOUBLE | 用户请求的状态 |
VAL | R/W | Result | DOUBLE | 当计数结束时被提交 |
VERS | R | Code Version | FLOAT | 代码版本 |
注意:在访问权列中:
1) R:只读
2) r:只读,不被提交
3) R/W:允许读写
4) R/W*:运行读写,如果这个记录的SCAN字段设置为"Passive",写触发记录运行。
5) N:不允许访问。
控制/状态字段:
1) CNT:用户设置这个字段为"Count(1)"来启动计数。当达到一个预置值时,计数停止,这个字段将被重置为"Done(1)",并且转发链接将被运行。当计数正在进行时,如果这是这个字段为"Done"(0),计数将被停止,将报告累计的计数,并且运行转发链接。
2) CONT:用户设置这个字段为"AutoCount(1)"启用后台计数。(也见自动计数延时(DLY1), 自动显示速率(RAT1)和自动计数时间预置TP1)。
3) G1...G64:有64个这样的字段,每个通道一个。假设硬件能够支持预置scalers,这些字段确定相关联的scalers是否被用作简单scalers(Gn=0)或者预置scalers(Gn=1)。当Gn设置为1时,这个记录将确保PRn不为0(如果它是0,将设置它为1000)。当PRn设置成任何正值,这个记录将设置Gn为1。如果硬件没实现预置scalers,当设备支持注意到它们已经被设为1时,它将设置这些字段为0。
4) PR1...PR64:对应相关联scalers的预置值。如果scalers n已经被指定为一个预置scaler(即:如果Gn=1),则当这个scaler达到了计数PRn时,所有scalers将被禁用,并且这个记录将通过设置CNT=0报告计数已经完成。如果scaler n未被指定成一个预置scaler,PRn被忽略。当PRn变成任何正值时,这个记录将设置Gn为1。
5) TP:如果没有其它预设停止这个scaler,这个字段为scaler指定要计数多久(以秒为单位)。TP实际上是一个对应预置字段PR1的代理,与scaler 1相关联。当TP变化时,这个记录将设置PR1=TP*FREQ,否则表现就像用户更改了PR1。
6) TP1:这个字段以秒指定后台计数周期。
7) DLY:延时(以秒为单位),在CNT变为1后在实际使计数开始前,这个记录要等待的延时时间。
8) DLY1:以秒为单位连续后台计数周期之间的延时。
9) RATE:这个字段以Hz为单位指定速率,当计数进行时,scaler记录以此速率提交scaler信息。如果这个字段设置为0,只在计数停止后才显示计数。Max速率:60Hz。
10) RAT1:这个字段以Hz为单位指定速率,当后台计数进行时,scaler记录以此速率提交scaler信息。如果这个字段为0,只在后台计数停止后,才显示计数。Max速率:60Hz。
数据字段
1) FREQ:scaler 1计数的时钟信号的频率。记录使用这个字段在时间值(秒为单位的T,TP)和与scaler 1(S1和PR1)相关的值之间转换。确保这个字段有正确的值是用户的责任。
2) S1...S64:scalers累计的计数。当计数在进行时,以(RATE Hz)周期地提交这些值,以及在计数停止后提交一次。
3) T:这个字段是一个对应于scaler 1相关联地值字段S1的代理。当S1变化时,记录将设置T=S1/FREQ。
链接字段
1) COUT:到EPICS PV的链接,当一个用户计数序列刚开始或刚结束时,CNT字段的值被写到这个链接。
2) COUTP:到EPICS PV的链接,当刚执行一个用户计数序列命令或者刚结束时,CNT字段的值被写到这个链接。这个输出链接不被DlY字段延时,COUT也这样。
3) OUT:这个字段指定要被控制的硬件。
各种字段
1) NM1...NM64:用户赋给各自scaler通道的名称。
2) PREC:由MEDM和其它通道访问客户端显示的小数点右边的数字位数。
3) EGU:发送给请求工程单位的通道访问客户端的字符串。
4) VERS:recScaler.c代码的版本好。
5) NCH:底层硬件实际支持的通道数,由设置支持报告。
私有字段
这些字段是为了这个记录私用,并且在将来可能消失或者变成只读。对于Scaler n, Dn是硬件实际计数的方向。
1) D1...D64:(0:"Up",1:"Dn")
2) PCNT:(0: "Done", 1: "Count") 前一个CNT值。
3) SS:硬件状态。
4) US:用户的请求状态。
5) VAL:当计数结束时,并且在所有其它字段被提交后,设置成T字段的值,并且被提交。
文件、设备支持
以下表格简略地描述了实现和使用scaler记录地所需的文件。
源代码
scalerRecord.c | 对应scaler记录的记录支持 |
devScalerAsyn.c | 对应asyn scaler驱动的设备支持。 |
devScaler.h | 记录和设备支持包含的头 |
devScaler.c | 对应Joerger VSC scalers的设备支持 |
devScaler_VS.c | 对应Joerger VS scalers的设置支持 |
devScalerSTR7201.c | 对应Struck 7201和SIS3801的设备支持 |
devMcaSIS3820Asyn.c | 对应Struck 7201和SIS3801的设备支持 |
scalerRecord.dbd | 这个文件为scaler记录定义了所有字段菜单等 |
*Include.dbd | 在ioc启动时装载这个文件,此文件是通过数据库配置工具并且描述scaler记录字段,以及可能与scaler记录相关联的设备类型。通常这个文件包含以下scaler相关的信息: # 对应scaler记录的数据库定义 include "scalerRecord.dbd" # 对scaler记录的设备支持 device(scaler, INST_IO, devScalerAsyn, "Asyn Scaler") device(scaler, VME_IO, devScaler, "Joerger VSC8/16") device(scaler, VME_IO, devScaler_VS, "Joerger VS") device(scaler, VME_IO, devScalerSTR7201, "Struck STR7201 Scaler") device(scaler, VME_IO, devScalerCamac, "CAMAC scaler") |
数据库和AUTOSAVE-REQUEST文件
scaler.db | 用于所有设备类型的数据库 |
scaler_settings.req | scaler_64ch_settings.req的副本 |
scaler_8ch_settings.req | 对应8通道scaler的设置 |
scaler_16ch_settings.req | 对应16通道scaler的设置 |
scaler_32ch_settings.req | 对应32通道scaler的设置 |
scaler_64ch_settings.req | 对应64通道scaler的设置 |
scaler_channelN_settings.req | 被其它的.req文件包含 |
MEDM显示文件
scaler.adl | 用于8通道scaler的小型操作窗口 |
scaler16.adl | 相同,用于16通道scaler |
scaler32.adl | 相同,用于32通道scaler |
scaler_more.adl | 中型操作窗口 |
scaler16_more.adl | 相同,但用于16通道scaler |
scaler32_more.adl | 相同,但用于32通道scaler |
scaler_full.adl | 大型操作窗口 |
scaler16_full.adl | 相同,但用于16通道scaler |
scaler32_full.adl | 相同,但用于32通道scaler |
scaler_full_calc.adl | 带有用户计算的大型操作窗口 |
scaler16_full_calc.adl | 相同,但用于16通道scaler |
scaler32_full_calc.adl | 相同,但用于32通道scaler |
这些文件构建medm窗口来访问scaler记录和相关的过程变量。要从命令行使用它们之一,例如:
medm -x -macro "P=XXX:,S=scaler1" scaler.adl
此处XXX:scaler1是在一个IOC中一个scaler的名称。
通过传递产生"P=XXX:,S=scaler1",这些文件也能够被用于来自其它medm窗口的相关显示。
EPICS启动文件
st.cmd:启动脚本
这个文件不是包含在发行版中。这是一个来自支持scalers的启动文件的带注释摘要:
#######################################################################
# vxWorks startup script to load and execute system (iocCore) software.
Scaler-related databases
# Tell EPICS all about the record types, device-support modules, drivers,
# etc. in the software we just loaded (xxxApp)
dbLoadDatabase("dbd/xxxApp.dbd")
# scalers
dbLoadRecords("$(STD)/stdApp/Db/scaler16m.db","P=xxx:,S=scaler1,OUT=#C0 S0 @,DTYP=Joerger VSC8/16,FREQ=10000000")
dbLoadRecords("$(STD)/stdApp/Db/scaler16m.db","P=xxx:,S=scaler2,OUT=#C0 S0 @,DTYP=Joerger VS,FREQ=10000000")
dbLoadRecords("$(STD)/stdApp/Db/scaler16m.db","P=xxx:,S=scaler3,OUT=#C0 S0 @,DTYP=Struck STR7201 Scaler,FREQ=25000000")
dbLoadRecords("$(STD)/stdApp/Db/scaler16m.db","P=xxx:,S=scaler4,OUT=#C0 S0 @,DTYP=CAMAC scaler,FREQ=10000000")
dbLoadRecords("$(STD)/stdApp/Db/scaler32.db", "P=xxx:,S=scaler5,OUT=@asyn($(PORT)),DTYP=Asyn Scaler,FREQ=50000000")
1) VSCSetup(int nCards, char *baseAddress, unisgned intVectBase)
nCards | 板卡实际数目可能少于,但不能多于这个数 |
baseAddress | 一系列第一块板卡的基地址。这必须符合在实际板卡上的跳线。Joerger VSC8和VSC16在A32地址空间有基地址,在一个256字节(0x100)边界(即:这些板卡中每一个都需要256个字节,并且都被连续地寻址,如:0xB0000000, 0xB0000100,...) |
intVectBase | 将被装载到一系列第一个版本中的中断矢量。将用initVectBase+1, intVectBase+2等装载连续板卡。保持在范文[64..255]。(从硬件读取中断级别) |
备份/恢复请求文件
scalerSetting.req | 保存一个scaler数据库设置的示例请求文件。编辑这个文件,提供你想要保存其设置的scaler记录的名称。 |
yyScalerSettings.req | 保存指定scaler记录的设置。 |
限制
当启动AutoCount时,用一个非常短的计数时间(TP1)和延迟时间(DLY1),scaler会用数据淹没网络。
scaler记录的应用:
以下是三种不同厂家的计时/计数器:通过底层驱动程序编写以及界面制作,隐藏了设备之间的差异,使用者的操作方式基本一致。