一个基于stream的EPICS IOC应用程序

本文将介绍如何开发一个基于stream的EPICS IOC应用程序,其将作为一个简单的基于消息的设备(用于EPICS stream练习的设备模拟程序_yuyuyuliang00的博客-CSDN博客中最后一个python程序模拟的设备)的IOC控制程序。

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

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

2)编辑configure中RELEASE文件,添加这个IOC程序所需要支持模块的路径:

SUPPORT=/usr/local/EPICS/synApps/support
ASYN=$(SUPPORT)/asyn
STREAM=$(SUPPORT)/stream

3) 编辑simpleintrument/streaminstrumentApp/src/Makefile文件,添加这个IOC程序所需模块以及库文件:

TOP=../..

include $(TOP)/configure/CONFIG
#----------------------------------------
#  ADD MACRO DEFINITIONS AFTER THIS LINE
#=============================

#=============================
# Build the IOC application

PROD_IOC = streaminstrument
# streaminstrument.dbd will be created and installed
DBD += streaminstrument.dbd

# streaminstrument.dbd will be made up from these files:
streaminstrument_DBD += base.dbd
streaminstrument_DBD += asyn.dbd
streaminstrument_DBD += drvAsynIPPort.dbd
streaminstrument_DBD += stream.dbd

# Include dbd files from all support applications:
#streaminstrument_DBD += xxx.dbd

# Add all the support libraries needed by this IOC
streaminstrument_LIBS += asyn
streaminstrument_LIBS += stream

# streaminstrument_registerRecordDeviceDriver.cpp derives from streaminstrument.dbd
streaminstrument_SRCS += streaminstrument_registerRecordDeviceDriver.cpp

# Build the main IOC entry point on workstation OSs.
streaminstrument_SRCS_DEFAULT += streaminstrumentMain.cpp
streaminstrument_SRCS_vxWorks += -nil-

# Add support from base/src/vxWorks if needed
#streaminstrument_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary

# Finally link to the EPICS Base libraries
streaminstrument_LIBS += $(EPICS_BASE_IOC_LIBS)

#===========================

include $(TOP)/configure/RULES
#----------------------------------------
#  ADD RULES AFTER THIS LINE

 4)退到这个IOC程序的顶层目录,执行make命令:

[blctrl@main-machine simpleintrument]$ make
make -C ./configure install
...
make[2]: Leaving directory '/home/blctrl/exer/simpleintrument/iocBoot/iocstreaminstrument'
make[1]: Leaving directory '/home/blctrl/exer/simpleintrument/iocBoot'
[blctrl@main-machine simpleintrument]$ ls
bin  configure  dbd  iocBoot  lib  Makefile  streaminstrumentApp

5)编辑一个协议文件,记录需要使用此协议文件,与设备进行交互:

[blctrl@main-machine Db]$ cat si.proto
Terminator = CR LF;
InTerminator = CR LF;
ReplayTimeout = 10000;
ReadTimeout = 10000;

# get Volts from the instrument to record
getVolt
{
        out "VOLTS?";
        in "VOLTS %f";
}

# set Volts from record to instrument
setVolt
{
        out "VOLTS %f";
        @init
        {
                getVolt;
        }
}

# get current from the instrument
getCurr
{
        out "CURR?";
        in "CURR %f";
}

# instrumnet information
getIDN
{
        out "*IDN?";
        in "*IDN %#s";
}

getOnOff
{
        out "ON?";
        in "ON %d";
}

setOnOff
{
        out "ON %d";
        @init{
                getOnOff;
        }
}

setForReadLoad
{
        out "LOAD?";
}

read_L1
{
        PollPeriod = 100;
        in "LOAD %f %*f %*f";
}


read_L2
{
        PollPeriod = 100;
        in "LOAD %*f %f %*f";
}

read_L3
{
        PollPeriod = 100;
        in "LOAD %*f %*f %f";
}

6) 用VisualDCT编辑记录,并且生成运行所需的文本数据库。

 

 导出以上记录数据库的文本:

[blctrl@main-machine Db]$ cat si.db
#! Generated by VisualDCT v2.8.3

# Get the voltage of the instrument
record(ai, "$(INSTRUMENT):VOLTAGE_RBV") {
  field(DESC, "Read Voltage")
  field(SCAN, "Passive")
  field(DTYP, "stream")
  field(INP, "@si.proto getVolt $(PORT)")
  field(PREC, "2")
  field(LINR, "NO CONVERSION")
  field(EGU, "V")
}

