EPICS -- asynRecord记录使用示例

news2025/8/11 12:11:44

这个示例演示了如何使用asynRecord记录

1、硬件准备工作

在这里准备了一个型号为NPort 5650-8-DT的Moxa串口服务器,用于一根交叉DB9双母头线缆连接设备上端口2和端口3,使之可以相互通信。

串口服务器配置如下

  • IP地址:192.168.3.50
  • 端口2对应的本地TCP端口号:4002
  • 端口3对应的本地TCP端口号:4003

2、安装以下测试EPICS asynRecord的IOC应用程序

a) 按如下步骤,先建立这个IOC程序的程序框架:

[blctrl@main-machine exer40]$ makeBaseApp.pl -t ioc asynRecordTest
[blctrl@main-machine exer40]$ makeBaseApp.pl -i -t ioc asynRecordTest
Using target architecture linux-x86_64 (only one available)
The following applications are available:
    asynRecordTest
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name?
[blctrl@main-machine exer40]$ ls
asynRecordTestApp  configure  iocBoot  Makefile

b) 编辑configure/RELEASE文件,添加指向asyn以及ipac模块的环境变量ASYN和IPAC:

SUPPORT=/usr/local/EPICS/synApps/support

IPAC=$(SUPPORT)/ipac
ASYN=$(SUPPORT)/asyn

c) 编辑asynRecordTestApp/Db/Makefile文件,添加如下一行用于指向asynRecord.db文件

DB += $(ASYN)/db/asynRecord.db

d) 编辑asynRecordTestApp/src/Makefile文件,添加以下行,使得这个IOC程序能够找到asyn的动态链接库

# Include dbd files from all support applications:
asynRecordTest_DBD += asyn.dbd
asynRecordTest_DBD += drvAsynSerialPort.dbd
asynRecordTest_DBD += drvAsynIPPort.dbd
#
# Add all the support libraries needed by this IOC
asynRecordTest_LIBS += asyn

e) 返回这个IOC程序的顶层目录,执行make命令进行编译。

f) 进入IOC启动目录,编辑st.cmd启动文件:

[blctrl@main-machine exer40]$ cd iocBoot/iocasynRecordTest/
[blctrl@main-machine iocasynRecordTest]$ pwd
/home/blctrl/exer/exer40/iocBoot/iocasynRecordTest
[blctrl@main-machine iocasynRecordTest]$ cat st.cmd
#!../../bin/linux-x86_64/asynRecordTest

#- You may have to change asynRecordTest to something else
#- everywhere it appears in this file

< envPaths

cd "${TOP}"

## Register all support components
dbLoadDatabase "dbd/asynRecordTest.dbd"
asynRecordTest_registerRecordDeviceDriver pdbbase
drvAsynIPPortConfigure("IP1","192.168.3.50:4002",0,0,1)
drvAsynIPPortConfigure("IP2","192.168.3.50:4003",0,0,1)

## Load 2 record instances
dbLoadRecords("db/asynRecord.db","P=Test:,R=IPPORT1,PORT=IP1,ADDR=0,IMAX=0,OMAX=0")
dbLoadRecords("db/asynRecord.db","P=Test:,R=IPPORT2,PORT=IP2,ADDR=0,IMAX=0,OMAX=0")

cd "${TOP}/iocBoot/${IOC}"
iocInit

g) 启动这个IOC程序,并且查看启动后装置的记录实例:

