这个IOC数据库由6个记录组成,一个bo记录,3个calc记录,1个aSub记录和1个waveform记录。
bo记录"$(P)$(R)Enable用于控制3个calc是否使能。
calc记录$(P)$(R)CurrentV01,$(P)$(R)CurrentV02,$(P)$(R)CurrentV03记录每次运行时进行自加,$(P)$(R)CurrentV01通过forward链接触发$(P)$(R)CurrentV02运行,而$(P)$(R)CurrentV02通过forward链接,触发$(P)$(R)CurrentV03运行,$(P)$(R)CurrentV03通过forward链接触发$(P)$(R)ASUB1运行。
aSub记录运行时从$(P)$(R)CurrentV01,$(P)$(R)CurrentV02,$(P)$(R)CurrentV03获取当前值,并且通过属性PP的输出链接将这三个值写到一个waveform记录中。
waveform记录以数组形式保存$(P)$(R)CurrentV01,$(P)$(R)CurrentV02,$(P)$(R)CurrentV03的三个值。
数据库设计如下:
以下是文本形式testASub.db:
record(calc, "$(P)$(R)CurrentV01") {
field(SCAN, "1 second")
field(SDIS, "$(P)$(R)Enable")
field(FLNK, "$(P)$(R)CurrentV02")
field(CALC, "A+1")
field(INPA, "$(P)$(R)CurrentV01")
}
record(calc, "$(P)$(R)CurrentV02") {
field(SCAN, "Passive")
field(SDIS, "$(P)$(R)Enable")
field(FLNK, "$(P)$(R)CurrentV03")
field(CALC, "A+0.1")
field(INPA, "$(P)$(R)CurrentV02")
}
record(calc, "$(P)$(R)CurrentV03") {
field(SCAN, "Passive")
field(SDIS, "$(P)$(R)Enable")
field(FLNK, "$(P)$(R)ASUB1")
field(CALC, "A+10")
field(INPA, "$(P)$(R)CurrentV03")
}
record(bo, "$(P)$(R)Enable") {
field(DOL, "Disable")
field(ZNAM, "Enable")
field(ONAM, "Disable")
}
record(aSub, "$(P)$(R)ASUB1") {
field(INPA, "$(P)$(R)CurrentV01")
field(INPB, "$(P)$(R)CurrentV02")
field(INPC, "$(P)$(R)CurrentV03")
field(OUTA, "$(P)$(R)RESULT PP")
field(SCAN, "Passive")
field(LFLG, "IGNORE")
field(SNAM, "convert_t")
field(PREC, "3")
field(FTA, "DOUBLE")
field(FTB, "DOUBLE")
field(FTC, "DOUBLE")
field(FTVA, "DOUBLE")
field(NOVA, "3")
}
record(waveform, "$(P)$(R)RESULT") {
field(SCAN, "Passive")
field(DTYP, "Soft Channel")
field(PREC, "3")
field(NELM, "3")
field(FTVL, "DOUBLE")
}
以下是为aSub记录实现输入和输出转换的C源程序:
#include <stdio.h>
#include <dbDefs.h>
#include <registryFunction.h>
#include <aSubRecord.h>
#include <epicsExport.h>
static long convert_t(aSubRecord *prec) {
long i;
double * b;
double *a[3] = {(double *)prec->a, (double*)prec->b, (double *)prec->c};
b = (double *)prec->vala;
for (i = 0; i < prec->nova; i++){
b[i] = a[i][0];
}
return 0; /* process output links */
}
epicsRegisterFunction(convert_t);
编译整个IOC,并且启动IOC:
root@xps:/usr/local/EPICS/program/myioc/iocBoot/myioc# ../../bin/linux-x86_64/myioc st.cmd
#!../../bin/linux-x86_64/myioc
< envPaths
epicsEnvSet("IOC","myioc")
...
############################################################################
## EPICS R7.0.7
## Rev. 2025-04-26T19:36+0800
## Rev. Date build date/time:
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncxxx,"user=xps"
epics> dbl
TEST:CH:ASUB1
TEST:CH:Enable
TEST:CH:CurrentV01
TEST:CH:CurrentV02
TEST:CH:CurrentV03
TEST:CH:RESULT
用通道访问进行测试:
当TEST:CH:Enable为Disable时:
(base) xps@xps:/usr/local/EPICS/program/myioc/myiocApp/src$ camonitor TEST:CH:RESULT
TEST:CH:RESULT 2025-08-02 21:34:38.452150 3 310 31 3100
将TEST:CH:Eanble设为Enable时:
(base) xps@xps:/usr/local/EPICS/program/myioc/myiocApp/src$ caput TEST:CH:Enable Enable; camonitor TEST:CH:RESULT
Old : TEST:CH:Enable Disable
New : TEST:CH:Enable Enable
TEST:CH:RESULT 2025-08-02 21:34:38.452150 3 310 31 3100
TEST:CH:RESULT 2025-08-02 21:56:58.452148 3 311 31.1 3110
TEST:CH:RESULT 2025-08-02 21:56:59.452159 3 312 31.2 3120
TEST:CH:RESULT 2025-08-02 21:57:00.452136 3 313 31.3 3130
TEST:CH:RESULT 2025-08-02 21:57:01.452158 3 314 31.4 3140
TEST:CH:RESULT 2025-08-02 21:57:02.452135 3 315 31.5 3150
TEST:CH:RESULT 2025-08-02 21:57:03.452149 3 316 31.6 3160
^C