EPICS记录参数--Event记录(event)

这个记录类型的一般使用是提交一个事件和/或运行一个forward链接。对这个记录的设备支持可以为I/O事件扫描的记录提供一个硬件中断处理例程。

参数字段

以下描述记录特定字段,按功能分组。

扫描参数

event记录有用于指定将在什么情况下运行它的标准字段。这些字段在Scan Fields中描述。

 事件编号参数

VAL字段包含被设备支持例程读取事件编号。它就是被提交的编号。对于使用Soft Channel设备支持的记录,可以在运行时前配置它或者通过dbPuts设置它。

 设备支持例程使用在这个记录中的地址去获取输入。对于提供一个中断处理程序的记录,INP字段应该指向I/O板卡的地址,并且DTYP字段应该指向一个有效的设备支持模块。注意地址格式根据使用的板卡类型而不同。有关硬件地址和指定链接的格式的信息见Address Specification。

对于软链接,INP字段可以是常数,数据库链接或通道访问。对于软记录,DYPT字段应该指定Soft Channel。

 用于操作显示的参数

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

警报参数

Event记录有所有记录类型共有的警报参数。"Alarm Fields"列出了与所有记录类型共有的警报相关联的其它字段。

仿真模式参数

以下字段用于在仿真模式中操作这个event记录。有关这些字段的更多信息见"Fields Common to Many Record Types"。

记录支持

记录支持例程

 1) init_record

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

如果设备支持包含init_record(),调用它。

2) process 见下一部分。

例程process实现以下算法:

1) 调用readValue。

2)如果PACT已经变成TRUE,设置支持读取例程已经开始,但还未完成读取一个新输入值。在这种情况下,运行中的process例程仅返回,保留PACT为TRUE。

3) 如果VAL>0,提交事件编号VAL。

4) 检查是否应该调用monitors。如果警报状态或严重性已经变为非0,调用警报monitors。

5) 根据需要,扫描forward链接,设置PACT为FALSAE,并且返回。

设备支持

设备支持有关字段

每个记录必须有一个相关联的设备支持例程的集合。设备支持例程主要使用以下字段:

设备支持例程

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

1) long report(int level)

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

2) long init(int after)

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

3) init_record(precord)

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

4) get_ioint_info(int cmd, struct dbCommon * precord, IOSCANPVT * ppvt)

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

5) read_event(precord)

这个例程返回i一下值:

  • 0:成功
  • 其它:错误

软记录的设备支持

Soft Channel设备支持模块是可用的。INP链接类型必须是CONSTANT, DB_LINK或CA_LINK。

如果INP链接类型是CONSTANT,则这个常数值被init_record()存储到了VAL,并且UDF被设置成FALSE。如果INP链接类型是PV_LINK,则dbCaAddInlink被init_record()调用。

read_event调用recGblGetLinkValue读取VAL的当前值。

Event记录使用举例:

以下数据库实例文件中有5个记录:

1) $(USER):longin记录,其扫描方式是被动的,用户可以使用通道访问向其VAL字段写入一个整数值。

2)$(USER):readInt1和$(USER):readInt2记录:它们都是Event扫描类型,并且都从$(USER):longin记录VAL字段读入输入,但它们的事件号分别是1和2。

3) $(USER):happen记录:扫描类型是Passive,当通道访问向其写入一个值时,将使得这个记录开始运行,并且在运行结束前,使得连接到其FLNK字段的被动记录运行。

4)$(USER):event记录:扫描类型是被动的,当其运行时,将从$(USER):happen读取输入值,并且放入自己的VAL字段。

record(longin, "$(USER):longin")
{
        field(INP, "0")
        field(SCAN, "Passive")
        field(DTYP, "Soft Channel")
}

record(longin,"$(USER):readInt1")
{
        field(INP, "$(USER):longin.VAL")
        field(SCAN, "Event")
        field(DTYP, "Soft Channel")
        field(EVNT, "1")
}

record(longin,"$(USER):readInt2")
{
        field(INP, "$(USER):longin.VAL")
        field(SCAN, "Event")
        field(DTYP, "Soft Channel")
        field(EVNT, "2")
}

