EPICS synApps calc模块sseq记录

1、介绍

sseq(字符串序列)记录派生自seq(序列)记录,并且具有所有其功能。此外,sseq记录可以从字符串或数值字段读取,并且写入字符串或者数值字段;它可以等待任何其输出链接触发的运行结束;并且其执行可以被中止。这个记录可以最多执行10组延时/获取值/吸入值/等待到结束的操作。所有步骤和序列是可选的;使用默认字段值,这个记录完全不做事情。类似seq记录,sseq记录实现了若干选择算法,这些算法允许数据库编程者,或者运行时用户指定执行哪些组的延时/获取/写入/等待。这个记录没有相关联的设备支持。

sseq记录的执行可以被用户取消。当这发生时,这个记录立即停止引发其它记录运行,但它不能取消它已经用其链接之一启动的任何执行。取消sseq记录也不阻止它执行它的转发链接。如果你想要链接两个sseq记录一起,并且使得整个序列可取消,用一个LNKn字段链接它们,而不是FLNK字段。

从std模块版本3.0开始,以上提到的字符串字段可以时一个DBF_STRING类型的PV或者其元素类似为DBF_CHAR或DBF_UCHAR的数组PV。在任何情况中,将被sseq记录读取或者写的长度受限于前39个字符,因为sseq记录内部使用EPICS string PVs。

从std模块版本3.0开始,sseq记录提交其输入和输出链接(但不是其转发链接)的状态,并且提交表明哪些输出链接正在等待回调的PVs。

从std模块版本3.2,和calc模块版本3.0开始,sseq记录从std模块移动到了calc模块。

要成功地写入一个DBF_MENU或DBF_ENUM(例如:一个bo或mbbo记录的VAL字段),这个记录的string值必须是用于这个PV的可能字符串之一,或者它必须是一个为这个PV指定了这个字符串编号的整数。例如,当写入一个其ZNAM是"No"和其ONAM是"Yes"的bo记录时,这个字符串值必须是"No", "Yes", "0"和"1"之一。要确保数字值被转化成整数,设置精度(PREC字段)为0。

这是一个一些sseq记录字段的示例MEDM窗口。在这个窗口中每条"线"从左到右由字段DOLn, DLYn,STRn,DOn, LNKn和WAITn组成。

sseqRecord.adl 

2 扫描/控制字段

类似所有其它EPICS记录,sequence记录有用于指定何时以在什么情况下它应该运行的标准字段集合(SCAN, PINI, FLNK, PROC等),以及如果有,什么记录应该之后立即运行。有关更多信息见EPICS记录参考手册。

除了标准控制字段外,sseq记录有字段ABORT:

 用户或者另一个EPICS记录可以通过写'1'到这个记录的ABORT字段使得一个运行的sseq记录停止执行链接。ABORT字段将在这个记录完成取消前保持'1',到完成取消后,这个字段将被重置为'0'。在其被取消时,仅这个记录自身的执行将停止。这个记录(通过其链接)已经启动的任何运行将不受取消影响,并且在任何情况下转发链接将被执行。

首次向取消字段写'1'在使此记录返回到空闲状态前等待待处理的回调到达。这是取消一个正在执行的序列的首选方式。但,这个记录正在等待的一个回调将不再到来是可能的。在这种情况中,需要一个更彻底的取消,把这个记录置回一个可执行的状态。因而,如果如果在这个记录正在等待回调时发生了向取消字段第二次写1,这个记录将丢弃待处理的回调,并且立即返回到空闲状态。任何被丢弃的回调仍然保持待处理,并且会在任何时候到来。如果一个回调在记录空闲时到来,它将被忽略,但如果它在记录正在执行一个新序列时出现,它被被当成那个新序列的结果。

EPICS开发者把一个sequence记录的转发链接当成一个额外的LNKn字段并且使用转发链接来链接一系列sequence记录一起成为了一个常见手段。这些手段不推荐与sseq记录一起使用,因为转发链接不受ABORT制约;它总是被执行。

