zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

EPICS记录参考2--EPICS过程数据库概念

数据库概念 -- 过程 记录 参考 epics
2023-09-27 14:26:51 时间

EPICS过程数据库

一个基于EPICS的控制系统包含一个或多个输入输出控制器,IOCs。每个IOC装载一个或多个数据库。一个数据库是各种类型记录的集合。

一个记录是一个对象,有:

  • 一个唯一名称
  • 有其类型定义的行为
  • 可控的特性(字段)
  • 可选的相关联硬件I/O(设备支持)
  • 链接到其它记录

有若干可用的不同类型记录。除了在EPICS base软件包中包含的记录类型,创建你自己的记录类型来执行某些特定任务是可能的(虽然不推荐,除非你绝对需要)。

每个记录由很多字段组成。字段可以有不同的功能,它们一般用于配置这个记录如何操作,或者如何存储数据项。

以下是对最常用记录类型的简单描述:

模拟输入和输出(AI和AO):记录能够存储一个模拟值,并且一般用于像设置点,温度,压力,流率等的东西。这些记录执行很多像数据转换,警报处理,过滤等的功能。

二进制输入和输出(BI和BO):记录一般用于从设备添加命令和状态。如名称指示,它们存储像On/Off, Open/Closed等的二进制值。

calc和calcout:记录能够访问其它记录并且根据它们的值执行计算。(例如:通过一个电流和电压输入和输出的函数计算一个电机的效率并且转换成用于操作读取的百分数)。

数据库功能说明

本章包括在所有数据库记录中找到的通用功能。包含的话题是I/O扫描,I/O寻址说明,数据转换,警报,数据监控以及持续控制:

  • 扫描说明描述各种条件,记录在哪个条件下运行。
  • 地址说明解释了输入的源和输出的目的。
  • 转换说明包含来自传感器接口的数据到工程单位的数据转换。
  • 警报说明展现在数据库中可用的很多警报侦测机制。
  • 监控说明详细说明了这样的机制,它通知操作者数据库值变化了。
  • 控制说明解释了可用于在数据库中实现连续控制的特性。

为了理解数据库如何连接过程,这些概念是必要的。

通过手动创建一个数据库"myDatabase.db"文本文件或者使用可视化工具(VDCT, CapFast),能够创建EPICS数据库。一个来自Cosylab的java程序可视化数据配置工具(VDCT)是一个运行在Linux,Windows和Sun上用于数据库创建/编辑的工具。在此文档中的说明是用VDCT创建的。

扫描说明

扫描确定了一个记录何时被运行。当一个记录执行与其数据有关的任何操作时,它被运行了。例如,当运行了一个输出记录时,它获取了要输出的值,转换这个值,并且接着写那个值到指定的位置。每个记录必须指定扫描方法,扫描方法确定将何时运行这个记录。有三种用于数据库记录的扫描方法:

1、周期

2、事件

3、被动

周期扫描在设置时间间隔发生。

事件扫描在遇到I/O中断或者用户定义的事件时发生。

被动扫描当链接了这个被动记录的记录被扫描时,或者当一个值通过数据库访问例程写入到一个被动记录时发生。

对于周期或事件扫描,用户也可以通过使用PHASE机制控制一个记录集按哪种顺序被处理。在PHAS字段中的数值能够定义在一个扫描循环中按哪种相对顺序处理记录:

  • 首先处理PHAS=0的记录
  • 接着按顺序处理PHAS=0, PHAS=1等的记录。

对于事件扫描,用户可以控制一个记录将运行在所在的优先级。PRIO字段为软事件和I/O中断选择Low/Medium/High优先级。

除了扫描和phase机制,还有数据链接和可用于引起在其它记录中运行的转发处理链接。

周期扫描

周期扫描任务运行尽可能接近指定的频率。当每个周期任务启动时,它调用gettime例程,接着运行在这个周期上的所有记录。在这个运行后,gettime再次被调用并且这个线程休眠扫描周期和处理这些记录所需时间之间的差值。例如,如果它用了100毫秒来处理所有"1秒"扫描周期的记录,则在结束后900毫秒,这个1秒扫描周期将再次启动。以下用于扫描数据库记录的周期默认可用,但可以配置EPICS识别更多扫描周期:

  • 10 second
  • 5 second
  • 2 second
  • 1 second
  • .5 second
  • .2 second
  • .1 second

应该指定最适合信号自然特性的周期。一个5秒间隔对于大量水的温度是足够的,因为它不会快速变化。但某些功率电平会非常快地变化,所以需要每0.5秒扫描它们。在一个受控过程变量快速变化的连续控制循环中,0.1秒间隔会是最好选择。

对于一个要周期扫描的记录,在其SCAN字段中必须输入一个有效选项。实际上,可用的选项取决于menuScan.dbd文件的配置。如组成一个选项菜单的大部分其它字段,通过编辑合适的.dbd(数据定义)文件,能够更改可用于SCAN字段的选项。dbd文件是用于产生头文件的ASCII文件,这些头文件接着用于编译这个数据库代码。除了菜单字段选项,很多dbd文件能够还用于配置其它东西。

这是一个menuScan.dbd文件的示例,这个文件有对应以上列出所有周期的菜单选项以及对应事件扫描,被动扫描和I/O中断扫描的选项。

menu(menuScan) {
  choice(menuScanPassive,"Passive")
  choice(menuScanEvent,"Event")
  choice(menuScanI_O_Intr,"I/O Intr")
  choice(menuScan10_second,"10 second")
  choice(menuScan5_second,"5 second")
  choice(menuScan2_second,"2 second")
  choice(menuScan1_second,"1 second")
  choice(menuScan_5_second,".5 second")
  choice(menuScan_2_second,".2 second")
  choice(menuScan_1_second,".1 second")
}

前三个选项必须首先并且按显示的顺序出现。余下的定义是用于周期扫描率,周期扫描率必须按最慢到最快的顺序出现(顺序直接控制分配给特定扫描率的线程优先级,并且更快的扫描率应该被赋予更高的线程优先级)。在IOC初始化时在扫描初始化时读取菜单选项字符串。因而可以通过更改menuScan.dbd并且通过dbLoadDatabase装载这个版本更改周期扫描率。唯一要求是每个周期选项字符串必须以一个数值开头并且以跟着任意以下单位字符串:

  • second or seconds
  • minute or minutes
  • hour or hours
  • Hz or Hertz

例如,要添加一个对应0.015秒的选项,在0.1秒选项后添加以下行:

choice(menuScan_015_second, " .015 second")

对应扫描周期的值范围可以是从一个时钟计时单位到在系统上可用的最大数目个的时钟计时单位(例如,开箱即用的VxWorks支持0.015秒或者一个60Hz的最大频率)。注意:选项的顺序是必要的。前三个选项必须按以上顺序出现。接着余下的选项应该按照降序,最长时间周期首先和最下周期最后。

