最近看EPICS的开发手册,因为手册中是分模块介绍的,所以看了一段时间还是写不出程序来,昨天去让师兄给我以具体的设备支持的例子讲述了下(因为我们室主要用到的还是设备支持),下面是构建设备支持程序的步骤,类似于一个Hello World程序,给同样在入门道路上的朋友一个参考。
1. 像ai、bi等这些类型的记录支持,EPICS已经提供,一般情况下不需要我们自己code,我们经常需要写的是设备支持即device support,下面是一个device support 简单程序的code和编译过程,包括support、ioc和boot。
2. 步骤
说明:我的EPICS_BASE路径为/root/myepics/base/
(1) 设备支持模块
1) 通过makeBaseApp.pl脚本添加support模块,命令如下:
/root/myepics/base/bin/linux-x86/makeBaseApp.pl -t support firstSupport
2) 在firstSupportApp/src下面添加设备支持的C源程序文件devFirstSupport.c(文件内容见下面),这里面定义了设备支持程序入口表,会根据记 录 类型DTYP字段值来查找相应的设备支持程序;
3) 修改firstSupportApp/src/firstSupport.dbd,添加device(bi,VME_IO,devFirstSupportBi, "firstSupport")
修改firstSupportApp/src/Makefile,适当位置添加firstSupport_SRCS +=devFirstSupport.c
4)firstSupportApp/目录下运行make命令
*5)可以添加自己的.c、.h文件,需要在本目录下的Makefile中添加firstSupport_SRCS +=×××.c来对其进行编译。
(2) IOC模块
1) 通过makeBaseApp.pl添加ioc模块
返回到top,然后运行命令:
/root/myepics/base/bin/linux-x86/makeBaseApp.pl -t ioc firstIoc
2)/root/work/epics/myFirst/firstIocApp/src下面修改Makefile,在适当位置添加dbd和lib,格式如下:***
firstIoc_DBD+= firstSupport.dbd
firstIoc_LIBS+= firstSupport
3) /root/work/epics/myFirst/firstIocApp/Db下面添加记录实例db文件如firstIoc.db(文件内容见下面)
修改此目录下面的Makefile,适当位置添加db:DB += firstIoc.db
(3)boot模块
1) 通过makeBaseApp.pl添加boot模块
返回到top,然后运行命令:
/root/myepics/base/bin/linux-x86/makeBaseApp.pl -i -t ioc firstIocBoot
(这里会提示要你输入要启动的ioc名字,这里firstIoc)
2) 到/root/work/epics/myFirst/iocBoot/iocfirstBoot下修改st.cmd
在适当位置添加加载记录实例,dbLoadRecords("db/firstIoc.db"),然后将st.cmd添加执行权限。
(4)回到top目录(/root/work/epics/myFirst),make命令编译,
(5)到/root/work/epics/myFirst/iocBoot/iocfirstBoot运行st.cmd,会循环输出1,2,3….
上面的步骤中没指名每步是具体是什么意识,后面我在补充,当然最好是自己去查看官方的开发手册。
devFirstSupport.c
#include <string.h>
#include <alarm.h>
#include <cvtTable.h>
#include <dbDefs.h>
#include <devLib.h>
#include <dbAccess.h>
#include <recSup.h>
#include <devSup.h>
#include <link.h>
#include <dbScan.h>
#include <aiRecord.h>
#include <aoRecord.h>
#include <biRecord.h>
#include <boRecord.h>
#include <mbbiRecord.h>
#include <epicsExport.h>
#include <recGbl.h>
int i;
static long init_bi(struct biRecord *pbi);
static long read_bi(struct biRecord *pbi);
struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_bi_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_bi;
} devFirstSupportBi = {
5,
NULL,
NULL,
init_bi,
NULL,
read_bi
};
epicsExportAddress(dset,devFirstSupportBi);
long init_bi(struct biRecord *pbi){
int status = 0;
pbi->udf = TRUE;
return status;
}
long read_bi(struct biRecord *pbi){
if(pbi->inp.type!=VME_IO){
recGblRecordError(S_db_badField,(void*)pbi,
"bi (init_record) Illegal INP field");
return S_db_badField;
}
struct vmeio *pvmeio = (struct vmeio *) &(pbi->inp.value);
char *parm = pvmeio->parm;
if(!strcmp(parm, "first")){
pbi->val = i++ % 2;
printf("%d\n", i);
}
return 2;
}
firstIoc.db
record(bi, "firstRecord")
{
field(DTYP, "firstSupport")
field(INP, "#C0 S0 @first")
field(SCAN, "1 second")
field(ZNAM, "off")
field(ONAM, "on")
}