[blctrl@main-machine iocasynRecordTest]$ ../../bin/linux-x86_64/asynRecordTest st.cmd
#!../../bin/linux-x86_64/asynRecordTest
< envPaths
epicsEnvSet("IOC","iocasynRecordTest")
epicsEnvSet("TOP","/home/blctrl/exer/exer40")
epicsEnvSet("SUPPORT","/usr/local/EPICS/synApps/support")
epicsEnvSet("IPAC","/usr/local/EPICS/synApps/support/ipac")
epicsEnvSet("ASYN","/usr/local/EPICS/synApps/support/asyn")
epicsEnvSet("EPICS_BASE","/usr/local/EPICS/base")
cd "/home/blctrl/exer/exer40"
## Register all support components
dbLoadDatabase "dbd/asynRecordTest.dbd"
asynRecordTest_registerRecordDeviceDriver pdbbase
drvAsynIPPortConfigure("IP1","192.168.3.50:4002",0,0,1)
drvAsynIPPortConfigure("IP2","192.168.3.50:4003",0,0,1)
## Load record instances
#dbLoadRecords("db/asynRecord.db","P=Test:,R=SPORT")
dbLoadRecords("db/asynRecord.db","P=Test:,R=IPPORT1,PORT=IP1,ADDR=0,IMAX=0,OMAX=0")
dbLoadRecords("db/asynRecord.db","P=Test:,R=IPPORT2,PORT=IP2,ADDR=0,IMAX=0,OMAX=0")
cd "/home/blctrl/exer/exer40/iocBoot/iocasynRecordTest"
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.3.1
## EPICS Base built Sep  8 2022
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncxxx,"user=blctrl"
epics> dbl
Test:IPPORT1
Test:IPPORT2
epics>

3、对asynRecord记录实例进行测试

a) 如下所述用medm分别连接上述两个asynRecord记录:

[blctrl@main-machine adls]$ medm -x -macro "P=Test:,R=IPPORT1,PORT=IP1" asynRecord.adl &
[blctrl@main-machine adls]$ medm -x -macro "P=Test:,R=IPPORT2,PORT=IP2" asynRecord.adl &

连接后成功后,显示了两个窗口 

 b) 以下是一个Python脚本,演示了asyn记录的用法。它用ASCII和二进制格式传输数据。

这是Python程序,它演示了EPICS asyn记录的用法。这个程序使用2个asyn记录。对应这两个记录的端口连接了所提供的串口服务器的两个TCP端口。

  • 记录1用ASCII发送消息"Hello EPICS"给记录2。
  • 记录2用二进制向记录1发送数组[0,2,3,...,29]消息。
[blctrl@main-machine exer40]$ cat write_read.py
import epics
import time

rec1="Test:IPPORT1"
rec2="Test:IPPORT2"

# 记录1 ASCII输出,二进制输入
t=epics.caput(rec1+'.OFMT', 'ASCII')
t=epics.caput(rec1+'.OEOS','\r')
t=epics.caput(rec1+'.IFMT', 'Binary')
t=epics.caput(rec1+'.IEOS', '')
# 清除记录1的输入垃圾
junk=epics.caget(rec1+'.BINP')

# 记录2 ASCII输入,二进制输出
t=epics.caput(rec2+'.OFMT', 'Binary')
t=epics.caput(rec2+'.OEOS', '')
t=epics.caput(rec2+'.IFMT','ASCII')
t=epics.caput(rec2+'.IEOS','\r')

# 记录2,处于读取模式
t=epics.caput(rec2+'.TMOD', 'Read')
# 清除读取值
junk=epics.caget(rec2+'.AINP')

message="Hello EPICS"
t=epics.caput(rec1+".TMOD", "Write")
epics.caput(rec1+".AOUT", message)

print("Record1 send Record2:", message)
time.sleep(0.1)
epics.caput(rec2+".PROC",1)
recv=epics.caget(rec2+".AINP")
print("Record2 received:",recv)

# 预计30个字节
size=30
# 记录1处于读取模式
t=epics.caput(rec1+".TMOD", "Read")
t=epics.caput(rec1+".NRRD", size)

junk=epics.caget(rec1+".BINP")
# 记录2处于写模式
send_data=[]
for i in range(size):
    send_data.append(i)

print("Record2 sends Record1:", send_data)

t=epics.caput(rec2+".TMOD","Write")
t=epics.caput(rec2+".NOWT",size)
t=epics.caput(rec2+".BOUT",send_data)

time.sleep(0.1)
t=epics.caput(rec1+".PROC",1)
time.sleep(0.1)
arr=epics.caget(rec1+".BINP")
print("Record1 received",arr)

