EPICS简单示例3--lsi记录示例设备支持

Long String Input Record(lsi)

长字符串输入记录用于获取最大长度65536个字符的任意ASCII字符串。

参数字段

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

扫描参数

长字符串输入记录有用于指定在上面情况下运行该记录的标准字段。这些字段在Scan Fields中列出。

输入说明

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

监视参数

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

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

操作显示参数

有关记录名称(NAME)和描述(DESC)字段更多见Fields Common to All Records。

警报参数

长字符串输入记录有所有记录类型共有的警报字段。Alarms Fields列出与所有记录类型共有的警报相关的字段。

运行时参数

长字符串输入记录(lsi)的旧值字段(OVAL)用于实现对VAL的值变化monitors。如果VAL不为OVAL,则将触发这些monitors。LEN包含了在VAL中字符串的长度,OLEN包含在OVAL中字符串的长度。

仿真模式参数

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

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

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

设备支持接口

记录需要设备支持提供一个定义了以下成员的入口表(dset):

 typedef struct {
     long number;
     long (*report)(int level);
     long (*init)(int after);
     long (*init_record)(lsiRecord *prec);
     long (*get_ioint_info)(int cmd, lsiRecord *prec, IOSCANPVT *piosl);
     long (*read_string)(lsiRecord *prec);
 } lsidset;

这个模块必须设置number至少为5,并且提供一个指向其read_string()的指针;如果其它函数的相关联功能对于这个支持层不需要,它们的指针可能是NULL。大部分支持也提供了一个init_record()程序来配置这个记录实例并且连接它到硬件或者驱动支持层。

对应软记录的设备支持

提供了对应DTYP Soft Channel的设备支持模块用于从其它记录或者其它软件组件获取值。

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

lsi记录实例:

[blctrl@telecom exer]$ mkdir exer3
[blctrl@telecom exer]$ cd exer3
[blctrl@telecom exer3]$ /usr/local/EPICS/base/bin/linux-x86_64/makeBaseApp.pl -t ioc testlsi
[blctrl@telecom exer3]$ /usr/local/EPICS/base/bin/linux-x86_64/makeBaseApp.pl -i -t ioc testlsi
Using target architecture linux-x86_64 (only one available)
The following applications are available:
    testlsi
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name?
[blctrl@telecom exer3]$ ls
configure  iocBoot  Makefile  testlsiApp

进入到testlsiApp/src/路径下,添加两个文件devlsiRecord.c和devlsiRecord.dbd:

devlsiRecord.c是为lsi记录编写的设备驱动程序

/*  
    devlsiRecord.c用于lsi(长字符串输入)记录的示例设备支持
    其提供了一个字符串作为这个记录的值。
*/
#include <stddef.h>
#include <stdio.h>
#include <string.h>

#include "devSup.h"
#include "lsiRecord.h"

/* 必须最后include这个头文件 */
#include "epicsExport.h"

const char version[] = "My First Version for device support for lsiRecord";

static long read_string(lsiRecord * prec)
{
        size_t N = sizeof(version);
        char * buf = prec->val;

        if (N > prec->sizv)
                N = prec->sizv;
        prec->len = N;

        memcpy(buf, version, N);
        buf[N-1] = '\0';
        printf("prec->val: %s\n",prec->val);

        return 0;
}

static lsidset devlsiRecord = {
        5, NULL, NULL, NULL, NULL, read_string
};
// 导出设备支持程序
epicsExportAddress(dset, devlsiRecord);

devlsiRecord.dbd:

device(lsi, INST_IO, devlsiRecord, "devlsiRecord")

然后编辑相同路径下的Makefile文件,添加以下两行:

TOP=../..

include $(TOP)/configure/CONFIG
#----------------------------------------
#  ADD MACRO DEFINITIONS AFTER THIS LINE
#=============================

#=============================
# Build the IOC application

PROD_IOC = testlsi
# testlsi.dbd will be created and installed
DBD += testlsi.dbd

# testlsi.dbd will be made up from these files:
testlsi_DBD += base.dbd

# Include dbd files from all support applications:
#testlsi_DBD += xxx.dbd
testlsi_DBD += devlsiRecord.dbd  # 添加行1

