EPICS数据库示例

本文目标是使用EPICS数据库示例帮助新手理解如何使用不同的示例。

1、使用seq和mbbo的简单选择器

这个简单示例展示了如何使用一个mbbo和一个seq来旋转哪个值将被设置到一个PV。

# 这个mbbo记录将选择将运行seq的哪段
record(mbbo, "CHOOSE") {field(VAL,  "0")field(FLNK, "SEQ")
}record(seq, "SEQ") {field(SELM, "Specified")# 此处我们指定mbbo记录作为选择器field(SELL, "CHOOSE")# 取决于这个选择,将选择一个不同的PV写入到RESULT PVfield(DOL0, "VAL0")field(DOL1, "VAL1")field(DOL2, "VAL2")field(LNK0, "RESULT")field(LNK1, "RESULT")field(LNK2, "RESULT")# 在设置了RESULT PV的值后,应该运行这个PVfield(FLNK, "RESULT")
}record(ai, "VAL0") {field(PREC, 2)field(VAL, "1.1")
}record(ai, "VAL1") {field(PREC, 2)field(VAL, "2.2")
}record(ai, "VAL2") {field(PREC, 2)field(VAL, "3.3")
}record(ai, "RESULT") {field(PREC, 2)
}

 用softIOC加载以上记录数据库,并且用dbl查看加载的记录实例:

orangepi@orangepi5plus:/usr/local/EPICS/program/softDB$ softIoc -d test.db
Starting iocInit
############################################################################
## EPICS R7.0.8
## Rev. 2024-04-17T15:36+0800
## Rev. Date build date/time:
############################################################################
iocRun: All initialization complete
epics> dbl
VAL0
VAL1
VAL2
RESULT
CHOOSE
SEQ

在局域网中另一个终端中,进行测试,分别向选择器CHOOSE中写入0,1,2,并且查看记录RESULT的结果:

(base) [blctrl@localhost ~]$ caput CHOOSE 0; caget RESULT
Old : CHOOSE                         0
New : CHOOSE                         0
RESULT                         1.1
(base) [blctrl@localhost ~]$ caput CHOOSE 1; caget RESULT
Old : CHOOSE                         0
New : CHOOSE                         1
RESULT                         2.2
(base) [blctrl@localhost ~]$ caput CHOOSE 2; caget RESULT
Old : CHOOSE                         1
New : CHOOSE                         2
RESULT                         3.3

2、使用'*'重写一个记录字段

本实例展示了如何使用记录类型"*"设置/重写一个已经定义好的记录的一个字段。当你正在处理来自一个模块的记录并且想要更改已经定义好的任何字段或者设置某些原先没有定义好的字段时,这会有用。

test02-1.db:

# 这是一个初始记录定义的示例。
record(ao, "MYRECORD"){field(DESC, "My record")
}

test02-2.db:

# 此定义将设置未在原先文件中定义的字段DRVL和DRVH。
record("*", "MYRECORD"){field(DRVL, "0")field(DRVH, "10")
}

以下测试测试过程:

1)构建IOC结构:

makeBaseApp.pl -t ioc dbtest
makeBaseApp.pl -i -t ioc dbtest

2)将test02-1.db和test02-2.db添加到dbtest/dbtestApp/Db路径下,并将其添加到Makefile文件中。

3) 返回到IOC定成目录dbtest执行make进行编译。

4)进入IOC启动路径,编辑st.cmd文件,添加以下两行:

...
dbLoadRecords("db/test02-1.db")
dbLoadRecords("db/test02-2.db")
...

5) 启动这个IOC并且查看加载的记录

../../bin/linux-aarch64/dbtest st.cmd
#!../../bin/linux-aarch64/dbtest
...
epics> dbl
MYRECORD

6) 用通道访问进行测试:

(base) [blctrl@localhost ~]$ caget MYRECORD.DESC MYRECORD.DRVL MYRECORD.DRVH
MYRECORD.DESC                  My record
MYRECORD.DRVL                  0
MYRECORD.DRVH                  10

3 使用calc的简单计数器

这个简单示例展示了如是用一个calc产生一个以1Hz更新的计数器。

record(calc, "COUNTER"){field(VAL,  "0")field(CALC, "VAL+1")field(SCAN, "1 second")
}

用softIOC加载以上记录:

 softIoc -d test03.db
Starting iocInit
############################################################################
## EPICS R7.0.8
## Rev. 2024-04-17T15:36+0800
## Rev. Date build date/time:
############################################################################
iocRun: All initialization complete
depics> dbl
COUNTER

用通道访问进行测试:

(base) [blctrl@localhost ~]$ camonitor COUNTER
COUNTER                        2024-07-08 11:57:56.087315 8
COUNTER                        2024-07-08 11:57:57.087179 9
COUNTER                        2024-07-08 11:57:58.087148 10
COUNTER                        2024-07-08 11:57:59.087178 11
COUNTER                        2024-07-08 11:58:00.087110 12
^C