运行以上python脚本,测试结果:

[blctrl@main-machine exer40]$ python3 write_read.py
Record1 send Record2: Hello EPICS
Record2 received: Hello EPICS
Record2 sends Record1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
Record1 received [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29]

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

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

相关文章

xilinx PL测 DP 点屏 /接收(三)--TX

环境&#xff1a; a)硬件&#xff1a;官方ZCU106开发板 , tb-fmch-vfmc-dp子卡。 b)软件&#xff1a;vivado2021.1&#xff0c;vitis2021.1&#xff0c;裸机程序。 1、例程&#xff1a; 1、DP TX ip速率&#xff1a; 2、框架&#xff1a; 3、重要寄存器&#xff1a; 4、 5、时钟…

Java 内存溢出(二)使用 MAT 分析 .hprof 内存映像文件

目录一、内存溢出时自动导出 .hprof 文件二、下载安装 MAT三、启动 MAT四、MAT 分析 hprof 文件1.Overview 概览2.Leak Suspects 溢出原因猜测3.Histogram 对象实例数量排序4.Dominator Tree 支配树.hprof 文件&#xff1a; 是 java 项目的 Heap Dump 文件&#xff0c;也叫内存…

手把手教你搭建属于自己的PyQt5-YOLOv5目标检测平台(保姆级教程)

>>>深度学习Tricks,第一时间送达<<< 🚀🚀🚀NEW!!!PyQt5-YOLOv5目标检测平台来啦 ~ 💡💡近期,小海带尝试用Pycharm做可视化界面相关设计,并搭载之前实验训练较好的YOLOv5算法模型,以此成功搭建了属于自己的PyQt5-YOLOv5目标检测平台,平台界面…

前后端分离项目,vue+uni-app+php+mysql在线小说电子书阅读系统设计与实现(H5移动项目)

功能介绍 用户首次登陆系统需要注册一个用户作为账号&#xff0c;用户在登录平台后&#xff0c;可以进行平台的操作。主要模块包括以下几点&#xff1a; 登录功能&#xff1a;注册普通账号登录&#xff1b;登录后可以修改用户的基本信息&#xff0c;也可以退出。 资讯功能&…

stress、mpstat、pidstat

简介 压测命令&#xff1a;stress &#xff0c;一个Linux 系统压力测试工具&#xff0c;这里我们用作异常进程模拟平均负载升高的场景。 监测命令&#xff1a;mpstat 是一个常用的多核CPU 性能分析工具&#xff0c;用来实时查看每个CPU 的性能指标&#xff0c;以及所 有 CPU 的…

(附源码)计算机毕业设计JavaJava毕设项目电脑小白网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

华为机试 - 勾股数元组

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 如果3个正整数(a,b,c)满足a^2 b^2 c^2的关系&#xff0c;则称(a,b,c)为勾股数&#xff08;著名的勾三股四弦五&#xff09;&#xff0c; 为了探索勾股数的规律&#xff0c;我们定义如果勾股数(a,b,…

Spring Boot 检索定时任务

概述 应用经常需要添加检索功能&#xff0c;开源的 ElasticSearch 是目前全文搜索引擎的首选。他可以快速的存储、搜索和分析海量数据。Spring Boot通过整合Spring Data ElasticSearch为我们提供了非常便捷的检索功能支持。 Elasticsearch是一个分布式搜索服务&#xff0c;提…

iwebsec靶场搭建

iwebsec靶场可以通过两种方法进行渗透。 iwebsec靶场简介 第一种是在线靶场&#xff1a;http://www.iwebsec.com:81/ 第二种是本地搭建&#xff1a;目前可以通过两种方法搭建&#xff0c;一种是虚拟机绿色版解压即用&#xff0c;另外一种则是通过docker安装&#xff0c;也是此…

智慧港口解决方案-最新全套文件

智慧港口解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 智慧**全套最新解决方案合集一、建设背景 智慧港口是随着时代进步发展起来的一种现代港口运输的新业态&#xff0c;它是以现代化基础设施为基础&#xff0c;促使大数据、云计算、物联网、移动互…