record(longin, $(USER):happen)
{
        field(INP, "0")
        field(SCAN, "Passive")
        field(DTYP, "Soft Channel")
        field(FLNK, "$(USER):event.PROC")
        field(PINI, "1")
}

record(event, "$(USER):event")
{
        field(INP, "$(USER):happen")
        field(SCAN, "Passive")
        field(DTYP, "Soft Channel")
}

以上记录的运行流程为:

当通过通道访问向$(USER):happen写入一个值时,此记录运行,把这个输入值放入本记录的VAL字段,并且在运行结束前,通过FLNK使得$(USER):event运行;当$(USER):event运行,本记录会通过INP字段从$(USER):happen的VAL字段读入一个值,并且放入本记录的VAL字段,如果这个值是1,则运行$(USER):readInt1记录,该记录从$(USER):longin的VAL字段读取当前值,放入$(USER):readInt1的VAL字段中,如果这个值是2,则则运行$(USER):readIn21记录,该记录从$(USER):longin的VAL字段读取当前值,放入$(USER):readInt2的VAL字段中,如果是其它值,则$(USER):readInt1和$(USER):readInt2都不会运行,它们的VAL保持之前的值。

测试:

加载以上数据库实例文件到IOC程序中,出现了5个记录实例:

epics> dbl
blctrl:event
blctrl:longin
blctrl:readInt1
blctrl:readInt2
blctrl:happen

以下为测试过程:

# 初始时,所有记录的值都为0
[root@bjAli ~]# caget blctrl:longin blctrl:readInt1 blctrl:readInt2 blctrl:happen blctrl:event
blctrl:longin                  0
blctrl:readInt1                0
blctrl:readInt2                0
blctrl:happen                  0
blctrl:event                   0



# blctrl:readInt1和blctrl:readInt2记录的值都未发生变化
[root@bjAli ~]# caput blctrl:longin 6
Old : blctrl:longin                  0
New : blctrl:longin                  6
[root@bjAli ~]# caget blctrl:longin blctrl:readInt1 blctrl:readInt2 blctrl:happen blctrl:event
blctrl:longin                  6
blctrl:readInt1                0
blctrl:readInt2                0
blctrl:happen                  0
blctrl:event                   0


# 向blctrl:happen记录写1
[root@bjAli ~]# caput blctrl:happen 1
Old : blctrl:happen                  0
New : blctrl:happen                  1
[root@bjAli ~]# caput blctrl:happen 1
Old : blctrl:happen                  0
New : blctrl:happen                  1

# blctrl:event运行从blctrl:happen读取输入值1,并且blctrl:readInt1运行从blctrl:longin读取值6
[root@bjAli ~]# caget blctrl:longin blctrl:readInt1 blctrl:readInt2 blctrl:happen blctrl:event
blctrl:longin                  6
blctrl:readInt1                6
blctrl:readInt2                0
blctrl:happen                  1
blctrl:event                   1

# 向blctrl:happen写入2值
[root@bjAli ~]# caput blctrl:happen 2
Old : blctrl:happen                  1
New : blctrl:happen                  2

# blctrl:event运行从blctrl:happen读取输入值2,并且blctrl:readInt2运行从blctrl:longin读取值6
[root@bjAli ~]# caget blctrl:longin blctrl:readInt1 blctrl:readInt2 blctrl:happen blctrl:event
blctrl:longin                  6
blctrl:readInt1                6
blctrl:readInt2                6
blctrl:happen                  2
blctrl:event                   2

# 向blctrl:longin写入一个值5
[root@bjAli ~]# caput blctrl:longin 5
Old : blctrl:longin                  6
New : blctrl:longin                  5
# 向blctrl:happen写入一个值3
[root@bjAli ~]# caput blctrl:happen 3
Old : blctrl:happen                  2
New : blctrl:happen                  3

# blctrl:event从blctrl:happen读取输入值3,但blctrl:readInt1和blctrl:readInt2都没有运行,还保持原来的值。
[root@bjAli ~]# caget blctrl:longin blctrl:readInt1 blctrl:readInt2 blctrl:happen blctrl:event
blctrl:longin                  5
blctrl:readInt1                6
blctrl:readInt2                6
blctrl:happen                  3
blctrl:event                   3

猜你喜欢

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