EPICS synApps calc模块简介

1、记录

1) aCalcout:

记录非常像在EPICS base中的calcout记录,但它支持数组字段和计算,并且其输出链接能够等待结束。

2) sCalcoutRecord:

sCalcoutRecord记录非常像在EPICS base中的calcout记录,但它支持字符串字段和计算,并且其输出链接能够等待结束。

3)transformRecord:

transform记录有点类似16个calcout记录被收集一起放入一个记录。16个calc表示式使用一个常见的16个值字段的集合,但每个calc表达式写入它自己的值字段。

4) sseqRecord:

sseq记录类似EPICS base中seq记录,但它可以写入字符串或数值字段,在执行每个输出链接后,它能够等待结束,并且这个顺序能够被取消。

5)swaitRecord

swait记录非常像EPICS base中calcout记录,但它使用一个更老格式的retargetable链接,并且其输出链接等待结束。对于新开发,不推荐swait记录,使用一个calcout记录替代。

2、EPICS数据库,MEDM显示文件以及autosave-request文件

1) arrayTest.db arrayTest.adl

这个数据库包含一个aSub记录,它维护两个数组字段:"$(P)arrayTest.VALA" 和 "$(P)arrayTest.VALB"。"VALB"字段包含来自0到$(N)-1的double值,此处$(N)是一个宏,它被提供给装载这个数据库的dbLoadRecords()。"VALA"字段包含来自M到M+$(N)-1的double值,此处M在运行时被提供给字段"$(P)arrayTest_start"。

2) CalcRecord.adl CalcRecord_full.adl

在EPICS base中calc记录没有附带显示文件。但经常想要能够显示并且与嵌入一个数据库中的calc记录交互。这个记录为了达到这个目的。

3)calcExamples.adl;calcAlgebraicExamples.adl;calcArrayExamples.adl;calcBitwiseExamples.adl;calcMiscExamples.adl;calcRelationalExamples.adl;calcStringExamples.adl;calcTrigExamples.adl

这些文件记载了由calc, calcout,sCalcout和aCalcout记录计算的表达式。

4) calcout_settings.req

在EPICS base中的calcout记录没有附带一个autosave-request文件。

5)yyCalcoutRecord.adl;yyCalcoutRecord_full.adl

在EPICS base中的calcout记录没有附带显示文件。但经常想要能够显示并且与在嵌入在数据库中calcout记录交互。此文件为了达到此目的。

6)interpNew.db;interpNew_settings.req; interpNew.adl

这是一个新版本的interp,它需要另一个宏Q,并且它更易于使用。

7)interp.db;interp_settings.req;interp.adl

这个数据库实现了数组插值,并且托管了三个数组:一个自变量数组X,其PV名称是"$(P)interp.VALA";两个应变量数组Y1(X)和Y2(X),其PV名各自是"$(P)interp.VALB" 和"$(P)interp.VALC"。

启动时可以使用autosave装载这些数组,运行时由CA客户端写入,或者通过设置MODE("$(P)interp_mode")切换为”Add Entry“,在运行时逐元素构建。

要插值,你设置模式切换为"Interpolate",并且写一个数值到X-input字段"$(P)interp_x"。这使得一个下层aSub记录插值Yi数组来查找符合X值的值,以"$(P)interp_y1"和"$(P)interp_y2"显示它们,并且可选地写它们到在连接字段"$(P)interp_y1.OUT"和"$(P)interp_y2.OUT"中指名的外部PVs。

执行的插值是拉格朗日插值,通过写入"$(P)Interp.F"可以指定多项式次数。级数必须在范围1..10。当前数据库没有可见地执行这些限制,但如果违反了它们,数据库悄悄地裁剪了它们。

要向数组添加元素,设置模式切换为"Add Element",写Yi值到"$(P)interp_y1"和"$(P)interp_y2",并且接着写对应的X值到"$(P)interp_x"。条目数"$(P)interp_n"将加1。

通过设置模式切换为"Clear All"并且向X写任何东西,能够清除这个数组。

更多信息见:

8)userAve10.db userAve10_settings.req;userAve.adl userAve10.adl;userAve10more.db userAve10more_settings.req;userAve_settings.req

这些文件实现,管理和显示10个编程好计算M个值平均的sub记录的设置,此处M是由"$(P)userAve$(N).A",通过输入链接"$(P)userAve$(N).INPB"读取它。另外,sub记录可用作拟合记录下的值成一条线(看作一个时间函数),并且返回用最近记录下的值计算的这条线。如果真实值是常数,这非常类似一个平均。如果真实值随时间变化,这条拟合的线条产生了比平均更好的信号真实值的评估。

这些记录是为了用于在运行时编程。用任一种算法,这些记录可以用两种方式操作:

1)运行平均/nihe("$(P)userAve$(N)_mode" == "CONTINOUS")

在M个值已经被记录后,在读取一个新值时,输出最近的M个值的平均(线拟合结果)。

2)一次平均/拟合("$(P)userAve$(N)_mode"=="ONE-SHOT")

清除输出,读取M个值,输出那些值的平均值(直线拟合结果),并且在接收到一个重新开始命令前忽略新值("$(P)userAve$(N).C设为1")。