# Set Voltage for the instrument
record(ao, "$(INSTRUMENT):VOLTAGE") {
  field(DESC, "Set Voltage")
  field(SCAN, "Passive")
  field(PINI, "YES")
  field(DTYP, "stream")
  field(FLNK, "$(INSTRUMENT):VOLTAGE_RBV")
  field(OUT, "@si.proto setVolt $(PORT)")
  field(PREC, "2")
  field(LINR, "NO CONVERSION")
  field(EGU, "V")
  field(DRVH, "10")
  field(DRVL, "-10")
}

# Get Current
record(ai, "$(INSTRUMENT):CURRENT_RBV") {
  field(DESC, "Get Current")
  field(SCAN, "Passive")
  field(PINI, "YES")
  field(DTYP, "stream")
  field(INP, "@si.proto getCurr $(PORT)")
  field(PREC, "2")
  field(LINR, "NO CONVERSION")
  field(EGU, "Amp")
}

# Set the ON/OFF state
record(bo, "$(INSTRUMENT):ONOFF") {
  field(DESC, "Control curr output")
  field(SCAN, "Passive")
  field(PINI, "YES")
  field(DTYP, "stream")
  field(FLNK, "$(INSTRUMENT):ONOFF_RBV")
  field(OUT, "@si.proto setOnOff $(PORT)")
  field(ZNAM, "OFF")
  field(ONAM, "ON")
  field(ZSV, "NO_ALARM")
  field(OSV, "MINOR")
}

# Get the on/off state of the instrument
record(bi, "$(INSTRUMENT):ONOFF_RBV") {
  field(DESC, "ON or OFF status")
  field(SCAN, "Passive")
  field(PINI, "YES")
  field(DTYP, "stream")
  field(INP, "@si.proto getOnOff $(PORT)")
  field(ZSV, "NO_ALARM")
  field(OSV, "MINOR")
  field(ZNAM, "OFF")
  field(ONAM, "ON")
}

# Instrument Informantion
record(waveform, "$(INSTRUMENT):INSTRUMENT_INFO") {
  field(DESC, "Instrument Info")
  field(SCAN, "Passive")
  field(PINI, "YES")
  field(DTYP, "stream")
  field(INP, "@si.proto getIDN $(PORT)")
  field(NELM, "30")
  field(FTVL, "CHAR")
}

record(ai, "$(INSTRUMENT):LOAD1") {
  field(DESC, "Read CPU Load")
  field(SCAN, "I/O Intr")
  field(PINI, "NO")
  field(DTYP, "stream")
  field(INP, "@si.proto read_L1 $(PORT)")
  field(PREC, "2")
  field(LINR, "NO CONVERSION")
  field(EGU, "%")
  field(HIHI, "90")
  field(HIGH, "60")
  field(HHSV, "MAJOR")
  field(LLSV, "NO_ALARM")
  field(HSV, "MINOR")
  field(LSV, "NO_ALARM")
}


record(calc, "$(INSTRUMENT):POWER") {
  field(DESC, "Calc Power")
  field(SCAN, "1 second")
  field(CALC, "A*B")
  field(INPA, "$(INSTRUMENT):CURRENT_RBV PP")
  field(INPB, "$(INSTRUMENT):VOLTAGE_RBV")
  field(EGU, "W")
  field(PREC, "2")
}

# Set For Read Load
record(stringout, "$(INSTRUMENT):SetForLoad") {
  field(DESC, "Set For Read Load")
  field(SCAN, "1 second")
  field(DTYP, "stream")
  field(FLNK, "$(INSTRUMENT):INSTRUMENT_INFO")
  field(OUT, "@si.proto setForReadLoad $(PORT)")
}

record(ai, "$(INSTRUMENT):LOAD2") {
  field(DESC, "Read CPU Load")
  field(SCAN, "I/O Intr")
  field(PINI, "NO")
  field(DTYP, "stream")
  field(INP, "@si.proto read_L2 $(PORT)")
  field(PREC, "2")
  field(LINR, "NO CONVERSION")
  field(EGU, "%")
  field(HIHI, "90")
  field(HIGH, "60")
  field(HHSV, "MAJOR")
  field(LLSV, "NO_ALARM")
  field(HSV, "MINOR")
  field(LSV, "NO_ALARM")
}

