EPICS简单的设备支持程序

最近看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")
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值