EPICS设备支持的简单示例
描述
这是一个非常简单的设备支持示例。这个EPICS设备支持提供了实时时钟的"秒"部分(00-59)。EPICS记录数据库提供了两个记录,"秒"值的十分之一和"秒"值的10倍。
构建
makeBaseApp.pl是一个创建应用程序区域的perl脚本。它了创建以下部分:
- Makefile
- configure:这个目录包含EPICS构建系统所需的文件
- Clock1App:一个用于一个主要子模块的目录和相关文件的集合。
- iocBoot:一个子目录和相关联的文件。
- iocBoot/iocClock1:用于单一ioc的子目录和文件。
1) 调用以下命令来准备目录结构和环境:
[root@centos7 EPICS]# mkdir Clock1 # 新建一个目录,用于放置项目
[root@centos7 EPICS]# cd Clock1/
[root@centos7 Clock1]# makeBaseApp.pl -t ioc Clock1
[root@centos7 Clock1]# makeBaseApp.pl -i -t ioc Clock1
Using target architecture linux-x86_64 (only one available)
The following applications are available:Clock1
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name?
[root@centos7 Clock1]# ls
Clock1App configure iocBoot Makefile
2)在Clock1/Clock1App/src目录下编写设备源文件
- devAiSecond.h
/** devAiSecond.h* */#include <time.h>
- devAiSecond.c
/** devAiSecond.c** */
static char what[] = "@(#) devAiSecond v0.1 support for Second";#undef DEBUG_ON#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>#include "alarm.h"
#include "cvtTable.h"
#include "dbDefs.h"
#include "dbAccess.h"
#include "recGbl.h"
#include "recSup.h"
#include "devSup.h"
#include "aiRecord.h"
#include "link.h"
#include "epicsExport.h"
#include "devAiSecond.h"/* create dset for devAiSecond */
static long init_record();
static long init_ai();
static long read_ai();struct {long number;DEVSUPFUN report;DEVSUPFUN init;DEVSUPFUN init_record;DEVSUPFUN get_ioint_info;DEVSUPFUN read_ai;DEVSUPFUN special_linconv;
} devAiSecond = {6,NULL,init_ai,init_record,NULL,read_ai,NULL
};
epicsExportAddress(dset, devAiSecond);/* Ai Record */
/* init_ai for debug */
static long init_ai(int after)
{
#ifdef DEBUG_ONprint("devAiSecond(init) called, pass=%d\n",after);
#endifreturn 0;
}static long init_record(struct aiRecord * pai)
{
#ifdef DEBUG_ONprintf("devAiSecond (init_record) called\n");
#endifpai->udf = FALSE;return 0;
}static long read_ai(struct aiRecord * pai)
{time_t t;struct tm * tm;#ifdef DEBUG_ONprintf("devAiRecord (read_ai) accessed\n");
#endiftime(&t);tm = localtime(&t);pai->udf = FALSE;pai->rval = tm->tm_sec;
#ifdef DEBUG_ONprintf("devAiSecond (read_ai) data %d\n", pai->rval);
#endifreturn 0;
}
- Makefile
TOP=../..include $(TOP)/configure/CONFIG
#----------------------------------------
# ADD MACRO DEFINITIONS AFTER THIS LINE
#=============================
# Build an IOC support library
LIBRARY_IOC += aiSecond
DBD += aiSecond.dbd
aiSecond_SRCS += devAiSecond.c
aiSecond_LIBS += ${EPICS_BASE_IOC_LIBS}#=============================
# Build the IOC applicationPROD_IOC = Clock1
# Clock1.dbd will be created and installed
DBD += Clock1.dbd# Clock1.dbd will be made up from these files:
Clock1_DBD += base.dbd# Include dbd files from all support applications:
Clock1_DBD += aiSecond.dbd# Add all the support libraries needed by this IOC
Clock1_LIBS += aiSecond# Clock1_registerRecordDeviceDriver.cpp derives from Clock1.dbd
Clock1_SRCS += Clock1_registerRecordDeviceDriver.cpp# Build the main IOC entry point on workstation OSs.
Clock1_SRCS_DEFAULT += Clock1Main.cpp
Clock1_SRCS_vxWorks += -nil-# Add support from base/src/vxWorks if needed
#Clock1_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary# Finally link to the EPICS Base libraries
Clock1_LIBS += $(EPICS_BASE_IOC_LIBS)#===========================include $(TOP)/configure/RULES
#----------------------------------------
# ADD RULES AFTER THIS LINE
- aiSecond.dbd
# include "base.dbd"
# local menu, record, device, driver, breakpoint definitions
device(ai,CONSTANT,devAiSecond,"Second")
3)在Clock1/Clock1App/Db目录下编辑记录文件和Makefile文件:
- aiSecond.db:
record(ai, "TEST_AI:CLOCK1:SEC1")
{field(DESC, "Second devided by 10")field(DTYP, "Second")field(INP, "this is not use, but must not be NULL")field(SCAN, "1 second")field(EGUF, "1")field(EGUL, "0")field(EGU, "Second/10")field(LINR, "LINEAR")field(ASLO, "0.1")field(AOFF, "0")field(MDEL, "0.01")field(HOPR, "6")field(LOPR, "0")field(HIHI, "5.5")field(HIGH, "4.5")field(LOW, "1.5")field(LOLO, ".5")field(HHSV, "MAJOR")field(HSV, "MINOR")field(LSV, "MINOR")field(LLSV, "MAJOR")
}
record(ai, "TEST_AI:CLOCK1:SEC10")
{field(DESC, "Second multiplied by 10")field(DTYP, "Second")field(INP, "this is not used")field(SCAN, "5 second")field(EGUF, "1")field(EGUL, "0")field(EGU, "Second*10")field(LINR, "LINEAR")field(ASLO, "10")field(AOFF, "0")field(MDEL, "1")field(HOPR, "600")field(LOPR, "0")field(HIHI, "550")field(HIGH, "450")field(LOW, "150")field(LOLO, "50")field(HHSV, "MAJOR")field(HSV, "MINOR")field(LSV, "MINOR")field(LLSV, "MAJOR")
}
- Makefile:
TOP=../..
include $(TOP)/configure/CONFIG
#----------------------------------------
# ADD MACRO DEFINITIONS AFTER THIS LINE#----------------------------------------------------
# Create and install (or just install) into <top>/db
# databases, templates, substitutions like this
DB += aiSecond.db#----------------------------------------------------
# If <anyname>.db template is not named <anyname>*.template add
# <anyname>_template = <templatename>include $(TOP)/configure/RULES
#----------------------------------------
# ADD RULES AFTER THIS LINE
4) 退到Clock1目录,执行make,进行编译:
[root@centos7 Clock1]# make
make -C ./configure install
make[1]: Entering directory `/usr/local/EPICS/Clock1/configure'
...
make[1]: Leaving directory `/usr/local/EPICS/Clock1/iocBoot'
[root@centos7 Clock1]#
5) 进入Clock1/iocBoot/iocClock1路径下,编辑st.cmd文件
[root@centos7 Clock1]# cd iocBoot/iocClock1/
[root@centos7 iocClock1]# ls
envPaths Makefile st.cmd
[root@centos7 iocClock1]# cat st.cmd
#!../../bin/linux-x86_64/Clock1#- You may have to change Clock1 to something else
#- everywhere it appears in this file< envPathscd "${TOP}"## Register all support components
dbLoadDatabase "dbd/Clock1.dbd"
Clock1_registerRecordDeviceDriver pdbbase## Load record instances
dbLoadRecords("db/aiSecond.db","user=epics") # 添加需要加载记录的路径cd "${TOP}/iocBoot/${IOC}"
iocInit## Start any sequence programs
#seq sncxxx,"user=epics"
[root@centos7 iocClock1]#
6) 在/etc/profile.d/epics.sh末尾添加以下两行
export EPICS_CA_ADDR_LIST=192.168.50.49 # 本机IP地址
export EPICS_CA_AUTO_ADDR_LIST=NO
7)使/etc/profile.d/epics.sh中定义的环境变量生效,并启动这个创建的软IOC程序:
[root@centos7 iocClock1]# source /etc/profile.d/epics.sh
[root@centos7 iocClock1]# ls
envPaths Makefile st.cmd
[root@centos7 iocClock1]# ../../bin/linux-x86_64/Clock1 st.cmd # 启动IOC
#!../../bin/linux-x86_64/Clock1
< envPaths
epicsEnvSet("IOC","iocClock1")
epicsEnvSet("TOP","/usr/local/EPICS/Clock1")
epicsEnvSet("EPICS_BASE","/usr/local/EPICS/base")
cd "/usr/local/EPICS/Clock1"
## Register all support components
dbLoadDatabase "dbd/Clock1.dbd"
Clock1_registerRecordDeviceDriver pdbbase
## Load record instances
dbLoadRecords("db/aiSecond.db","user=epics")
cd "/usr/local/EPICS/Clock1/iocBoot/iocClock1"
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.3.1
## EPICS Base built Mar 16 2022
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncxxx,"user=epics"
epics> dbl # 查看当前的EPICS数据库中正在运行的记录
TEST_AI:CLOCK1:SEC1
TEST_AI:CLOCK1:SEC10
epics>
8) 用camonitor监视其中一个记录TEST_AI:CLOCK1:SEC1:
[epics@centos7 ~]$ camonitor TEST_AI:CLOCK1:SEC1 # 每秒钟值VAL值增量为0.1,且在0-6之间循环
TEST_AI:CLOCK1:SEC1 2022-03-23 23:35:47.460203 4.7 HIGH MINOR
TEST_AI:CLOCK1:SEC1 2022-03-23 23:35:48.458183 4.8 HIGH MINOR
TEST_AI:CLOCK1:SEC1 2022-03-23 23:35:49.459828 4.9 HIGH MINOR
TEST_AI:CLOCK1:SEC1 2022-03-23 23:35:50.460593 5 HIGH MINOR
TEST_AI:CLOCK1:SEC1 2022-03-23 23:35:51.459630 5.1 HIGH MINOR
TEST_AI:CLOCK1:SEC1 2022-03-23 23:35:52.460288 5.2 HIGH MINOR
TEST_AI:CLOCK1:SEC1 2022-03-23 23:35:53.459531 5.3 HIGH MINOR
^C
[epics@centos7 ~]$
更多描述:
devAiSecond.c提供一个使用ai记录支持的设备支持。它读取系统时钟并且提取"秒"部分。由于它只用一个短事件获取此信息,这个设备支持相当简单。如果它用很长时间处理输入/输出,为了不阻止你的ioc程序的其它部分的实时运行,这个运行的之后部分不应该被延迟。这样一个设备支持被称为异步设备支持。运行的此部分会在另一个线程或进程中被通知,并且那被称为驱动支持。你可以编写你自己的异步设备支持和相应的驱动支持,或者你可以使用AsynDriver。
aiSecond.db数据库定义了两个过程变量。其中一个每秒种被运行(SCAN:1 second)并且通过devAiSecond设备支持读取实时时钟。它指定一个线性转换(LINR:LINEAR ASLO:0.1等)获取"秒"值的十分之一。它也指定若干警报条件(HIHI:5.5 HHSV: MAJOR等),如果这个值大于或等于5.5,将产生一个MAJOR警报。
aiSecond.dbd绑定这个记录支持"ai"和设备支持名称"Second"(在数据库aiSecond.db中使用),和dset结构体"devAiSecond"(在设备支持devAiSeond.c中使用)。
EPICS设备支持的简单示例相关推荐
- VS2010对C++11的语法支持简单示例
简单的来说,就是大部分不支持,小部分支持,具体的参考官网链接: https://docs.microsoft.com/en-us/previous-versions/visualstudio/visu ...
- Web API 简单示例
一.RESTful和Web API Representational State Transfer (REST) is a software architecture style consisting ...
- 配置Dot1q终结子接口实现同设备VLAN间通信示例
示例图 一.实验目的 1.配置Dot1q终结子接口实现同设备VLAN间通信示例 二.注意事项 1.Dot1q终结子接口和QinQ终结子接口不支持透传不带VLAN Tag的报文,收到不带VLAN Tag ...
- 使用NATS及其nats.c客户端简单示例用法(nats.c的API接口)
NATS 前言 什么是NATS NATS 客户端应用程序 NATS 服务基础架构 将NATS客户端应用程序连接到NATS服务器 简单的消息传递设计 NATS客户端 安装 开始 基本用法 JetStre ...
- Java TCP 抓包简单示例
Java TCP 抓包简单示例 由于目前网上没有一篇能真正方便读者操作的此类文章,本文对此通过示例做个简单介绍. 缘起 有一天本来在看头条,然后看到一则游戏的广告,看画面可能是我喜欢的建造类型(纪元1 ...
- Xcode8支持iOS11或者是Xcode9支持iOS11.1的设备支持文件(免费)
更新一下Xcode9支持iOS12 的设备支持文件 GitHub下载地址: https://github.com/iGhibli/iOS-DeviceSupport 先把设备支持文件的下载地址贴出来: ...
- appcompat v21: 让 Android 5.0 前的设备支持 Material Design
1. 十大Material Design开源项目 2. appcompat v21: 让 Android 5.0 前的设备支持 Material Design 主题 AppCompat已经支持最新的调 ...
- xcode江湖录-第04章 风水宝地--界面生成器之StoryBoard简单示例 与 约束
第04章风水宝地--界面生成器之StoryBoard简单示例 ??如何设置转场动画?? ??如何在参与到转场动作中?? ??如何让页面跳转到自定义VC?? ??如何设置自定义跳转模式?? ??如何用S ...
- python简单单元测试示范卷_Python 单元测试的简单示例
这篇文章主要为大家详细介绍了Python 单元测试的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 以前我是不 ...
最新文章
- 【转】android开发工具Eclipse,androidStudio,adt网盘下载--不错
- gitlab开启https加密 and 全站https
- 转载:WPF binding
- foreach循环怎么获取全部返回值_PHP跳出循环的方法语句有哪些
- git升级后jenkins的报错
- AIM Tech Round 5 (rated, Div. 1 + Div. 2)
- 四款主流同步软件介绍
- Java使用ttf字体下载网站
- Pr2023(Premiere Pro)中文版软件下载「附带安装教程」
- 如何简单地设置一个LoRa网关?
- QT 5.9.5的快捷键操作
- 浏览器下载ftp文件
- 高校企业双向赋能,首届飞桨启航菁英计划圆满结束
- 检测网络不通时自动重启计算机,电脑连不上网怎么办?6个最简单最实用的解决办法,帮你轻松搞定!...
- 在练琴时关于音乐与计算机结合的碎思考
- Masm for MAC安装教程+实例分析
- 创邻科技Galaxybase荣获2021年度IT168技术卓越奖
- 与Anthony Baldino一起塑造声音
- JQuery中常用的 属性选择器
- 微信小程序-导航吸顶+view锚点
热门文章
- vim 配置文件 ,高亮+自动缩进+行号+折叠+优化
- 跟李沐学AI:实用机器学习 | 第九章
- PPT“备注”内容字体可以修改颜色也能直接看到修改效果
- 华为鸿蒙系统老手机能用吗_华为使用自家“鸿蒙”系统,旧手机的安卓系统可以更新成那个系统吗?...
- cnblogs is not free for us to motify
- python全案例学习_Python全案例学习与实践
- 【Labview】基于Labview的BMI计算器
- 【VCS】Git之无尽探索
- 工作小妙招之将Excel中不同sheet中的数据按照相同属性进行合并
- 一枚中级网络工程师的工作日常,能引起多少同行的共鸣啊。