mbbiDirect记录

mbbiDirect记录接收一个32位硬件值并且转换它位一个32个无符号字符的数组,每个字符代表这个字的一位。这些字段(B0-B9, BA-BF, B10-B19, B1A-B1F)根据相应位被置位被设成1,否则被设成0。这个记录操作类似多位二进制输入记录(mbbi)的操作,并且它有很多字段与mbbi记录相同。这个记录也有两个可用的软设备支持模块:Soft Channel和Raw Soft Channel。

参数字段

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

扫描参数

mbbiDirect记录有用于指定在什么情况下将运行这个记录的标准字段。这些字段在Scan Fields中被列出。

读取和转换参数

设备支持例程从在INP字段中指定的设备或链接获取这个记录的输入。对于从设备获取它们输入的记录,INP字段必须包含I/O板卡的地址,并且DTYP字段必须指定合适的设备支持模块。小心:根据使用的I/O总线,地址格式不同。

在DTYP字段中能够指定两个软设备支持Soft Channel和Raw Soft Channel。

Raw Soft Channel把值读取到RVAL,对其执行正常的转换过程。Soft Channel读取任意无符号整数直接到VAL。对于一个软mbbiDirect记录,INP字段可以是一个常数,一个数据库或一个通道访问链接。如果INP是一个常数,则VAL被初始化到INP值,但在运行时通过dbPutField或dbPutLink可以被修改。

对于不使用Soft Channel设备支持的记录,RVAL用于按照以下确定VAL:

1) RVAL被分配一个临时变量rval=RVAL

2)  rval右移SHFT比特位

3) VAL被设置成rval

这些字段B0-BF和B10-B1F中每个字段代表这个字段的一位。

 

 操作显示参数

这些参数用于向操作者显示有意义的数据。

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

运行时参数

 运行时代码使用这些参数用于运行mbbi direct记录。在运行前,它们是不可配置的。

由设备支持例程使用MASK读取硬件寄存器。记录支持置位MASK中低位NOBT个比特。设备支持可以移位这个值。

MLST保存在触发值变化的上次monitor时的值。

 

仿真模式参数

如果SIMM(通过SIML获取)是YES或RAW,这个记录被置入SIMS严重性并且这个值是通过SIOL被获取(缓存在SVAL)。如果SIMM是YES,SVAL被不经转换地写入VAL,如果SIM是RAW,SVAL被传给了RVAL并且被转换。SSCN设置一个在仿真模式中不同的SCAN机制。SDLY设置一个延时(秒为单位),其用于异步模拟运行。

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

 

警报参数

用于mbbi direct记录的可能的警报条件是SCAN和READ警报。由于它们总是MAJOR严重性,这些警报是用户不可配置的。对于mbbi direct记录不存state警报。

Alarm Fields列出了所有记录类型共有的警报相关字段。

记录支持

记录支持例程

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

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

清理MASK并且接着设置NOBT个低位bits。

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

refresh_bits接着被调用,根据一个硬件值去初始化所有bit字段。

process:见下面部分。

记录运行

例程process实现了以下算法:

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

2) 调用readValue。

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

4) 转换:

  • status=read_mbbiDirect
  • PACT=TRUE
  • recGblGetTimeStamp()被调用。
  • 如果status是0,则确定VAL:a) 设置rval=RVAL b) 右移rval SHFT位 c) 设置VAL=RVAL
  • 如果status是1,返回0
  • 如果status是2,设置status=0

5) 检查是否应该调用monitors

  • 如果警报状态或严重性已经变化,警报monitors被调用。
  • 如果MLST不等于VAL,调用archive和值变化monitors。
  • 当调用其它monitors时,检查RVAL的monitors。
  • NSEV和NSTA被置位0

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

设备支持

设备支持感兴趣字段

每种输入记录必须有一个相关联设备支持例程的集合。

设备支持例程的主要作用时在调用read_mbbiDirect时获取一个新的raw输入值。设备支持例程主要对以下字段有兴趣:

设备支持例程

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

1) long report(int level)

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

2) long init(int after)

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

3) init_record(precord)

这个例程是可选的。如果提供了,由记录支持init_record()例程调用它。如果它使用MASK,它应该根据需要对它移位并且也给SHFT赋值。

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

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

5) read_mbbiDirect(precord)

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

  • 0:成功。一个原始值被放入RVAL。记录支持模块从RVAL和SHFT确定VAL。。
  • 2:成功,但不修改VAL。
  • 其它:出错。

对Soft记录的设备支持

为不与实际硬件设备相关联的mbbiDirect记录提供两个soft设备支持模块soft channel和Raw Soft Channel。INP链接类型必须是CONSTANT,DB_LINK或CA_LINK。

Soft Channel

对于这个模块,read_mbbiDirect总是返回一个2值,这表示不执行转换。

如果INP链接类型是常数,则这个常数值由init_record()被存储到VAL,并且UDF被设成FALSE。通过dbPut请求可以更高VAL。如果INP链接类型是PV_LINK,则init_record()调用dbCaAddInlink。

read_mbbiDirect调用recGblGet读取VAL的当前值。