Ansible Automation Platform - 保护 Playbook 中的敏感内容

《OpenShift / RHEL / DevSecOps / Ansible 汇总目录》 文章目录AAP 保护 Playbook 敏感信息的方法使用 ansible-vault 保护 Playbook 中的敏感信息使用AAP的凭证保护访问通用目标的关键信息场景1场景2使用令牌访问 AAPAAP 保护 Playbook 敏感信息的方法 在上一篇《Ansible Au…

【ES笔记01】ElasticSearch数据库之index索引、doc文档、alias别名、mappings映射结构的基本操作

这篇文章&#xff0c;主要介绍ElasticSearch数据库之index索引、doc文档、alias别名、mappings映射结构的基本操作。 目录 一、索引index相关操作 1.1、创建索引 1.2、查询索引 1.3、查询所有索引 1.4、删除索引 二、文档doc相关操作 2.1、创建文档 2.2、更新文档 &am…

基于JSP的敬老院信息管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86467170 主要使用技术 ServletJSPCSSJSMysql 功能介绍 系统管理员用户功能介绍&#xff1a; 密码信息管理&#xff1a;修改个人账号密码&#xff1b; 系统用户管理&#xff1a;可以对系统…

【爬虫进阶】易班登录加密逆向

目录前言分析代码过程結果完整代码前言 demo比较简单&#xff0c;逆向难点&#xff1a;rsa加密&#xff0c;图片验证码 分析 我们模拟登录&#xff0c;请求一下 红框内是我们提交的参数&#xff0c;password看上去应该是rsa加密&#xff0c;captcha是验证码&#xff0c;key…

GO面试一定要看看这些面试题

Go核心特性 1.goroutine 协程是用户态轻量级线程&#xff0c;它是线程调度的基本单位。 使用者分配足够多的任务&#xff0c;系统能自动帮助使用者把任务分配到 CPU 上&#xff0c;让这些任务尽量并发运作。这种机制在 Go语言中被称为 goroutine&#xff08;协程&#xff09…

【javaEE】网络原理(网络层)

努力经营当下&#xff0c;直至未来明朗 文章目录前言一、网络层简述【IP协议】THINK前言 一个人最大的痛苦来源于对自己无能的愤怒 Hi&#xff0c;这里是不想秃头的宝贝儿&#xff01; 本文主要介绍【网络层】&#xff0c;其中最关键的就是【IP协议】。&#xff08;同样&…

【天池竞赛】心跳数据挖掘

天池学习赛 心跳数据挖掘 168分攻略 Chapter 1. 赛题解析 就如比赛界面所介绍的一般&#xff0c;这里再复述一遍 本次新人赛是Datawhale与天池联合发起的0基础入门系列赛事 —— 心跳信号分类预测。赛题以心电图心跳信号数据为背景&#xff0c;要求选手根据心电图感应数据预测…

【序列召回推荐】(task4)多兴趣召回实践:MIND(更新中)

note 阿里的序列召回MIND模型&#xff1a;引入了胶囊网络&#xff0c;将胶囊网络的动态路由算法引入到了用户的多兴趣建模上&#xff0c;通过B2I动态路由很好的从用户的原始行为序列中提取出用户的多种兴趣表征。在离线训练阶段&#xff0c;通过提出Label-Aware Attention详细…

Lifecycle 生命周期组件的那些事

引言 在2022的今天&#xff0c;AndroidX 普遍的情况下&#xff0c;JetPack Lifecycle 也早已经成为了开发中的基础设施&#xff0c;小到 View(扩展库) ,大到 Activity&#xff0c;都隐藏着它的身影&#xff0c;而了解 Lifecycle 也正是理解 JetPack 组件系列库生命感知设计的基…

D-013 蜂鸣器硬件电路设计

蜂鸣器硬件电路设计1 简介2 蜂鸣器电路设计1 简介 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中做发声器件。 蜂鸣器的分类&#xff1a;压电…