EPICS의 간단한 장치 지원 프로그램

최근에 EPICS의 개발 매뉴얼을 봤는데 매뉴얼에 모듈별로 소개되어 있어서 한동안 봤는데 프로그램이 안 나왔어요. 어제 사형에게 구체적인 설비 지원의 예를 들어 설명해 달라고 했어요. (우리 실에서 주로 사용하는 것은 설비 지원이기 때문에) 다음은 설비 지원 프로그램을 구축하는 절차예요. Hello World 프로그램과 비슷해서 입문 길에 있는 친구에게 참고를 해 드릴게요.
1.ai,bi 등 이런 종류의 기록 지원은 EPICS가 이미 제공하기 때문에 일반적인 상황에서 우리만의 코드가 필요하지 않다. 우리가 자주 쓰는 것은 장치 지원, 즉 device support이다. 다음은 device support 간단한 프로그램의 코드와 컴파일 과정이다. support, ioc와 boot을 포함한다.
2.단계
설명: 내 EPICSBASE 경로는/root/myepics/base/
(1) 장치 지원 모듈
1)makeBaseApp.pl 스크립트에서 support 모듈을 추가합니다. 명령은 다음과 같습니다.
                       /root/myepics/base/bin/linux-x86/makeBaseApp.pl  -t support firstSupport
2)firstSupport App/src 아래에 장치가 지원하는 C 소스 파일 devFirstSupport를 추가합니다.c(파일 내용은 아래 참조), 이 안에 장치 지원 프로그램 입구표를 정의하고 기록 유형 DTYP 필드 값에 따라 해당하는 장치 지원 프로그램을 찾을 것이다.
3)firstSupport App/src/firstSupport 수정dbd, device 추가(bi, VME IO, devFirstSupportBi, "firstSupport")
firstSupport App/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 아래에 firstIoc와 같은 기록 실례db 파일을 추가합니다.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
", 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")
}

좋은 웹페이지 즐겨찾기