EPICS calc记录

5 篇文章 0 订阅

1 介绍

计算或”Calc”记录用于对从其它记录接收的值执行代数,关系和逻辑操作。其操作结果可以接着被另一个记录访问,使得可以使用它。在这个记录中的字段分为这些类别:

1) 扫描参数

2)读取参数

3)表达式参数

4)操作显示参数

5)警报参数

6)  监视参数

7) 运行时参数

2 扫描参数

Calc记录有用于指定在什么情况下运行这个记录的标准字段。由于Calc记录不支持直接与硬件连接,不能在I/O interrupt上扫描它,所以它的SCAN字段不能是I/O Intr。

3 读取参数

用于Calc记录的读取参数由12个输入链接组成—INPA,INPB, … INPL。这些字段可以是数据库链接,通道访问链接或者常数。如果它们是链接,它们必须指定另一个记录的字段或者一个通道访问链接。如果它们是常数,用配置它们的值初始化它们,并且通过dbPuts可以更改它们对应字段的值。它们不能是硬件地址。

在Calc记录的核心是CALC和RPCL字段。CALC字段包含内嵌表达式,当记录routine运作这个记录时,它将使用这个表达式。产生的结果被放置在VAL字段并且可以从那里被访问。CALC表达式实际被转成了opcode并且以Reverse Polish Notation形式被存储在RPCL字段。它时实际用于计算VAL的表达式。在运行时Reverse Polish表达式计算效率高于一个内嵌表达式。CALC在运行时可以被更改,并且special记录routine调用一个函数转换它为Reverse Polish Notation。

这个计算记录支持的表达式范围被分成了操作数,代数操作符,三角函数操作符,关系操作符,逻辑操作符,括号和逗号,以及问号或’?:’操作符。表达式可以由这些操作符中任何以及来自输入链接其为操作数的值组成。

4.1 操作数

表达式使用从INPx链接获取的值作为操作数,常数也可以被用作操作数。从输入链接获取的这些值被存储在A-L字段。要在表达式中被使用的值只要通过这个字段字母被引用。例如,从INPA链接获取的值被存储在字段A,而从INPB获取的值被存储在字段B。字段名可以被包含在表达式中,表达式将操作它们各自的值,如在A+B中。为了产生一个0和1之间的随机数值,RNDM一元函数可以以一个操作数被包含在表达式中。

4.2 代数操作符

4.3 三角函数操作符

4.4 关系操作符

4.5 逻辑操作符

4.6 位操作符

4.7 括号和逗号

支持开和闭括号。支持嵌套括号。在用于分隔一个二元函数参量时支持逗号。

4.8 条件表达式

支持C语言的问号操作符。格式是:(condition)?True resulut : False result

4.9 表达式

代数:A+B+10 结果是A+B

关系:(A+B)<(C+D) 如果(A+B)<(C+D)为1,如果(A+B)>=(C+D)是0.

问号:(A+B)<(C+D)?E:F+L+10 如果(A+B)<(C+D)结果是E,如果(A+B)>=(C+D)结果是E+L+10

(A+B)<(C+D)?E 如果(A+B)<(C+D)结果是E,如果(A+B)>=(C+D)结果不变。

位操作:A&B 使得以下发生:转换A为整数,转换B为整数,把A和B位与,转换结果为浮点数

5 操作显示参数:

这些参数用于向操作者显示有意义数据。这些字段用于以文本或图形显示这个计算记录的VAL和其它参数。EGU字段包含一个最多16个字符的字符串,其由用户提供并且描述了正在被操作的值。在routine get_units被调用时,获取这个字符串。EGU 字符串只出于操作者的原因并且不是必须被使用。

HOPR和LOPR字段只指向VAL,HIHI,HIGH,LOW和LOLO字段的限制。PREC控制VAL字段的精度。

有关记录名(NAME)和描述(DESC)的更多,见第二章:Fields Common to All Record Types。

6 警报参数

对于Calc记录的可能的警报参数时SCAN,READ,Calculation和limit警报。SCAN和READ警报被这个记录支持routines调用。Calculation警报被这个记录的processing routine调用并且在CALC表达式是一个无效表达式时,产生一个错误消息。

以下警报参数,它们是由用户为VAL字段定义的限制警报和对应那些条件的严重性来配置的。

HYST字段为每个limit定义一个警报死区。

7 mointor参数

这些参数用于确定何时为这个值字段发送monitors。在这个值字段超过受监控字段合适的死区时,ADEL用于存档程序监视器,MDEL字段用于其它所有类型的监视器。如果这些字段是一个0值,每次这个值变化时,触发监视器;如果它们有一个-1值时,每次扫描这个记录时,触发监视器。

8 运行时参数

不能使用配置工具配置这些字段,在运行时也不能被修改。它们是用于运行这个记录。

LALM字段用于为警报限制实现回滞因子。

LA-LL字段用于决定何时触发对应相应字段的监视器。例如,如果LA不等于对应A的值,触发对应A的监视器。MLST字段以与VAL字段相同方式被使用。

9 记录支持程序

  1. init_record:对于每个常数输入链接,如果这个输入链接是CONSTANT,对应的值字段被这个常数值初始化成这个常数,或者如果输入链接是PV_LINK,创建一个通道访问链接。调用一个routine postfix转换在CALC中的infix表达式为reverse polish notation。结果存储在RPCL中。
  2. special:见下一部分
  3. get_value:填入struct valueDes的值,使它们指向VAL。
  4. get_precision:获取PREC。
  5. get_graphic_double:为一个字段设置上下显示限制。如果这个字段是VAL,HIHI,HIGH,LOW或LOLO,限制被设置成HOPR和LOPR,或如果这个字段有定义的上下限制,将使用它们,否则将使用对应这个字段类型的上下限制。
  6. get_control_double:为一个字段设置上下控制限制。如果这个字段是VAL,HIHI,HIGH,LOW或LOLO,限制被设置成HOPR和LOPR,或如果这个字段有定义的上下限制,将使用它们,否则将使用对应这个字段类型的上下限制。
  7. get_alarm_double:设置以下值:

               

10 记录运行

routine process实现以下算法:

  1. 获取所有参量
  2. 调用routine calcPerform,其从在CALC中指定表达式的postfix版本计算VAL。如果calcPerform返回成功,UDF设置成FALSE。
  3. 检查警报。这个routine检查新的VAL是否引起警报状态和严重性变化。如果这样,设置NSEV,NSTA和LALM。它也遵守警报回滞因子(HYST)。在警报状态和严重性变化前,这个值必须至少变化HYST。
  4. 检查是否应该调用monitors:
    1. 如果警报状态或严重性变化了,调用警报monitors
    2. 如果ADEL和MDEL条件满足了,调用archive和value变化Monitors。
    3. 当调用其它monitors,检查对应A-L的Monitors。
    4. 重置NSEV和NSTA为0.
  5. 如果需要,扫描forward链接,设置PACT为FALSE并且返回。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值