EPICS의 간단한 장치 지원 프로그램
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")
}