4、进行任务交替输出的记录的两个计数器

这个示例运行两个配置为1Hz的两个计数器。在每个计数器间隔末尾,运行一个输出记录。这可以用于基于一个周期循环切换事物启动和停止。

数据库设计如下:

任务1时长5秒,任务2时长3秒,两个任务交替进行: 

record(ao, DUTY_CYC_TIM1) {field(DESC, "duty cycle time 1")field(SCAN, "Passive")field(VAL, "3")field(EGU, "s")
}record(ao, DUTY_CYC_TIM2) {field(DESC, "duty cycle time 2")field(SCAN, "Passive")field(VAL, "2")field(EGU, "s")
}record(calcout, DUTY_CYC1) {field(DESC, "duty cycled counter 1")field(SCAN, "1 second")field(CALC, "VAL-1")field(OUT, "DUTY_RESET2 PP")field(OOPT, "Transition To Zero")field(DOPT, "Use CALC")
}record(calcout, DUTY_CYC2) {field(DESC, "duty cycled counter 2")field(SCAN, "1 second")field(CALC, "VAL-1")field(OUT, "DUTY_RESET1 PP")field(OOPT, "Transition To Zero")field(DOPT, "Use CALC")
}record(calcout, DUTY_RESET1) {field(SCAN, "Passive")field(PINI, "YES")field(FLNK, "DUTY_ACT1")field(CALC, "A")field(INPA, "DUTY_CYC_TIM1")field(OUT, "DUTY_CYC1")field(DOPT, "Use CALC")
}record(calcout, DUTY_RESET2) {field(SCAN, "Passive")field(FLNK, "DUTY_ACT2")field(CALC, "A")field(INPA, "DUTY_CYC_TIM2")field(OUT, "DUTY_CYC2")field(DOPT, "Use CALC")
}record(calcout, DUTY_ACT1) {field(DESC, "duty cycle action 1")field(CALC, "VAL+1")
}record(calcout, DUTY_ACT2) {field(DESC, "duty cycle action 2")field(CALC, "VAL+1")
}

测试:

(base) [blctrl@localhost ~]$ camonitor  DUTY_ACT1  DUTY_ACT2
DUTY_ACT1                      2024-07-08 13:57:51.712822 1
DUTY_ACT2                      <undefined> 0 UDF INVALID
DUTY_ACT2                      2024-07-08 13:57:56.212409 1
DUTY_ACT1                      2024-07-08 13:57:58.212538 2
DUTY_ACT2                      2024-07-08 13:58:03.212562 2
DUTY_ACT1                      2024-07-08 13:58:05.212573 3
DUTY_ACT2                      2024-07-08 13:58:10.212532 3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1475166.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

c#字符串常用方法

目录 1.字符串的处理常用方法 1.1 Format 1.2 IsNullOrEmpty和IsNullOrWhiteSpace 1.3 Equals 1.4 Contains 1.5 Length 1.6 Substring 1.7 IndexOf和LastIndexOf 1.8 ​​​​​​​StartsWith 和 EndsWith 1.9 ​​​​​​​Remove 1.10 ​​​​​​​Revserse…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

如何手工DIV一个小车:基于树莓派和总线舵机的智能小车实现

成品演示&#xff1a;bilibili - 悄悄的魔法书 代码仓库&#xff1a;github - flying forever 或者 gitee - 清风莫追 文章目录 1 引言1.1 课题背景1.2 课题意义1.3 课题目的 2 课题相关知识与开发环境3 课题的总体设计4 课题的详细设计与实现4.1 小车物理结构4.1.1 轮子4.1.2 …

2024年最新ComfyUI汉化及manager插件安装详解!

前言 在ComfyUI文生图详解中&#xff0c;学习过如果想要安装相应的模型&#xff0c;需要到模型资源网站&#xff08;抱抱脸、C站、魔塔、哩布等&#xff09;下载想要的模型&#xff0c;手动安装到ComfyUI安装目录下对应的目录中。 为了简化这个流程&#xff0c;我们需要安装Co…

如何在 PostgreSQL 中实现数据的去重操作,尤其是对于复杂的数据结构?

文章目录 一、基本数据类型的去重二、多列数据的去重三、复杂数据结构的去重&#xff08;一&#xff09;数组类型的去重&#xff08;二&#xff09;JSON 类型的去重&#xff08;三&#xff09;结构体类型&#xff08;复合类型&#xff09;的去重 四、使用 GROUP BY 进行去重五、…

数据结构--堆,堆排序

1.树概念及结构 1.1树的概念 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 。 有一个 特殊的结…

自动高速开箱机:如何助力电商物流行业

在电商飞速发展的今天&#xff0c;物流行业也迎来了前所未有的挑战与机遇。为了满足消费者对快速、高效、安全的配送需求&#xff0c;各大电商平台和物流公司纷纷寻求技术革新&#xff0c;其中&#xff0c;自动高速开箱机凭借其独特的优势&#xff0c;在电商物流中崭露头角&…