事件扫描

在输入/输出控制器(IOC)数据库中支持两种事件类型,I/O中断事件和用户定义的事件。对于每种事件类型,用户可以能够使用PRIO字段或优先级字段指定事件的调度优先级。调度优先级指向这个事件在栈上相对于其它运行的任务的优先级。有三种可能的选项:LOW,MEDIUM或HIGH。一个低优先级事件有一个略高于通道访问的优先级。一个中优先级事件有一个等于中位数周期扫描任务的优先级。高优先级事件有一个等价于事件扫描任务的优先级。

I/O中断事件

在I/O中断上扫描使得在一个驱动提交一个I/O事件时运行一个记录。在很多情况中,在中断服务例程中提交这些事件。例如,如果一个模拟输入记录此从一个I/O板卡获取它的值并且指定I/O中断为它的扫描例程,则每次这个板卡产生一个中断(不是所有类型I/O板卡能够产生中断)时将运行这个记录。注意:即使某些板卡不能实际上产生中断,一些驱动支持模块能够模仿中断。为了使一个记录在I/O中断上扫描,它的SCAN字段必须指定I/O Intr。

用户定义的事件

用户定义的事件的机制处理只在特定环境下有意义的记录。通过post_event()数据库访问例程能够产生用户定义的事件。两个记录event记录和timer记录,也用于提交事件。例如,有定时输出,当过程处于一个控制能够被安全更改的状态时产生。通过Timer记录控制定时输出,Timer记录有产生中断的能力。考虑一种情况,在此情况中在I/O中断上扫描这个timer记录并且timer记录的事件字段(EVNT)包含一个事件号。 当扫描这个记录时,将提交这个事件,其SCAN字段指定Event并且其事件号与产生的事件相同的所有记录将被运行。也能够通过软件产生用户定义的事件。事件号是可配置的并且应该通过项目工程师被控制。它们只需要每个IOC唯一,因为它们只触发相同IOC中记录的运行。

使用用户定义的事件的机制的所有记录必须在它们的SCAN字段中指定Event并且在它们的EVNT字段中指定一个事件号。

被动扫描

当被动记录通过它们的链接字段被其它记录引用或者当对它们进行了一次通道访问写时,它们被运行。

通道访问写入到被动扫描记录

 在一个通道访问对一个记录进行了写的情况中,这个被写的字段有一个属性,其决定了这个写是否引起记录运行。在所有记录的情况中,对VAL字段的写引起了记录运行。考虑一个其SCAN字段为Passive的二进制输出记录。如果操作窗口在VAL字段上有一个按钮,每次按下这个按钮时,向这个记录发送了一个通道访问写。当VAL字段被写时,这个Passive记录被运行并且通过DTYP指定的设备支持调用指定的设备支持写新转换的RVAL到在OUT字段中指定的设备。决定更改一个记录行为方式的字段,一般使得这个记录运行。会引起二进制输出运行的另一个字段是ZSV;它是这个二进制输出记录处于状态Zero(0)时的警报严重性。如果这个记录处于状态0并且处于那个状态的严重性从No Alarm变成了Minor Alarm,在一个SCAN Passive的记录上捕获这个的唯一方法是运行它。在bo.dbd文件中字段可以配置成引起二进制输出记录运行。ZSV严重性可按以下配置:

field(ZSV,DBF_MENU) {
  prompt("Zero Error Severity")
  promptgroup(GUI_ALARMS)
  pp(TRUE)
  interest(1)
  menu(menuAlarmSevr)
}

此处"pp(True)"行是指明:当进行一个通道访问写时运行这个记录。

到被动记录的数据库链接

在过程数据库中的记录使用link字段配置数据传递和调度(或者运行)。这些字段是INLINK, OUTLINK或FWDLINK字段。

转发链接

在数据库定义文件中(.dbd),按如下定义了这些字段:

field(FLNK,DBF_FWDLINK) {
  prompt("Forward Process Link")
  promptgroup(GUI_LINKS)
  interest(1)
}

在被FLNK字段引用的记录设置SCAN字段为"Passive",则在带有FLNK记录之后,运行被FLNK字段引用的记录。FLNK字段只引起记录运行,不传递数据。在(图1)中,显示了三个记录。周期地运行ai记录"Input_2。在每个间隔中,运行Input_2。在Input_2完成读取新输入,转换它为工程单位,检查警报条件,并且向通道访问转发监控,接着运行calc记录"Calculation_2"。Calculation_2读取输入,执行计算,检查警报条件,并且向通道访问提交监控,接着运行ao记录"Output_2"。Output_2读取所要地输出,对它限制速率,限制范围,为OUT字段调用设备支持,检查警报,提交监控并且接着结束。

 图1 输入链接

输入链接通常从一个字段获取数据到在进行引用的记录中一个字段。例如,如果一个CALC记录的INPA字段设置成了Input_3.VAL,则从Input_3记录获取VAL字段并且放入CALC记录的A字段。这些数据链接有一个属性,它指定一个被动记录在返回值前是否应该被运行。这个属性的默认值是NPP(no process passive)。在这种情况中,记录获取VAL字段并且返回它。如果它们设置成PP(process passive),则在返回这个字段前,运行这个记录。

在图2中,使用PP属性。在这个示例中,周期性运行Output_3。记录运行首先获取DOL字段。由于DOL字段设置了PP属性,在返回Calc_3的VAL字段前,运行这个记录。由ai记录Input_3做的第一件事情是读取输入。它接着转换RVAL字段为工程单位并且在VAL字段中放置这个值,检查警报,提交监控,并且接着返回。calc记录接着从Input_3获取VAL字段,放置它在A字段,进行运算,检查警报,提交监控,返回。ao记录Output_3接着从CALC记录获取VAL字段,使用变化率和限制,写新值,检查警报,提交监控并且结束。

图2

在图3,使用PP/NPP属性计算变化率。 以1Hz运行Calc记录。它按顺序为calc记录获取输入。由于INPA有属性NPP,从ai记录获取VAL字段。由于在这个链接上的属性是PP,在INPB从ai记录获取VAL字段前,它被运行。新的ai值被放入calc记录的B字段。A-B是一秒前ai记录的VAL字段和当前VAL字段。

图3

过程链

链接可以用于创建复杂的扫描逻辑。在以上转发链接的示例中,记录的链是由输入链接的扫描率决定的。在PP示例中,链的扫描率是由输出速率决定的。取决于硬件和过程限制,其中任何一个可能是合适的。

由于这种灵活性也会导致某些错误配置,必须小心。我们在接下来的示例中看到会发生的某些错误。

在图4中,在10Hz被扫描的两个记录指向了相同的Passive记录。在这种情况中,不产生警告或错误。Passive记录以10Hz被扫描两次。两次扫描之间的时间取决于在在两个周期记录之间运行了什么记录。

 图4

