EPICS数据库示例

news2024/9/22 1:25:13

本文目标是使用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 PV
    field(DOL0, "VAL0")
    field(DOL1, "VAL1")
    field(DOL2, "VAL2")
    field(LNK0, "RESULT")
    field(LNK1, "RESULT")
    field(LNK2, "RESULT")
    # 在设置了RESULT PV的值后,应该运行这个PV
    field(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.coloradmin.cn/o/1907072.html

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

相关文章

使用树莓派进行python开发,控制电机的参考资料

网站连接&#xff1a;https://www.cnblogs.com/kevenduan?page1 1、简洁的过程步骤&#xff0c; 2、有代码示例&#xff0c; 3、有注意事项&#xff0c;

AI实践与学习7_AI解场景Agent应用预研demo

前言 学习大模型Agent相关知识&#xff0c;使用llama_index实现python版的Agent demo&#xff0c;根据AI解题场景知识密集型任务特点&#xff0c;需要实现一个偏RAG的Agent WorkFlow&#xff0c;辅助AI解题。 使用Java结合Langchain4j支持的RAG流程一些优化点以及自定义图结构…

星网安全产品线成立 引领卫星互联网解决方案创新

2024年6月12日&#xff0c;盛邦安全&#xff08;688651&#xff09;成立星网安全产品线&#xff0c;这是公司宣布全面进入以场景化安全、网络空间地图和卫星互联网安全三大核心能力驱动的战略2.0时代业务落地的重要举措。 卫星互联网技术的快速发展&#xff0c;正将其塑造为全球…

MySQL 存储引擎事务

MySQL存储引擎&事务 一、MySQL 存储引擎1、怎么查看/添加“存储引擎”&#xff1f;2、常用存储引擎简介 二、MySQL 事务1、什么是事务&#xff1f;2、事务是怎么做到多条DML语句同时成功和同时失败的呢&#xff1f;3、事务四大特性 ACID4、四个隔离级别 一、MySQL 存储引擎…

如何下载jmeter旧版本

如何下载jmeter旧版本 推荐先用旧版本做好测试基本操作&#xff0c;因为高版本不适合做压力测试&#xff0c;需要证书&#xff0c;有点麻烦。 1.百度或直接打开jmeter官网&#xff1a;https://jmeter.apache.org/ 2.向下拖到Archives一栏&#xff0c;点击Apache Jmeter archi…

项目:简易Mybatis

目录 一、新建项目 二、新建模块 三、回顾JDBC 四、准备环境 五、使用dom4j解析xml文件 六、开始,编写Mapper解析API 1、自定义Resources类 2、定义Configuration类 3、定义MappedStatement类 4、定义XmlMapperBuilder类 5、更新一下UserMapper.xml和UserMapper接口 …

一文彻底带你搞懂什么是适配器模式!!

一文彻底带你搞懂什么是适配器模式&#xff01;&#xff01; 什么是适配器模式&#xff1f;适配器的两种实现方式适用情况代码示例背景类适配器对象适配器 IO流中的实际应用应用扩展 总结 什么是适配器模式&#xff1f; 适配器模式&#xff08;Adapter Pattern&#xff09;是作…

web自动化(六)unittest 四大组件实战(京东登录搜索加入购物车)

Unittest框架 Unittest框架:框架测试模块测试管理模块测试统计模块&#xff0c;python的内置模块 import unittest Unittest框架四大组件: 1、TestCase 测试用例 2.TestFixture 测试用例夹具 测试用例需要执行的前置和后置 3.TestSuite 测试套件 把需要执行的测试用例汇总在一…

什么是企业服务总线?它包含哪些技术组件?

我们每个人都会去医院&#xff0c;您描述下我们去医院的场景&#xff0c;然后引出这个挂号流程&#xff0c;通过挂号流程中的一个问题或者什么东西来吸引他的好奇心&#xff0c;这样呢&#xff1f;会比现在的预设场景好一些。我举个例子&#xff0c;人工智能怎么帮人看病。如果…

前端面试题23(css3)

关于CSS3的面试题&#xff0c;我们可以从多个维度来探讨&#xff0c;包括但不限于选择器、盒模型、布局技术、动画与过渡、响应式设计等。下面我会列举一些典型的CSS3面试问题&#xff0c;并尽可能提供详细的解答或示例代码。 1. CSS3中新增了哪些选择器&#xff1f; 答案: C…

【Java安装】windows10+JDK21+IDEA

文章目录 一、JDK安装1. 下载完成后按照自己需要的位置安装2. 配置环境变量2.1 JAVA_HOME变量2.2 PATH配置 3. 验证4. helloworld 二、IDEA安装三、IDEA-HelloWorld 一、JDK安装 JDK安装链接 1. 下载完成后按照自己需要的位置安装 2. 配置环境变量 2.1 JAVA_HOME变量 安装…

手机飞行模式是什么意思?3个方法教你如何开启

在现代生活中&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时我们需要暂时切断手机的通信功能&#xff0c;比如在飞机上、开会时或需要安静休息的时候。这时候&#xff0c;苹果手机上的“飞行模式”功能就派上了用场。 那么&#xff0c;手机飞…

【从零到一,如何搭建本地AI大模型】

摘要: 本文主要记录这一段时间对本地大模型搭建的心得。 作为一个资深程序员,在AI席卷全球的时候,深深感觉到了一丝危机感,不禁有一个想法不断在脑海闪现:我会不会真的哪一天被AI给取代了? 从哪入手 程序员出生的我,掌握了很多语言,从前端到数据库,再到运维,基本都…

uniapp-小程序获取用户位置

1. 需要在微信公众平台进行接口的申请。选择自己需要用的接口。 2. 在app.json文件中配置permission和requiredPrivateInfos。requiredPrivateInfos里面是你需要使用的接口。 3. 配置完成后&#xff0c;就可以使用了。 相关获取位置API的链接 4. 如果要获取当前位置到某一个指…

VS 附加进程调试

背景&#xff1a; 此方式适合VS、代码和待调试的exe在同一台机器上。 一、还原代码到和正在跑的exe同版本 此操作可以保证能够调试生产环境的exe 二、设置符号路径 1.调试->选项 三、附加进程 方式1&#xff1a; 打开VS&#xff0c;调试->附加到进程&#xff0c;出…

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

MySQL连接池原理与简易网站数据流动是如何进行 1.MySQL连接池原理2.简易网站数据流动是如何进行 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f60…

【Go】常见的变量与常量

变量 常见的变量声明方式 一、声明单个变量的多种方式 1.声明一个变量初始化一个值 //声明变量 默认值是0&#xff0c;var a int//初始化一个值a 1fmt.Println(a) 2. 在初始化的时候省去数据类型&#xff0c;通过值自动匹配当前的变量的数据类型 var b 2fmt.Println(&quo…

7月6日 VueConf 技术大会即将在深圳举办

7月6日&#xff0c;VueConf 2024 即将在深圳召开&#xff0c;本次大会正值 Vue.js 十周年&#xff0c;旨在聚焦 Vue.js 社区的成员&#xff0c;分享最新的技术动态、经验以及创新实践。 本次参与 VueConf 大会的是来自全球 Vue.js 核心团队成员、行业专家及前端开发者。其中&a…

Java语言程序设计——篇二(1)

Java语言基础 数据类型关键字与标识符关键字标识符 常量与变量1、常量2、变量 类型转换自动类型转换强制类型转换 数据类型 数据的基本要素数据的性质&#xff08;数据结构&#xff09;数据的取值范围&#xff08;字节大小&#xff09;数据的存储方式参与的运算 Java是一门强类…

NodeJS蔬菜自产零售混合销售平台-计算机毕业设计源码10149

摘 要 随着移动互联网的快速发展&#xff0c;购物方式也发生了巨大的变化。蔬菜作为消费者生活中必不可少的商品之一&#xff0c;在移动互联网时代也迎来了新的购物方式——购物小程序。购物小程序是一种基于手机应用平台的轻量级应用程序&#xff0c;用户可以通过它方便地浏览…