record(ai, "$(INSTRUMENT):LOAD3") {
  field(DESC, "Read CPU Load")
  field(SCAN, "I/O Intr")
  field(PINI, "NO")
  field(DTYP, "stream")
  field(INP, "@si.proto read_L3 $(PORT)")
  field(PREC, "2")
  field(LINR, "NO CONVERSION")
  field(EGU, "%")
  field(HIHI, "90")
  field(HIGH, "60")
  field(HHSV, "MAJOR")
  field(LLSV, "NO_ALARM")
  field(HSV, "MINOR")
  field(LSV, "NO_ALARM")
}

7) 将在第5步编写的协议文件si.proto和在第6步编写的记录数据库文件si.db放入以下目录streaminstrumentApp/Db,并且编写这个路径下的Makefile文件,在这个文件中添加以下内容:

DB += si.db
DB += si.proto

然后在这个路径下执行make命令。

8)切换到设备模拟程序所在的目录,执行python程序:

[blctrl@main-machine python_dir]$ ./simple_instrument.py --verbose
Serving on TCP 24742
Terminate with Ctrl-C

9) 进入iocBoot/iocstreaminstrument目录下,启动这个IOC应用程序,并用dbl查看当前IOC包含的记录:

[blctrl@main-machine simpleintrument]$ cd iocBoot/iocstreaminstrument/
[blctrl@main-machine iocstreaminstrument]$ ../../bin/linux-x86_64/streaminstrument st.cmd
#!../../bin/linux-x86_64/streaminstrument
< envPaths
epicsEnvSet("IOC","iocstreaminstrument")
epicsEnvSet("TOP","/home/blctrl/exer/simpleintrument")
epicsEnvSet("SUPPORT","/usr/local/EPICS/synApps/support")
epicsEnvSet("ASYN","/usr/local/EPICS/synApps/support/asyn")
epicsEnvSet("STREAM","/usr/local/EPICS/synApps/support/stream")
epicsEnvSet("EPICS_BASE","/usr/local/EPICS/base")
cd "/home/blctrl/exer/simpleintrument"
## Register all support components
dbLoadDatabase "dbd/streaminstrument.dbd"
streaminstrument_registerRecordDeviceDriver pdbbase
drvAsynIPPortConfigure("PORT","127.0.0.1:24742")
epicsEnvSet("STREAM_PROTOCOL_PATH", "/home/blctrl/exer/simpleintrument/db")
## Load record instances
dbLoadRecords("db/si.db","INSTRUMENT=SIMPLE:INSTRUMENT,PORT=PORT")
cd "/home/blctrl/exer/simpleintrument/iocBoot/iocstreaminstrument"
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
SIMPLE:INSTRUMENT:VOLTAGE_RBV
SIMPLE:INSTRUMENT:CURRENT_RBV
SIMPLE:INSTRUMENT:LOAD1
SIMPLE:INSTRUMENT:LOAD2
SIMPLE:INSTRUMENT:LOAD3
SIMPLE:INSTRUMENT:ONOFF
SIMPLE:INSTRUMENT:POWER
SIMPLE:INSTRUMENT:VOLTAGE
SIMPLE:INSTRUMENT:INSTRUMENT_INFO
SIMPLE:INSTRUMENT:ONOFF_RBV
SIMPLE:INSTRUMENT:SetForLoad
epics>

10) 另开一个命令行窗口,进行测试:

[blctrl@main-machine ~]$ caget -S SIMPLE:INSTRUMENT:INSTRUMENT_INFO
SIMPLE:INSTRUMENT:INSTRUMENT_INFO US-PAS Instrument, Yoyodyne I
[blctrl@main-machine ~]$ caput SIMPLE:INSTRUMENT:ONOFF 1
Old : SIMPLE:INSTRUMENT:ONOFF        OFF
New : SIMPLE:INSTRUMENT:ONOFF        ON
[blctrl@main-machine ~]$ caput SIMPLE:INSTRUMENT:VOLTAGE 5
Old : SIMPLE:INSTRUMENT:VOLTAGE      0
New : SIMPLE:INSTRUMENT:VOLTAGE      5
[blctrl@main-machine ~]$ caget SIMPLE:INSTRUMENT:CURRENT_RBV
SIMPLE:INSTRUMENT:CURRENT_RBV  0.86756
[blctrl@main-machine ~]$ caget SIMPLE:INSTRUMENT:POWER
SIMPLE:INSTRUMENT:POWER        28.873
[blctrl@main-machine ~]$ caget SIMPLE:INSTRUMENT:LOAD1
SIMPLE:INSTRUMENT:LOAD1        0.02
[blctrl@main-machine ~]$ caget SIMPLE:INSTRUMENT:LOAD2
SIMPLE:INSTRUMENT:LOAD2        0.08
[blctrl@main-machine ~]$ caget SIMPLE:INSTRUMENT:LOAD3
SIMPLE:INSTRUMENT:LOAD3        0.16

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vb+access大气污染模型系统