在图5中,做了若干环形引用。由于为链接递归地调用了记录运行,在运行这个链的整个时间中,包含这个链接的记录被标记成活跃。当遇到这些环形引用之一时,活跃标记被识别并且运行这个记录的请求被忽略。

 图5

通道访问链接

通道访问链接是一个输入或输出链接,它指向位于另一个IOC中一个记录的链接或者是一个具有以下属性:CA,CP或CPP之一的输入或输出链接。

通道访问输入链接

如果输入链接指定了CA,CP或CPP,无论被引用的过程变量的位置,将强制它为一个通道访问链接。这对于分隔不是紧密关联的过程链是有帮助的。如果输入链接指定CP,无论何时提交监控,无论这个记录的SCAN字段指定什么,它也引起包含这个输入链接的记录运行。如果输入链接指定CPP,当且仅当有CPP链接的记录设置SCAN字段为Passive时,它将引起记录被运行。换句话,随着它们引用的过程变量变化,CP和CPP使得包含这个链接的记录运行

通道访问输出链接

仅CA适合于输出链接。通过通道访问对一个字段的写引起运行,如在对被动扫描记录的通道访问写中指定的。

通道访问转发链接

转发链接也可以是通道访问链接,或者当它们指定在另一个IOC中一个记录或者当它们指定CA属性。但,如果转发链接指定另一个记录的PROC字段,它们将只成为通道访问。

最大化严重性属性

最大化严重性属性是以下之一:

  • NMS (Non-Maximize Severity)
  • MS (Maximize Severity)
  • MSS (Maximize Status and Severity)
  • MSI (Maximize Severity if Invalid)

它决定是否沿链接传播警报严重性。如果属性是MSI,仅传播INVALID_ALARM严重性;MS或MSS的设置传播比这个记录的当前严重性更严重的所有警报。对于输入链接,由链接引用的记录的警报严重性被传播给了包含这个链接的记录。对于输出链接,包含这个链接的记录的警报严重性被传播给了由这个链接引用的记录。如果严重性被更改了,相关联的警报状态被设置成LINK_ALARM,除非属性是MSS,此时警报状态将随着严重性一起被复制。

决定警报状态和严重性是否被更改的方法被称为"最大化严重性"。除了它的实际状态和严重性,每个记录也由一个新状态和严重性。新状态和严重性初始为0,其标识NO_ALARM。每次一个软件组件想要更改状态和严重性时,它首先检查新严重性并且只在它想要设置的严重性高于当前新严重性时才做更改。如果它进行了更改,它更改新状态和严重性,不是当前状态和严重性。当数据库监控被检查时,这通常由一个记录运行例程完成,当前状态和严重性被设置成新只并且心智重置为0。最终结果是当前警报状态和严重性反映最高严重性待处理警报。如果相同严重性的多个警报出现了,警报状态反映首个被探测到的。

Phase

PHAS字段用于排序以相同时间扫描的记录的运行顺序,即是,以相同间隔和优先级被周期性扫描的记录,或是在相同时间上被扫描的记录。用这种方式,依赖于其它记录的记录可以被确保使用当前数据。

为了说明这个,我们将看一看一个来自前一部分的示例,但记录被周期地扫描替代被动(图6)。在这个示例中,其中每一个记录都指定.1秒;因而,这些记录是同步地。phase顺序用于确保首先运行模拟输入记录,意味着它从指定位置获取它地值并且(在任何转换后)放置它在VAL字段。下一步,将运行calc记录,从这个模拟输入记录获取它的值并且执行计算。最后,将运行模拟输出记录,从calc记录的VAL字段(VAL字段包含了calc记录的计算结果)获取它的所需输出值并且写那个值到在其OUT链接中指定的位置。为了让这个发生,模拟输入记录的PHAS字段必须指定0,calc记录的PHAS字段必须指定1,而模拟输出记录的PHAS字段必须指定2。

 图6

理解以上示例是重要的,没有记录使得另一个记录运行。phase机制使得每个记录按顺序运行。

PVAccess链接

当按照Base>=3.16.1构建时,启用了对PVAccess链接的支持,这类似于通道访问(CA)链接。但PVA链接的语法十分不同。

权威文档在git仓库中可得,pva2pva(pva2pva: QSRV)。

注意:"dbjlr"和"dbpvar" IOC shell命令提供了有关在一个运行的IOC中PVA信息。

一个使用默认的简单配置是:

record(longin, "tgt") {}
record(longin, "src") {
  field(INP, {pva:"tgt"})
}

这是对以下的简写:

record(longin, "tgt") {}
record(longin, "src") {
    field(INP, {pva:{pv:"tgt"}})
}

可以使用一些(除"pv"外)补充的键。在下面这个示例中展示了默认:

record(longin, "tgt") {}
record(longin, "src") {
  field(INP, {pva:{
    pv:"tgt",
    field:"", # may be a sub-field
    local:false,# Require local PV
    Q:4, # monitor queue depth
    pipeline:false, # require that server uses monitor
    # flow control protocol
    proc:none, # Request record processing
    #(side-effects).
    sevr:false, # Maximize severity.
    time:false, # set record time during getValue
    monorder:0, # Order of record processing as a result #of CP and CPP
    retry:false,# allow Put while disconnected.
    always:false,# CP/CPP input link process even when # .value field hasn't changed
    defer:false # Defer put
  }})
}

pv: 目标PV名称

要搜索的PV名称。这是与'pvget'或其它客户端工具一起使用的相同名称。

field:结构体字段名称

远程提供的结构体的次级字段的名称。默认,一个空字符串""使用顶层结构体。

如果选择了顶级结构体或者次级结构体,则预计符合NTScalar, NTScalarArray或NTEnum来提取值和元数据。

如果次级字段是PVScaler或PVScalarArray,则将从它获取一个值,但将得不到元数据。

local:需要本地PV

当真时,除非由本地(QSRV)数据提供者提供指定名称的PV,否则链接将不连接。

Q:监控对了长度

请求一个特定的监控队列深度。当选择一个队列深度时,服务器可能会或者可能不会考虑这个。

pipeline:监视流量控制

希望服务器支持PVA监视流量控制。如果不,订阅将失速。

proc:请求记录运行(副作用)

这个选项的含义取决于链接的方向。

对于输出链接,此选项允许一个对远程运行的请求(父作用)

  • none(默认):不进行特殊请求。使用一个服务器特定的默认。
  • false,“NPP”:请求忽略运行。
  • true,“PP”:请求强制运行。
  • "CP","CPP":对于输出链接,"PP"的别名。

对于输入链接,此选项控制当接收到订阅事件时包含这个PVA链接的记录是否将被运行。

  • none(默认),false,“NPP”:在订阅更新时不运行。
  • true, "CP":总是在订阅更新时运行。
  • "PP", "CPP":如果SCAN=Passive,在订阅更新时运行

