EPICS记录参考 -- 字符串输入记录(stringin)

字符串输入记录获取一个最多40个字符的任意ASCII串。若干设备支持例程可用,它们都是从其它记录或者其它软件组件获取数据的软设备支持。

参数字段

在下面描述记录专用字段,按功能分组。

扫描参数

字符串输入记录有用于指定在什么情况下运行它的标准字段。这些字段在Scan Fields中被列出。

输入格式

INP字段确定此字符串输入记录从哪里获取其字符串。它可以是一个数据库或者通道访问链接或者一个常量。如果为常量,用这个常量初始化VAL字段,并且能够通过dbPuts更改VAL字段。否则,在每次运行这个记录时,东指定的位置读取这个字符串,并且放置在VAL字段中。在VAL中字符串的最大字符数目可以是40。此外,必须在DTYP字段中输入合适的设备支持模块。

 用于监控的参数

这些参数用于指定monitor()例程应该在何时发送这个monitor提交。有两个可能的选项:

Menu stringPOST

APST用于archiver monitors,而MPST用于所有其它类型的monitors。

用于操作显示的参数

 有关记录名称(NAME)和描述(DESC)字段的更多信息见Fields Common to All Record Types。

 警报参数

字符串输入记录有所有记录类型共有的警报参数。Alarm Fields列出了与所有记录类型共有的警报相关的字段。

运行时参数

字符串输入记录的前一次的值字段(OVAL)用于实现对VAL的值变化监视。如果VAL与OVAL不同,则触发monitors。

 仿真模式参数

以下字段用于在仿真模式中操作这个记录。

如果SIMM(从SIML获取)是YES,记录被置入SIMS严重性并且聪慧SIOL获取这个值(缓存在SVAL中)。SSCN设置一个要在仿真模式中使用的不同SCAN机制。SDLY设置一个延时(秒为单位),其用于异步仿真运行。

有关仿真模式和其字段的信息见Input Simulation Fields。

记录支持

记录支持例程

1) init_record

long (*init_record)(struct dbCommon *precord, int pass)

 如果SIML类型是CONSTANT链接,这个例程用SIML的值初始化SIMM,或者如果SIML类型是PV_LINK,创建一个通道访问链接。根据SIOL是CONSTANT或PV_LINK,SVAL被类似地初始化。

这个例程接着检查设备支持是否可用并且是否定义了一个记录支持读取例程。如果都不存在,发出一条错误消息,并且终止正在运行地process。

如果设备支持包含一个init_record()例程,它被调用。

2) process

 long (*process)(struct dbCommon *precord)

 记录运行

例程process实现以下算法:

1) 检查合适地设备支持模块是否存在。如果它不存在,发布一条错误消息并且用PACT字段仍然设置为TRUE终止正在运行的process。这确保了将不再为此记录调用process。因而将不发生错误风暴。

2) 调用readValue。

3)PACT已经被更改为TRUE,设备支持读取例程已经启动,但还没有完成读取一个新值。在这种情况中,正在运行的process例程仅返回,保留PACT为TRUE。

4) 调用recGblGetTimeStamp()。

5) 检查是否应该调用monitors:

  • 如果警报状态或严重性发生变化,调用警报监视器
  • 如果OVAL不等于VAL,调用archive和值变化monitors
  • NSEV和NSTA被重置回0

6) 如果需要,扫描forward链接。设置PACT为FALSE并且返回。

设备支持

设备支持有关字段

每个stringin输入记录必须有一个设备支持例程相关的集合。设备支持例程的主要作用是在调用read_stringin时获取一个新的ASCII串。设备支持例程主要使用以下字段:

设备支持例程 

设备支持由以下例程组成:

1) report

long report(int level);

这个可选的例程被IOC命令dbior调用并且被传递用户请求的报告级别。它应该打印有关此设备支持状态的报告到stdout。level参数可以用于以更高级别增强输出更详细信息,或者选取有不同等级的不同类型信息。级别0应该输出不多于一小段概要。

2)init

long init(init after)

这个可选的例程在IOC初始化时被调用两次。第一次调用用整数参数after设为0发生在进行任何Init_record()调用前。第二次调用用after设为1发生在已经进行了init_record()调用后。

3) init_record

long init_record(dbCommon *prec)

这个例程是可选的。如果提供了,由记录支持init_record()例程调用。

4) get_ioint_info

  long get_ioint_info(int cmd, dbCommon *precord, IOSCANPVT *ppvt)

在这个记录每次被添加到一个I/O事件扫描列表或者被从一个I/O事件扫描列表删除时,这个例程被ioEventScan调用。根据这个记录被添加到一个I/O事件列表或者被从一个I/O事件扫描列表删除,cmd有值0或1。必须为能够使用ioEvent scanner的任何设备类型提供它。

5) read_stringin

 long read_stringin(stringinRecord *prec)

这个例程必须提供一个新输入值。它返回以下值:

  • 0:成功。一个新ASCII字符串被存入到VAL。
  • 其它:错误

用于软记录的设备支持

Soft Channel模块直接读取一个值到VAL。

提供对应DTYP getenv的设备支持用于从环境变量获取字符串。在INP链接字段中使用寻址@<environment variable>来选取所需的环境变量。

举例:

1) 使用以下一个数据库实例文件,来说明stringin记录类型的使用方式:

record(stringin, "$(USER):si1")
{
        field(SCAN, "1 second")
        field(DTYP, "getenv")
        field(INP, "@USER")
        field(FLNK, "$(USER):si2.PROC")
        field(PINI, "YES")
}

record(stringin,"$(USER):si2")
{
        field(SCAN, "Passive")
        field(DTYP, "Soft Channel")
        field(INP, "$(USER):si1.VAL")
}

stringin记录类型的一个记录实例$(USER):si1,一秒钟运行一次,其设备支持位"getenv",读取读取在INP字段中环境变量名对应的值,在其运行结束前通过FLNK字段使得记录实例$(USER):si2运行,$(USER):si2运行过程中国通过INP字段中数据库访问从$(USER):si1获取输入值。

2) 将以上数据库实例文件加载到IOC中,进行测试:

测试IOC中加载的记录:

epics> dbl
blctrl:si1
blctrl:si2

新开一个命令终端,通过caget获取blctrl:si1和blctrl:si2的值:

[root@bjAli ~]# caget blctrl:si1 blctrl:si2
blctrl:si1                     blctrl
blctrl:si2                     blctrl

在新开的终端中,通过caput向blctrl:si1.INP中写入一个新的环境变量,然后查看blctrl:si1和blctrl:si2两个记录实例的值:

[root@bjAli ~]# caput blctrl:si1.INP  @SHELL
Old : blctrl:si1.INP                 @USER
New : blctrl:si1.INP                 @SHELL
[root@bjAli ~]# caget blctrl:si1 blctrl:si2
blctrl:si1                     /bin/bash
blctrl:si2                     /bin/bash

猜你喜欢

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