数据模型就是按专业的要求&#xff0c;用数字方式描述自然界的事物或现象以及他们的关系。 我们通过对地区的具体数值和情况的观察&#xff0c;对大气质量状况做出分析&#xff0c;建立一个符合当地情况的大气污染模型&#xff0c;用来测量大气污染浓度&#xff0c;并根据污染…

在公司兢兢业业5年,被新来的自动化测试倒挂了薪资…

去年年中朋友左思右想从工作了 5 年的企业离职&#xff0c;离职原因很简单&#xff0c;待疲了&#xff0c;薪资也没咋涨过&#xff0c;新来的自动化测试钱比 Ta 高一倍。但离职 Ta 还是很忐忑的&#xff0c;在这个公司待得久了&#xff0c;自己会的东西一直是那些&#xff0c;业…

Python3爬虫图片抓取

在上一章中&#xff0c;我们已经学会了如何使用Python3爬虫抓取文字&#xff0c;那么在本章教程中&#xff0c;将通过实例来教大家如何使用Python3爬虫批量抓取图片。注&#xff1a;该网站目前已经更换了图片的请求方式&#xff0c;以下爬虫方法只能作为思路参考&#xff0c;已…

【Linux】进程理解与学习-程序替换

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅 相关文章推荐&#xff1a; 【Linux】冯.诺依曼体系结构与操作系统 【Linux】进程理解与学习Ⅰ-进程概念 【Linux】进程理解与学习Ⅱ-进程状态 【Linux】进程理解与学…

想拿到10k-40k的offer,这些技能必不可少!作为程序员的你了解吗

总结了一份Java架构师的技能树&#xff0c;希望对Java编程的同学有点帮助 Java编程的技术点&#xff1a; ​ 计算机基础 ​ Java高级特性 设计模式 ​ 数据库 分布式系统 ​ 注意&#xff1a;下文主要是我个人的总结方法经验&#xff08;面试学习和刷题笔记&#xff09; 01…

aws codedeploy 在ec2实例和autoscaling组上进行蓝绿部署

参考资料 https://docs.amazonaws.cn/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.htmlhttps://docs.amazonaws.cn/zh_cn/codedeploy/latest/userguide/applications.html为 EC2/本地蓝/绿部署创建部署组&#xff08;控制台&#xff09; 部署ec2比较…

面试角度看问题:消息队列详解(万字长文,绝对值得一看)

面试角度看问题&#xff1a;消息队列详解前言一、消息队列是什么&#xff1f;二、为什么要使用消息队列&#xff1f;1.解耦2.异步3.削峰三、消息队列有什么缺点&#xff1f;1.系统可用性降低2.系统复杂度提高3.一致性问题四、如何保证消息队列的高可用&#xff1f;1.RabbitMQ 的…

zookeeper

目录 1.软件架构的发展 2.了解zookeeper 2.1概述 2.2zookeeper的应用场景 2.3安装zookeeper 2.4zookeeper客户端命令 3.zookeeper简单操作 3.1zookeeper的数据结构 3.2节点的分类 3.3java代码操作zookeeper节点 3.4zookeeper的watch机制 3.4.1介绍 3.4.2NodeCache…

ERD Online 4.0.11 在线数据库建模、元数据协作平台(免费、私有部署)

ERD Online 是全球第一个开源、免费在线数据建模、元数据管理平台。提供简单易用的元数据设计、关系图设计、SQL查询等功能&#xff0c;辅以版本、导入、导出、数据源、SQL解析、审计、团队协作等功能、方便我们快速、安全的管理数据库中的元数据。 4.0.11 ❝ :memo: fix(erd):…

5亿融资与重磅新品双发布,杉数以智能决策技术变革中国产业运营模式

2023年3月30日&#xff0c;由杉数科技举办的“智能决策重塑增长”2023杉数科技智能决策前沿峰会在北京举行。会上发布了杉数新一轮融资消息&#xff0c;同时&#xff0c;面向零售快消的决策优化产品计划宇宙&#xff08;Planiverse&#xff09;与面向工业制造的决策优化产品数弈…