sevr:警报传播

这个选项控制从一个输入PVA链接读取一个值是否有通过最大化严重性过程传播任何警报的附加作用。

  • false:不最大化严重性。
  • true:最大化警报严重性。
  • “MSI”:如果远程验证性是"INVALID",才进行最大化。

time:事件传播

某种程度上类似于sevr:对时间戳使用。当真时,当读取链接值时,更新记录的TIME字段。

警告:TSEL必须对time:true设置成-2来起作用。

monorder:监控运行顺序

当多个记录以相同目录PV作为目标时,并且在订阅更新时请求运行。这个选项允许指定运行的顺序。按升序运行记录。在monorder=0前运行monorder=-1。二者都在monorder=1前运行。

defer:延迟put

默认(defer=false),一个输出链接将立即启动一个PVA Put操作。defer=true将在一个内部缓存存储新值,但不启动一个PVA Put。

这个选项,结合field:allows允许单个Put包含对多个次级字段的更新。

retry: 当断开时put

在链接断开时,允许一个Put操作被排队。当链接连接时将执行这个Put。

always: CP/CPP总是运行

默认(always:false),只在结构字段(cf.field:option)被标记成变化时,订阅更新才使得一个CP输入链接扫描。设置成true重写这个,并且总是运行这个链接。

链接语义/行为

这部分尝试回答一些有关链接在某些情况中如何表现的问题。

在三种基本上下文中评估链接:

  • dbPutLink()/dbScanFwdLink()
  • non-CP链接的dbGetLink()
  • 由CP链接产生一个扫描过程中dbGetLink()

一个输入链接能够带进一个值以及元数据,警报,时间和显示/控制信息。对于输入链接,PVA链接引擎尝试在值,警报和时间之间维持一致性。但这些以及显示/控制信息之间的一致性只在一个CP扫描过程中才被确保。

地址规范

地址参数指定一个输入记录从哪里获取输入,一个输出记录从哪里获取它的所需输出值,以及一个输出记录写其输出到哪里。它们用于标识记录之间的链接,并且指定硬件设备的位置。最常见的链接字段时OUT(输出链接),INP(输入链接)和DOL(所需输出位置,也是一个输入链接)。

有三种基本类型的地址规范,它们可以出现在这些字段:硬件地址,数据库地址和常量。

注意:虽然某些这样,但不是所有链接都支持所有三种类型。对于算术记录不是这样,算术记录不能指定硬件地址。算术记录是像Calc,PID和Select记录的记录。这些记录用于处理从其它记录获取的值。参考对应每种记录的文档。

硬件地址

EPICS过程数据库逻辑和硬件驱动之间的接口在支持硬件接口的记录的两个字段中被指明:DTYP和INP/OUT。DTYP字段是用于连接设备的设备支持入口表的名称。地址规范由设备支持确定。在下面列出了存在于若干总线的一些规则。最近,更多设备才选择了使用一个字符串,其接着被设备设置解析成所需。规范类型被称作INST I/O。这里列出的其它规范包括:VME,Allen-Bradley, CAMAC, GPIB, BITBUS, VXI和RF。对应这里每一种的输入规范是不同的。必须从设备支持代码或文档获取这些字符串的规范。

1、INST

INST I/O规范指定一个由设备支持解析的字符串。这个字符串的格式由设备支持决定

@parm

对于INST I/O

@ 在可选字符串parm前

2、VME Bus

VME地址规范格式在不同设备之间不同。在所有这些规范中,‘#’字符指定一个硬件地址。三种格式是:

#Cx Sy @parm

对于模拟输入,模拟输出,和计时器

  • C 在板卡编号x前
  • S 在信号编号y前
  • @ 在可选的字符串parm前

在VME地址中的板卡编号制定了逻辑板卡编号。板卡编号由地址规则分配:在背板中的位置是不重要的。地址是由填入背板的工程师分配的,逻辑编号明确记录。逻辑板卡编号同信号编号从0开始。parm指向一个最多31个字符的任意字符串并且是设备特定的。

3、Allen-Bradley Bus

Allen-Bradley地址规范由于有若干更多字段,它更加复杂。'#'指定一个硬件地址。格式是:

#La Ab Cc Sd @parm

所有字段类型:

  • L 在串行链接编号a前并且是可选的,默认0
  • A 在适配器编号b前并且是可选的,默认0
  • C 在板卡编号c前
  • S 在信号编号d前
  • 在可选字符串parm前

对应Allen-Bradley I/O的板卡编号指定物理插槽编号,此处0是直接位于适配器板卡的右侧。AllenBradley I/O I/O有12个可用于I/O板卡的插槽,编号从0到11。Allen-Bradley I/O可以使用双查询地址,这表示插槽0,2,4,6,8,10用于输入模块,插槽1,3,5,7,9和11用于输出模块。由于1771IL板卡只在双插槽寻址寻址模式中有用,所有当使用它时,需要使用双地址插槽寻址模式。由于此板卡提供Kilovolt隔离,需要它。

4、Camac Bus

CAMAC总线规范类似于Allen-Bradley地址规范。'#'表示一个硬件地址。格式是:

#Ba Cb Ad Fe @parm

用于waveform数字仪表

  • B 在分支号a前
  • C 在箱号b前
  • N 在站点号c前
  • A 在次级地址d前(可选)
  • F 在功能e前(可选)
  • @ 在可选的字符串parm前

支持的waveform数字仪表是每个板卡仅一个通道;没有通道是必需的。

5、其它

GPIB,BITBUS,RF和VXI板卡类型已经被添加到了受到支持的I/O板卡中。以下简要描述了每一种的地址格式。要进一步解释,见每种板卡的特定文档。

#La Ab @parm

用于GPIB I/O

  • L 在链接号a前
  • A 在GPIB地址b前
  • @ 在可选的字符串parm前

#La Nb Pc Sd @parm

用于BITBUS I/O

  • L 在链接a前,即是:VME bitbus接口
  • N 在bitbus节点b前
  • P 在节点c上端口前
  • S 在端口d上信号前
  • @  在可选的字符串parm前

#Va Cb Sc #parm

用于VXI I/O,动态寻址

  • V 在VXI帧号a前
  • C 在VXI帧b中插槽前
  • S 在信号编号c前
  • @  在可选的字符串parm前

#Va Sb @parm

用于VXI I/O, 静态寻址

  • V在逻辑地址a前
  • S在信号编号b前
  • @  在可选的字符串parm前

数据库地址

数据库地址用于指定输入链接,所需输出链接,输出链接和转发运行的链接。在每种情况中格式相同:<RecordName>.<FieldName>

此处RecordName只是被引用的记录的名称。'.'是记录名和字段名之间的分隔符,而FieldName是在这个记录中字段的名称。