对于这个记录的先前版本(早于std模块版本3.0),使用者被警告不要通过PP链接写入到ABORT字段,因为这会使得EPICS在取消成功后再次运行这个记录。这个记录现在通过清理其RPRO字段作为一个取消的最后步骤来防止自身这种可能性。

3 所需输出字段

这些字段保存这个记录要写到其它记录的值或者决定哪些值被从何处读取。

这个sequence记录可以最多从10个位置获取10个值。用户在所需输出链接字段(DOL1-DOLA)中指定位置,这些可以是数值常数或者指向其它EPICS PVs的链接。如果所需输出链接是一个数值常数,那个链接对应的值字段被初始化成那个值。否则,如果所需输出链接是一个字符串,它被认为表示一个链接,每次记录运行时,从那个链接获取一个值。有关如何指定数据库链接的信息见EPICS记录参考手册。如果你想要初始化一个字符串值,使用STRn。例如,要写一个初始化字符串STR1(此字符串将被LNK1写)为"abcdefg"的数据库文件,包含以下行:

record(sseq,"mySeqRecord") {
	...
	field("STR1","abcdef")
	...
}

从所需输出链接获取的值被存储在对应的所需输出字段(DO1-DOA和STR1-STRA)。这些字段可以被数据库配置工具初始化,并且它们可以在运行时被修改。但注意如果DOLn是一个有效链接,DOn和STRn的值将被重写(即是:如果DOLn包含一个PV的名称,sseq记录能够对这个PV创建通道访问链接)。

很多有DOL链接字段的EPICS记录也有一个OMSL(输出模式选择)字段,它决定是否使用DOL字段。如seq记录,sseq记录没有这样的字段。如果DOLn字段包含可能是一个PV名称的文本,它们被当成链接,并且如果那些链接成功地获取了值,值字段将被重写。

4 输出/等待字段

 当sseq记录被运行时,所需输出值(DOn或STRn)被写入对应地输出链接(LNKn)。这些输出链接应该或者为空(在此种情况种,写将不发生),或者包含一个EPICS PV地名称;它们不可以是设备地址。有10个输出链接。仅包含了有效PV名的那些链接才被使用。如果一个链接字段包含了一个PV名,而不能对其创建一个CA连接,这个记录余下部分当前继续运行,就如未连接的连接字段为空(这可能不是一个好规则,并且在改进此记录时,它不确保它还这样)。

EPICS链接可以引起被链接到(即:目标)记录的运行发生。运行是否确实发生取决于这个链接的格式以及目标记录的属性。这在EPICS应用程序开发者指南中被详细地记录,但由于链接作用的某些细节对于理解sseq记录的WAITn字段是必不可少的,在这里概述了输出链接LNKn的作用:

有三种可能性:

1)PP:如果LNKn有属性PP(例如:"targetRecord.field PP NMS"),则这个连接将使得targetRecord运行。但这种尝试仅在这个目标记录是"Passive"(例如:targetRecrod.SCAN有值Passive)时才成功。换句话,PP表示"如果Passive,运行"。

2)CA:如果LNKn有属性CA(例如:"targetRecord.field CA NMS"),接着targetRecord仅在field已经由targetRecord的记录支持代码指定为"Process Passive"时才运行。你可以通过查看此记录的.dbd文件或者通过从任何通道访问客户端写入它区分一个字段是否是"过程被动";如果在有疑问字段通过通道访问被写入时,这个记录运行了,则这个字段是过程被动,并且一个从sseq记录到那个字段的CA链接也将使得这个记录运行。

3)NPP:如果LNKn有属性NPP时,则targetRecord将不由LNKn导致运行。

只在sseq记录正在运行的输出链接字段有属性CA时,它才被允许从EPICS要求一个结束回调。PP链接不被允许提出这个要求。如果LNKn确有CA属性,并且WAITn有Wait值,则sseq记录将要求一个结束回调。在这种情况下,在启动了LNKn后在进行到下组DLY/DOL/LNK字段前它将等待其回调。如果LNKn有除了'CA'外的任何属性,WAITn没有作用并且其值被忽略。

