当前位置: 首页 > news >正文

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
http://www.dtcms.com/a/312231.html

相关文章:

  • [学习笔记-AI基础篇]02_深度基础
  • Kotlin协程极简教程:5分钟学完关键知识点
  • 工业场景工服识别准确率↑32%:陌讯多模态融合算法实战解析
  • OpenVLA复现
  • 23th Day| 39.组合总和,40.组合总和II,131.分割回文串
  • Linux—进程状态
  • 深入 Go 底层原理(九):context 包的设计哲学与实现
  • 智能手表:电源检查
  • Java多线程详解(2)
  • 一、灵巧手捉取几何原理——空间五指平衡捉取
  • GraphRag安装过程中的报错:系统找不到指定的文件(Could not install packages due to an OSError)
  • AI赋能测试:技术变革与应用展望
  • C++const成员
  • [网安工具] Web 漏洞扫描工具 —— AWVS · 使用手册
  • 机器学习【五】decision_making tree
  • Linux重定向和缓冲区
  • Piriority_queue
  • 三、摩擦刚体——捉取质量函数
  • ARP协议是什么?ARP欺骗是如何实现的?我们该如何预防ARP欺骗?
  • 前端与后端部署大冒险:Java、Go、C++三剑客
  • Codeforces Round 1039 (Div. 2) A-C
  • nodejs读写文件
  • 数据类型Symbol
  • 裸露土堆识别准确率↑32%:陌讯多特征融合算法实战解析
  • 数据结构基础
  • Minimizing Coins(Dynamic Programming)
  • 【智能体cooragent】创建 workflow 时 候选 Agent 和 Tool 获取来源详细分析
  • Python从入门到精通——第五章 列表与元组
  • 机器人学中路径规划(Path Planning)和轨迹生成(Trajectory Generation)关系
  • 海康皓视通 对接测试和比较