记录名和字段名是大小写敏感的。记录名可以是以下的混合:a-z A-Z 0-9 _ - . [ ] < > ;。字段名总是大写。如果未指定字段名作为一个地址的组成部分,认为是这个记录的值字段(VAL)。转发运行的链接不需要包含字段名,由于在使用一个转发运行的链接时,不返回值;因而,一个转发运行的链接只需要指定一个记录名。

当从另一个记录获取一个值时,进行基本的类型转换--整数倍转成浮点数以及浮点数倍转成整数。例如,一个使用二进制输入记录的值字段的calc记录将得到一个浮点1或0来在计算中使用,因为calc记录的值字段是浮点数值。如果calc记录的值被用于多位二进制输出记录的所需输出,浮点结果被转成一个整数,因而多位二进制输出记录使用整数。

使用软设备支持例程或者没有硬件设备支持例程的记录被称为软记录。有关记录的设备支持的信息见每种记录的章节。

常数

输入链接字段和所需输出位置字段可以指定一个常数来替代硬件或数据库地址。一个常数,其不是一个真地址,可以是任何格式(hex, decimal等)等的整数或者浮点值。当初始化数据库时,值字段被初始化成这个常数。并且在运行时通过数据库访问例程更改这个值字段。例如,在calc记录的输入链接中可以使用常数。对于非常数链接,calc记录从输入链接获取值,并且放置它们到对应的值字段。对于常数链接,用这个常数初始化值字段,并且通过更改这个值字段而非链接字段能够更改这些值。因而,因为calc记录使用它的值字段作为它表达式的操作数,常数变成了计算的组成部分。

当在链接字段中没有指定东西,它是一个NULL链接。在Release 3.13前,与NULL 链接相关联的值字段被用0值初始化。从Release 3.13之后,与这些链接相关联的值字段不被初始化。常数也可以用于输出记录的所需输出位置或DOL字段。在这种情况,初始的所需输出值(VAL)将是那个常数。只要设备支持模块支持转换,在写这个值前,对这个值执行任何指定的转换(软通道设备支持例程不执行转换)。在运行时通过写入这个值字段,一个操作者能够更改所需输出值。

常数可以用于输出链接字段,但如果是这样的,将不写输出。小心:这不被数据库检查工具认为一个错误。

转换规范

转换参数用于转换传感器数据成有意义数据。离散信号需要在电平和状态(即是:on,off,high,low等)之间转换。模拟转换需要在电平和工程单位之间转换(即是:压力,温度,电平等)。进行这些转换以有意义单位向操作者和应用程序代码提供值。

以下部分讨论三种类型转换。以及字段名称以大写字母出现。

离散转换

离散转换的最简单类型是一个表示一个设备on/off状态的离散输入。如果电平为高,他指示设备的状态是开启的。相反,如果电平为低,它指示设备是关闭的。在数据库中,参数可用于输入对应每种电平的字符串,其接着对那个一个状态(1,0)。通过定义这些字符串,不需要操作者知道当其发射器的电平为高时一个特定的传感器开启,当电平为低时,其是关闭的。在一个代表性示例中,输入一个离散输入记录被输入以下的转换参数:

Zero Name (ZNAM): Off
One Name (ONAM): On

相同的离散输出记录示例是一个on/off控制器。我们考虑一种情况:设备的安全状态是On,0状态。电平为0驱动设备开启,因而断开的电缆将驱动设备进入一个安全状态。在这个示例中,按如下输入了数据库参数:

Zero Name (ZNAM): On
One Name (ONAM): Off

通过给外部世界这个设备的状态,信息清楚了。二进制输入和二进制输出记录用于表示这样的on/off设备。

一个涉及离散值的更加复杂示例是一个多位二进制输出记录。考虑双状态阀有四状态:移动,全开,全闭和断开。用描述那个状态的字符串向数据库输入对应每种控制状态的位模式。按如下输入用于监控的数据库参数:

Number of Bits (NOBT): 2
First Input Bit Spec (INP): Address of the least significant bit
Zero Value (ZRVL): 0
One Value (ONVL): 1
Two Value (TWVL): 2
Three Value (THVL): 3
Zero String (ZRST): Traveling
One String (ONST): Open
Two String (TWST): Closed
Three String (THST): Disconnected

在这种情况种,当扫描数据库记录时,读取监控位并且与每种状态的位模式比较。当找到了位模式,设备被设成那种状态。例如,如果两个监控位读成10(二进制),Two valve时相应的值,并且设备将被设成表示阀关闭的状态2。

如果位模式未被找到,设备进入一个未知状态。在本例种,所有可能的状态都被定义了。

此外,二进制输出记录的DOL字段(bo和mbbo)将接受字符串形式的值。当它们获取字符串时或者当值字段通过put_enum_strs被传递一个字符串时,用其中一个状态搜房一个匹配。如果发现匹配,写对应那个状态的值。

模拟转换

模拟转换需要了解传感器,滤波器和I/O板卡。它们一起测量这个过程,传递数据并且连接数据到IOC。平滑可用于过滤噪音信号。平滑参量是一个0和1之间的常数,并且在SMOO字段种被指定。它按如下应用于被转换的硬件信号:

eng units = (new eng units × (1 - smoothing)) + (old eng units × smoothing)

从原始值到工程单位的模拟转换可以是线性的或者断点转换。

一个模拟记录是否执行线性转换,断点转换或者完全不转换,取决于如何配置记录的LINR字段。用于LINR字段的可能选项如下:

  • LINEAR
  • SLOPE
  • NO CONVERSION
  • typeKdegF
  • typeKdegC
  • typeJdegF
  • typeJdegC

如果选择了LINEAR或者SLOPE,记录对数据执行线性转换。如果选择了NO CONVERSION,记录不对数据执行转换。其它选项是断点表的名称。当在LINR字段种指定这些之一,记录使用指定的表格转换它的数据。(注意:在特定站点经常添加补充的断点表,因而在用户站点会有闭这里列出的更多的断点表。) 以下部分解释了线性和断点转换。

线性转换

在EGUF和EGUL字段种各种指定工程单位的最大量程和最小量程。EGUF和EGUL字段的值各自对应传感器的最大和最小值。因而,这些字段的值是设备依赖的。例如,如果传感器有一个-10到+10伏特的范围,则EGUF字段应该为10并且EGUL字段应该为-10。在所有情况种,EGU字段是一个包含指明这个值单位的文本字符串。

用于LINR字段的LINEAR和SLOPE设置之间区分是在如何计算转换参数中:

用LINEAR转换,用户必须各自设置EGUL和EGUF为能够被硬件转换的最小和最大可能的工程单位值。设备支持知道原始数据的范围并且从它们计算ESLO和EOFF。