在任何一种模式中,这个记录使用它的警报字段表明它显示的输出值("$(P)userAve$(N).VAL")是否有效(即是:是M个读取的结果)。在完成M个读取前,记录将处于警报(STAT="SOFT", SEVR="MAJOR")。在M个读取以被处理后,STAT="NO_ALARM", SEVR="NO_ALARM"。

9) userCalcs10.db userCalcs10_settings.req;userCalcs10more.db userCalcs10more_settings.req; swait_settings.req;userCalc.adl ;userCalcMeter.adl;userCalc_full.adl;userCalc_help.adl;userCalcs10.adl;userCalcs20.adl;userCalcs40.adl;userCalcN.db;userCalcN_noDisable.db;userCalcN_settings.req

一个userCalc只是一个为在运行时编程使用实现的swait记录。"Implemented"表示一个包含了若干未指明用途的swait记录的(带一个整体开关的)数据库被装载;在autosave文件中写了相应的条目来保存和恢复所选的字段值;并且提供了相当全面的MEDM窗口,使得用户可以练习这个记录的大部分功能。

虽然不推荐swait记录用于新开发,因为很多用户已经习惯了它作用的方式,尤其它的链接被编程的方式,在这种情况下,保留了它:它们只接受PV名称,没有链接标准EPICS链接带有的链接属性(例如:NPP,NMS)。

10) userCalcOuts10.db userCalcOuts10_settings.req;userCalcOuts10more.db userCalcOuts10more_settings.req; userCalcOut.adl userCalcOut_full.adl userCalcOuts10.adl

就像userCalc,但基于calcout记录,而不是swait记录。

11) userArrayCalcs10.db userArrayCalcs10_settings.req;userArrayCalcs10more.db;userArrayCalcs10more_settings.req acalcout_settings.req;userArrayCalc.adl;userArrayCalcPlot.adl;userArrayCalcPlots10.adl;userArrayCalc_full.adl;userArrayCalc_plot.adl;userArrayCalcs10.adl;arrayPlot8.adl

就像userCalc,但是基于aCalcout(数组calcout)记录,而不是swait记录。

12) userStringCalcs10.db userStringCalcs10_settings.req;userStringCalcs10more.db userStringCalcs10more_settings.req scalcout_settings.req;userStringCalc.adl
userStringCalc_demo.adl; userStringCalc_full.adl; userStringCalcs10.adl

就像userCalc,但基于aCalcout(数组calcout),而不是swait记录。

13)yysCalcoutRecord.adl;yysCalcoutRecord_demo.adl;yysCalcoutRecord_full.adl

用于文本sCalcout记录的MEDM窗口,即是:也不是一个userStringCalc。

14)userTransform.db userTransforms10.db userTransforms10_settings.req
userTransforms10more.db userTransforms10more_settings.req;
userTransform.adl userTransform_full.adl userTransforms10.adl;userTransforms20.db (deprecated) userTransforms20_settings.req(deprecated)

就像userCalc, 但基于transform记录,而不是swait记录。

15)Transform.adl Transform_full.adl Transforms10.adl transforms10.db transforms10_settings.req transform_settings.req

就像userTransform,但单独地启用/禁用

16)yyTransform.adl yyTransform_full.adl

用于普通transform记录的MEDM窗口,即是:不是userTransform。

17)waitRecN.db yyWaitRecord.adl yyWaitRecord_full.adl

用于普通swait记录的MEDM窗口,即:不是userCalc,以及一个装载单个swait记录的数据库。保留这些文件为了后向兼容。

18)userStringSeqs10.db userStringSeqs10_settings.req userStringSeqs10more_settings.req userStringSeqs10more.db userStringSeq*.adl

10个string-sequence记录。

19)yySseq.db yySseq*.adl

1个string-sequence记录。

2、如何构建和使用

1)编辑configure/RELEASE指定指向EPICS base,sscan和seq模块的路径。如果你没有sscan,或者不想它被calc模块使用,注释掉这个定义,并且calc模块将相应地调整其构建。对seq也是相同的。calc没有sscan下唯一不能构建的东西是swait记录,基本由于历史原因,它被保留在了calc。calc没有sscan下唯一不能构建的东西是editSseq程序和数据库,它支持sseq和seq记录的运行时编辑。

如果用sscan或seq一起构建calc,依赖calc的模块也应该与那些模块一起构建。

swait记录是原来的"userCalc"记录,并且在APS的很多用户习惯于它运行的方式。来自EPICS base带有"Async Soft Channel"设备支持的calcout记录是对这个swait记录的合适替代。

2) 运行GNU Make来构建。

3)注意:calc模块仅靠自身是没用的,而是仅能产生被其它模块使用的代码。(一个使用calc模块的典型示例是synApps xxx模块)。一个使用calc的应用程序必须在其configure/RELEASE文件中指定calc模块的路径;它必须添加include calc.dbd到其xxxInclude.dbd文件,并且它必须通过向xxxApp/src/Makefile中添加像xxx_LIBS+=calc的一行链接libcalc。

猜你喜欢

转载自blog.csdn.net/yuyuyuliang00/article/details/130298711