如果recGblGetLinkValue的返回状态是0,则read_mbbi设置UDF为FALSE。返回recGblGetLinkValue的状态。

Raw Soft Channel

除了值被读到了RVAL,这个模块像前面的模块,从RVAL计算VAL,并且read_mbbiDirect返回一个0值。因而这个记录processing例程将用这种常规方式确定VAL。

为了理解此记录的运行方式,我们新建一个测试程序,具体步骤如下:

1) 新建一个名为exer10的顶层目录:

[blctrl@telecom exer10]$ makeBaseApp.pl -t ioc testmbbiDirect
[blctrl@telecom exer10]$ makeBaseApp.pl -i -t ioc testmbbiDirect
Using target architecture linux-x86_64 (only one available)
The following applications are available:
    testmbbiDirect
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name?
[blctrl@telecom exer10]$ ls
configure  iocBoot  Makefile  testmbbiDirectApp

2) 进入~/exer10/testmbbiDirectApp/Db目录,新建一个名为test.db的文件,内容如下:

# 使用软通道
record(mbbiDirect, "$(TEST):mbbiDirect:Soft")
{
        field(DTYP,"Soft Channel")
        field(SCAN, "Passive")
        field(INP, "6")
        field(SHFT, "1")
        field(NOBT, "3")
}

# 使用raw软通道
record(mbbiDirect, "$(TEST):mbbiDirect:RawSoft")
{
        field(DTYP,"Raw Soft Channel")
        field(SCAN, "Passive")
        field(INP, "6")
        field(SHFT, "1")
        field(NOBT, "3")
}

编辑与新建文件相同路径下Makefile文件,添加如下一行:

DB += test.db

3) 退出到这个应用程序的顶层目录,exer10,执行make编译这个程序。

4) 进入ioc启动目录:

[blctrl@telecom exer10]$ cd iocBoot/ioctestmbbiDirect/
[blctrl@telecom ioctestmbbiDirect]$ ls
envPaths  Makefile  st.cmd

并且编辑st.cmd启动文件, 在装载数据库实例的部分中添加以下一行 

dbLoadRecords("db/test.db","TEST=blctrl")

5) 启动这个应用程序::

[blctrl@telecom ioctestmbbiDirect]$ ../../bin/linux-x86_64/testmbbiDirect st.cmd

6) 查看启动这个应用程序中装载的记录实例:

epics> dbl
blctrl:mbbiDirect:Soft
blctrl:mbbiDirect:RawSoft

7) 换一个shell命令行提示窗口,进行测试:

# 以下测试软通道mbbiDirecct记录实例
[blctrl@telecom ioctestmbbiDirect]$ caput blctrl:mbbiDirect:Soft.INP 6
Old : blctrl:mbbiDirect:Soft.INP     6
New : blctrl:mbbiDirect:Soft.INP     6
[blctrl@telecom ioctestmbbiDirect]$ caget blctrl:mbbiDirect:Soft.VAL
blctrl:mbbiDirect:Soft.VAL     6
[blctrl@telecom ioctestmbbiDirect]$ caget blctrl:mbbiDirect:Soft.B0
blctrl:mbbiDirect:Soft.B0      0
[blctrl@telecom ioctestmbbiDirect]$ caget blctrl:mbbiDirect:Soft.B1
blctrl:mbbiDirect:Soft.B1      1
[blctrl@telecom ioctestmbbiDirect]$ caget blctrl:mbbiDirect:Soft.B2
blctrl:mbbiDirect:Soft.B2      1

# 以下测试raw软通道mbbiDirecct记录实例
[blctrl@telecom ioctestmbbiDirect]$ caput blctrl:mbbiDirect:RawSoft.INP 6
Old : blctrl:mbbiDirect:RawSoft.INP  6
New : blctrl:mbbiDirect:RawSoft.INP  6
[blctrl@telecom ioctestmbbiDirect]$ caget blctrl:mbbiDirect:RawSoft.RVAL
blctrl:mbbiDirect:RawSoft.RVAL 6
[blctrl@telecom ioctestmbbiDirect]$ caget blctrl:mbbiDirect:RawSoft.VAL
blctrl:mbbiDirect:RawSoft.VAL  3
[blctrl@telecom ioctestmbbiDirect]$ caget blctrl:mbbiDirect:RawSoft.B0
blctrl:mbbiDirect:RawSoft.B0   1
[blctrl@telecom ioctestmbbiDirect]$ caget blctrl:mbbiDirect:RawSoft.B1
blctrl:mbbiDirect:RawSoft.B1   1
[blctrl@telecom ioctestmbbiDirect]$ caget blctrl:mbbiDirect:RawSoft.B2
blctrl:mbbiDirect:RawSoft.B2   0

通过以上测试,我们发现使用软通道的mbbiDirect记录实例从INP读取一个输入值,并且直接把这个值放入VAL中,并且对VAL进行二进制解码,解码结果从低位到高位对应B00-B1F;使用raw软通道的mbbiDirect记录实现从INP读取一个输入值,并且把这个值放入RVAL,然后对RVAL右移SHFT位后放入VAL,然后对其二进制解码,解码结果从低位到高位对应B00-B1F。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值