SLOPE转换需要用户计算合适的缩放和偏移因子并且在ESLO和EOFF中直接写入它们。

当考虑线性转换参数时,要知道有三种公式。从测量值到工程单位的转换如下:

 在以下示例中,显示了工程单位最大量程和最小量程的确定。到工程单位的转换也显示给读者,使其熟悉从信号源到数据库工程单位的信号转换。

传感器匹配I/O模块

首先让我们考虑线性转换。在这个示例中,传感器传递0-10V,没有放大,并且I/O板卡使用0-10V接口。

传感器传递压力:0V对应0PSI,10V对应175PSI。按以下确定工程单位的最大量程和最小量程:

eng. units full scale = 17.5 × 10.0
eng. units low scale = 17.5 × 0.0
  •  LINR:Linear
  • EGUF:175.0
  • EGUL:0
  • EGU:PSI

转换将考虑I/O模块的精度。在这个示例(假设一个12位模拟输入板卡),转换如下:

当压力是175 PSI时,10V被发送给了I/O模块。在10V时,信号读取为4095。当这被接入这个转换,值是175 PSI。

低于I/O模块的传感器

考虑这个线性转换的变量,此处传感器0-5V 

在这个示例中,传感器在0 PSI产生0V,在175 PSI产生5V。按如下确定工程单位最大量程和最小量程:

eng. units full scale = 35 × 10 
eng. units low scale = 35 × 0

在模拟记录中要转换这个压力的字段项将如下:

  •  LINR:Linear
  • EGUF:350
  • EGUL:0
  • EGU:PSI

转换也将考虑I/O模块的精度。在这个示例中(假设一个12位模拟输入板卡),转换如下:

注意:在最大量程,传感器将产生表示175 PSI的5V。这只是输入板卡所接受的一半。

让接入数值来看结果:

0+(2048/4095)∗(350−0)=175

在本例中,我们必须调整工程单位最大量程来补偿发送器和模拟输入板卡之间的差值。

传感器正和I/O模块双极型

我们考虑这个线性转换的另一个变体,输入板卡接受-10V到10V(即是:双极性替代单极性)。

在本例中,传感器在0 PSI产生0V,在175 PSI产生10V。输入模块有不同的电压范围,按如下确定了工程单位最大量程和最小量程:

eng. units full scale = 17.5 × 10 
eng. units low scale = 17.5 × (-10)

转换这个压力的数据库项如下:

  • LINR:Linear
  • EGUF:175
  • EGUL:-175
  • EGU:PSI

转换考虑I/O模块的精度。在这个示例中(假设一个12位模拟输入板卡),转换如下:

注意:在最小量程处,传感器将产生0V来表示0 PSI。因为这是输入板卡所接受的一半,以2048输入。我们带入数值看结果:

−175+(2048/4095)∗(175−(−175))=0

 在本例中,我们必须调整工程单位最小量程来补偿单极性发送器和双极性输入板卡之间的差值。

结合线性转换和放大器

考虑线性转换的另一种变量:输入板卡接受-10V到10V,传感器传递0-2V对应0-175 PSI以及在这个发送器上一个2X放大器。

 在0 PSI时,传感器传递0V。这被放到到0V。在量程一半,它读为2048。在175 PSI,满量程,传感器传递2V,其被放大到4V。模拟输入板卡把4V当作范围的70%或者2867个计数。由以下确定最大测量范围的上下限:

eng units full scale = 43.75 × 10
eng units low scale = 43.75 × (-10)

(175/4=43.75) 记录的字段项将按以下转换这个压力:

LINR:LINEAR

EGUF:437.5

EGUL:-437.5

EGU:PSI

转换也考虑I/O模块的精度。在本例中(假设一个12位模拟输入板卡),转换按以下:

注意:在测量量程的下限,传感器将产生0V来表示0 PSI。因为这是这个输入板卡所接受的一半,其输入是2048。我们带入数值看结果:

−437.5+(2048/4095)∗(437.5−(−437.5))=0

 注意:在测量量程的上线,传感器将产生2V,其表示175 PSI。放大器将把2V变成4V。4V是I/O板卡量程的14/20或者70%。来自I/O板卡的输入因而是2866(即是:0.7*4095)。我们带入数值看结果:

−437.5+(2866/4095)∗(437.5−(−437.5))=175PSI

 我们必须调整工程单位最大量程来调整传感器和放大器影响以及I/O板卡范围之间的差异。我们也调整最小量程补偿单极性传感器和双极性模拟输入板卡之间的差异。

断点转换

现在我们考虑非线性转换。这些是作为多项式输入的转换。由于要执行这些更耗时,创建一个断点表,其把非线性转换分成了足够准确的线段。

断点表

断点表接着用于进行分段线性转换。断点表的每个分段包括:

对应这个分段的原始值起始值,起始的工程单位。

breaktable(typeJdegC) {
   0.000000 0.000000
   365.023224 67.000000
   1000.046448 178.000000
   3007.255859 524.000000
   3543.383789 613.000000
   4042.988281 692.000000
   4101.488281 701.000000
}

断点表转换示例

当读取一个新的原始值,转换例程从先前使用的线段开始,比较原始起始值,并且在表格中前进或后退搜索对应这个新原始值的合适段。一旦找到了合适的段,新的工程单位值是这段起始处的工程单位值加上这段的斜率乘以在这段上的位置。

alue = eng.units at segment start + (raw value - raw at segment start) * slope

 一个有对应每个可能原始计数的项的表格是一个有效的查找表格。

使用dbLoadDatabase shell函数装载断点表到IOC。当装载这个表格时,计算对应每段的斜率。对于超过了断点表中最后一个点的原始值,使用末尾段的斜率。

在这个示例中,传感器是一个传递0-20mA的热电偶。一个放大mA到V的放大器存在。I/O板卡使用0-10V接口和一个12-Bit ADC。原始值范围因而是0到4095。

传感器传递温度。在模拟输入记录转换温度所需的数据项如下:

LINR:typeJdegC

EGUF: 0

EGUL: 0

EGU: DGC

对于使用断点表的模拟输入记录,在转换中部使用EGUF和EGUL,因而不需要给它们赋值。

使用这个示例设置并且假设我们获取了一个3500的ADC原始读取,以上公式会给出:

Value = 524.0 + (3500 - 3007) * 0.166 = 605.838 DGC

 EPICS Base发行包当前包含了以华氏F和摄氏C的J和K热电偶的查找表。

用于查找表的其它潜在程序是例如其它类型热电偶,对数输出控制器和指数传感器。信号的分段线性化提供一种最小化转换非线性信号所需的浮点算术量。能够添加补充的断点表到预定义表。

创建断点表

创建新断点表有两种方法:

1) 只要位每段输入数据,用以下格式为每个点给出原始值和工程单位值。

breaktable(<tablename>) {
  <first point> <first eng units>
  <next point> <next eng units>
  <etc.> <...>
}