Flink (四) --------- Flink 运行时架构

目录一、系统架构1. 整体构成2. 作业管理器&#xff08;JobManager&#xff09;3. 任务管理器&#xff08;TaskManager&#xff09;二、作业提交流程1. 高层级抽象视角2. 独立模式&#xff08;Standalone&#xff09;3. YARN 集群三、 一些重要概念1. 数据流图&#xff08;Data…

C的实用笔记36——几种常用的字符串处理API(一)

0、const关键字 1、知识点&#xff1a;const是与存储相关的关键字&#xff0c;用作常量声明&#xff0c;修饰普通变量和指针变量&#xff0c;表示只读。const修饰普通变量&#xff1a;&#xff0c;修饰后变量从可修改的左值变成不可修改的左值 const修饰指针变量&#xff1a;分…

redis源码解析(四)——ziplist

版本&#xff1a;redis - 5.0.4 参考资料&#xff1a;redis设计与实现 文件&#xff1a;src下的ziplist.c ziplist.h 一、基础知识1、压缩列表的各个组成部分及详细说明2、列表节点3、encoding二、连锁更新三、ziplist.hquickList一、基础知识 压缩列表是Redis为了节约内存而开…

陌生人社交软件如何破冰?

据艾媒咨询的数据显示&#xff0c;2020年中国移动社交用户规模已达9.24亿人&#xff0c;预计2022年中国移动社交用户整体突破10亿人。而早在2020年&#xff0c;我国陌生人社交用户规模已经达到了6.49亿人&#xff0c;虽然增速有所放缓&#xff0c;但整体规模还是较为庞大。 艾媒…

操作系统笔记——进程管理

操作系统笔记——进程管理2. 进程管理2.1 进程与线程2.1.1 进程的引入前趋图程序的顺序执行程序的并发执行2.1.2 进程的定义及描述进程的定义进程的特征进程和程序的关系进程与作业的区别进程的组成2.1.3 进程的状态与转换进程的5种基本状态进程的状态的相互转换2.1.4 进程的控…

java常见锁策略分享(包括cas和synchronized的优化)

前言 锁策略学习思维导图: 1.常见锁策略 ① 乐观锁和悲观锁 ● 它们是根据锁冲突的预测,如果预测锁冲突比较小,那就是乐观锁,反之,就是悲观锁. ● 举个例子:高考前夕,我总觉得高考题会很难,然后拼命做各种科目的题,全副武装的去应对高考,而我妈则觉得高考只是人生的一个阶段而…

PCB模块化设计04——USB-Type-C PCB布局布线设计规范

目录PCB模块化设计04——USB-Type-C PCB布局布线设计规范USB Type-C功能介绍信号图示Type-C接口引脚定义USB 2.0差分对电源和接地引脚RX和TX引脚CC1和CC2针脚VCONN引脚SBU1和SBU2针脚USB供电PCB设计布线要求PCB模块化设计04——USB-Type-C PCB布局布线设计规范 USB Type-C US…

STC的官网,是我永远忘不掉的炼丹炉

搞电子的&#xff0c;应该都搞过8051搞8051的&#xff0c;那应该都搞过STC在国内&#xff0c;STC已经成为了8051的代名词http://www.stcmcudata.com/如果你刚开始搞嵌入式&#xff0c;应该学单片机&#xff0c;你学习单片机&#xff0c;就应该学习下8051&#xff0c;学习8051&a…

Python+Pygame实现简单的单词小游戏

语言是一种艺术&#xff0c;但是作为语言的基础——词汇&#xff0c;却不像艺术那样赏心悦目。不断的记忆与复习&#xff0c;让词汇成为很多孩子在学习英语时&#xff0c;最难完全攻克的关卡。本文就来用Python制作一个简单的英语单词游戏吧 前言 语言是一种艺术&#xff0c;但…

【ArcGIS Pro二次开发】(17):打开GDB、SHP、CAD等各种数据

一、打开GDB数据库 // 输入一个数据库路径string gdbPath "C:\Users\Administrator\Documents\ArcGIS\Projects\Test\Test.gdb";await QueuedTask.Run(() >{// 如果文件夹存在并且包含有效的地理数据库&#xff0c;则会打开地理数据库。using (Geodatabase geoda…