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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值