此处<tableName>是这个表格的名称,诸如typeKdegC,<first point>是每条线段起始点的原始值,<first eng units>是相应的工程单位值。由软件计算斜率并且不应该被指定。

2) 创建一个文件,其由一个以工程单位的任意数目的数值的表格组成并且使用称作makeBpt的工具转换这个表格为一个断点表。作为一个示例,要创建typeJdegC断点表的内容数据文件看起来像这样:

!header
"typeJdegC" 0 0 700 4095 .5 -210 760 1
!data
-8.096 -8.076 -8.057 <many more numbers>

 文件名必须有扩展名.data。文件首先必须有一个指定这9行东西的头:

  1. 在引号中的断点表名称: “typeJdegC”
  2. 对应第一个断点表项的工程单位: 0
  3. 对应第一个断点表项的原始值: 0
  4. 用工程单位表示的所需最大值: 700
  5. 对应工程单位最大值的原始值: 4095
  6. 以工程单位表示的允许误差: .5
  7. 对应在数据表中第一项的工程单位: -210
  8. 对应在数据表中最后项的工程单位: 760
  9. 在数据表项之间工程单位表示的变化量: 1

这个文件余下部分包含等分工程值的行,在新行字符前每行不多于160个字符。用!header和!data各自指定头和实际表。对应数据表的这个文件被称为typeJdegC.data,并且能够用makeBpt工具按以下转成一个断点表:

unix% makeBpt typeJdegC.data

警报规范

对应一个警报有两个元素:警报状态(status)和此警报的严重性(severity)。每个数据库记录包含它的当前警报状态和对应那个状态的当前警报严重性。侦测到这些警报的扫描任务也能够为警报状态的每次变化产生一条消息。可用的警报类型分为这些类别:扫描警报,读/写警报,limit警报,和状态(state)警报。其中一些警报是由用户设定的,而某些是自动的,其表示它们是由记录支持例程在特定条件下调用的,并且不能被用户更改或配置。

警报严重性

警报严重性用于赋予当前警报状态的重要程度。有四种严重性:

  • NO_ALARM
  • MINOR
  • MAJOR
  • INVALID

NO_ALARM表示警报还未被触发。一个需要注意单不危险的警报是MINOR警报。在本例中,此警报状态用于向操作者传递警告。一个严重状态是MAJOR警报。在本例中,操作者应该立即注意到这种情况并且采取正确操作。一个INVALID警报表示数据有问题,这可以是若干问题之一:例如,一个出错的地址规范,设备通信出错,或者信号超出范围。在这些情况中,设置一个INVALID的警报严重性。一个INVALID警报能够指向一个简单的配置问题或者一个严重的操作问题。

对于limit警报和state警报,严重性可以由用户为指定状态配置为MAJOR或MINOR。例如,一个模拟记录可以被配置为在器值超过了175.0时触发一个MAJOR警报。除了MAJOR和MINOR,用户可以选择NO_ALARM严重性,在这种情况中,不为那种状态触发警报。

对于其它警报类型(即是:scan,read/write),严重性总是INVALID并且并且不由用户配置。

警报状态

警报状态是一个所有记录都具有的字段。这个字段被定义为枚举字段。在下面列出了可能的状态。

  • NO_ALARM: 记录未处于警报
  • READ: 一个输入链接在设备支持中出错
  • WRITE: 一个输出链接在设备支持中出错
  • HIHI:一个模拟值limit警报
  • HIGH:一个模拟值limit警报
  • LOLO: 一个模拟值limit警报
  • LOW: 一个模拟值limit警报
  • STATE: 一个数字值状态警报
  • COS: 一个数字值状态变化警报
  • COMM:一个指示设备不通信的设备支持警报
  • TIMEOUT: 一个指示异步设备超时的设备支持。
  • HWLIMIT: 一个指示硬件limit警报的设备支持警报。
  • CALC: 一个用于CALC记录指示一个出错运算的记录支持警报
  • SCAN: 输入了一个无效SCAN字段
  • LINK: 对应一个链接的软设备支持错误:在被引用记录上没有记录,错误的字段,无效转换,无效警报严重性。
  • SOFT
  • BAD_SUB
  • UDF
  • DISABLE
  • SIMM
  • READ_ACCESS
  • WRITE_ACCESS

这个字段和菜单有很多问题:

1) 通过通道访问传递的最大枚举字符串是16,如果通道访问不是以字符串请求这个值,看不到东西传递SOFT。

2) 一个时刻只有一个状态能够是真,因而引起一个或多个问题的根源是被屏蔽。这在记录支持和设备支持之间接口中尤其明显。硬件可能出现问题的组合并且没有通过提供的接口看到这个的方法。

3) 这个列表不完整。

4) 简言之,通过STAT字段看到错误的能力受限。在硬件,配置或通信中大部分问题被减少成了REWAD或WRITE错误并且设置它们的严重性未INVALID。当你有一个INVALID警报严重性,需要一些调查来确定这个错误。大部分EPICS驱动提供了一个repot例程,它转存大量诊断信息。在这些情况中这是一个开始的好地方。

在数据库中配置的警报条件

当你有一个有效值时,在记录中有允许用户配置偏离正常条件的字段。对于模拟值,有limit警报。对于离散值,这些是state警报。

limit警报

对于模拟记录(这包含诸如步进电机记录的记录),有可配置的警报limits。在正常操作范围之上有两个limits并且在正常操作范围之下有两个limits。这些limits中每一个都有一个相关联的警报严重性,在数据库中配置它。如果记录的值降到了下limit之下并且为那个limit指定了一个MAJOR警报严重性,则一个MAJOR警报被触发。当一个limit的严重性被设置成了NO_ALARM,将不产生警报,即使已经超出了这个limit。

在每端有两个limits,两个小值和两个大值,因而在值进入一个危险条件前能够引起一个警告。

模拟记录也包含一个回滞字段,在确定超限时,也被使用。回滞字段是警报limit两边的死区。死区防止一个在limit处不稳定的信号产生太多警报。我们举个例子:范围是-100V到100V,high警报limit是30V,回滞是10V。如果只正常并且接近HIGH警报limit,当这个只达到30V,触发了一个警报。只在这个值降低到这个limit下多于回滞时,这才进入正常状态。例如,如果这个值从30变成38,这个记录将维持在HIGH警报。只有当这个值降低到20时,这个记录才返回正常状态。

状态警报

对于离散值,有可配置的状态警报。在这种情况中,用户可以配置一个特定状态为一个警报条件。我们考虑一个降温风扇,其离散状态是hight,low和off。off状态可以配置成一个警报条件,因而当风扇是off时,记录处于STATE警报。为每种状态配置这个错误的严重性。在本例中,low状态可以是一个MINOR严重性的STATE警报,而off状态可以是一个MAJOR严重性的STATE警报。

 离散记录也有一个字段,用户在这个字段中可以指定一个未知状态的严重性为NO_ALARM, MINOR或MAJOR。因而,未知状态警报不是自动的。