vulnhub-Os-hackNos-3(包含多种靶机获取不了IP地址情况)

下载靶机 通过VMware搭建 网络问题是个关键点 我们点击开启虚拟机&#xff0c;到开机的页面我们回车选择第二个Ubuntu的高级选项 (如果出不来这个选择界面&#xff0c;开机时按下shift键) 进到高级选项&#xff0c;我们再次回车选择第二个进入Linux内核版本的恢复模式 回车后…

BaseServlet的封装

创建BaseServlet的必要性 如果不创建BaseServlet&#xff0c;现在我们只要实现一个功能&#xff0c;我们就需要创建一个servlet! 例如:用户模块(登录&#xff0c;注册&#xff0c;退出录&#xff0c;激活&#xff0c;发送邮件等等功能) 也就是说&#xff0c;我们必须要创建一…

Vue3使用ref绑定组件获取valueRef.value为null的解决

问题&#xff1a; onMounted(() > {nextTick(()>{console.log(treeselectRef, treeselectRef.value);console.log(treeselectRef.value, treeselectRef.value);}); });输出&#xff1a; 查看绑定和定义都没有问题&#xff0c;还是获取不到 解决&#xff1a;使用getCur…

YOLOv5+DecoupleHead解耦头(YOLOx)

一、解耦头原理 在目标检测中,分类任务和回归任务之间的冲突是一个众所周知的问题。因此,用于分类和定位的解耦头被广泛应用于大多数一级和二级探测器。但是,由于YOLO系列的主干和特征金字塔(如FPN, PAN)不断演化,它们的检测头仍然是耦合的。 从下表可以看出,头耦合时端…

leetcode 1398 购买了产品A和产品B却没有购买产品C的顾客(postgresql)

需求 Customers 表&#xff1a; ---------------------------- | Column Name | Type | ---------------------------- | customer_id | int | | customer_name | varchar | ---------------------------- customer_id 是这张表的主键。 customer_name 是顾客的名称。 Order…

水果商城系统 SpringBoot+Vue

1、技术栈 技术栈&#xff1a;SpringBootVueMybatis等使用环境&#xff1a;Windows10 谷歌浏览器开发环境&#xff1a;jdk1.8 Maven mysql Idea 数据库仅供学习参考 【已经答辩过的毕业设计】 项目源码地址 2、功能划分 3、效果演示

【软件分享】我们为分类而生—eCognition

分类是各位小伙伴入门遥感需要做的一项基础的工作&#xff0c;在进行遥感影像中的地物进行分类和提取时&#xff0c;如何提高分类精度&#xff0c;常常令人头疼。今天小编带来此前接触过的一个工具&#xff0c;他的名字是—eCognition&#xff0c;感觉比ENVI好用&#xff0c;在…

gui创新点charts图表

import javax.swing.*; import java.awt.*;public class ComboChartExample extends JPanel {Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 数据int[] values {100, 200, 150, 300, 250};int[] lineValues {120, 180, 160, 280, 230};Str…

掌上教务系统-计算机毕业设计源码84604

摘要 在数字化教育日益成为主流的今天&#xff0c;教务管理系统的智能化和便捷性显得尤为重要。为满足学校、教师、学生及家长对教务管理的高效需求&#xff0c;我们基于Spring Boot框架设计并实现了一款掌上教务系统。该系统不仅具备课程分类管理功能&#xff0c;使各类课程信…

Git 查看、新建、删除、切换分支

Git 是一个版本控制系统&#xff0c;软件开发者用它来跟踪应用程序的变化并进行项目协作。 分支的诞生便于开发人员在彼此独立的环境中进行开发工作。主分支&#xff08;通常是 main 或 master&#xff09;可以保持稳定&#xff0c;而新的功能或修复可以在单独的分支中进行开发…

猫咪健康新选择!福派斯鲜肉猫粮里的果蔬纤维大揭秘

你们是不是对福派斯鲜肉猫粮中那些丰富的果蔬粗纤维特别好奇呢&#xff1f;&#x1f914; 其实&#xff0c;这些看似简单的粗纤维&#xff0c;对猫咪的健康可是大有裨益的&#xff01; 粗纤维在猫粮中起到多种重要作用&#xff0c;并且对猫咪的健康和消化系统有着显著的影响。以…

运维系列.Nginx中使用HTTP压缩功能

运维专题 Nginx中使用HTTP压缩功能 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…

linux 安装Openjdk1.8

一、在线安装 1、更新软件包 sudo apt-get update 2、安装openjdk sudo apt-get install openjdk-8-jdk 3、配置openjdk1.8 openjdk默认会安装在/usr/lib/jvm/java-8-openjdk-amd64 vim ~/.bashrc export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export JRE_HOME${J…