如果LNKn有属性CA,并且WAITn有值Wait,但targetRecord.field不是Process-Passive字段,则targetRecord将不由LNKn导致运行,但sseq记录将无论如何立即接收到一个结束回调,并且因而不等待targetRecord运行。

最后,如果sseq记录成功地等待了targetRecord结束了运行,由于LNKn间接导致其它记录运行仍然是可能的,并且除非数据库开发者已经安排了间接引起的运行可被EPICS跟踪,否则sseq记录不能等待这种间接引起的运行结束。例如,通道访问客户端在sseq记录写入的字段上设置了监控,并且在那个记录的值变化时做某件事情。EPICS在没有来自数据库开发者的特殊帮助下不能跟踪这个运行。这个话题在sscan记录文档中详细地描述,sscan记录也依赖EPICS执行跟踪来确定它引起地运行何时结束。

 这些字段确定sseq记录是否等待由一个输出链接启动的运行的结束,以及这个记录在序列中什么位置。如果WAITn有一个除了"NoWait"外的其它值,这个记录将等待。要完成这个,这个记录将尝试用这样的方式执行LNKn:当由这个链接启动的所有运行结束时,这个记录将得到通告。这种尝试仅在此链接有属性"CA"时才会成功。

如果WAITn有值"Wait",这个记录将在继续下一个操作前等待结束。

如果WAITn有值"Afteri, 此处i在[1,10]中",接着这个记录在等待结束前将执行操作到并且包含操作i。因而,例如,如果你想要在进行到链接3前快速连续地执行链接1和链接2,并且接着等待由这两个链接启动的运行的结束,你设置WAIT1为"After2",并且设置WAIT2为"Wait"或"After2"。(对于链接n,"Wait"表示与"Aftern"相同的意思)。

sseq记录不能及时倒回。如果你为链接3指定了"After2",这个记录将如你指定了"Wait"或(等价地)"After3"一样的表现。

WERRn字段纯粹为了用户信息,并且表示WAITn字段是否与为LNKn字段指定的链接属性保持一致。如果你想要这个记录等待一个链接的完成,那个链接必须有属性'CA'。这个记录强制这条,它仅告诉你是否有问题。

 这些字段显示它们各自链接的等待状态。当这个记录正在等待由一个链接启动的运行的结束时,这个字段将设为值1。

为了避免误解,强调:WAITn字段不控制或影响sseq记录对其延时(DLYn)字段的使用。WAITn仅控制是否等待由LNKn启动的运行的结束。因而,如果WAITn为0,这个记录将立即执行LNKn并且在执行LNK(n+1)前等待DLY(n+1)秒;如果WAITn是1,这记录将执行LNKn,等待由LNKn启动的运行到结束,并且接着暂停DLY(n+1)秒。

顺便说一下,因为sseq记录可以写字符串,它可以用于写到(其自身或者另外记录的那些)链接字段。仅在进行写的链接字段有属性CA时,这种用法才会成功。

5、选择算法字段

当sseq记录被运行时,它使用一个类似sel记录算法的选择算法来决定运行哪些链接。选择机制字段(SELM)提供了从All, Specified或Mask中选择的三种算法。

1)ALL:所有链接从1到10按顺序都被处理。因而,如果DOL1或LNK1被连接,记录将等待DLY1,从DOL1(如果DOL1包含一个PV名称)获取所需输出值,放置它到DO1和STR1,并且发送它到LNK1(如果LNK1包含一个PV名),可选地等待结束。接着记录将进入到处理DLY2, DOL2, STR2, DO2, LNK2, WATI2,并且继续到最后一个输入和输出链接DOA和LNKA。当SELM=All时,SELN不被使用。

