EPICS aSub记录示例2
这个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