离散记录也有一个字段,其可以指定一在记录的状态变化时的个警报。因而,操作者可以知道记录的警报状态何时变化。如果这个字段指定NO_ALARM, 则一个状态的变化将不触发状态警报的变化。但,如果它制定了MINOR或MAJOR,状态变化将触发一个相应严重性的警报。

警报处理 

一个记录用NSEV,NSTA,SEVR和STAT字段处理警报。当一个软件组件想要发出一个警报时,它首先检查新的警报状态字段:NSTA新警报状态,和NSEV新警报严重性。如果在NSEV字段中严重性高于当前严重性字段(SEVR),则软件组件设置NSTA和NSEV字段为相应待处理警报的严重性和警报状态。当这个记录process例程下次运行这个记录时,它设置当前警报状态(STAT)和当前严重性(SEVR)为在NSEV和NSTA字段中的值。这种处理警报的方法确保了当前严重性(SEVR)反映了待处理警报条件的最高严重性而不是简单地上次产生的警报。这也意味着如果出现了多个相同严重性的警报,警报状态指示首个被侦测到的警报。

补充,get_alarm_double()例程可以被调用来格式化一条警报消息并且发送它给一个警报处理程序。警报状况可能由操作接口通过显式地监视STAT和SEVR被监控。用当前状态信息从数据库访问返回被操作接口监控地所有值。

监控规范

EPICS为客户端提供了订阅PV变化被通告的方法;在EPICS词汇中,这个方法被称作"监控"。

在通道访问中,以以PVAccess客户端连接PVs来put,get或monitor。在EPICS记录中有帮助限制通过CA或PVA服务器向这些客户端提交监控的速率。当客户端监控一个记录的VAL字段时,这些字段最典型应用。大部分其它字段在它们被改变时提交一个监控。例如,对一个警报limit的写,引起一个监控被提交给任何正在监控那个字段的客户端。客户端可以选择...

更多有关使用监控的信息,见Channel Access Reference Guide。

速率limit

固有速率limit是记录被扫描所用的速率。只在记录作为一个最小被运行时,才提交监控。对于客户端当前没有速率限制一个监控的机制。如果一个记录运行比一个程序想要的快得多,要么数据开发者能够生成一个更低速率的第二个记录,并且客户端连接到那个版本或者在时间戳反映变化前客户端忽略这些监控。

通道访问死区选取

当在数据库中一个字段变化时,发送值变化监控。VAL字段是例外的。如果设置了MDEL,则当设置了一个监控时,发送VAL字段,并且在VAL字段变化了MDEL,才再次发送。注意:MDEL为0,在VAL字段变化时发送一个监控,MDEL为-1,由于MDEL被应用于前个扫描和当前扫描之间的差值的绝对值,所以当记录被运行时,发送一个监控。一个MDEL为-1对于被触发的标量以及需要出现的触发的正指示有用。

存档变化监控

在数据库中一个字段变化时,发出存档变化监控。VAL字段例外。如果设置了ADEL,则当一个监控设置时,发出VAL字段,并且只在VAL字段变化了ADEL时才再次发出。

警报变化监控

只在警报严重性或状态变化时,才发出监控。由于在警报状况检查上有过滤器,通过那些机制,警报状态或严重性的变化已经被过滤。在警报规范中描述这些。

元数据变化

当一个通道访问客户端连接一个字段时,它一般请求与那个字段相关的元数据。一种情况是来自操作接口的连接请求包括以下的元数据:显示limit, 控制limit,和诸如精度和工程单位的显示信息。如果在连接建立后,在一个记录中被包含在这个元数据的任何字段变化了,客户端不被通知并且因此除非客户端断开并且重连,否则这不被反映。一个新标记被加入到了通道访问客户端去支持在任何元数据变化时提交监控给客户端。客户端可以请求元数据并且反映这个变化。

敬请期待在记录支持和通道访问客户端中这个改进。

客户端特定的过滤

出现了若干情况会有帮助。这些包括事件过滤,速率保证,速率限制和值变化。

事件过滤

有若干情况:只在一个特定事件为真时,才从一个通道发出一个监控。例如,有以1KHz读取的诊断。当机器产生一个特定束流时,诸如一个有若干注入器和束线的linac,一个控制程序可能只想要这个信息。这些是虚拟机,它们在机器是处于它们的模式时想要得到通知。这些模式在某些情况下可以是以60Hz交织。一个故障分析工具可能只在一个故障发生并且束流丢失时才对所有这些数据感兴趣。

这里有两个努力:一个在LANL,一个来自ANL/BNL。这些应该在将来讨论。

速率保证

有对大部分客户端注意被通告的速率的限制。当前,只有SCAN周期限制这个。在一些情况中,需要一个用户施加的限制:诸如数据存档程序只想要这个通道在1Hz(在这种情况中,所有通道在相同的1msc上)。

值变化

不同的客户端可能在它们之间设置不同的死区。没有举特定情况。

控制规范

控制循环时一个数据库记录集用于维持自动控制。每个输出记录有两个字段,它们帮助实现这个独立控制:所需输出位置字段(DOL)和输出模式选择字段(OMSL)。OMSL字段有两种模式选择:closed_loop或supervisory。当选择了闭环控制时,从由DOL字段指定的位置获取所需输出并且放置它到VAL字段。当选择了监管模式,所需输出值是VAL字段。在监管模式中,不提取DOL链接。在监管模式中,由操作者通告通道访问"Put"设置VAL。

闭环一个模拟控制循环

在一个简单的控制循环中,模拟输入记录读取一个过程变量或PV的值。操作者在PID记录中设置设置点。接着,PID记录从模拟输入记录提取值并且计算误差--回读和设置点的差值。PID记录计算新的输出设置来移动过程变量靠近设置点。当OSMLK是闭环时,模拟输出记录通过DOL从PID获取值。它设置新的输出并且在下次周期上重复这个过程。

配置一个互锁

当某些情况在这个过程中变成真,它可能引起互锁。这个互锁的结果是通过采取默写行动移动某个东西到一个安全状态或者减小损失。一个示例是一个真空阀的关闭来隔离真空损失。当在一个机器区域总的真空取读不在操作范围时,一个互锁用于关闭阀并且禁止它打开。通过读取在一个区域中若干真空计到一个Calc记录可以实现这个。在calc记录中的表达式可以表示允许阀打开的条件。表达式结果是被一个可以控制阀的二进制输出记录的DOL字段引用。如果二进制输出记录设置OMSL字段为closed_loop,它设置阀位calc记录的值。如果它设置成监管,操作者可以重写这个互锁并且直接控制阀。