2)Specified:记录每次运行时,它将获取链接选择字段(SELN)中的值,并且将其用作要运行的链接组的索引。例如,如果SELN是4,从DO4获取所需输出值并且发送到LNK4。如果DOLn是一个常数,就使用DOn,而不是从输入链接获取的值。

3)Mask:每次运行这个记录时,记录使用来自SELN字段的整数值作为确定要运行哪些链接组的掩码。例如,如果SELN是1,则来自DO1的值将被写入到LNK1中的位置。如果SELN是3,记录将从DO1和DO2获取值并且写它们到LNK1和LNK2中的位置。如果SELN是3(0x3F),DO1...DO6将被写入到LNK1...LNK6。

6 延时字段

有10个延时相关的字段,每一个用于一个以上讨论的I/O链接。这些字段在从相关输入链接获取数据或者写到相关输出链接前使得记录延时运行。例如,如果用户设置DLY1字段为一个3.0的值,运行时每次运行这个记录,这个记录在从DOL1获取数据前将延迟运行3秒。如果输入或输出链接都不存在,忽略相关的延时。

用系统时钟的时间粒度实现了延时,这一般有一个60Hz的频率。当延时值被指定时,这个记录近似它为系统时钟周期的最近整数倍,并且把它写回到DLYn字段。

 这些字段用于向操作者显示有意义数据。精度字段(PREC)决定在显示VAL字段时的十进制精度。在调用get_precision记录例程时,使用它。

有关记录名(NAME)和描述的(DESC)字段见EPICS记录参考手册。

8 警报字段

sequence记录有所有记录类型共有的警报字段。详细见EPICS记录参考手册。

9 记录支持例程

唯一的记录支持例程是process。

1)首先,PACT被设置成TRUE,并且获取链接选择。取决于选择机制,按从LNK1到LNKA的顺序,链接选择输出链接被运行。当LNKn被运行,对应的DLYn值被用于通过看门狗计时器产生一个延时。

2)在DLYn秒后,(如果DOL你是常数)从DOn或者(如果DOLn是一个数据库连接或通道访问链接)从DOLn获取输入值并且写入到LNKn。

3)当所有链接都结束时,生成一个对dbProcess的异步完成回调。

4)接着设置UDF为FALSE

5) 检测monitors。

6)扫描转发链接,设置PACT为FALSE,并且process例程返回。

为了使得延时机制正常运行,异步运行这个记录。这个记录不被异步运行的唯一时候是在没有选择非non-NULL输出链接时(即:在其没有事情做时)。通过在dbCommon中PRIO字段的优先级设置的回调任何进行链接的运行。

10 运行时编辑一个sseq记录

编辑sseq记录字段(重新排列sequence中的行,插入新行等)是一个枯燥且易错的过程,因为sseq记录字段可以相互指向。例如,WAIT1字段可以设置值为"After3",因而记录将在运行第4行前等待由LNK1启动的操作。如果第1-3行被移动到了第2-4行,则想要WAIT2设置为"After4",来保留第1-3行的行为。LNK和DOL字段可以指向DO和STR字段,并且想要这些也被修改。

editSseq这些事情都干,有一个简单的基于命令的接口。这是一个editSseq的示例MEDM窗口:

 editSseq_more.adl

要完成以上描述的修改(移动一个sseq记录的第1-3行到相同记录的第2-4行),做以下事情:

1、输入记录名称到recName字段(获取使用拖放;editSseq将截取字段名)

2、输入3+到command字段。

3、输入2+到command字段。

4、输入1+到command字段

editSseq对seq记录也有效。

要使用editSseq,添加以下命令到一个IOC的启动文件:

1) dbLoadRecords("$(CALC)/calcApp/Db/editSseq.db", "P=xxx:,Q=ES:")

2) seq &editSseq, "P=xxx:, Q=ES:"

并且添加以下菜单项到一个MEDM窗口文件:

display[0] {
		label="editSseq"
		name="editSseq.adl"
		args="P=xxx:,Q=ES:"
}

猜你喜欢

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