testlsi_SRCS += devlsiRecord.c   # 添加行2
# Add all the support libraries needed by this IOC
#testlsi_LIBS += xxx

# testlsi_registerRecordDeviceDriver.cpp derives from testlsi.dbd
testlsi_SRCS += testlsi_registerRecordDeviceDriver.cpp

# Build the main IOC entry point on workstation OSs.
testlsi_SRCS_DEFAULT += testlsiMain.cpp
testlsi_SRCS_vxWorks += -nil-

# Add support from base/src/vxWorks if needed
#testlsi_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary

# Finally link to the EPICS Base libraries
testlsi_LIBS += $(EPICS_BASE_IOC_LIBS)

#===========================

include $(TOP)/configure/RULES
#----------------------------------------
#  ADD RULES AFTER THIS LINE

然后进入到testlsiApp/Db下,编译如下一个文件dblsiRecord.db:

record(lsi, "$(user):mylsiRecord") {
    field(DTYP, "devlsiRecord")
    field(DESC, "lsiRecord devsup test")
    field(SIZV, "200")
    field(PINI, "YES")
}

record(lsi, "$(user):lsiRecord")
{
        field(DTYP,"getenv")
        field(SCAN, "Passive")
        field(DESC, "lsiRecord getenv DTYP")
        field(SIZV, "$(SIZV=200)")
        field(PINI, "YES")
        field(INP, "@EPICS_BASE")
}

在相同路径下的Makefile中,编辑Makefile文件:

[blctrl@telecom Db]$ cat Makefile
TOP=../..
include $(TOP)/configure/CONFIG
#----------------------------------------
#  ADD MACRO DEFINITIONS AFTER THIS LINE

#----------------------------------------------------
# Create and install (or just install) into <top>/db
# databases, templates, substitutions like this
#DB += xxx.db
DB += dblsiRecord.db   # 添加这一行

#----------------------------------------------------
# If <anyname>.db template is not named <anyname>*.template add
# <anyname>_template = <templatename>

include $(TOP)/configure/RULES
#----------------------------------------
#  ADD RULES AFTER THIS LINE

然后进入到这个应用程序的顶层目录中,执行make程序,进行编译。

[blctrl@telecom exer3]$ make

接着进入到启动目录中:

[blctrl@telecom exer3]$ cd iocBoot/ioctestlsi/

编辑启动脚本st.cmd:

#!../../bin/linux-x86_64/testlsi

#- You may have to change testlsi to something else
#- everywhere it appears in this file

< envPaths

cd "${TOP}"

## Register all support components
dbLoadDatabase "dbd/testlsi.dbd"
testlsi_registerRecordDeviceDriver pdbbase

## Load record instances
dbLoadRecords("db/dblsiRecord.db","user=blctrl")   # 修改处

cd "${TOP}/iocBoot/${IOC}"
iocInit

启动这个应用程序并检查这个IOC中存在的过程变量:

[blctrl@telecom ioctestlsi]$ ../../bin/linux-x86_64/testlsi st.cmd
#!../../bin/linux-x86_64/testlsi
< envPaths
epicsEnvSet("IOC","ioctestlsi")
epicsEnvSet("TOP","/home/blctrl/exer/exer3")
epicsEnvSet("EPICS_BASE","/usr/local/EPICS/base")
cd "/home/blctrl/exer/exer3"
## Register all support components
dbLoadDatabase "dbd/testlsi.dbd"
testlsi_registerRecordDeviceDriver pdbbase
## Load record instances
dbLoadRecords("db/dblsiRecord.db","user=blctrl")
cd "/home/blctrl/exer/exer3/iocBoot/ioctestlsi"
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.3.1
## EPICS Base built Aug 28 2022
############################################################################
prec->val: My First Version for device support for lsiRecord
iocRun: All initialization complete
## Start any sequence programs
#seq sncxxx,"user=blctrl"
epics> dbl
blctrl:mylsiRecord
blctrl:lsiRecord
epics>

另开一个命令终端,用caget测试以上的过程变量:

[root@telecom ~]# caget blctrl:mylsiRecord
blctrl:mylsiRecord             My First Version for device support for
[root@telecom ~]# caget blctrl:lsiRecord
blctrl:lsiRecord               /usr/local/EPICS/base

猜你喜欢

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